C语言简易计算器的实现

合集下载

c语言简易计算器

c语言简易计算器

#include <stdio.h>char token;/*定义程序要使用到的一些函数*/void match( char expectedToken ) /*对当前的标志进行匹配*/{if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/ else{printf("cannot match\n");exit(1); /*匹配不成功,退出程序*/}}int low( void )/*用于计算表达式中级别最低的运算*/{int result = mid(); /*计算比加减运算优先级别高的部分*/while(( token == '+' ) || ( token == '-' ))if ( token == '+'){match('+'); /*进行加法运算*/result += mid();break;}else if ( token == '-'){match('-'); /*进行减法运算*/result -= mid();break;}return result;}int mid( void )/*用于计算表达式中级别较高的运算*/{int div; /*除数*/int result = high(); /*计算比乘除运算优先级别高的部分*/while(( token == '*' ) || ( token == '/' ))if ( token == '*'){match('*'); /*进行乘法运算*/result *= high();break;}else if (token == '/'){match('/'); /*进行除法运算*/div = high();if( div == 0 ) /*需要判断除数是否为0*/{printf( "除数为0.\n" );exit(1);}result /= div;break;}return result;}int high( void )/*用于计算表达式中级别最高的运算,即带()的运算*/{int result;if( token == '(' ) /*带有括号的运算*/{match( '(' );result = low();/*递归计算表达式*/match(')');}else if ( token>= '0'&&token<='9' ) /*实际的数字*/{ungetc( token, stdin ); /*将读入的字符退还给输入流,为读取整个数*/scanf( "%d", &result ); /*读出数字*/token = getchar(); /*读出当前的标志*/}else{printf("The input has unexpected char\n"); /*不是括号也不是数字*/exit(1);}return result;}main(){int result; /*运算的结果*/printf("*****************************************\n");printf("**Welcome to use this simple calculator**\n");printf("**Please input a multinomial like **\n");printf("** 6-3*(5-1)/2+14/7 **\n");printf("*****************************************\n");token = getchar(); /*载入第一个符号*/result = low(); /*进行计算*/if( token == '\n' ) /* 是否一行结束*/printf( "The answer is : %d\n", result );else{printf( "Unexpected char!");exit(1); /* 出现了例外的字符*/}scanf("%d",result);return 0;}。

C语言实现简单的计算器(加、减、乘、除)

C语言实现简单的计算器(加、减、乘、除)

C语⾔实现简单的计算器(加、减、乘、除) 利⽤运算符做为swich case 语句条件,实现简单程序的编写;并且对输⼊的运算做判断,除数为零也需做判断;1 #include<stdio.h>23int add(int a, int b);4int sub(int a, int b);5int mul(int a, int b);6int div(int a, int b);789int main(int argc, const char *argv[])10 {11/*12 * 定义接收变量,运算字符;13*/14int a,b,d;15char ch;1617/*18 * 赋初值19*/20 a = 0;21 b = 0;22 ch = '0';232425/*26 * 控制台输⼊运算变量,运算符;27*/28 printf("请输⼊需要计算的数及运算符;格式如:'num1 +-x/ num2' \n");29 scanf("%d%c%d",&a,&ch,&b);3031/*32 * 输⼊数据判断33*/34while((ch != '+')&&(ch != '-')&&(ch != '*')&&(ch != '/'))35 {36//fflush(stdin);此种清空缓冲区⽆效37 setbuf(stdin,NULL);38 printf("输⼊运算符有误,请重新输⼊:\n");39 scanf("%c",&ch);40 }4142/*43 * 除数为0做判断44*/45if((ch == '/')&&(b==0))46 {47 setbuf(stdin,NULL);48 printf("除数不能为0,请重新输⼊:\n");49 scanf("%d",&b);50 }515253/*54 * 识别不同运算字符,做不同的运算;55*/56switch(ch)57 {58case'+':59 printf("%d+%d=%d\n",a,b,add(a,b));60break;61case'-':62 printf("%d-%d=%d\n",a,b,sub(a,b));63break;64case'*':65 printf("%d*%d=%d\n",a,b,mul(a,b));66break;67case'/':68 printf("%d/%d=%d\n",a,b,div(a,b));69break;70default:71 printf("Error\n");72 }7374return0;75 }7677/*78* 定义运算函数79*/80int add(int a, int b) 81 {82return a+b;83 }8485int sub(int a, int b) 86 {87return a-b;88 }8990int mul(int a, int b) 91 {92return a*b;93 }9495int div(int a, int b) 96 {97return a/b;98 }。

C语言程序设计-简单的计算器

C语言程序设计-简单的计算器

- - . 《程序设计基础(C)》课程设计报告简易计算器设计学生姓名:学号:班级:指导老师:日期:309工作室设计目录一、设计目标2二、总体设计4三、详细设计6四、调试与测试12五、分析及结论13六、参考文献14【附录】16一、设计目标设计一个C语言程序(简单计算器设计)具体要求:在功能上功能尽量模拟windows操作系统中的计算器,系统界面不做强制要求。

主要功能:进行+、-、*、/、三角函数、对数、幂等各项数学运算,能够进行进制间的相互转换与计算。

二、总体设计1、程序设计组成框图2、设计思路简单计算器的设计的程序中主要调用的函数有:数学函数的定义和I/O函数;设计思路和理念在于一切追求简便易操作原理,通过个人的构思和设计以及调试运行设计出这一款简单的计算器。

3、程序设计流程图三、详细设计1、功能函数①函数的功能:两数的+、-、*、/计算、求平均函数的入口:从main()的if(flag==1)开关结构中进入,即flag的值为1时进入该函数,从而进行该功能函数的计算。

