个人作业1——四则运算题目生成程序(基于C++)
2017-03-06 19:39
399 查看
题目描述:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:1.除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 2.运算符为 +, −, ×, ÷ 3.并且要求能处理用户的输入,并判断对错,打分统计正确率。 4.要求能处理用户输入的真分数, 如 1/2, 5/12 等 5.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 Myapp.exe -n 10
需求分析:
1.能够自动生成四则运算; 2.随机生成分数运算或整数运算; 3.用户自定义题目生成的数量; 4.用户可以输入答案; 5.程序判断对错并给出正确答案; 6.答完题后给出正确率。
Coding代码地址
https://coding.net/u/wumingxiang/p/ming_2017/git/blob/master/test1.cpp
程序设计:
本程序由C++语言编写,主要有四个函数,定义了一个 integer() 函数来生成整数的四则运算,定义了一个 fraction() 函数来生成分数的四则运算,由于分数需要化简,定义了 divisor (int a,int b) 函数通过辗转相除法求分子和分母的最大公约数,定义了 CheckResult(char result[]) 函数来判断输入的答案是否正确。 为了计算回答的正确率,定义全局变量 ri 来计算回答正确的题数。
#include<iostream> #include<stdlib.h> #include<time.h> #include <string.h> using namespace std; int ri = 0; int divisor (int a,int b) { int temp; if(a<b) { temp=a; a=b; b=temp; } while(b!=0) { temp=a%b; a=b; b=temp; } return a; } int CheckResult(char result[]) { char answer[10] ; cin>>answer; if(strcmp(answer,result)==0) { cout<<"回答正确"<<endl<<endl; ri++; } else { cout<<"回答错误,正确答案为"<<result<<endl<<endl; } } void integer() { int x,y,z,temp; char result[10]; srand(time(NULL)); x = rand() % 10; y = rand() % 10+1; z = rand()%4; switch(z) { case 0 : cout<<x<<" + "<<y<<"="; temp = x + y; sprintf(result, "%d", temp); break; case 1 : if(x<y) { temp=x; x=y; y=temp; } cout<<x<<" - "<<y<<"="; temp = x - y; sprintf(result, "%d", temp); break; case 2 : cout<<x<<" * "<<y<<"="; temp = x * y; sprintf(result, "%d", temp); break; case 3 : cout<<x<<" ÷"<<y<<"="; if(x%y==0) { temp = x / y; sprintf(result, "%d", temp); } else { temp = divisor(x,y); x = x/temp; y = y/temp; sprintf(result, "%d/%d", x, y); } break; } CheckResult(result) ; } void fraction() { int a,b,c,d,x,y,z,temp; char result[10]; srand(time(NULL)); a = rand() % 10; b = rand() % 10+1; c = rand() % 10; d = rand() % 10+1; z = rand() % 4; if(a>b) { temp=a; a=b; b=temp; } if(c>d) { temp=c; c=d; d=temp; } switch(z) { case 0 : cout<<a<<"/"<<b<<" + "<<c<<"/"<<d<<"="; x = a*d+b*c; y = b*d; temp = divisor(x,y); x = x/temp; y = y/temp; if(y==1) { sprintf(result, "%d", x); } else { sprintf(result, "%d/%d", x, y); } break; case 1 : if(a*d<b*c) { temp = a; a = c; c = temp; temp = b; b = d; d = temp; } cout<<a<<"/"<<b<<" - "<<c<<"/"<<d<<"="; x = a*d-b*c; y = b*d; temp = divisor(x,y); x = x/temp; y = y/temp; sprintf(result, "%d/%d", x, y); break; case 2 : cout<<a<<"/"<<b<<" * "<<c<<"/"<<d<<"="; if(a==0||c==0) { temp = 0; sprintf(result, "%d", temp); } else { x = a*c; y = b*d; temp = divisor(x,y); x = x/temp; y = y/temp; sprintf(result, "%d/%d", x, y); } break; case 3 : cout<<a<<"/"<<b<<" ÷"<<c<<"/"<<d<<"="; if((a*d)%(b*c)==0) { x = a*d; y = b*c; temp = x / y; sprintf(result, "%d", temp); } else { x = a*d; y = b*c; temp = divisor(x,y); x = x/temp; y = y/temp; if(y==1) { sprintf(result, "%d", x); } else { sprintf(result, "%d/%d", x, y); } } break; } CheckResult(result); } int main() { int n,q; cout<<"输入要生成的题数:"; cin>>n; for(int i=0;i<n;i++) { int a = rand()%2; switch(a) { case 0: integer();break; case 1: fraction();break; } } q=(ri*100)/n; cout<<"回答对了"<<ri<<"题"<<endl; cout<<"正确率为:"<<q<<"%"<<endl<<endl; }
测试:
PSP:
小结:
这次实验花了我较多的时间,通过这次实验,我也认识到自己对编程语言的掌握不够熟悉,在实验中我学会了许多技巧,比如说,我们在拿到实验题目的时候不能直接埋头写代码,而是应该先做一下需求分析,理清一下自己所需要实现的功能,我们应该先在脑海中有一个清晰的思路,写的代码才能够简洁明了。在完成实验的时候,遇到了一些语法不太熟悉的问题,我也上网查了一下资料,像sprintf()这个函数,以前没学过,但我知道自己所需要的功能,所以上网就查到了这个函数。其实我这次写的代码其实还存在一些代码重复写的问题,有些代码其实可以提取出来封装成一个函数,但因为怕超过实验的截止日期,没有实现,下次我会改进的。
相关文章推荐
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于C++)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于java)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(java代码,基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- (修改)个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)
- 个人作业1——四则运算题目生成程序(基于控制台)