作业五—个人项目-小学四则运算 “软件”之升级版1
作业五—个人项目-小学四则运算 “软件”之升级版
作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186
github地址:https://github.com/huangzhipeng00/-
一、题目要求
像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:
23 - 3 * 4 = 11
二.扩展要求:
1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。
2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。
- 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
- 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
- 用户答题结束以后,程序可以显示用户答题所用的时间
- 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
- 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名
- 程序可以出单个整数阶乘的题目:如:4!=24
- 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
- 程序可以设置皮肤功能,可以改变界面的颜色即可。
三、设计思路
编程语言:c语言
工具:
设计思路:主函数让用户输入要练习的题目数量;而后随机产生随机数和随即运算符并产生运算式;判别用户输入的结果是否与正确答案一致,提示输入值是否正确,答题继续。答题完毕后,统计错对情况给出判别数据。
类。
四、主要代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<windows.h>
float algorithm(float x,char op,float y);
float algorithm2(float x,char op2,float y);
char createnumberop();
void test1(int n);
main()
{
int chooce,n;
system("color fc");
printf("欢迎来到四则运算练习题\n");
printf("(按回车键开始做题)\n");
getchar();
printf("\n请输入四则运算的数目:");
while(1)
{
scanf("%d",&n);
if(n<=0)
printf("【数目有误,请重新输入!】\n");
else
break;
}
test1(n);
}
//第一个运算符计算
float algorithm(float x,char op,float y)
{
float result;
switch(op)
{
case'+':result = x + y;break;
case'-':result = x - y;break;
case'*':result = x * y;break;
case'/':result = x / y;break;
}
return result;
}
//第二个运算符计算
float algorithm2(float x,char op2,float y)
{
float result;
switch(op2)
{
case'+':result = x + y;break;
case'-':result = x - y;break;
case'*':result = x * y;break;
case'/':result = x / y;break;
}
return result;
}
//随机产生运算符
char mark()
{
int op;
op=rand() % 4+1;
switch(op)
{
case 1:return'+';
case 2:return'-';
case 3:return'*';
case 4:return'/';
}
return 0;
}
//100以内四则运算
void test1(int n)
{
int i,rightnum=0,wrongnum=0;//rightnumber正确的个数,wrongnumber错误的个数
float a,b,c,answer,result;
char op,op2;//运算符
srand(time(NULL));
for(i=0;i<n;i++)
{
a=(float)(rand() % 100+1);//获取随机数
b=(float)(rand() % 100+1);
c=(float)(rand() % 100+1);
op=mark();//获取随机运算符
op2=mark();
if((op=='+' || op=='-') && (op2=='*' || op2=='/')){
result=algorithm(a,op,algorithm2(b,op2,c));
}
else{
result=algorithm2(algorithm(a,op,b),op2,c);//根据运算符优先级得出结果
}
if(result< 0)//如果结果为非正数,则重新获取题目
{
i--;
continue;
}
else{
printf("%.f %c %.f %c %.f = ",a,op,b,op2,c);
scanf("%f",&answer);
if((int)(100.0*answer+0.5)/100.0==(int)(100.0*result+0.5)/100.0 && result>=0)//四舍五入精确到小数点后两位
{
printf("【回答正确!】\n\n");
rightnum++;
}
else
{
printf("【回答错误!答案是:%.2f】\n\n",(int)(100.0*result+0.5)/100.0);
wrongnum++;
}
}
}
printf("你总共答对了%d题,准确率为%.2f%!\n",n,rightnum,(float)rightnum/(float)n*100);
system("pause");
system("CLS");
printf("\n\n");
}
五、遇到的问题
很多简单的函数都忘记怎么拼了,比上次更有难度,问了同学解决了等问题。