函数调用关系:被主函数调用,由if()开关结构中进入。

函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构。

2、功能函数②函数的功能: x的y次方的计算、两数的求余、以x为底y的对数函数的入口:从main()的if(flag==2)开关结构中进入,即flag的值为2时进入该函数,从而进行该功能函数的计算。

函数调用关系:被主函数调用,由if()开关结构中进入。

函数的出口:函数的出口为printf("是否继续运算?(Y/N) :"),此时输入“Y”,继续前面的结构。

3、功能函数③函数的功能: 单个数值sin、cos、tan的计算,以e为底的指数、求绝对值函数的入口:从main()的if(flag==3)开关结构中进入,即flag的值为3时进入该函数,从而进行该功能函数的计算。

可视化计算器c语言代码

可视化计算器c语言代码

可视化计算器c语言代码好的,这是一个简易计算器的可视化界面的示例代码,使用`Graphics.h`库实现:```c#include <graphics.h>#include <conio.h>#include <stdio.h>int main() {int gd = DETECT, gm;initgraph(&gd, &gm, "");int x, y, a, b;char c;// 设置文本和背景颜色为白色setcolor(WHITE);// 设置文本方向为水平方向settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);// 在屏幕上输出提示信息和输入框outtextxy(100, 100, "Enter the first number: ");scanf("%d", &a);outtextxy(100, 150, "Enter the second number: ");scanf("%d", &b);setcolor(YELLOW);outtextxy(100, 200, "Choose an operation (+, -, *, /): ");c = getch();// 根据用户选择的操作计算结果switch (c) {case '+':x = a + b;break;case '-':x = a - b;break;case '*':x = a * b;break;case '/':x = a / b;break;default:printf("Invalid operation.\n");return 0;}// 设置文本颜色为绿色setcolor(GREEN);outtextxy(100, 250, "The result is: ");printf("%d\n", x);getch();// 关闭图形界面closegraph();return 0;}```上述代码使用`initgraph()`函数初始化图形界面,在屏幕上显示了几个提示信息和输入框,然后根据用户选择的操作计算结果并输出。

C语言实现简易计算器(可作加减乘除)

C语言实现简易计算器(可作加减乘除)

