C 语言集中上机实验报告 一、 需求分析 (1) 制作一个计算器,能够计算四则混合运算以及乘方和开方,并显示出正确的结果。 (2) 程序能根据运算符的高低进行运算(开放符号置左置右不影响正常运算) (3) 可以输入括号 二、 设计思路 (1) 运用栈以及结构体来实现,将数字与运算符分别放在结构体与栈里面,将栈以及结构体里的字符数值一一匹配计算,将得出的结果保存到另一个栈里(z han3)。 (2) 开始,对所输入的字符串进行转化,把运算符存放在 z han2 里面,把数值存放到 data 结构体里面,然后进行运算和操作。 (3) 运用循环来实现无限输入,用数组 nibo 来跟踪整个过程,每次运算后将值置空,若检测到空,计算得出结果,退出输入 q。 三、 流程图 四、 主程序段 #include #include #include double jisuan(char a[]) { int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo[50],zhan2[50];//zhan2 存放的是运算符 double x,n,l,z=0,zhan3[50];//暂存结果 typedef struct { 括号 读 取 表 达式 读 取 括 号里 的 表 达式 乘 除 方运算 Y NY Y 乘 除 方运算 NN计算乘除 计算加减 计算乘除 计算加减 转到括号外 输出结果 计算方 计算方 开始 double d1; int d2; }dd; typedef struct { dd data[50]; int top; }zhan1; zhan1 *shu; shu=(zhan1 *)malloc(sizeof(zhan1)); shu->top=0; while(a[i]!='\0') { if(a[i]>='0'&&a[i]<='9') { z=0; j=i+1; while(a[j]>='0'&&a[j]<='9') {j++;} j--; for(k=i;k<=j;k++) { z=z*10+a[k]-'0'; } j=j+1;//j 跳到数字后一位 x=z; if(a[j]=='.')//如果是小数的话就把小数和整数一起加上 { l=1; i=j+1; j=i+1; while(a[j]>='0'&&a[j]<='9') {j++;} j--; for(k=i;k<=j;k++) { n=pow(0.1,l); l=l+1; x=x+n*(a[k]-'0'); } i=j+1; } else i=j; shu->data[++shu->top].d1=x; shu->data[shu->top].d2=++cnt; nibo[++t1]='0'+shu->data[shu->top].d2; nibo[t1+1]='\0'; }//如果是数字那么就保存到结构体里 的dd 数组里的 第二个成员里 else if(a[i]=='(') { zhan2[++t2]=a[i]; i++; } else if(a[i]==')') { j=t2; while(zhan2[j]!='(') { nibo[++t1]=zhan2[j]; nibo[t1+1]='\0'; j--; } t2=j-1; i++; } else if(a[i]=='...