目录一.课程设计目的 (1)二.设计环境 (1)三.设计内容 (1)四.设计说明 (2)五.设计程序流程图 (2)六.调试 (4)(1)错误原因分析一 (4)(2)语法错误 (5)(3)逻辑错误 (5)七. 调试结果图 (6)八. 结论与心得体会 (7)九.附录 (8)具体代码实现 (8)十.参考文献 (18)一.课程设计目的1.通过一个学期的学习,我认为要学号C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践来巩固我们的知识,特别是学计算机专业的,我们更应该注重这一环节,只有这样我们才能成为一个合格的计算机人才。
通过这一个课程设计,进一步来巩固所学的语句,如:循环,和分支结构的运用。
还要熟悉四则运算和函数的算法。
2.通过这次课程设计扩展自己的知识面,课本上的东西是远远不够的,可以通过上网或去图书馆查资料等方式得到一些新的知识,3.通过课程设计,加深对课程化设计思想的理解,能进行一个系统功能分析,并设计一个合理的模块化结构,提高程序开发能力。
二.设计环境1.硬件:一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz2.软件:安装有Microsoft visual c++6.0三.设计内容以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。
(1)定义一个结构体类型数组,输入0~9及+、--、*等符号的信息,将其信息存入文件中;(2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果;(3)画出部分模块的流程图;(4)编写代码;(5)程序分析与调试。
四.设计说明1)包含的功能有:加、减、乘、除运算,开方、平方等功能。
(2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。
(3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。
(4)计算功能基本上是用系统内部函数。
(5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。
(6)“CE”按钮可以清除所有已输入的数据从头计算五.设计程序流程图六.调试根据电脑所给的提示出现语法错误,缺少变量的定义大多的语法错误在通过书本参考下能够修改。
主要是平时看书不仔细、不太注意而产生的。
如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。
这些语法错误有信息框的提示一般是能够排除的。
另外还有部分注释的位置也错了,最重要的是逻辑上的错误,一般电脑不容易发现。
所以更要对程序仔细的检查。
经认真修改之后重新保存文件。
(1) 错误原因分析一由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。
不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。
为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。
(2) 语法错误大多的语法错误在通过书本参考下能够修改。
主要是平时缺乏锻炼、不太注意而产生的。
如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式(3) 逻辑错误编译、连接的成功并不意味着程序的最终成功。
逻辑上的错误机器不易检查出来,这时需要对数据结果进行分析。
这种错误的查找是最难的,需要有相当的耐心和细心去把问题找出来。
这也是本次程序编辑过程中碰到的最大的难题。
往往运行之后得不到另人满意的结果,此时解决的方法一则用“分段检查”的方法,在程序的不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,对检查出的错误进行修改,当调试完毕将设置的printf都删去。
若在程序中找不到问题,则再来考虑算法是否逻辑严谨,再进行修改。
如此循环往复,直到最后程序运行成功。
在本次程序编辑过程中,我就是常遇到编译能通过,能够运行程序,但是总在输入、删除等操作完之后再想去看数据文件中存在的数据记录的时候,却一条记录也显示不出来,可能是对n变量的定义或使用出错了,于是在每个主要函数的操作过程中添加了printf语句用来显示n的变化,在执行某个函数前添加插入语句显示n的起始值,在执行完该个函数后再添加插入语句显示此时n的结果值,观察n的变化是否正确,如果错误了,也就说明该函数编写过程有错。
诸如这样的调试方法,不断缩小检查范围,最后将错误找到,进行修改。
所以到最后我找到了错误,及时改正,终于把程序完成了,一切功能显示正常。
七. 调试结果图八. 结论与心得体会经过了两个星期的C语言程序设计终于在老师的细心指导和同学的热情帮助下基本完成了计算器课题的设计修改任务,虽然有些地方不尽如人意但是初步达到了对自己的要求。
信息时代是科技和经济发展的产物,软件产业是信息时代的产物,它在我们的生活工作中发挥着越来越大的作用,计算器的设计对我们知识的掌握有很大的作用,更能方便他人,可行性很强。
刚开始设计的时候找不到头绪,不知道该从哪里下手,通过向同学询问和向老师寻求帮助找走进了设计的门槛。
在设计这个程序时,刚开始是根据网上的资料,,经过自己的反复尝试以及与与同学的讨论,这也不难,最好还是被我搞定了。
这些只要你自己愿意去尝试,问题都可以迎刃而解的。
通过网上查找到很多成功的计算器程序,通过对那些已经成功地程序进行分析找到自己的设计思路,制定设计流程。
并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的。
万事开头难,可是对于并不是很熟悉的C语言在下面的工作中困难处处能遇见。
通过查找C语言教材去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决。
测试阶段中发现了几处错误导致程序不能编译,通过耐心的分析源代码终于编好了一个完整无误的程序。
在这次的C语言程序设计实习中遇到了现实编程中必然见到的问题通过这些问题的解决积累了编程的实践经验。
在实际的编程操作中发现自己C语言知识的不足,加深了对C语言的理解。
在学习之余体验到收获的感觉。
同时认识到程序员的工作并不是我们想象的那么简单轻松的,在现在的编程中要有足够的耐心和热情。
九.附录具体代码实现#include"dos.h"#include"conio.h"#include"string.h"#include"stdio.h"#define normbut_bor 0x80#define presbut_but 0xb8#define normnum_but 0x8e#define presnum_but 0xb9#define spebut_char 0x2c#define win_color 0xf2#define win_char 0xfbstruct s_button /*按键的结构体*/{int sx,sy,ex,ey;char *head;int press;}button[17]; /*图表按键数*/char far *vid_mem;static int tx=32,ty=3; /*静态变量*/float v1=0.0,v2=0.0;struct stack /*结构体栈*/{char s[20];int tos,top;}stack;char tag;init_stack() /*初始化栈*/{stack.tos=0;stack.top=0;stack.s[stack.tos]='\0';}push(char ch) /*入栈*/{stack.s[stack.tos++]=ch;stack.s[stack.tos]='\0';}pop() /*取栈数据通过*/{if(stack.tos>0)stack.s[--stack.tos]='\0';}clear_stack() /*清空栈*/{stack.tos=0;stack.top=0;stack.s[stack.tos]='\0';}int form_win() /*表格窗口初始化*/{textbackground(WHITE); /*窗口背景颜色*/clrscr(); /*清零*/draw_win(); /*窗口画线*/active_button(); /*窗口按键*/out_text_win(); /*输出文本窗口*/window_xy(32,3); /*计算结果窗口*/}draw_win() /*边框画线窗口*/{int i;char far *t;char *s="这是一个模拟计算器!"; /*顶端边框输出的字符*/ draw_border(30,0,79,24,win_color); /*边框的位置和颜色*/ i=(79-30-strlen(s))/2+30;t=vid_mem+i*2;for(;*s;){*t++=*s++;*t++=win_color; /*顶端字体颜色*/}}draw_border(int sx,int sy,int ex,int ey,int attrib) /*边界线函数*/ {char far *t,far *v;int i;t=vid_mem;for(i=sx+1;i<ex;i++){v=t+sy*160+i*2;*v++=196; /*每一行上画线确定为直线*/*v=attrib;v=t+ey*160+i*2;*v++=196; /*每一行下画线确定为直线*/*v=attrib;}for(i=sy+1;i<ey;i++){v=t+i*160+sx*2;*v++=179; /*每一列左画线确定为直线*/*v=attrib;v=t+i*160+ex*2;*v++=179; /*每一列由画线确定为直线*/*v=attrib;}write_char(sx,sy,218,attrib);write_char(ex,sy,191,attrib);write_char(sx,ey,192,attrib);write_char(ex,ey,217,attrib);}write_char(int x,int y,char ch,int attrib) /*字符输入函数*/{char far *v;v=vid_mem;v+=x*2+160*y;*v++=ch;*v=attrib;}active_button()/*图表按钮设定函数*/{int i;make_button(0,32,9,38,11,"1");/*每个键对应的位置和数值*/make_button(1,42,9,48,11,"2");make_button(2,52,9,58,11,"3");make_button(3,62,9,67,11,"+");make_button(4,71,9,76,11,"-");make_button(5,32,12,38,14,"4");make_button(6,42,12,48,14,"5");make_button(7,52,12,58,14,"6");make_button(8,62,12,67,14,"*");make_button(9,71,12,76,14,"/");/*“/”的位置*/make_button(10,32,15,38,17,"7");make_button(11,42,15,48,17,"8");make_button(12,52,15,58,17,"9");make_button(13,62,15,67,17,"=");make_button(14,71,15,76,17,"<-");make_button(15,32,18,38,20,"0");/*“0”的位置*/make_button(16,71,18,76,20,"End");for(i=0;i<17;i++){draw_border(button[i].sx,button[i].sy,button[i].ex,button[i].ey,normbut_bor);}for(i=0;i<17;i++){write_top(button[i].sx+1,button[i].sy+1,button[i].ex-1,button[i].head,normnum_but);}}write_top(int x1,int y,int x2,char *s,int attrib){char far *v,far *t;int i;v=vid_mem;for(i=x1;i<=x2;i++){t=v+y*160+i*2;*t++=' ';*t=attrib;}i=(x2-x1-strlen(s)+1)/2+x1;t=v+160*y+i*2;for(;*s;){*t++=*s++;*t++=attrib;}}make_button(int num,int sx,int sy,int ex,int ey,char *top) {button[num].sx=sx;button[num].sy=sy;button[num].ex=ex;button[num].ey=ey;button[num].head=top;button[num].press=0;}out_text_win() /*结果输出窗口*/{draw_border(31,2,75,4,0x7f);write_top(32,3,74," ",0xff);}get_key() /*得到按键值*/{union inkey /*共用体*/{char ch[2];int i;}c;c.i=bioskey(0);return(c.i);}window_xy(int x,int y){union REGS r; /*定义联合体*/r.h.ah=2; /*初始化*/r.h.dh=y;r.h.dl=x;r.h.bh=0;int86(0x10,&r,&r);}key_choice() /*小键盘键的输入函数*/{int ch,bx=0,by=0;/*起始停留键的位置*/do{ch=get_key();switch(ch){case 0x4f31:res_but(bx,by);bx=0;by=0;get_data(bx,by);break;/*图表键和小键盘的键对应,此处为1*/case 0x5032:res_but(bx,by);bx=1;by=0;get_data(bx,by);break;/*2*/case 0x5133:res_but(bx,by);bx=2;by=0;get_data(bx,by);break;/*3*/case 0x4b34:res_but(bx,by);bx=0;by=1;get_data(bx,by);break;/*4*/case 0x4c35:res_but(bx,by);bx=1;by=1;get_data(bx,by);break;/*5*/case 0x4d36:res_but(bx,by);bx=2;by=1;get_data(bx,by);break;/*6*/case 0x4737:res_but(bx,by);bx=0;by=2;get_data(bx,by);break;/*7*/case 0x4838:res_but(bx,by);bx=1;by=2;get_data(bx,by);break;/*8*/case 0x4939:res_but(bx,by);bx=2;by=2;get_data(bx,by);break;/*9*/case 0x5230:res_but(bx,by);bx=0;by=3;get_data(bx,by);break;/*0*/case 0x4e2b :res_but(bx,by);bx=3;by=0;get_data(bx,by);send1();break;/*加*/case 0x4a2d :res_but(bx,by);bx=4;by=0;get_data(bx,by);send1();break;/*减*/case 0x372a :res_but(bx,by);bx=3;by=1;get_data(bx,by);send1();break;/*乘*/case 0x352f:res_but(bx,by);bx=4;by=1;get_data(bx,by);send1();break;/*除*/case 0x0d3d:res_but(bx,by);bx=3;by=2;get_data(bx,by);send2();out_text_win();put_string();break;/*等于号*/case 0x1c0d:res_but(bx,by);bx=2;by=4;get_data(bx,by);send2();out_text_win();put_string();break;/* 回车键(相当与等于号)*/ case 0x0e08:res_but(bx,by);bx=4;by=2;pop();text_clo();break; /*退格(backspace)*/case 0x3920:res_but(bx,by);get_data(bx,by);ba_space(bx,by); break;/* 空格*/case 0x4f00:res_but(bx,by);bx=4;by=3;exit(1);break;/*结束(End)*/case 0x4800:res_but(bx,by);by--;break;/* 上*/case 0x4b00:res_but(bx,by);bx--;break;/* 左*/case 0x5000:res_but(bx,by);by++;break;/* 下*/case 0x4d00:res_but(bx,by);bx++;break;/* 右*/}if(bx<0)bx=0; /* 只能在X0到4和Y在0到4内选择按键*/if(by<0)by=0;if(by>4)by=4;if(bx>4)bx=4; /* 只能在X0到4和Y在0到4内选择按键*/select_but(bx,by);}while(1);}ba_space(int x,int y){int num;char ch;if(y>2)if(x<2)num=15;else num=16;else num=x+5*y;switch(num){case 3:send1();break;case 13:send2();out_text_win();put_string();break;case 4:send1();break;case 8:send1();break;case 9:send1();break;case 16:exit(1);break;/*图表对应的结束键*/case 14:pop();text_clo();break;/*“〈—”对应功能*/default:;}}text_clo() /*文本光标*/{tx--; /*光标向左移*/if(tx<32)tx++; /*backspace时X不能小于32*/put_char(tx,ty,'');}put_string() /*计算机运算函数*/{float result;tx=32;switch(tag) /*根据运算符号计算*/{case '+': result=v1+v2;break; /*做加法*/case '-':result=v1-v2;break; /*做减法*/case'*':result=v1*v2;break; /*做乘法*/case '/': result=v1/v2;break; /*做除法*/default :result=v1; /*若不计算输出0*/}sprintf(stack.s,"%.3f",result); /*输出结果保留小数点后三位*/ while(stack.s[stack.top]){put_char(tx,ty,stack.s[stack.top++]);tx++;}}send1() /*向服务器发送请求*/{sscanf(stack.s,"%f",&v1); /*输入并储存在V1中*/clear_stack(); /*清除栈*/}send2() /*向服务器发送信息*/{sscanf(stack.s,"%f",&v2);clear_stack(); /*清除栈*/}get_data(int x,int y) /*键的移动和对应数值关系*/{int num;char ch;if(y>2)if(x<2)num=15;else num=16; /*使得第3行只能取的0键和End键*/ else num=x+5*y; /*其余各键坐标和原来设定的值的关系*/ switch(num) /*使得图表面键和实际键一致*/{case 0:ch='1';break; /*图表面1键和实际1一致*/case 1:ch='2';break;case 2:ch='3';break;case 3:ch='+';break;case 4:ch='-';break;case 5:ch='4';break;case 6:ch='5';break;case 7:ch='6';break;case 8:ch='*';break;case 9:ch='/';break;case 10:ch='7';break;case 11:ch='8';break;case 12:ch='9';break;case 13:ch='=';break;case 15:ch='0';break; /*图表面0键和实际0一致*/default:ch=1;}if(ch!=1){put_char(tx,ty,ch);if(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/')push(ch);else tag=ch;tx++;}}select_but(int x,int y) /*选择按钮*/{int num;if(y>2)if(x<2)num=15;else num=16;else num=x+5*y;draw_border(button[num].sx,button[num].sy,button[num].ex,button[num].ey,presbut_but);write_top(button[num].sx+1,button[num].sy+1,button[num].ex-1,button[num].head,presnum_but) ;}res_but(int x,int y){int num;if(y>2)if(x<2)num=15;else num=16;else num=x+5*y;if(num<16){draw_border(button[num].sx,button[num].sy,button[num].ex,button[num].ey,normbut_bor);write_top(button[num].sx+1,button[num].sy+1,button[num].ex-1,button[num].head,normnum_but );}else{draw_border(button[num].sx,button[num].sy,button[num].ex,button[num].ey,normbut_bor);write_top(button[num].sx+1,button[num].sy+1,button[num].ex-1,button[num].head,spebut_char);}}put_char(int x,int y,char ch) /*计算窗口的输入确定函数*/{char far *v;v=vid_mem;v+=x*2+y*160; /*光标的位置*/*v++=ch; /*输入字符随光标的推进*/*v=0xf0; /*输入数字的颜色*/window_xy(x,y); /*光标在窗口坐标*/}calculator() /*计算器构成的函数*/{int a,b;key_choice(); /*键选择函数*/}write_text(int x,int y,char *s,int attrib) /*文本输入函数*/{char ch;int lx=x,ly=y;for(;*s;){ch=*s++;switch(ch){case '\n':lx=x;ly++;break;default:write_char(lx++,ly,ch,attrib);}}}menu() /*左边窗口函数*/{ char *j="方向键\n移动!""\n空格键\n确定!\n可用小键盘\n输入!\n用小窗口\n显示"; /*左边框中显示的字符*/ char *s="设计人员\n1 \n2 \n3 \n ""\n组长:K ";draw_border(0,0,29,24,win_color); /*左边框的位置和颜色*/write_top(1,2,28,"操作步骤",0xf9);/*INTRODCTION的位置和颜色*/write_text(2,5,j,0x79); /*输入字符的位置和颜色*/write_text(2,17,s,0x79); /*输入字符的位置和颜色*/}main(){init_stack();vid_mem=(char far *)0xb8000000;if(!form_win()){printf("can't form the device,press any key to leave!...");/*如果不能显示见面窗口,按任意退出。