C语⾔实现简易计算器(可作加减乘除)C语⾔实现简易计算器(加减乘除)计算器作为课设项⽬,已完成答辩,先将代码和思路(注释中)上传⼀篇博客已增添、修改、整理⾄⽆错且可正常运⾏虽使⽤了栈,但初学者可在初步了解栈和结构语法后理解代码#include <stdlib.h>#include <stdio.h>#include <string.h>#define IsDouble 0#define IsChar 1//_______________________________________________________________________________________________________________________________________________________ //1.⽀持浮点数和字符的栈typedef struct {char * buffer;int typesize;int top;int max;} stack;stack * CreateStack(int max, int typesize);//创建⼀个栈void DestroyStack(stack *);//释放栈的空间void ClearStack(stack *);//清空栈int Push(stack *, void *);//⼊栈int Pop(stack *, void *);//出栈int GetSize(stack *s);//得到栈的⼤⼩int GetTop(stack *, void *);//找到栈顶int IsEmpty(stack *);//判断是否为空栈,空则下溢int IsFull(stack *);//判断栈是否已满,满则溢出stack * CreateStack(int max, int typesize){stack * s = (stack*)malloc(sizeof(stack));//为栈s malloc内存if (!s) return 0;//为结构中buffer元素malloc内存s->buffer = (char *)malloc(sizeof(char) * max * typesize);if (!s->buffer) return 0;//初始化结构中的栈顶,最⼤值,类型⼤⼩s->top = -1;s->max = max;s->typesize = typesize;return s;}void DestroyStack(stack* s){free(s->buffer);//先释放buffer的空间free(s);//在释放s的空间}void ClearStack(stack * s){s->top = -1;//清空栈(栈头位置归零)}int Push(stack * s, void * data){if (IsFull(s)) return 0;//如果栈已满则return 0,防⽌溢出//栈未满则将栈头移动打动下⼀位置,并将data中的元素拷⼊栈中buffer的第top位置s->top++;memcpy(s->buffer + s->top*s->typesize, data, s->typesize);//⼊栈成功return 1return 1;}int Pop(stack * s, void * data){if (IsEmpty(s)) return 0;//出栈判断栈是否为空,若为空则return 0//栈未空则将buffer中top位置的字符拷⼊data记录,并让栈头向前移动⼀个位置memcpy(data, s->buffer + s->top*s->typesize, s->typesize);s->top--;//成功则return 1return 1;}int GetSize(stack *s){return s -> top+1;//栈头位置+1得到⼤⼩}int GetTop(stack *s, void * data){if (IsEmpty(s)) return 0;//如果栈空return 0//栈不为空则将top位置的字符拷回data记录,得到栈头memcpy(data, s->buffer + s->top*s->typesize, s->typesize);//成功则return 1;return 1;}int IsEmpty(stack * s){return s->top == -1;//如果top为-1则栈空}int IsFull(stack * s){return s->top == s->max-1;//如果top为max-1则栈满}//___________________________________________________________________________________________________________________________________________________ //2.定义⼀个cal类型,其中data存数时sign为IsDouble,存字符时,sign为Ischartypedef struct {double data;char sign;} cal;//3.查找对应符号(找到则返回该符号下标)(找不到则说明该部分为数字返回-1)int SearchCode(char ch){char * code = "+-*/()@";//@为终⽌符,算式输⼊结束int index = 0;//while (code[index]){if (code[index] == ch) return index;index++;}return -1;}//4.得到两个符号间的优先级//与SearchCode相对应,char GetPriority(char ch, char next){//创建⼀个perferen表,第i⾏(列)对应SearchCode函数中code中的第i个字符char perferen[7][7] = {">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=E",">>>>E>>","<<<<<E="};//找到两个形参对应的字符int c = SearchCode(ch);int n = SearchCode(next);//如果找不到对应运算符(字符不是运算符⽽是为数字)return Eif (c==-1 || n==-1) return 'E';//如果找到两个对应运算符则按照优先级表返回两个运算符的优先级return perferen[c][n];}//5.四则运算double add(double a, double b) { return a+b; }double sub(double a, double b) { return a-b; }double mul(double a, double b) { return a*b; }double ddiv(double a, double b) { return a/b; }//整合四种运算double calcu(double a, char ch, double b){double (*calculation[4])(double,double) = {add,sub,mul,ddiv};return calculation[SearchCode(ch)](a,b);}//6.检测字符串int CheckStr(char * buffer){int n;//遍历字符串确保算式中⽆⾮法字符若检测到⾮法字符return 0,若都合法则return 1for (n = 0;buffer[n];n++){if ((SearchCode(buffer[n]) != -1 || buffer[n] == '.' || (buffer[n] >= '0' && buffer[n] <= '9')) && buffer[n] != '@') continue;else return 0;}buffer[n] = '@';//加上终⽌符,表⽰算式结束buffer[n+1] = '\0';return 1;}//7.得到数据转化为double类型存⼊rsint GetDigit(char * buffer, int * n, double * rs){char str[30];int i,j = 0;for (i = 0;SearchCode(buffer[*n]) == -1;i++){str[i] = buffer[*n];//从*n位置开始,将这⼀串数字字符存⼊str(*n)++;}str[i] = '\0';for (i = 0;str[i];i++){if (str[i] == '.') j++;}//如果⼀段⼩数有多个⼩数点或⼩数点在数字⾸尾,return 0if (j>1 || str[i-1] == '.' || str[0] == '.') return 0;//rs接收转化为double的数据*rs = atof(str);//操作成功return 1return 1;}//8.将⽤户输⼊的buffer字符串转化为可供程序运算的calstr数组int resolu(char * buffer, cal * calstr){int i = 0, j = 0;cal c;while (buffer[i]){if (SearchCode(buffer[i]) == -1){//如果得到数据不成功则return 0if (GetDigit(buffer,&i, &c.data) == 0) return 0;//如果成功得到数据则在c.sign标记为浮点数c.sign = IsDouble;//将c存⼊数组calstr中calstr[j++] = c;}else{//若符号为运算符//判断正负号if (buffer[i] == '-' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '-')){ i++;if (GetDigit(buffer,&i, &c.data) == 0) return 0;//在符号的下⼀位开始查找,若找不到数字return 0//否则,给数字取相反数,c.sign标记为浮点数,存⼊calstr中c.data = 0 - c.data;c.sign = IsDouble;calstr[j++] = c;} else//如果是正号,与符号处理⽅式同理if (buffer[i] == '+' && (buffer[i-1] == '('||buffer[i-1] == '+'||buffer[i-1] == '-'||buffer[i-1] == '*'||buffer[i-1] == '/') || (i==0 && buffer[0] == '+')){ i++;if (GetDigit(buffer, &i, &c.data) == 0) return 0;c.sign = IsDouble;calstr[j++] = c;}else{//如果不是正负号,则为运算符,先强制转换为double类型存在c.data⾥,然后c.sign标记为char类型,存⼊calstrc.data = (double)buffer[i++];c.sign = IsChar;calstr[j++] = c;}}}//操作蔡成功则return 1return 1;}//9.计算出结果int result(cal * calstr, double * rs){stack * pst = CreateStack(100,sizeof(char));//运算符栈stack * pnd = CreateStack(100,sizeof(double));//数据栈double num1,num2;int n = 0;char ch = '@';Push(pst, &ch);//在转换得到的calstr中遍历直到终⽌符'@"while(ch != '@' || !(calstr[n].sign == IsChar && (char)calstr[n].data == '@')){//如果calstr的n位上是浮点数,则将这个data压栈进⼊数据栈pnd中if (calstr[n].sign == IsDouble){Push(pnd, &(calstr[n].data));n++;}//反之,如果是运算符,则要检测优先级else{switch( GetPriority(ch, (char)calstr[n].data)){//如果运算符优先级较⼩,则让ch等于优先级⼤的符号并压⼊符号栈pst中case '<':ch = (char)calstr[n].data;Push(pst, &ch);n++;break;//如果结果为等号,让符号出栈暂存到ch中case '=':if (!Pop(pst, &ch)) return 0;n++;break;//如果ch优先级较⾼,则将前两个数字及运算符出栈,分别储存⾄num2,ch,num1中,进⾏运算,得到的结果再次压栈进⼊pnd中 case '>':if (!(Pop(pnd,&num2) && Pop(pst,&ch) && Pop(pnd,&num1))) return 0;num1 = calcu(num1,ch,num2);Push(pnd, &num1);break;//如果符号顺序出错,return 0case 'E':return 0;}}//检测是否可以得到栈顶符号,栈空则return 0if (!GetTop(pst, &ch)) return 0;}//如果栈中得到了最终结果,并且取出pnd中的最终结果到rs,return 1if (GetSize(pnd) == 1 && GetTop(pnd,rs)){DestroyStack(pst);DestroyStack(pnd);return 1;}//否则 return 0else{return 0;}}//10.⽤户交互函数void treatment(){char buffer[100];//⽤户输⼊的字符串(算式)cal calstr[50];//计算⽤的数组double rs = 0;//计算结果printf("Enter your equation:");gets(buffer);//让⽤户输⼊算式buffer//⽤户不输⼊"exit"就不退出while (!(buffer[0]=='e' && buffer[1]=='x' && buffer[2]=='i' && buffer[3]=='t')){//检查buffer中字符君合法,成功将buffer转化为⽤于计算的calstr数组,成功计算出结果存⼊rsif (CheckStr(buffer) && resolu(buffer,calstr) && result(calstr,&rs)){printf("\n%lf\n",rs);}else{printf("\nError!\n");}printf("Enter \"exit\"to quit");printf("\nEnter your equation:");gets(buffer);//再次让⽤户输⼊算式}printf("\nbye\n");}//11.主函数int main(){treatment();}参考⽂献链接如下[参考⽂献]()。

