首页 > 代码库 > 四则运算--第三周
四则运算--第三周
/功能:由随机数决定出题为10个以内的数字,并确定是否出现括号(仅限一对),顺序输出表达式,并用栈的方式进行计算,判断正误。其他功能有待进一步实现。//头文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <math.h>//栈的结构体typedef struct stack{ double * e; int zd;}bds_stack;//声明函数void InitStack(bds_stack ** s,int n);int Push_stack(bds_stack * s,double t);void Pop_stack(bds_stack * s,double * t);double Opt_num();void Cal(int n);void yxj_table();//定义全局变量int yxj[7][7];bds_stack * dz,* tz;//主函数int main(){ int num; int c = 0,p,s; double r,ans,r1,r2,r3; int * d,* t; int p1,p2; //存储出现括号的下标int m,n,f; //分别记录数组d、t的下标int i,j,k; yxj_table(); //初始化优先级数组 scanf("%d",&num); srand(time(NULL)); //随机数种子 for(i = 0;i < num;i++) { m = 0;n = 0;f = 0; while(c == 1||c == 0) { c = rand()%10; //数字字符 } s = rand()%2; //是否出现括号 if(s == 1) //确定字符总数 { p = c + 1; } else { p = c - 1; } printf("%d %d %d\n",c,p,s); d = (int * )malloc(sizeof(int)*c); t = (int * )malloc(sizeof(int)*p); InitStack(&dz,c); InitStack(&tz,p); Push_stack(tz,0); //0为‘#’ for(j = 0;j < c;j++) { d[j] = rand()%100; //数字为两位数 } if(s == 1) { p1 = rand()%(p-2)+1; p2 = rand()%(p-p1-1)+1+p1+1; p1--; p2--; //下标 t[p1] = 5; t[p2] = 6; } for(j = 0;j < p;j++) { if(s == 1) { if(j == p1||j == p2) continue; } t[j] = rand()%4+1; } j = 0; if(t[n] == 5) { printf("("); Push_stack(tz,t[n]); n++; j++; } for(;j < (c+p);) //输出表达式 { if(f == 0) { printf("%d",d[m]); Push_stack(dz,d[m]); m++; j++; if(t[n] == 6) { printf(")"); while(yxj[(int)tz->e[tz->zd-1]][t[n]] != 2) { if(yxj[(int)tz->e[tz->zd-1]][t[n]] == 1) { r = Opt_num(); Push_stack(dz,r); } else { printf("出错!\n"); return 1; } } Pop_stack(tz,&r); n++; j++; } f = 1; } else { if(t[n] == 1) { printf("+"); Cal(t[n]); } if(t[n] == 2) { printf("-"); Cal(t[n]); } if(t[n] == 3) { printf("*"); Cal(t[n]); } if(t[n] == 4) { printf("/"); Cal(t[n]); } n++;j++; if(t[n] == 5) { printf("("); Push_stack(tz,t[n]); n++; j++; } f = 0; } } printf(" = ?\n"); while((yxj[(int)(tz->e[tz->zd-1])][0]) != 2) { r = Opt_num(); Push_stack(dz,r); } scanf("%lf",&ans); if(ceil(fabs(r-ans)) == 0) { printf("right!!\n"); } else { printf("false!!\n"); } } return 0;}//初始化优先级表void yxj_table(){ int i,j; yxj[0][0] = 2; yxj[0][6] = 3; yxj[5][0] = 3; for(i = 0,j = 1;j <= 5;j++) { yxj[i][j] = 0; } yxj[6][0] = 1; for(i = 1;i <= 4 ;i++) { for(j = 0;j <= 2;j++) { yxj[i][j] = 1; } } for(i = 5,j = 1;j <= 4;j++) yxj[i][j] = 0; for(i = 6,j = 1;j <= 4;j++) yxj[i][j] = 1; for(i = 1;i <= 2;i++) { for(j = 3;j <= 5;j++) { yxj[i][j] = 0; } } for(i = 3;i <= 4;i++) { for(j = 3;j <= 4;j++) { yxj[i][j] = 1; } } yxj[3][5] = 0; yxj[4][5] = 0; for(j = 6,i = 1;i <= 4;i++) { yxj[i][j] = 1; } yxj[5][6] = 2; yxj[5][5] = 3; yxj[6][5] = 3; yxj[6][6] = 3;}//初始化栈void InitStack(bds_stack ** s,int n){ *s = (bds_stack*)malloc(sizeof(bds_stack)); (*s)->e = (double*)malloc(sizeof(double)*n); (*s)->zd = 0;}//入栈int Push_stack(bds_stack * s,double t){ int q; s->e[s->zd] = t; q = s->zd; s->zd++; return q;}//出栈void Pop_stack(bds_stack * s,double * t){ (*t) = s->e[--(s->zd)];}//字符出栈计算double Opt_num(){ double num1,num2,opt; Pop_stack(dz,&num2); Pop_stack(tz,&opt); Pop_stack(dz,&num1); if(opt == 1) { return num1 + num2; } if(opt == 2) { return num1 - num2; } if(opt == 3) { return num1 * num2; } if(opt == 4) { return num1 / num2; } return 0;}//优先级比较void Cal(int n){ double r; int k; while(yxj[(int)(tz->e[tz->zd-1])][n] != 0) { if(yxj[(int)(tz->e[tz->zd-1])][n] == 1) { r = Opt_num(); Push_stack(dz,r); } else { printf("出错!\n"); } } Push_stack(tz,(double)n);}
四则运算--第三周
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。