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

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

目录

- 一、作业信息

- 二、作业要求

- 三、代码提交

- 1.代码

- ①求最大公约数、最小公倍数

- ②整数计算

- ③真分数计算

- ④运算

- ⑤头文件、函数声明

- ⑥主函数

- 2.运行截图

- 四、个人小结

一、作业信息

博客班级 软件工程导论-计算机18级
作业要求 作业要求
作业目标 自主完成需求功能的分析,规范代码书写,学会通过写博客呈现作业完成情况
学号 3180404131

二、作业要求

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

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

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

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

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

三、代码提交

1. 代码

①求最大公约数、最小公倍数

//求最大公约数
int max_pa(int first, int second){//辗转相除法
    int t;//交换大小中间变量
	int r=0;//余数
    if (first< second) {
        t = second;
        second = first;
        first = t;
    }
    r = first%second;
    while (r != 0) {
        first = second;
        second = r;
        r = first%second;
    } 
    return second;
}

//求最小公倍数
int min_pm(int first, int second){
	int f,s;
	f=first;
	s=second;
    
    return f*s/max_pa(f,s);
}

②整数计算

 void integer(int sy1,int*num,int*count){//整数
	int first,second,result=0,cresult=0;
	int r=0,cr=0;
	int sy=1;
	srand(time(NULL)); /*初始化随机数种子*/
	first=(int)(rand()%20)+1;
	second=(int)(rand()%20)+1;
	sy=sy1;
	switch (sy){
	case 1://加法
		cresult=first+second;
		printf("%d+%d=",first,second);
		scanf("%d",&result);
		if(result==cresult){//检验
			printf("回答正确!\n");
			(*num)++;
			(*count)++;
		}
		else{
			printf("回答错误,继续加油。\n");
			(*num)++;
		}
		break;
	case 2://减法
		cresult=first-second;
		printf("%d-%d=",first,second);
		scanf("%d",&result);
		if(result==cresult){//检验
			printf("回答正确!\n");
			(*num)++;
			(*count)++;
		}
		else{
			printf("回答错误,继续加油。\n");
			(*num)++;
		}
		break;
	case 3://乘法
		cresult=first*second;
		printf("%d*%d=",first,second);
		scanf("%d",&result);
		if(result==cresult){//检验
			printf("回答正确!\n");
			(*num)++;
			(*count)++;
		}
		else{
			printf("回答错误,继续加油。\n");
			(*num)++;
		}
		break;
	case 4://除法
		cresult=first/second;
		cr=first%second;
		printf("%d/%d=",first,second);
		printf("请输入商:");
		scanf("%d",&result);
		printf("请输入余数:");
		scanf("%d",&r);
		if(result==cresult && r==cr){//检验
			printf("回答正确!\n");
			(*num)++;
			(*count)++;
		}
		else{
			printf("回答错误,继续加油。\n");
			(*num)++;
		}
		break;
	}
	

}

③真分数计算

void t_score(int sy1,int*num,int*count){  //真分数计算
	int first_num1,first_num2;//第一个数的分子,分母
	int second_num1,second_num2;//第二个数的分子,分母
	int result_num1,result_num2;//正确结果的分子分母
	int p,q;//最小公倍数,最大公约数
	int i, len;//len存储输入字符长度 
	int flag=0;
	int W_num1=0;//存储用户输入的分子
	int W_num2=0;//分母
	char figure[20];//存储用户输入字符串
	int sy=1;
	srand(time(NULL)); /*初始化随机数种子*/
	first_num2=(int)(rand()%10)+1;
	first_num1=(int)(rand()%(first_num2/2)+1);
	second_num2=(int)(rand()%10)+1;
	second_num1=(int)(rand()%(second_num2/2)+1);
			
	p=min_pm(first_num2, second_num2);
	sy=sy1;
	switch (sy){
			case 1://加法
				result_num1=first_num1*p/first_num2 + second_num1*p/second_num2;
				result_num2=p;
				q=max_pa(result_num1, result_num2);
//				printf("%d/%d\n",result_num1/q,result_num2/q);
				printf("%d/%d + %d/%d=",first_num1,first_num2,second_num1,second_num2);
				break;
			case 2://减法
				result_num1=first_num1*p/first_num2 - second_num1*p/second_num2;
				result_num2=p;
				q=max_pa(result_num1, result_num2);
//				printf("%d/%d\n",result_num1/q,result_num2/q);
				printf("%d/%d - %d/%d=",first_num1,first_num2,second_num1,second_num2);
				break;
			case 3://乘法
				result_num1=first_num1 * second_num1;
				result_num2=first_num2 * second_num2;
				q=max_pa(result_num1, result_num2);
//				printf("%d/%d\n",result_num1/q,result_num2/q);
				printf("%d/%d * %d/%d=",first_num1,first_num2,second_num1,second_num2);
				break;
			case 4://除法
				result_num1=first_num1 * second_num2;
				result_num2=first_num2 / second_num1;
				q=max_pa(result_num1, result_num2);
//				printf("%d/%d\n",result_num1/q,result_num2/q);
				printf("%d/%d / %d/%d=",first_num1,first_num2,second_num1,second_num2);
				break;
			}
			
			
			scanf("\n%s", figure);//用户输入
			len = strlen(figure);//输入长度
	
			for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
			{	
				if(figure[i] != '/')
				{
					int figure1 = figure[i] - '0';//将char型转换为int型
					if(flag == 0){//
						W_num1 *= 10;
						W_num1 += figure1; 
					}
					if(flag == 1){
						W_num2 *= 10;
						W_num2 += figure1;
					}
				}
				
				else if(figure[i] == '/')//跳过/
				{
				//	printf("\n/");
					flag = 1;
				}
			}
			
			if(result_num1/q==W_num1 && result_num2/q==W_num2)//检验
			{
				printf("答案正确!\n"); 
				(*num)++;
				(*count)++;
			}
			else
			{
				printf("答案错误,继续加油。\n"); 
				(*num)++;
			}
/*
			if(num!=number){
				printf("继续请输入1,退出请输入0:");
				scanf("%d",&input);
				//if(input==0){
				//	break;
				//}
			}else{
				break;
			}
	*/		
}

