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


一、题目要求

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

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("\n\n请答题:\n");
    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("正确\n\n");
	     }
	   else
	    {
	    	printf("错误\n");
	    	if(ch=='/')
	    	{
	    		printf("正确答案为%.2f\n\n",Integet[i][2]); 
			}
			else
			printf("正确答案为%.0f\n\n",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("正确\n\n"); 
		 }
	   else
	    {
	    	printf("错误\n");
	    	printf("正确答案为%s\n\n",a1); 
		}
	}
	printf("\n\n得分:%d\n",score);
} 

9.选择运算方式菜单

int menu(){
	start1: 
	printf("\n\n\t*****小学四则运算****\n\n"); 
	printf("\n\n\t\t1.加法\n");
	printf("\n\n\t\t2.减法\n");
	printf("\n\n\t\t3.乘法\n");
	printf("\n\n\t\t4.除法\n"); 
	printf("\n\n\t\t0.退出\n"); 
	printf("\n\n\t请选择运算运算方式:");
	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("\t\t\t\t*********************输入错误!*******************\n");
				system("pause");
				system("cls");
				goto start1;
		}
		printf("\n\n按任意键返回上一级");
		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编辑器,通过查阅资料也学会使用。通过参考链接学习。

posted @ 2020-11-07 10:06  木昔年  阅读(184)  评论(0编辑  收藏  举报