用c语言写的简单计算器

用c语言写的简单计算器

⽤c语⾔写的简单计算器这是⾃⼰在学习C语⾔,凭借⾃⼰的兴趣,将课本的知识运⽤后整理的关于C语⾔计算器的代码。

计算器实现的功能有:加、减、乘、除、求余。

功能简单,但对于初学者的我来说能把它写出来,排除每个错误依旧是个难题。

前后两种代码是由⾃⼰所学东西的质量决定的,如有错误,请前辈指出。

最初版本的计算器:1 #include<stdio.h>23int checkPassword();45int add(int x,int y);67int sub(int x,int y);89int multi(int x,int y);1011float quo(float x1,float y1);1213int com(int x,int y);1415int x,y;1617int result;1819int select;2021float result1;2223float x1,y1;2425int success,psw;2627int a;2829int i;3031int t;323334353637void main()3839 {4041 printf("请输⼊密码:\n");4243 i=0;4445do{46474849 scanf("%d",&a);50515253if( a!=1234 && i<2)5455 printf("请重新输⼊密码:\n");5657else5859 i=3;6061 i++;6263 }while( i<=2);6465if(a==1234)6667 {6869for(t=1;t!=6;t=select)7071 {72737576777879 printf("+=============================+\n"); 8081 printf("+======计=算=器=主=菜=单======+\n"); 8283 printf("+=============================+\n"); 8485 printf("+==========1、加法==========+\n"); 8687 printf("+==========2、减法==========+\n"); 8889 printf("+==========3、乘法==========+\n"); 9091 printf("+==========4、除法==========+\n"); 9293 printf("+==========5、求余==========+\n"); 9495 printf("+==========6、退出==========+\n"); 9697 printf("+=============================+\n"); 9899100101102103 printf("请输⼊你的选择:\n");104105 scanf("%d",&select);106107108109switch(select)110111 {112113114115case1:116117 printf("请输⼊两个数:\n");118119 scanf("%d%d",&x,&y);120121 result=add(x,y);122123 printf("%d+%d=%d\n",x,y,result);124125break;126127case2:128129 printf("请输⼊两个数:\n");130131 scanf("%d%d",&x,&y);132133 result=sub(x,y);134135 printf("%d-%d=%d\n",x,y,result);136137break;138139case3:140141 printf("请输⼊两个数:\n");142143 scanf("%d%d",&x,&y);144145 result=multi(x,y);146147 printf("%d*%d=%d\n",x,y,result);148149break;150151case4:152153 printf("请输⼊两个数:\n");154155 scanf("%f%f",&x1,&y1);156157 result1=quo(x1,y1);159 printf("%f/%f=%f\n",x1,y1,result1); 160161break;162163case5:164165 printf("请输⼊两个数:\n");166167 scanf("%d%d",&x,&y);168169 result=com(x,y);170171 printf("%d/%d=%d\n",x,y,result); 172173break;174175case6:176177break;178179default:180181 printf("请输⼊1~5之间的数\n"); 182183break;184185186187188189 }190191 }192193 }194195 }196197int add(int x,int y)198199 {200201int sum;202203 sum=x+y;204205return sum;206207 }208209int sub(int x,int y)210211 {212213int sub;214215 sub=x-y;216217return sub;218219 }220221int multi(int x,int y)222223 {224225int multi;226227 multi=x*y;228229return multi;230231 }232233float quo(float x,float y)234235 {236237float quo;238239 quo=x/y;240241return quo;243 }244245int com(int x,int y)246247 {248249int com;250251 com=x%y;252253return com;254255 }256257int checkPassword( int psw)258259 {260261if(psw==1234)262263 success=1;264265else266267 success=-1;268269return success;270271 }改版后的计算器:1 #include<stdio.h>23int yanzheng(int );45void caidan();67void jiafa(int,int);89void jianfa(int,int);1011void chengfa(float,float);1213void chufa(float,float);1415void mo(int,int);16171819void main(){2021int x,m;2223int y;2425float a,b;2627 printf("请输⼊密码:\n");2829 scanf("%d",&x);3031 m=yanzheng(x);3233if(m==1){3435 caidan();3637//int y;3839//float a,b;4041for(;y!=6;){4243 printf("请输⼊选项:\n"); 4445 scanf("%d",&y);4647if(y>=1 && y<6){4849 printf("请输⼊要运算的两个数:\n");5051 scanf("%f%f",&a,&b);5253 }54555657switch(y){5859case1 :jiafa(a,b);break;6061case2 :jianfa(a,b);break;6263case3 :chengfa(a,b);break;6465case4 :chufa(a,b);break;6667case5 :mo(a,b);break;6869case6 :break;7071default : printf("选项输⼊错误!请重试\n");break; 7273 }7475 }7677 }7879 }808182838485int yanzheng(int x){8687int i,m;8889for(i=1,m=0;i<3;i++){9091if(x==1234){9293 m=1;9495break;9697 }9899 printf("请重新出⼊密码:");100101 scanf("%d",&x);102103104105 }106107return m;108109 }110111112113void caidan(){114115 printf("+=============================+\n"); 116117 printf("+======计=算=器=主=菜=单======+\n"); 118119 printf("+=============================+\n"); 120121 printf("+==========1、加法==========+\n"); 122123 printf("+==========2、减法==========+\n"); 124125 printf("+==========3、乘法==========+\n"); 126127 printf("+==========4、除法==========+\n"); 128129 printf("+==========5、求余==========+\n"); 130131 printf("+==========6、退出==========+\n"); 132133 printf("+=============================+\n"); 134135 }136137138139void jiafa(int x,int y){140141int sum;142143 sum=x+y;144145 printf("%d\n", sum);146147 }148149150151void jianfa(int x,int y){152153int cha;154155 cha=x-y;156157 printf("%d\n", cha);158159 }160161162163void chengfa(float x,float y){164165float ji;166167 ji=x*y;168169 printf("%f\n", ji);170171 }172173174175void chufa(float x,float y){176177float shang;178179 shang=x/y;180181 printf("%f\n", shang);182183 }184185186187void mo(int x,int y){188189int mo;190191 mo=x%y;192193 printf("%d\n", mo);194195 }。