④运算

void num_count(int isymbol){//计算

	int number=0;//最多产生题目数量
	int i=0,j=0;
	int num=0;//答题数目
	int count=0;//统计答对题目数量
//	int input=1;//进入条件
	int x=isymbol;
	int sy;
	sy=isymbol;
	printf("请输入题目数量\n");
	scanf("%d",&number);
	for(i=0;i<number;i++){
		int sign=0;
	//	srand(time(NULL)); /*初始化随机数种子*/
		sign=(int)(rand()%2);
		printf("第%d题:",i+1);
		printf("\n");
		
		switch (sy){
		case 1://加法
			if(sign==0){//整数
				integer(1,&num,&count);
			}
			else{//真分数
				t_score(1,&num,&count);
			}
			break;
		case 2://减法
			if(sign==0){
				integer(2,&num,&count);
			}else{
				t_score(2,&num,&count);
			}
			break;
		case 3://乘法
			if(sign==0){
				integer(3,&num,&count);
			}else{
				t_score(3,&num,&count);
			}
			break;
		case 4://除法
			if(sign==0){
				integer(4,&num,&count);
			}else{
				t_score(4,&num,&count);
			}
			break;
		}
			
/*			if(num!=number){
				printf("继续请输入1,退出请输入0:");
				scanf("%d",&input);
				//if(input==0){
				//	break;
				//}
			}else{
				break;
			}*/

			
	}
	printf("你一共回答了%d题,答对%d题\n",num,count);

}

⑤头文件、函数声明

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

int max_pa(int first, int second);//求最大公约数
int min_pm(int first, int second);//求最小公倍数
void t_score(int sy1,int*num,int*count);//真分数计算
void integer(int sy1,int*num,int*count);//整数计算
void num_count(int isymbol);//四则运算

⑥主函数

void main(){

	int isymbol=1;
		printf("||-------------------------------------------||\n");
		printf("||-----------欢迎进入四则运算系统------------||\n");
		printf("||-----   整数/真分数加法(请输入1)    -----||\n");
		printf("||-----   整数/真分数减法(请输入2)    -----||\n");
		printf("||-----   整数/真分数乘法(请输入3)    -----||\n");
		printf("||-----   整数/真分数除法(请输入4)    -----||\n");	
		printf("||               退出输出0                   ||\n");
	do{
		printf("加法 1,减法 2,乘法 3,除法 4,退出0          \n");
		
		printf("请输入你的选择:");
		scanf("%d",&isymbol);
		switch (isymbol){
		case 1:
			num_count(1);
			break;
		case 2:
			num_count(2);
			break;
		case 3:
			num_count(3);
			break;
		case 4:
			num_count(4);
			break;
		case 0:
			break;
		}	
	}while(isymbol>0);


}

2、运行截图

①加法

②减法

③乘法

④除法

四、个人小结

1、psp耗时表

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

2.作业小结

  在开发过程中,我采取模块化测试,首先把这个模块写好,再单独测试其功能,测试成功再放入整个代码中,这样在最后测试整个代码时会发现错误会很少,出现的错误也很好找到,很好解决不过会有个别bug,逻辑上的问题依然很难找,仍然需要阅读整个代码。养成写注释的习惯很好,可以很清楚找到各个模块的代码,能看明白其内容。  

  在本次开发中做的不好的是需求分析写的不好,在开发过程中想更改之前的需求分析,使得在开发过程中走了不少弯路。其次,还没有养成很好的代码规范的习惯。
posted @ 2020-11-08 11:15  计算机183罗星宇  阅读(142)  评论(0编辑  收藏  举报