• 软件工程作业——小学四则运算



    博客班级 AHPU软件工程
    作业要求 实现小学四则运算
    作业目标 熟练使用Markdown编辑
    学号 3180701118


    一、题目要求

    写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

    1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24

    2)程序要求能处理用户的输入,判断对错,累积分数

    3)程序支持可以由用户自行选择加、减、乘、除运算

    4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

    二、代码

    1.存储结构

    typedef struct {
    	int num;//分子 
    	int demo;//分母 
    }Factions; 
    
    //题目个数 
    int n=10;
    //整数题目  Integet[i][0]、Integet[i][1]、Integet[i][3] 分别存储第i题的两个运算数和运算结果 
    float Integet[M][3];
    //分数题目  Faction[i][0]、Faction[i][1]、Faction[i][3] 分别存储第i题的两个运算数和运算结果
    Factions Faction[M][3]; 
    //总分
    int score=0;
    
    

    2.产生随机数

    int produre(char ch)//生成题目 
    {
    	int i,j;
    	srand((unsigned)time(NULL));	
        for(i=0;i<=n/2;i++)	//前n/2题为整数题 
    	   {  
    	      if(ch=='-')
    		  {
    		  	Integet[i][1]=rand()%100+1;
    		  	Integet[i][0]=rand()%100+1+Integet[i][1];
    		  }
    		  else
    		  {
    		  Integet[i][1]=rand()%100+1; 
    		  Integet[i][0]=rand()%100+1;
    		 }     
    	   }
        int a=n-i;
    	for(j=0;j<a;j++)//后n/2题为分数题 
    	{
    		Faction[j][0].num =rand()%9+1;
    		Faction[j][0].demo=rand()%9+Faction[j][0].num+1;	
    		Faction[j][1].num =rand()%9+1; 
    	    Faction[j][1].demo =rand()%9+Faction[j][1].num+1;
    	}
    } 
    

    3.约分

    int yf(int demo,int num,int j) 
    { 
    	int a = abs(demo);
    	int b = abs(num);
    	int t;
    	while(b != 0){
    		t = a%b;
    		a = b;
    		b = t;
        }
    	Faction[j][2].demo=demo/a;
    	Faction[j][2].num=num/a;
    }
    

    4.加法

    int add()
    {
    	int i,j,a;
    	for(i=0;i<=n/2;i++)
    	  Integet[i][2]=Integet[i][0]+Integet[i][1];
    	a=n-i; 
    	for(j=0;j<a;j++)
    	  { Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].demo;
    	    Faction[j][2].num=Faction[j][0].num*Faction[j][1].demo+Faction[j][1].num*Faction[j][0].demo;
    	    yf(Faction[j][2].demo,Faction[j][2].num,j);
    	  } 
    }
    

    5.减法

    int sub(){
    	int i,j,a;
    	for(i=0;i<=n/2;i++)
    	  Integet[i][2]=Integet[i][0]-Integet[i][1];
    	a=n-i; 
    	for(j=0;j<a;j++)
    	  { Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].demo;
    	    Faction[j][2].num=Faction[j][0].num*Faction[j][1].demo-Faction[j][1].num*Faction[j][0].demo;
    	    yf(Faction[j][2].demo,Faction[j][2].num,j);
    	  } 
    }
    

    6.乘法

    int mul(){
    	int i,j,a;
    	for(i=0;i<=n/2;i++)
    	  Integet[i][2]=Integet[i][0]*Integet[i][1];
    	a=n-i; 
    	for(j=0;j<a;j++)
    	  { Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].demo;
    	    Faction[j][2].num=Faction[j][0].num*Faction[j][1].num;
    	    yf(Faction[j][2].demo,Faction[j][2].num,j);
    	  } 
    	  
    } 
    

    7.除法

    四舍五入

    float sw(float b)
    {
    	b=b*100;//保留一位小数,乘10,两位乘100,以此类推; 
    	b=b+0.5;
    	b=(int)b;//向上取整 
    	b=b/100;//同 乘 ; 
    	return b;
    } 
    

    除法运算

    int div(){
    	int i,j,a;
    	for(i=0;i<=n/2;i++)
    	  {
    	   Integet[i][2]=Integet[i][0]/Integet[i][1];
    	   Integet[i][2]=sw(Integet[i][2]);//四舍五入、保留小数 
    	  }
    	a=n-i; 
    	for(j=0;j<a;j++)
    	  { Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].num;
    	    Faction[j][2].num=Faction[j][0].num*Faction[j][1].demo;
    	    yf(Faction[j][2].demo,Faction[j][2].num,j);
    	  } 
    }
    

    8.答题并判断正确

    int ask(char ch)
    {
    	printf("
    
    请答题:
    ");
        int i,j,a;
         
    	for(i=0;i<=n/2;i++)
    	  {
    	   printf("(%d),%.0f %c %.0f = ",i+1,Integet[i][0],ch,Integet[i][1]);
    	   float answer;
    	   scanf("%f",&answer);
    	   if(answer==Integet[i][2])
    	     {score+=1;//回答正确分值加1
    	      printf("正确
    
    ");
    	     }
    	   else
    	    {
    	    	printf("错误
    ");
    	    	if(ch=='/')
    	    	{
    	    		printf("正确答案为%.2f
    
    ",Integet[i][2]); 
    			}
    			else
    			printf("正确答案为%.0f
    
    ",Integet[i][2]); 	
    		}
    	  }   
    	a=n-i; 
    	for(j=0;j<a;j++){ 
    		printf("(%d),%d/%d %c %d/%d = ",j+i+1,
    		Faction[j][0].num,Faction[j][0].demo,ch,
    		Faction[j][1].num,Faction[j][1].demo);
    		char a2[10],a1[10],answerz[100]; 
    	    itoa(Faction[j][2].demo,a2,10);
    	    itoa(Faction[j][2].num,a1,10);
    	    char a3[2]="/";
    	    strcat(a1,a3);
    		strcat(a1,a2);
    		char answer[20];
    	   scanf("%s",&answer);
    	   if(strcmp(answer,a1)==0)
    	     {score+=1;//回答正确分值加1
    		 printf("正确
    
    "); 
    		 }
    	   else
    	    {
    	    	printf("错误
    ");
    	    	printf("正确答案为%s
    
    ",a1); 
    		}
    	}
    	printf("
    
    得分:%d
    ",score);
    } 
    

    9.选择运算方式菜单

    int menu(){
    	start1: 
    	printf("
    
    	*****小学四则运算****
    
    "); 
    	printf("
    
    		1.加法
    ");
    	printf("
    
    		2.减法
    ");
    	printf("
    
    		3.乘法
    ");
    	printf("
    
    		4.除法
    "); 
    	printf("
    
    		0.退出
    "); 
    	printf("
    
    	请选择运算运算方式:");
    	char ch;
    	while(1){
    		fflush(stdin);
       		scanf("%d",&ch);
    		fflush(stdin);
    		switch(ch)
    		{
    		    case 1:	
    				system("cls");
    				produre('+');
    				add();
    				ask('+');
    				break;
    			case 2:
    				system("cls");
    				produre('-');
    				sub();
    				ask('-');
    				break;
    			case 3:
    				system("cls");
    				produre('*');
    				mul();
    				ask('*');
    				break;
    			case 4:
    				system("cls");
    				produre('/');
    				div();
    				ask('/');
    				break;
    			case 0:
    				system("cls");
    				exit(0);
    			default:
    				printf("				*********************输入错误!*******************
    ");
    				system("pause");
    				system("cls");
    				goto start1;
    		}
    		printf("
    
    按任意键返回上一级");
    		system("pause");
    		system("cls");
    		goto start1;
    		break; 
    	} 
    }
    

    三、运行界面

    主界面

    减法

    除法

    四、作业小结

    1.psp表格

    psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 120 8
    Development 开发 100 150
    Analysis 需求分析(包括学习新技术) 10 10
    Design Spec 生成设计文档 30 40
    Design Review 设计复审 5 10
    Coding Standard 代码规范 5 10
    Design 具体设计 20 40
    Coding 具体编码 120 180
    Code Review 代码复审 5 7
    Test 测试(自我测试,修改代码,提交修改) 10 15
    Reporting 报告 20 60
    Test Report 测试报告 5 5
    Size Measurement 计算工作量 5 10
    Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 10 15

    2.心得和经验

    本次作业整数部分运算不难,但要注意整数除法的到的是小数,比较小数相等判断正确。而真分数运算时,要注意产生的随机数的分子要比分母小。
    这也是我第一次使用markdow编辑器,通过查阅资料也学会使用。通过参考链接学习。

  • 相关阅读:
    微软警告:“大规模电子邮件活动”正在推动勒索软件感染
    静态莫队分块
    可持久化线段树练习题
    KMP的一些好题
    KMP模式匹配
    最大异或路径
    人类分块精华(Ex)
    人类分块精华(二)
    人类分块精华(一)
    Treap 详解
  • 原文地址:https://www.cnblogs.com/zssb/p/13939938.html
Copyright © 2020-2023  润新知