C语言简易计算器的实现

C语言简易计算器的实现

C语言简易计算器的实现C语言简易计算器是一种用于进行基本数学运算的程序。

实现一个简易计算器的关键是要能够解析用户输入的数学表达式,并将其转化为计算机可以理解的形式,然后进行计算,并输出结果。

下面是一个大约1200字以上的示例实现。

```c#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <ctype.h>#define MAX_SIZE 100//定义操作符的优先级int getPriority(char op)if (op == '+' , op == '-')return 1;else if (op == '*' , op == '/')return 2;elsereturn 0;//进行四则运算int calculate(int a, int b, char op)switch (op)case '+': return a + b;case '-': return a - b;case '*': return a * b;case '/': return a / b;default: return 0;}//将中缀表达式转换为后缀表达式void infixToPostfix(char* infixExp, char* postfixExp) char stack[MAX_SIZE];int top = -1;int j = 0;for (int i = 0; infixExp[i] != '\0'; i++)if (isdigit(infixExp[i])) { // 数字直接输出到后缀表达式while (isdigit(infixExp[i]))postfixExp[j++] = infixExp[i++];}postfixExp[j++] = ' ';i--;}else if (infixExp[i] == '(') { // 左括号压入栈stack[++top] = infixExp[i];}else if (infixExp[i] == ')') { // 右括号弹出栈内所有操作符并输出到后缀表达式,直到遇到左括号while (top != -1 && stack[top] != '(')postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';}top--; // 弹出栈顶的左括号}else { // 操作符while (top != -1 && getPriority(stack[top]) >=getPriority(infixExp[i]))postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';stack[++top] = infixExp[i];}}while (top != -1) { // 将栈内剩余操作符弹出并输出到后缀表达式postfixExp[j++] = stack[top--];postfixExp[j++] = ' ';}postfixExp[j] = '\0';//计算后缀表达式的值int evaluatePostfix(char* postfixExp)char stack[MAX_SIZE];int top = -1;for (int i = 0; postfixExp[i] != '\0'; i++)if (isdigit(postfixExp[i])) { // 数字压入栈int num = 0;while (isdigit(postfixExp[i]))num = num * 10 + (postfixExp[i++] - '0');stack[++top] = num;i--;}else if (postfixExp[i] == ' ')continue;}else { // 操作符,弹出栈顶的两个数进行计算,并将结果压入栈int b = stack[top--];int a = stack[top--];int result = calculate(a, b, postfixExp[i]);stack[++top] = result;}}return stack[top];int maichar infixExp[MAX_SIZE];printf("请输入中缀表达式:");fgets(infixExp, sizeof(infixExp), stdin); // 读取用户输入//将中缀表达式转换为后缀表达式char postfixExp[MAX_SIZE];infixToPostfix(infixExp, postfixExp);printf("后缀表达式为:%s\n", postfixExp);//计算后缀表达式的值并输出int result = evaluatePostfix(postfixExp);printf("计算结果为:%d\n", result);return 0;```这个简易计算器的实现基于栈的数据结构。

C语言实现简单计算器程序

C语言实现简单计算器程序

C语⾔实现简单计算器程序这两天在看⼀个C语⾔写的计算器程序,做了不少的功夫,跟着作者⼀步步的进⾏完善,了解了许多细节性的东西,在此⾃⼰做个总结,加深⾃⼰对程序的印象,也算是梳理。

在该计算器程序,能进⾏加减乘除、sin、cos、exp等操作,同时能进⾏数值保存功能。

⽽该计算器使⽤逆波兰表⽰法。

即所有运算符都跟在操作数的后⾯,⽐如下列表达式:(1 - 2) * (4 + 5)采⽤逆波兰表⽰法表⽰为:1 2 - 4 5 + *逆波兰表达法中不需要圆括号,只要知道每个运算符需要⼏个操作数就不会引起歧义。

