小学生四则运算(C)

博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ 
作业要求  https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376
作业目标 写一个能自动生成小学四则运算题目的程序
学号 3190704207

 

#include<stdio.h>
#include<stdlib.h>
#include<time.h> 
#include<math.h>
int N;    //存储应该生成的题目数量
int Nc;   //题目数量的拷贝 
int lenth;       //确定当前生成的题目有几位,默认生成2~5位 
int t;     //确定是否出含真分数的题 
int i;   //用于应付程序中要用到的各种循环 
float result=0;   //用于存储正确答案 
float answer;     //用于存储输入的答案 
int right=0;    //用于存储答案正确的数量
int num;  //用于存储在整数情况下生成的随机数 
float num1;    //用于存储生成分数的分子 
float num2;   //用于存储生成分数的分母 
float ep=0.00001;
float ans1;   //存储输入答案的分子 
float ans2;    //存储输入答案的分母 

void ran(){
    srand((int)time(0));   //利用时间变化,使种子的设定值为任意数 
    lenth=(int)rand()%4+2;    //确定位数
    
    t=(int)rand()%2;   //确认是否出真分数,1出,0不出 
     
} 

void fenshu(){        //生成一个真分数 
    num1=rand()%99+1;
    num2=rand()%100+1;
    while(num1>=num2){     //保证为真分数 
        num2=rand()%100+1;
    }
    printf("(%d/%d)",(int)num1,(int)num2);
} 


void jia(int n){
    while(n--){
        ran();    
        printf("%d. ",Nc-n);
        
        if(t){                     //进行具有分式的运算 
            for(i=1;i<lenth;i++){
                fenshu();    
                result+=(num1/num2);
                printf("+");
                
            }
            fenshu();
            printf("=");
            scanf("%d/%d",&ans1,&ans2);
            answer=ans1/ans2; 
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率 
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%f\n",result);     //判断 
            } 
            result=0;   //答案初始化 
            
        }else{               //进行具有整数的运算 
            for(i=1;i<lenth;i++){
                num=(int)rand()%100;    
                result+=num;
                printf("%d+",num);
            }
            num=(int)rand()%100;
            result+=num;
            printf("%d=",num);    //整数题目生成 
            
            scanf("%f",&answer);
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率 
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%d\n",(int)result);     //判断 
            } 
            result=0;   //答案初始化 
        }
        
    }
}

void jian(int n){
    while(n--){
        ran();    
        printf("%d. ",Nc-n);
        
        if(t){                     //进行具有分式的运算 
            fenshu();    
               result+=(num1/num2);
               printf("-");
            for(i=2;i<lenth;i++){
                fenshu();    
                result-=(num1/num2);
                printf("-");
                
            }
            fenshu();
            printf("=");
            scanf("%d/%d",&ans1,&ans2);
            answer=ans1/ans2; 
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%f\n",result);     //判断 
            } 
            result=0;   //答案初始化 
            
        }else{               //进行具有整数的运算 
            
            num=(int)rand()%100;    
            result+=num;
            printf("%d-",num);
            for(i=2;i<lenth;i++){
                num=(int)rand()%100;    
                result-=num;
                printf("%d-",num);
            }
            num=(int)rand()%100;
            result-=num;
            printf("%d=",num);    //整数题目生成 
            
            scanf("%f",&answer);
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率 
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%d\n",(int)result);     //判断 
            } 
            result=0;   //答案初始化 
        }
        
    }
    
}

