个人作业-四则运算题目生成程序
个人作业—四则运算生成程序
目录
- 一、作业信息
- 二、作业要求
- 三、代码提交
- 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,逻辑上的问题依然很难找,仍然需要阅读整个代码。养成写注释的习惯很好,可以很清楚找到各个模块的代码,能看明白其内容。
在本次开发中做的不好的是需求分析写的不好,在开发过程中想更改之前的需求分析,使得在开发过程中走了不少弯路。其次,还没有养成很好的代码规范的习惯。