计算器程序实现很简单,具体原理如下:while(/* 下⼀个运算符或操作数不是⽂件结束指⽰符 */)if(/* 是数 */)/* 将该数压⼊到栈中 */else if (/* 是运算符 */)/* 弹出所需数⽬的操作数 *//* 执⾏运算 *//* 将结果压⼊到栈中 */else if (/* 是换⾏符 */)/* 弹出并打印栈顶的值 */else/* 出错 */在程序设计中,使⽤模块化思想,getop函数来进⾏读⼊,该函数返回⼀个标识,⽤来标识读⼊的是什么类型。

主循环体中根据该标识执⾏相应的动作。

以下是该程序:(我将所有函数和变量放在同⼀⽂件)#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXOP 100#define NUMBER '0' //标识读⼊的是数字#define NAME 'n' //标识读⼊的是字符串(函数名或⾮法字符串)#define ALPHA 26int getop(char []);void push (double); //压栈double pop(void); //出栈void clear(void); //清空栈void mathfnc(char []); //执⾏相应的数学函数sin、cos、exp等int main(void){int type;int i, var = 0;double op1, op2,v;char s[MAXOP];double variable[ALPHA];for (i = 0; i < ALPHA; i++) //初始化⽤于保存数值的变量数组variable[i] = 0.0;while ((type = getop(s)) != EOF) //读取输⼊{switch (type){case NUMBER:push (atof(s));break;case NAME:mathfnc(s);break;case '+':push (pop() + pop());break;case '*':push (pop() * pop());break;case '-':op2 = pop();push (pop() - op2);break;case '/':op2 = pop();if (op2 != 0.0)push (pop() / op2);elseprintf ("error: zero divisor\n");break;case '%':op2 = pop();if (op2 != 0.0)push (fmod(pop(), op2));elseprintf ("error: zero divisor\n");break;case '?': //打印栈顶元素op2 = pop();printf ("\t%.8g\n", op2);push (op2);break;case '=': //保存数值pop();if (var >= 'A' && var <= 'Z')variable[var - 'A'] = pop();elseprintf ("error: no variable name\n");break;case 'c':clear();break;case 'd': //复制栈顶元素op2 = pop();push(op2);push(op2);break;case 's': //交换栈元素op1 = pop();op2 = pop();push(op1);push(op2);case '\n':v = pop(); //v保存最后的⼀次结果printf ("\t%.8g\n", v);break;default:if (type >= 'A' && type <= 'Z')push(variable[type - 'A']);else if (type == '@') //输⼊的字符@表⽰最近⼀次结果值 push(v);elseprintf ("error: unknown command %s\n", s);break;}var = type;}return 0;}/* ----------------------------------------------------------- */#define MAXVAL 100int sp = 0; //标识栈顶double val[MAXVAL];void push(double f){if (sp < MAXVAL)val[sp++] = f;elseprintf ("error: stack full, can't push %g\n", f);}double pop(void){if (sp > 0)return val[--sp];else{printf ("error: statck empty\n");return 0.0;}}void clear(void){sp = 0;}void mathfnc (char s[]){double op2;if (strcmp (s, "sin") == 0)push(sin(pop()));else if(strcmp (s, "cos") == 0)push(cos(pop()));else if(strcmp (s, "exp") == 0)push(exp(pop()));else if(strcmp (s, "pow") == 0){op2 = pop();push (pow(pop(), op2));}elseprintf ("error: %s not supported\n", s);}/* ----------------------------------------------------------- */#include <ctype.h>int getch(void);void ungetch(int);int getop(char s[]){int i, c;while ((s[0] = c = getch()) == ' ' || c == '\t') //过滤开头的空⽩字符;s[1] = '\0';i = 0;if (islower(c)) //判断是否为⼩写字母,也即读取由⼩写字母组成的字符串 {while (islower(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);if (strlen (s) > 1)return NAME;elsereturn c;}if (!isdigit(c) && c != '.' && c != '-')return c;if (c == '-') //⽤于判断是负数还是减操作{if (isdigit(c = getch()) || c == '.')s[++i] = c;else{if (c != EOF)ungetch(c);return '-';}}if (isdigit(c)) //收集整数部分while (isdigit(s[++i] = c = getch()));if (c == '.') //收集⼩数部分while (isdigit(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);return NUMBER;}/* ----------------------------------------------------------- *//** 引⽤以下两个函数是因为:程序不能确定它已经读⼊的输⼊是否⾜够 ** 除⾮超前多读⼊⼀些输⼊,在本程序中,读⼊⼀些字符合成⼀个数字 ** 所以在看到第⼀个⾮数字字符之前,已经读⼊的数的完整性是不能确定的* 由于程序要超前读⼊⼀个字符,这样就导致最后⼜⼀个字符不属于当前所要读⼊的数*/#define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void){return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch (int c){if (bufp >= BUFSIZE)printf ("ungetch: too many characters\n");elsebuf[bufp++] = c;}该程序虽然简单,但是还是存在⼀些⼩⼩的问题,⽐如没有数据时进⾏pop的话,会打印栈中⽆数据同时返回数值0.0,在循环体中许多执⾏操作会将该数值保存到栈中,之后打印该值,⽤户体验度⽐较差。

C语言简单计算器原理——表达式求值(采用逆波兰表达式和栈结合)

C语言简单计算器原理——表达式求值(采用逆波兰表达式和栈结合)

C语⾔简单计算器原理——表达式求值(采⽤逆波兰表达式和栈
结合)
表达式的求解的关键是将其转换成逆波兰表达式(即后缀表达式,如1+2*3它的逆波兰表达式为123*+),在后缀表达式中已经考虑了运算符的优先级,
没有括号,只有操作数和运算符。