void cheng(int n){
    while(n--){
        ran();    
        printf("%d. ",Nc-n);
        
        if(t){                     //进行具有分式的运算 
            fenshu();
            result=num1/num2;
            printf("*");
            for(i=2;i<lenth;i++){
                fenshu();    
                result+=(num1/num2);
                printf("*");
                
            }
            fenshu();
            printf("=");
            scanf("%d/%d",&ans1,&ans2);
            answer=ans1/ans2; 
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率 
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%f\n",result);     //判断 
            } 
            result=0;   //答案初始化 
            
        }else{               //进行具有整数的运算 
            num=(int)rand()%100;    
            result=num;
            printf("%d*",num);
            
            for(i=2;i<lenth;i++){
                num=(int)rand()%100;    
                result*=num;
                printf("%d*",num);
            }
            num=(int)rand()%100;
            result*=num;
            printf("%d=",num);    //整数题目生成 
            
            scanf("%f",&answer);
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率 
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%d\n",(int)result);     //判断 
            } 
            result=0;   //答案初始化 
        }
        
    }
    
}

void chu(int n){
    while(n--){
        ran();    
        printf("%d. ",Nc-n);
        
            num=(int)rand()%100;    
            result=num;
            printf("%d/",num);       
            for(i=2;i<lenth;i++){
                num=(int)rand()%100;    
                result/=num;
                printf("%d/",num);
            }
            num=(int)rand()%100;
            result/=num;
            printf("%d=",num);    //整数题目生成 
            
            scanf("%f",&answer);
            result=((float)((int)((result+0.005)*100)));
            answer=answer*100;
            if(fabs(answer-result)<ep){
                right++;      //用于最后计算正确率 
                printf("正确!\n");
            }else{
                printf("错误!正确答案为:%.2f\n",result/100);     //判断 
            } 
            result=0;   //答案初始化 
        
        
    }
    
}

int main(){
    printf("注意:\n在需要输入小数时(即仅在除法运算中),请保留两位小数!\n");
    printf("--------------------------------------------\n") ;
    printf("请输入想要生成的题目数量:\n");
    scanf("%d",&N);
    getchar();
    Nc=N; 
    
    while(1){                  //输入选择的运算 
        char c;
        printf("请输入想要进行的运算:(请输入符号 + - * /)\n");
        scanf("%c",&c);
        printf("-------------------------------------------------\n");
        if(c=='+'){
            jia(N);
            break;
        }else if(c=='-'){
            jian(N);
            break;
        }else if(c=='*'){
            cheng(N);
            break;
        }else if(c=='/'){
            chu(N);
            break;
        }else{
            printf("输入的符号错误,请重新输入!!\n"); 
            getchar(); 
        } 
    }
    
    printf("恭喜你全部完成题目,正确率为:%.1f%%\n",((right*1.0)/Nc*100));
    
    
    return 0;
} 

 

运行结果如下所示:(按顺序分别为 + - * / 的运行结果)

 

 

 

 

 

 

 

 

 

 

 

总结:

  • 前期在设计排版时,应该考虑更多,这才有助于之后的代码不会有遗漏
  • 对于代码的编写规范和读入还有待进一步的加强,很多次的失败都出现在读入格式上,浪费了不少的时间,比如scanf中不能存在\n,浮点数不能用==进行比较,甚至是<=
  • 在学习新技术这方面要更加肯下功夫,对于能够加强代码可行性的代码设计应该要掌握最新动态,比如随机函数种子srand的设置,浮点数的比较方式
  • 这四则运算设计的还是有欠缺,在真分数的正确答案公布方面还是个很大的漏洞,理应应该输出分数格式
  • 在题目设计上也还存在缺陷,难度还是过大,不适合小学生,甚至不太适合让人算,尤其是除法运算时,很容易会在保留两位小数的情况下,出现答案为0的情况
任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
计划 8 6
估计这个任务需要多少时间,并规划大致工作步骤 8 12
开发 150 180
需求分析(包括学习新技术) 20 17
生成设计文档 5 4
设计复审 10 5
代码规范 5 1
具体设计 10 7
具体编码 50 35
代码复审 7 5
测试(自我测试,修改代码,提交修改) 30 50
报告 20 15
测试报告 5 0
计算工作量 5 0
事后总结,并提出过程改进计划 10 15
posted @ 2020-10-28 02:23  Sia1  阅读(153)  评论(0编辑  收藏  举报