还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
计算器c程序设计报告一.设计要求运用C语言所具有的函数,模仿画出计算器的界面,并实现计算器的基本功能浮点数加、减、乘、除、乘方和求模运算1收集资料,全面分析课题,分析问题,形成总体编程思路2深入分析各个小问题,编写各部分程序模块并进行具体介绍如初始化函数、主窗口函数、计算器函数等等3上机调试,修改出现的错误,确保程序能正确运行二.设计的作用、目的1通过课程设计全面掌握《C语言程序设计》关键知识点,掌握C语言中数组、指针、结构体、各种函数等方面的基本知识2通过课程设计了解并掌握C语言程序设计的方法,熟悉C程序设计的开发环境及C程序的调试过程3培养学生查阅参考资料、手册的自学能力,通过独立思考深入钻研有关问题,学会自己分析、解决问题的方法4通过自己动手,培养、提高对编程的兴趣,为将来从事相关工作打好基础三.课题分析要实现计算器功能,先要输出计算器的样式,再是通过按键的方式实现数值的运算,故程序大致可分两部分实现,一部分是显示计算器,另一部分是实现计算功能Turbo C提供了PC系统环境下扩充的屏幕和图形支持系统,利用系统提供的字符屏幕处理函数和图形系统的有关信息以及函数的实现,这样就可以显示计算器了计算功能主要解决的是接收按键信息的处理和进行识别,如果按键是数字符号,要将其转变为操作数,如果是运算操作符,则进行相应的处理四.设计的具体实现
1.系统组成模块结构及功能lMain主函数设置了程序的流程,首先初始化图形系统,然后调用计算器computer0函数进行计算,当从计算器程序返回时,关闭图形系统,程序结束22Initialize初始化函数if x=xOx=x0+6*width;m=4;}/*如果移到头,再左移,则移动到最右边字符位置*/elsex=x-width-width/2;m——;}/*否则,左移到前一个字符位置*/ifv二二UP/*上移箭头时新位置计算*/if y=yOy=y0+4*height+height/2;n=3;}/*如果移到头,再上移,则移动到最下边字符位置*/elsey=y-height-height/2;n一;}/*否则,移到上边一个字符位置*/ifv==DOWN/*下移箭头时新位置计算*/if y=7*height{y=yO;n=0;}/*如果移到尾,再下移,则移动到最上边字符位置*/else{y=y+height+height/2;n++;}/*否则,移到下边一个字符位置*/_put imagex,y,rar,XOR_PUT;/*在新的位置显示光标箭头*/c=strl[n*5+m];/*将字符保存到变量c中*/if isdigitc||c~./*判断是否是数字或小数点*/ifflag==-l/*如果标志为T,表明为负数*/strcpystr2,〃-〃;/*将负号连接到字符串中*/flag=l;}/*将标志值恢复为1*/sprintf temp,〃%c〃,c;/*将字符保存到字符串变量temp中*/strcat str2,temp;/*将temp中的字符串连接到str2中*/setfillstyle SOLIDFILL,color+3;bar2*width+width/2,height/2,15*width/2,3*height/2;outtextxy5*width,height,str2;/*显示字符串*/if c==,+,{numl=atof str2;/*将第一个操作数转换为浮点数*/strcpy str2,〃〃;/*将str2清空*/act=l;/*做计算加法标志值*/setfillstyleSOLID_FILL,color+3;bar2*width+width/2,height/2,15*width/2,3*height/2;outtextxy5*width,height,〃
0.〃;/*显示字符串*/}ifc==」{if strcmpstr2,,/,z==0/*如果str2为空,说明是负号,而不是减号*/flag=-l;/*设置负数标志*/elsenuml=atof str2;/*将第二个操作数转换为浮点数*/strcpy str2,,,zz;/*将str2清空*/act=2;/*做计算减法标志值*/setfillstyleSOLID_FILL,color+3;bar2*width+width/2,height/2,15*width/2,3*height/2;/*画矩形*/outtextxy5*width,height,〃
0.〃;/*显示字符串*/if c==,*,numl=atof str2;/*将第二个操作数转换为浮点数*/strcpy str2,,zz,;/*将str2清空*/act=3;/*做计算乘法标志值*/setfillstyleSOLID_FILL,color+3;bar2*width+width/2,height/2,15*width/2,3*height/2;outtextxy5*width,height,〃
0.〃;/*显示字符串*/ifc=/numl=atof str2;/*将第二个操作数转换为浮点数*/strcpy str2,,,/z;/*将str2清空*/act=4;/*做计算除法标志值*/setfillstyleSOLID FILL,color+3;bar2*width+width/2,height/2,15*width/2,3*height/2;outtextxy5*width,height,
0.;/*显示字符串*/ifc=Lnuml=atof str2;/*将第二个操作数转换为浮点数*/strcpy str2,,,/z;/*将str2清空*/act=5;/*做计算乘方标志值*/setfillstyleSOLID_FILL,color+3;/*设置用淡绿色实体填充*/bar2*width+width/2,height/2,15*width/2,3*height/2;/*画矩形*/outtextxy5*width,height,
0.;/*显示字符串*/ifc=%numl=atof str2;/*将第二个操作数转换为浮点数*/strcpy str2,z//,;/*将str2清空*/act=6;/*做计算模运算乘方标志值*/setfillstyleSOLID_FILL,color+3;/*设置用淡绿色实体填充*/bar2*width+width/2,height/2,15*width/2,3*height/2;/*画矩形*/outtextxy5*width,height,〃
0.〃;/*显示字符串*/if c==,=,num2=atof str2;/*将第二个操作数转换为浮点数*/switch act/*根据运算符号计算*/case1:result=numl+num2;break;/*做力口法*/case2:result=numl-num2;break;/*做减法*/case3:result=numl*num2;break;/*做乘法*/case4:result=numl/num2;break;/*做除法*/case5:result=pownuml,num2;break;/*做x的y次方*/case6:result=fmodnuml,num2;break;/*做模运算*/setfillstyleSOLID_FILL,color+3;/*设置用淡绿色实体填充*/bar2*width+width/2,height/2,15*width/2,3*height/2;/*覆盖结果区*/sprintf temp,〃%f〃,result;/*将结果保存到temp中*/outtextxy5*width,height,temp;/*显示结果*/if c二二cnuml=0;/*将两个操作数复位0,符号标志为1*/num2=0flag=l;strcpy str2,〃〃;/*将str2清空*/setfillstyleSOLID_FILL,color+3;/*设置用淡绿色实体填充*/bar2*width+width/2,height/2,15*width/2,3*height/2;/*覆盖结果区*/outtextxy5*width,height,〃
0.〃;/*显示字符串*/ifc=QexitO;/*如果选择了q回车,结束计算程序*/put imagex,y,rar,X0R_PUT;/*在退出之前消去光标箭头*/return;/*返回*/}/*窗口函数*/void mwindowchar*headerint height;cleardevice;/*清除图形屏幕*/setcolor MaxColors-1;/*设置当前颜色为白色*/setviewport20,20,MaxX/2,MaxY/2,1;/*设置视口大小*/height=textheight〃H〃;/*读取基本文本大小*/settextstyle DEFAULT_FONT,H0RIZ_DIR,1;/*设置文本样式*/settext justifyCENTER_TEXT,T0P_TEXT;/*设置字符排列方式*/outtextxyMaxX/4,2,header;/*输出标题*/setviewport20,20+height+4,MaxX/2+4,MaxY/2+20,1;/*设置视口大小*/drawboder;/*画边框*/}_void drawbodervoid/*画边框*/struct viewporttype vp;/*定义视口类型变量*/setcolor MaxColors-1;/*设置当前颜色为白色*/setlinestyle SOLID_LINE,0,NORM_WIDTH;/*设置画线方式*/getviewsettings vp;/*将当前视口信息装入vp所指的结构中*/rectangle0,0,vp.right-vp.left,vp.bottom-vp.top;/*画矩形边框*//*设计鼠标图形函数*/int arrowint size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};/*定义多边形坐标*/setfillstyleSOLID_FILL,2;/*设置填充模式*/fillpoly8,raw;/*画出一光标箭头*/size=imagesize4,4,16,16;/*测试图象大小*/rar=malloc size;/*分配内存区域*/getimage4,4,16,16,rar;/*存放光标箭头图象*/put image4,4,rar,X0R_PUT;/*消去光标箭头图象*/return0;/*按键函数*/int specialkeyvoidint key;whilebioskey1==0;/*等待键盘输入*/key=bioskey0;/*键盘输入*/key=keyOxff keyOxff:key»8;/*只取特殊键的扫描值,其余为0*/return key;/*返回键值*/:\PROGRA-1\CLANGU-1\tc\TC.EXE-lol x|
15.软件调试问题分析及解决方法EditLine1Co11Insert Indent Tab Fill Un indent E NONAME.Cimport Java.Applet.*;importJaua.awt.*;importinport jaua.awt.event.*;importjaua.lang.*;importimport Jaua.applet.Applet;jauax.Swing.*;publicjauax.swing.border.*;private final StringC1KEYS=,”/Jsqrt“4“,“5,W“1”“2”“3”J”W3,・©I”./一•,」.“」♦•,」=;priuate finalString[J privatefinalString[]COMMANDS^Backspace℃E°,℃0Messageclass Calculatorextends JAppletimplements ActionListenerIFl-HelpF5-ZoomF6-SwitchF7-TraceF8-StepF9-MakeFl0-Menu NUM~E:\PROGRA~l\CLANGU-l\tc\TC.EXEFile EditRun CompileProject OptionsDebug Break/wat chEdit=import Java.Applet.*;import jaua.awt.*;import jaua.awt-event-*;import jaua.lang.*Compilingimport Java.appletimport jauax.Swing Main fileNONAME.C CompilingEDITORimport jauax.swing-NONAME.CLines compiled Warn ings“Errors二Available memopy236KErrorsPress anyke£inal StriFinalStriiMessageNUMLine1Co11lose rtIndentTab FillUn indentENONAME.C第一次找到计算器的程序后匆忙运行,出现8个错误,而且都看不懂,经查找,才发现♦是因为编程语言不对,选用了javalass CalcLiE:\PROGRA~1\CLANGU-1\tc\TC.EXEFile EditRun CompileDebug Break/watchCAF5-Zoon F6T F7-Trace F9-Make F10-Menup•,,t52+ae:/,T108t209F
10812.19I AItFl-Last helpF3-Pick F6—Swap ProjectOptions NUM=Edit=F7/F8Line1Col9Insert IndentTabFillUnindent*E-NONAME.CMinelude dos.h Z*DOS1J「|产―/ttinclude nath.httinclude conio.h-Preu/Next errorF9-Conp/*Minelude stdio-hZ*I/O^*Zttinclude stdlib.hr CompilingMineludestdarg.httinclude graphicsMainfileNONAME.Cttinc ludestring.hCompilingEDITOR-NONAME.CMinelude ctype.httdef ineUP0x48Total FileHdeFine DOUN0x50LEFT1622Lines compiled1622ttdef ine0x4b01Hdef ineRIGHT0x4dWarnings0ttdef ineENTER0x0d Errors1uoid*rar;/Available memory236Kstruct palettetypeint ErrorsPress anGiaphDi*iu ei*;,M essa g,cCompiling E\PROGRA\CLA NGU\T CXNONAME.C•Error E:\PROGRA~1\CLANGU~1\TC\NONAME.C311Compound statementmissingin£第二次又由于疏忽,在最后少加了一个大括号♦
6.软件运行结果▲在TC上编写计算器程序▲检查程序没有错误四.心得体会及建议通过此次C语言程序设计实践,本人实在是获益不浅!C语言是上个学期开的课程,所以这个学期并没怎么看过,当要开始设计的时候,还真不知从哪下手!结果,第一次上机,我坐了一个下午,只找到个源程序,而且也看不懂,什么也没干!回去以后,我想,这样不行,这样下去还得了!我就重新学了一遍我们上个学期的教材,发觉自己有许多都遗忘了!经过温习,和资料的查找,再去看源程序终于觉得有些头绪了通过这次课程设计,理解了一些编译程序的一般原理和基本实现方法把死板的课本知识变得生动有趣,激发了学习的积极性把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解使我对C语言的使用得到了的提高我觉得对程序的深层理解,清楚程序中每一步的功能,▲计算器程序运行界面在程序的运行中是十分重要的一个好的结构在运行中能够充分的发挥程序的功能结构设计的合理性决定了这个程序的价值在今后的学习中我Calculator要注意这方面,使得我的编程能力能有进一步的提高这次课程设计,不仅对我的学习提供了帮助,而且在意志力方面也得到了锻炼没有足够的耐力和信心就很难坚持对课程设计每一步的顺利进行我觉得编写类似的程序其中最重要的一个方面就是要认真,认真编写代码可以大大减少错误的出现;其次是要有耐心,勇于克服困难,不断解决问题,面对困难要永不退缩,迎难而上;再次是要有清晰的思维,能够理清各个函数之间的关系,明确各个函数的职能;最后还要和同学多交流合作,▲输入1+2多参考书籍五.参考文献1郭翠英《C语言课程设计案例精编》中国水利水电出版社
2004.32谭浩强《C程序设计》第二版清华大学出版社
2005.8www.ut
365.com▲运行结果Turbo C通常的工作方式是字符文本模式,要显示图形,调用图形函数,则必须进入图形工作方式,应首先调用函数initgraphGraphDriver,GraphMode,初始化图形系统,并装入相应的图形驱动器3Mwindow主窗口函数设置视口大小为当前窗口的一半,再调用drawboderO函数画出边框我们将可以在屏幕的左上角看到本程序的运行结果视口;4Drawboder画边框函数通过getviewsettings vp函数把当前视口的信息装入由vp所指向的结构中vp是structviewporttype类型,其结构定义如下struct viewporttypeintleft,top,right,bottom;int clip;void farrectangleint left,int top,int right,int bottom;void farsetlinestyleint linestype,unsigned upattern;}域left、top right、bottom中存放视口左上角和右下角的坐标当clip为0时,不进行对超出视口边界输出的剪裁,否则,执行剪裁以防止超出边界字符屏幕操作和图形函数的核心是窗口,它是屏幕的活动部分,在这个活动窗口中将显示输出为保持两个系统的独立性,Turbo C在字符屏幕和图形系统之间用了两个不同的术语字符屏幕的函数提供了窗口,而图形系统提供了视口,但是当屏幕用字符模式时,左上角坐标为1,1,而在图形状态下,左上角坐标为0,0o根据视口坐标,利用rectangle函数画出矩形边框线我们将可以在屏幕的左上角看到程序运行的窗口;5Computer计算器函数计算器函数是本程序的主要函数部分,其流程是先调用mwindowO主窗口函数显示一黄色边框的窗口,再在窗口中显示计算器,最后接收按键进行计算为了合理布局、方便操作,根据窗口的大小设计按钮的大小和位置读取当前窗口的大小后,设置了两个单位变量width和height,图形显示以这两个单位变量为计算单位,布局如下图所示图中的符号按钮利用函数setfillstyle设置用绿色实体进行填充,然后用bar函数画一个二维矩形条,setcolor函数设置边框颜色,retangle函数画一个矩形边框线,利用outtextxyO函数将预先存储在strl中的字符串中的字符输出,因为outtextxy输出的是字符串,所以先要用sprintf函数将输出的字符写入字符数组str2,转变为字符串,再输出界面设置完成后,首先在第一个按钮位置显示光标,此时可以移动和按下光标,当按下Alt+X键时可以结束程序,否则执行循环判断移动的是哪一个光标键,变量m和n分别记录光标的坐标x,y位置,光标移动到某个位置按回车键后,则程序判断所按的是哪个字符,并进行相应的处理
①当所选为数字或小数点,则先判断是否为负数,如果是负数则将符号连接到字符串中,否则只连接所选的数字或小数点,并显示数据;
②当所选为”时,先判断有无操作数,如果没有操作则表示负数,组负数标记,否则是做减法,做减法标志,并将当前的操作数保存;
③当所选为“+”、“*”、“/、“八”、“%”时,处理方式与b步骤一样,均是先保存第一个操作数,做为运算标志准备接收第二个操作数;
④当所选为“二”时,根据运算符号标志act进行相应的运算,并结果显示;
⑤当所选为“c”时,表示归零,所以将第一和第二操作数均置0;
⑥当所选为“Q”时,则结束运算,桌面切换到原程序桌面状态;6Arrow设计图形鼠标函数由于在图形函数方式下,光标是不可见的,所以为了能正确地选择按钮,自己设计一个光标图形方法是用fillpoly8,raw画一个由raw所指向的数组定义的8个x,y坐标点所围成的封闭图形,用当前填充颜色对该形状进行填充后形状像鼠标的光标,利用函数imagesize测试图像和函数putimagex,y,rar,XOR_PUT操作实现光标图像的显示和隐藏;7Specialkey读取特殊键函数利用函数bioskeyO读取所按键的信息,int bioskeyint cmd函数原型在bios,h中功能是完成直接键盘操作如果cmd是0,bioskeyO返回下一个在键盘输入的值它将等待到下一个按键它返回严格16位的二进制数,包括两种不同的值当按下“普通键”时,它的低8位数存放在该字符的ASCH码;对于“特殊键”,低8位为0特殊键包括箭头键、功能键等高8位字节存放该键的扫描码,所以程序中用到了语句key=bioskey0,表示返回下一个在键盘上按下的键,并保存在变量key中,key=key0xff:key8,对所按的键进行判断,如果keyOxff为真,即低8位不为0,则说明按下的是“普通键”,因为Oxff16进制数代表的二进制码高8位为0,低8位为1,和0相遇,结果为0,和1相遇,结果保持原数,这样就将低8位也就是该字符的ASCII码值赋给key如果keyOxff为假,即低8位为0,署名按下的是“特殊键”,将key右移8位后,也就是将其高8位值赋给keyCmd如果是1,bioskey查询是否按下一个键时返回非0值,否则返回0值,所以用whilebioskey1==0语句等待按键重要函数介绍
0.〃;/*显示字符串*/if c--’{....}if c==*{..}if c==,/{..}if c=={..}if c=-对{....}if c==,=,{..}if c-c{..}if c=-Q{..}•设置加、减、乘、除、归零和退出的功能5int arrow{int size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};setfillstyleSOLID_FILL,2;fillpoly8,raw;size=imagesize4,4,16,16;rar=malloc size;getimage4,4,16,16,rar;put image4,4,rar,XOR_PUT;return0;•设置鼠标图形6int specialkeyvoid{intkey;while bioskeyl==0;key=bioskey0;key=key0xff keyOxff:key8;return key;设置键盘的输入・#include dos.h/*DOS接口函数*/ttinclude
4.程序代码编写及注释ttincludemath.h/*数学函数的定义*/^includeconio.h/*屏幕操作函数*/ttinclude#include stdio.h/*1/0函数*/stdlib.httinclude/*库函数*/#include stdarg.h/*变量长度参数表*/〈graphics,h〉/*图形函数*/string.h/*字符串函数*/#include ctype.h/*字符操作函数*/Wdefine UP0x48/*光标上移键*/ttdefine DOWN0x50/*光标下移键*/ttdefine LEFT0x4b/*光标左移键*/ttdefine RIGHT0x4d/*光标右移键*/ttdefine ENTEROxOd/*回车键*/void*rar;/*全局变量,保存光标图象*/struct palettetypepalette;/*使用调色板信息*/int GraphDriver;/*图形设备驱动*/int GraphMode;A图形模式值*/int ErrorCode;/*错误代码*/int MaxColors;/*可用颜色的最大数值*/int MaxX,MaxY;/*屏幕的最大分辨率*/double AspectRatio;/*屏幕的像素比*/void drawbodervoid;/*画边框函数*/void initializevoid;/*初始化函数*/void computervoid;/*计算器计算函数*/void changetextstyleintfont,int direction,int charsize;/*改变文本样式函数*/void mwindowchar*header;/*窗口函数*/int specialkeyvoid;/*获取特殊键函数*/int arrow;/*设置箭头光标函数*//*主函数*/int maininitializeO;/*设置系统进入图形模式*/computer;/*运行计算器*/closegraph;/*系统关闭图形模式返回文本模式*/return0;/*结束程序*/int xasp,yasp;/*用于读x和y方向纵横比*//*设置系统进入图形模式*/void initializevoidGraphDriver=DETECT;/*自动检测显示器*/initgraph GraphDriver,GraphMode,〃〃;/*初始化图形系统*/ErrorCode=graphresult;/*读初始化结果*/if ErrorCode!=grOk/*如果初始化时出现错误*/printf GraphicsSystem Error:%s\n〃,grapherrormsgErrorCode;/*显示错误代码*/exit1;/*退出*/}getpalettepalette;/*读面板信息*/MaxColors=getmaxcolor+1;/*读取颜色的最大值*/MaxX=getmaxx;/*读屏幕尺寸*/MaxY=getmaxy;/*读屏幕尺寸*/getaspectratio xasp,yasp;/*拷贝纵横比到变量中*/AspectRatio二doublexasp/doubleyasp;A计算纵横比值*/}/*计算器函数*/void computervoidstructviewporttypevp;/*定义视口类型变量*/int color,height,width;int x,y,xO,yO,i,j,v,m,n,act,f lag=l;float numl=0,num2=0,result;/*操作数和计算结果变量*/char cnum
[5],str2
[20]={〃〃},c,temp
[20]={z,/,};char strl□二〃
1230.456+-789*/Qc=〃;/*定义字符串在按钮图形上显示的符号inwindow Calculator;/*显示主窗口*/color=7;/*设置灰颜色值*/getviewsettings vp;/*读取当前窗口的大小*/width=vp.right+l/10;/*设置按钮宽度*/height=vp.bottom-10/10;/*设置按钮高度*1x=width/2;/*设置x的坐标值*/y=height/2;/*设置y的坐标值*/setfillstyleSOLID_FILL,color+3;bar x+width*2,y,x+7*width,y+height;/*画一个二维矩形条显示运算数和结果*/setcolorcolor+3;/*设置淡绿颜色边框线*/rectangle x+width*2,y,x+7*width,y+height;/*画一个矩形边框线*/setcolor RED;/*设置颜色为红色*/outtextxy x+3*width,y+height/2,〃
0.〃;/*输出字符串〃
0.〃*/x=2*width-width/2;/*设置x的坐标值*/y=2*height+height/2;/*设置y的坐标值*/forj=0;j4;++j/*画按钮*/fori=0;i5;++i setfillstyleSOLID_FILL,color;setcolor RED;barx,y,x+width,y+height;/*画一个矩形条*/rectangle x,y,x+width,y+height;sprintf str2,z/%c/z,strl[j*5+i];/*将字符保存到str2中*/outtextxyx+width/2,y+height/2,str2;x=x+width+width/2;/*移动列坐标*/}y+=height/2*3;/*移动行坐标*/x=2*width-width/2;/*复位列坐标*/x0=2*width;y0=3*height;x=xO;y=yO;gotoxy x,y;/*移动光标到x,y位置*/arrow;/*显示光标*/put imagex,y,rar,XOR PUT;m=0;n=0;strcpy str2,〃〃;/*设置str2为空串*/whilev二specialkey!=45/*当压下Alt+x键结束程序,否则执行下面的循环whilev=specialkey!=ENTER/*当压下键不是回车日寸*/{一putimage x,y,rar,XOR_PUT;/*显示光标图象*/ifv==RIGHT/*右移箭头时新位置计算*/if x=x0+6*width/*如果右移,移到尾,则移动到最左边字符位置*/{x=xO;m=0;else{x=x+width+width/2;m++;}/*否则,右移到下一个字符位置*/ifv==LEFT/*左移箭头时新位置计算*/。