算术表达式转换成后缀表达式⽅法如下:
依次从键盘输⼊表达式的字符ch,对于每个ch:
(1)若ch为数字则直接将其放⼊后缀数组exp中并以#号标记数值串结束。

(2)若ch为"(",则直接将其压⼊字符栈op中。

(3)若ch为")",则将栈中"("以前的字符依次全部删除并将其放⼊后缀数组exp中,然后再将字符ch放⼊字符栈op中。

(4)若ch为"+"."-",则将栈中"("以前的运算符依次全部删除并将其放⼊后缀数组exp中,然后再将ch放⼊op栈中。

(5)若ch为"*"."/",则将栈顶连续的"*"."/"删除,并放⼊后缀数组exp中,然后将ch放⼊op栈中。

(6)若字符串str扫描完毕,则将栈中所有运算符删除并放⼊后缀数组exp,最后在后缀数组exp中便可得到后缀表达式。

在对后缀表达式求值时要⽤到⼀个数值栈st,在后缀数组exp中从头开始扫描,若是数字则将其放⼊数值栈中,
若遇到字符就进⾏两次退栈,并将运算结果再放⼊栈中,如此重复下去,最后当后缀数组扫描完后数值栈st的栈顶元素便是所要求的表达式的值。

cencot 编写c -回复

cencot 编写c -回复

cencot 编写c -回复题目: 用C语言编写一个简单的计算器程序引言:计算器程序是我们日常生活中经常使用的一种工具。

虽然现代手机、电脑等设备已经提供了强大的计算功能,但了解和掌握计算器程序的编写仍然对我们理解计算原理和提高编程能力有着重要的意义。

本篇文章将逐步介绍如何用C语言编写一个简单的计算器程序。

第一步: 确定需求和功能在开始编写计算器程序之前,我们应该确定我们的计算器应该具备哪些功能。

通常,一个基本的计算器程序应该包括加法、减法、乘法和除法四则运算,以及能够接受用户的输入并显示计算结果。

现在我们可以开始编写我们的C程序。

第二步: 初始化变量和函数计算器程序需要使用一些变量来存储用户的输入和计算结果。

我们可以定义变量来存储这些值。

此外,我们还需要一些函数来执行加法、减法、乘法和除法运算。

在C语言中,我们可以定义函数来实现这些功能。

下面是一些常用的函数和变量的示例代码:c#include<stdio.h>int num1, num2; 存储用户输入的两个操作数int result; 存储计算结果加法函数int add(int a, int b) {return a + b;}减法函数int subtract(int a, int b) {return a - b;}乘法函数int multiply(int a, int b) {return a * b;}除法函数int divide(int a, int b) {if (b == 0) {printf("Error: Cannot divide by zero!");return 0;} else {return a / b;}}int main() {主函数体等待用户输入操作数printf("Please enter two numbers: ");scanf("dd", &num1, &num2);执行加法运算并打印结果result = add(num1, num2);printf("Addition: d + d = d\n", num1, num2, result);执行减法运算并打印结果result = subtract(num1, num2);printf("Subtraction: d - d = d\n", num1, num2, result);执行乘法运算并打印结果result = multiply(num1, num2);printf("Multiplication: d * d = d\n", num1, num2, result);执行除法运算并打印结果result = divide(num1, num2);printf("Division: d / d = d\n", num1, num2, result);return 0;}第三步: 编译和运行程序完成上述代码后,我们可以使用C编译器来编译并运行我们的程序。

c语言计数器程序代码

c语言计数器程序代码

c语言计数器程序代码计数器是一种常用的程序功能,可以用来记录某个事件的发生次数或者进行循环计数。

在C语言中,可以使用变量和循环结构来实现一个简单的计数器程序。

下面是一个简单的计数器程序的代码示例:```c#include <stdio.h>int main() {int count = 0; // 初始化计数器变量为0printf("开始计数...\n");// 循环执行计数操作,每次循环计数器加1,直到达到目标计数值while (count < 10) {printf("当前计数:%d\n", count);count++; // 计数器自增1}printf("计数结束。

\n");return 0;}```上述代码使用了一个整型变量 `count` 作为计数器,并将初始值设为0。

然后使用 `while` 循环进行计数操作,每次循环中打印出当前计数值,并使计数器自增1,直到计数器的值达到目标值(此处为10)时结束循环,最后打印出计数结束的提示信息。

通过运行上述代码,我们可以得到如下的输出结果:```开始计数...当前计数:0当前计数:1当前计数:2当前计数:3当前计数:4当前计数:5当前计数:6当前计数:7当前计数:8当前计数:9计数结束。

```上述代码示例只是一个最简单的计数器程序,实际应用中可以根据需要进行扩展和修改。

下面是一些相关参考内容,供进一步学习和开发计数器程序时参考:1. C语言基础知识:了解C语言的基本语法、数据类型、变量和运算符等,是学习和编写计数器程序的基础。

2. 循环结构:掌握C语言中的循环结构,包括 `for` 循环、`while` 循环和 `do-while` 循环等,以及循环控制语句如 `break` 和 `continue`,可以灵活运用于计数器程序的实现。

3. 程序流程控制:了解C语言中的条件语句如 `if-else` 和`switch`,以及逻辑运算符、比较运算符等,可以根据需要在计数器程序中加入条件判断,实现更加灵活的计数器功能。

c语言计算器原理

c语言计算器原理

c语言计算器原理随着计算机技术的发展,计算器作为基本的数学运算工具,已经广泛地应用于各个领域。

