个人作业——四则运算题目生成程序

个人作业——四则运算题目生成程序

一、作业信息

作业课程 软件工程
作业要求 作业要求
作业目标 能对需求进行分析并实现;编码格式规范;学习博客撰写
学号 3180205402

二、作业要求

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

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

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

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

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

三、代码提交

1.代码结构

①加法整/分数运算函数

void add_oper()
{
	 int a,b,c,q;
	 q=rand()%2;//随机选择整数或分数进行运算
	 if(q == 1)
	 {
		 a=rand()%100;
		 b=rand()%100;
		 printf("请回答:\n\t\t %d + %d = ",a,b);
		 scanf("%d",&c);
		 if(a+b==c)
		 {
		  	printf("回答正确!\n");
		  	r++;
		 }
		 else
		 {
		  	printf("回答错误!\n");
		  	w++;
		 }
	}
	else
	{
		int nume_1, deno_1, nume_2, deno_2;
		//↑第一个数的分子分母和第二个数的分子分母
		int nume_s, deno_s;
		//↑存储计算机计算出的答案分子分母
		int i, len;//len存储输入字符长度 
		int nume=0;
		int deno=0;//存储用户输入的分子分母
		char sum[DIGIT];//存储用户输入字符串
		 
		deno_1=rand()%100+1;
		nume_1=rand()%deno_1;
		deno_2=rand()%100+1;
		nume_2=rand()%deno_2;
		printf("%d/%d+%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
		//真分数分母要比分子大且分母不能为0;
		
		nume_s=(nume_1*deno_2)+(nume_2*deno_1);
		deno_s=deno_1*deno_2;
		//↑计算真分数相加的结果 
		
		scanf("%s", sum);
		len = strlen(sum);
//		for(i=0; i<len; i++)
//		{
//			printf("%c", sum[i]);
//
//		}
		
		int flag=0;
		for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
		{	
			if(sum[i] != '/')
			{
				int i_sum = sum[i] - '0';//将char型转换为int型
			//	printf("\ni_sum=%d",i_sum);
				if(flag == 0){
					nume *= 10;
					nume += i_sum; 
				}
				if(flag == 1){
					deno *= 10;
					deno += i_sum;
				}
			}
			
			else if(sum[i] == '/')
			{
			//	printf("\n/");
				flag = 1;
			}
		}
		
		if(nume == nume_s && deno == deno_s)
		{
		//	printf("转换后的结果 %d/%d", nume, deno); 
			printf("答案正确!"); 
			r++;
		}
		else
		{
		//	printf("转换后的结果 %d/%d", nume, deno); 
			printf("答案错误!"); 
			w++;
		}

	}
	
}

②减法整/分数运算函数

void sub_oper()
{
	 int a,b,c,q;
	 q=rand()%2;
	 if(q == 0)
	 {
		 a=rand()%100;
		 b=rand()%100;
		 printf("请回答:\n\t\t %d - %d = ",a,b);
		 scanf("%d",&c);
		 if(a-b==c)
		 {
		 	 printf("回答正确!\n");
		 	 r++;
		 }
		 else
		 {
			 printf("回答错误!\n");
		 	 w++;
		 }
	 }
	 else
	 {
	 	int nume_1, deno_1, nume_2, deno_2;
		//↑第一个数的分子分母和第二个数的分子分母
		int nume_s, deno_s;
		//↑存储计算机计算出的答案分子分母
		int i, len;//len存储输入字符长度 
		int nume=0;
		int deno=0;//存储用户输入的分子分母
		char sum[DIGIT];//存储用户输入字符串
		 
		deno_1=rand()%100+1;
		nume_1=rand()%deno_1;
		deno_2=rand()%100+1;
		nume_2=rand()%deno_2;
		printf("%d/%d-%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
		//真分数分母要比分子大且分母不能为0;
		nume_s=(nume_1*deno_2)-(nume_2*deno_1);
		deno_s=deno_1*deno_2;
		//↑计算真分数相减的结果 
		scanf("%s", sum);
		len = strlen(sum);
		
		int flag=0;//判断比值符 
		int sign=0;//判断正负符号 
		for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
		{	
			if(sum[i] != '/' && sum[i] != '-')
			{
				int i_sum = sum[i] - '0';//将char型转换为int型
				if(flag == 0){
					nume *= 10;
					nume += i_sum; 
				}
				if(flag == 1){
					deno *= 10;
					deno += i_sum;
				}
			}
			
			else if(sum[i] == '/')
			{
				flag = 1;
			}
			else if(sum[i] == '-') 
			{
				sign = 1;//说明用户输入的结果是负数 
			}
		}
		
		if(nume_s > 0 && nume == nume_s && deno == deno_s)
		{
			printf("答案正确!");
			r++; 
		}
		else if(nume_s < 0 && nume == -nume_s && deno == deno_s && sign == 1)
		{
			printf("答案正确!"); 
			r++;
		}
		else
		{
			printf("答案错误!"); 
			w++;
		} 
		 
	
	 }
	 
}

③乘法整/分数运算函数

void mul_oper()
{
	 int a,b,c,q;
	 q=rand()%2;
	 if(q == 0)
	 {
		 a=rand()%100;
		 b=rand()%100;
		 printf("请回答:\n\t\t %d * %d = ",a,b);
		 scanf("%d",&c);
		 if(a*b==c)
		 {
		  	printf("回答正确!\n");
		  	r++;
		 }
		 else
		 {
		  	printf("回答错误!\n");
		  	w++;
		 }
	 }
	 else
	 {
	 	int nume_1, deno_1, nume_2, deno_2;
		//↑第一个数的分子分母和第二个数的分子分母
		int nume_s, deno_s;
		//↑存储计算机计算出的答案分子分母
		int i, len;//len存储输入字符长度 
		int nume=0;
		int deno=0;//存储用户输入的分子分母
		char sum[DIGIT];//存储用户输入字符串
		
		deno_1=rand()%100+1;
		nume_1=rand()%deno_1;
		deno_2=rand()%100+1;
		nume_2=rand()%deno_2;
		printf("%d/%d*%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
		//真分数分母要比分子大且分母不能为0;
		nume_s=nume_1*nume_2;
		deno_s=deno_1*deno_2;
//		printf("%d * %d", nume_s, deno_s);
		//↑计算真分数相乘的结果 
		scanf("%s", sum);
		len = strlen(sum);
		
		int flag=0;//判断比值符  
		for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
		{	
			if(sum[i] != '/')
			{
				int i_sum = sum[i] - '0';//将char型转换为int型
				if(flag == 0){
					nume *= 10;
					nume += i_sum; 
				}
				if(flag == 1){
					deno *= 10;
					deno += i_sum;
				}
			}
			
			else if(sum[i] == '/')
			{
				flag = 1;
			}

		}
		
		if(nume == nume_s && deno == deno_s && nume_s != 0)
		{
			printf("答案正确!");
			r++; 
		}
		else if(nume == nume_s && nume_s == 0)
		{
			printf("答案正确!"); 
			r++;
		}
		else
		{ 
//			printf("%d", nume);
			printf("答案错误!"); 
			w++;
	 	}
	 } 
}

④除法整/分数运算函数

void div_oper()
{
	 int a,b,c,q;
	 q=rand()%2;
	 if(q == 0)
	 {	 
		 a=rand()%100;
		 b=rand()%100;
		 printf("请回答:\n\t\t %d / %d = ",a,b);
		 scanf("%d",&c);
		 if(a/b==c)
		 {
		  	printf("回答正确!\n");
		 	r++;
		 }
		 else
		 {
		  	printf("回答错误!\n");
		  	w++;
		 }
	 }
	 else
	 {
	 	int nume_1, deno_1, nume_2, deno_2;
		//↑第一个数的分子分母和第二个数的分子分母
		int nume_s, deno_s;
		//↑存储计算机计算出的答案分子分母
		int i, len;//len存储输入字符长度 
		int nume=0;
		int deno=0;//存储用户输入的分子分母
		char sum[DIGIT];//存储用户输入字符串
		
		deno_1=rand()%100+1;
		nume_1=rand()%deno_1;
		deno_2=rand()%100+2;
		nume_2=rand()%deno_2;//除数不能为零!!! 
		printf("%d/%d ÷%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
		//真分数分母要比分子大且分母不能为0;
		nume_s=nume_1*deno_2;
		deno_s=deno_1*nume_2;
//		printf("%d * %d", nume_s, deno_s);
		//↑计算真分数相乘的结果 
		scanf("%s", sum);
		len = strlen(sum);
		
		int flag=0;//判断比值符 
//		int sign=0;//判断正负符号 
		for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
		{	
			if(sum[i] != '/')
			{
				int i_sum = sum[i] - '0';//将char型转换为int型
				if(flag == 0){
					nume *= 10;
					nume += i_sum; 
				}
				if(flag == 1){
					deno *= 10;
					deno += i_sum;
				}
			}
			
			else if(sum[i] == '/')
			{
				flag = 1;
			}

		}
		if(nume == nume_s && deno == deno_s && nume_s != 0)
		{
			printf("答案正确!");
			r++; 
		}
		else if(nume == nume_s && nume_s == 0)
		{
			printf("答案正确!");
			r++; 
		}
		else
		{ 
			printf("答案错误!"); 
			w++;
	 	}
			 	
	 }
}

⑤头文件、宏定义、全局变量

#include<stdio.h> 
#include<math.h>
#include<string.h>
#include<windows.h>
#define N 10 //出十道题 
#define DIGIT 20 //用户输入答案数组的大小 
int r = 0;//计数正确答题数 
int w = 0;//计数错误答题数 
void add_oper();//加法整/分数运算函数 
void sub_oper();//减法整/分数运算函数 
void mul_oper();//乘法整/分数运算函数 
void div_oper();//除法整/分数运算函数 

⑥主函数

int main()
{
	int sel_oper, flag=1;
	int con = 0;
	
	printf("\n\t\t\t欢迎进入简易四则运算\n\n");

	while(flag <= N)
	{
		printf("请选择:\n");
		printf("\t\t\t  加法整/分数运算(请输入1)\n");
		printf("\t\t\t  减法整/分数运算(请输入2)\n");
		printf("\t\t\t  乘法整/分数运算(请输入3)\n");
		printf("\t\t\t  除法整/分数运算(请输入4)\n");
		printf("\t\t\t  退出整/分数运算(请输入5)\n");
//		sto = rand()%4;//随机生成四则运算选择数
		if(con==0)
   		scanf("%d",&sel_oper);
		switch(sel_oper)
		{
			case 1:
				printf("第%d题:", flag);
				add_oper();
				flag++;
				break;
			case 2:
				printf("第%d题:", flag);
				sub_oper();
				flag++;
				break;
			case 3:
				printf("第%d题:", flag);
				mul_oper();
				flag++;
				break;
			case 4:
				printf("第%d题:", flag);
				div_oper();
				flag++;
				break;
			case 5:
				return;
		}
		printf("\n\t\t\t继续运算?(请输入1)\n");
		printf("\n\t\t\t重新选择?(请输入2)\n");
		printf("\n\t\t\t退出运算?(请输入3)\n");
		scanf("%d",&con);
		if(con==1)
			con=1;
		else if(con==2)
		   con=0;
		else if(con==3)
		   break;
		else
		   printf("抱歉!,你输入的指令有误!请重新输入!\n");
	}
	printf("您总共完成了 %d 道题\n正确 %d 道\n错误 %d 道\n",r+w,r,w);
	return 0;
}


2.运行截图

整数加法

分数加法

整数减法

分数减法

整数乘法

分数乘法

整数除法

分数除法

四、个人小结

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 10 30
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 5 10
Development 开发 120 360
Analysis 需求分析(包括学习新技术 10 30
Design Spec 生成设计文档 15 40
Design Review 设计复审 5 5
Coding Standard 代码规范 3 3
Design 具体设计 10 50
Coding 具体编码 100 300
Code Review 代码复审 5 10
Test 测试(自我测试,修改代码,提交修改) 10 10
Reporting 报告 10 10
Test Report 测试报告
Size Measurement 计算工作量 3 3
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3 3
posted @ 2020-11-03 18:13  云宫迅音  阅读(179)  评论(0编辑  收藏  举报