在计算机编程中,C语言是一种通用的、面相过程的编程语言,它可以用来开发各种类型的应用程序,包括计算器。

本文将介绍使用C语言编写计算器的原理和方法。

一、计算器的基本原理计算器的基本原理是利用数学运算的原理,通过编程实现加、减、乘、除等基本运算功能。

在C语言中,可以使用各种运算符和函数来实现这些运算,例如“+”、“-”、“*”、“/”等运算符,以及“abs”、“sqrt”等函数。

这些运算符和函数可以被嵌入到程序中,以实现各种复杂的数学运算。

二、计算器的设计思路设计一个计算器需要考虑到以下几个问题:1.用户界面:计算器需要有一个直观、易于使用的用户界面,以便用户能够输入要计算的表达式并得到结果。

2.表达式解析:计算器需要能够解析用户输入的表达式,并将其转换为计算机能够处理的数学运算。

3.运算执行:计算器需要能够执行解析后的表达式,并输出结果。

4.错误处理:计算器需要能够处理各种可能的错误情况,例如无效的输入、除以零等。

基于以上思路,我们可以设计一个简单的计算器程序,它使用命令行界面,支持基本的加、减、乘、除运算,并能够处理一些常见的错误情况。

三、计算器的实现方法实现一个计算器需要使用C语言的输入输出函数、字符串处理函数和数学函数等。

下面是一个简单的计算器程序示例:```c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>intmain(){charexpression[100];printf("请输入表达式(如:2+3*4):");fgets(expression,sizeof(expression),stdin);expression[strcspn(expression,"\n")]='\0';//去掉换行符doubleresult=0;intsign='+';//默认运算符为加号inti=0;while(expression[i]!='\0'){if(expression[i]==sign){//如果是运算符,则执行相应的运算if(i+2>strlen(expression)){//确保后面还有数字printf("无效的表达式\n");return1;//返回错误码}doublenum1=atof(expression+i+1);//获取第一个数字result+=num1;//进行运算i+=2;//跳过运算符和数字}elseif(isdigit(expression[i])){//如果是数字,则添加到结果中result+=expression[i]-'0';//进行加法运算}else{//遇到非数字和非运算符字符时,结束表达式解析并输出结果break;}i++;//移动到下一个字符}printf("结果为:%f\n",result);//输出结果return0;//返回正常结束代码}```以上代码实现了一个简单的命令行计算器程序,它使用fgets函数从标准输入读取用户输入的表达式,并使用字符串处理函数和数学函数进行表达式解析和运算。

C语言简易计算器的实现

C语言简易计算器的实现

C语言简易计算器的实现计算器是一个常见的应用程序,用于执行数学运算。

在C语言中,可以通过使用条件判断、循环和函数来实现一个简易计算器。

下面是一个实现四则运算的简易计算器的示例代码:```c#include <stdio.h>float add(float a, float b)return a + b;float subtract(float a, float b)return a - b;float multiply(float a, float b)return a * b;float divide(float a, float b)return a / b;int maifloat num1, num2;char operator;printf("请输入两个数:");scanf("%f %f", &num1, &num2);printf("请输入操作符:");scanf(" %c", &operator); // 注意空格,以防止读取上一个输入时的换行符float result;switch (operator)case '+':result = add(num1, num2);printf("结果为:%.2f\n", result);break;case '-':result = subtract(num1, num2);printf("结果为:%.2f\n", result);break;case '*':result = multiply(num1, num2);printf("结果为:%.2f\n", result);break;case '/':if (num2 == 0)printf("除数不能为0!\n");} elseresult = divide(num1, num2);printf("结果为:%.2f\n", result);}break;default:printf("操作符无效!\n");break;}return 0;```在这个简易计算器中,使用了四个函数来执行加法、减法、乘法和除法运算,这些函数分别返回运算结果。

C语言课程设计(计算器)

C语言课程设计(计算器)

目录1 前言 (2)2 需求分析 (2)2.1要求 (2)2.2任务 (2)2.3运行环境 (2)2.4开发工具 (2)3 概要设计 (2)3.1系统流程图 (3)3.2查询函数流程图 (4)4 详细设计 (8)4.1分析和设计 (8)4.2具体代码实现 (9)5 课程设计总结 (25)参考文献 (25)致谢 (26)1 前言编写一个程序来实现算术计算器。

通过结构体数组和共用体数组来存放输入的每一数字或运算符号的记录(包括1.2.3等数字, +、--、*、等运算符号), 然后将其信息存入文件中。

输入一个算术计算式, 就在屏幕上显示结果。

2 需求分析2.1要求(1)用C语言实现程序设计;(2)利用结构体、共用体进行相关信息处理;(3)画出查询模块的流程图;(4)系统的各个功能模块要求用函数的形式实现;(5)界面友好(良好的人机互交), 程序要有注释。

2.2任务(1)定义一个结构体类型数组, 输入0~9及+、--、*等符号的信息, 将其信息存入文件中;(2)输入简单的加减乘除算术计算式, 并在屏幕上显示计算结果;(3)画出部分模块的流程图;(4)编写代码;(5)程序分析与调试。

2.3运行环境(1)WINDOWS2000/XP系统(2)TurboC2.0编译环境2.4开发工具C语言3 概要设计3.1系统流程图如图3.1所示。

图3.1系统流程图3.2查询函数流程图4 详细设计4.1分析和设计在程序的开头部分定义了结构替类型, 用来存放按钮信息struct 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;用输入函数input()来输入按键放在s_button数组中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录一.课程设计目的 (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!...");/*如果不能显示见面窗口,按任意退出。

相关文档
最新文档