1、实验目的与要求
- 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
- 练习题生成好后,将你的学号
- 当程序接收的参数为4时,以下为输出文件示例。
运算符为 +, −, ×, ÷
并且要求能处理用户的输入,并判断对错,打分统计正确率。
使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
需求分析
•通过-n参数控制题目个数,通过-s参数执行对错检验输出正确率
•生成max=10以内的随机的整数,随机的 +, −, ×, ÷符号,组合成四则运算运算题目,输出到文本文件
•读入文本文件,解析表达式求值,对比用户的答案,统计正确率
•学习新技术
◦栈
◦文件的读写
◦markdown
◦string流,string与int的相互转换
设计文档
用户输入命令行,程序根据命令行执行相应功能,Myapp.exe -n 10生成10道随机四则运算题目并输出到文本,Myapp.exe -s读入文本统计正确率并输出到控制台。
具体定义:
•运算符号只包含+, −, ×, ÷,=。没有括号。
•题目类型:[整数][符号][整数][符号][整数]
操作数+运算符+操作数
程序架构:
•解析用户输入的命令行。Myapp.exe -n 10,Myapp.exe -s
•Myapp.exe -n 10 ,返回题目个数
•循环生成题目直到满足题目数n
•随机生成整数或真分数,运算符,组成一道题目string
•一道题目加上 ’=’ 一行,输出到文本文件
•Myapp.exe -s ,表达式求值并统计正确率
•从文本中逐行读入题目和答案string
•bool result(string one) 将string中算术表达式部分压入optr和opnd栈中计算出结果res,最后从string中解析出答案ans,比对答案,正确返回true,错误返回false。
-函数返回true则tc+1,false则fc+1。
•统计结果tc/(tc+fc)并输出到控制台
代码规范
-随机生成low到high之间的数字的函数int random(int low ,int high)
-表达式比对并进行答案比对bool result(string one)
设计思路: 我做这个四则运算的思路是这样的:首先进入程序,在主函数里直接用一个while循环,循环里面判断并输出用户在10题的练习里做对了几题,当用户做完了10道题就给用户作出是否继续练习或者退出的选择;还有直接进入调用函数,调用函数首先是随机产生0~10的两个整数,四个符号(+ - * /)用一个变量随机产生1~4的整数。每个数对应一个符号,用case语句实现。然后加入两个个判断:
1.防止“不够减”的语句,当选择减法且num1小于num2时不够减不够减的时候,用临时变量交换两个操作数;
2.防止“除数为0”的程序漏洞,当num2被随机取值到0时,就将num2强制置为1,做除法时,将num1的值强制赋值给num1*num2,防止不能整除;
然后电脑计算正确的结果提示用户输入答案并且电脑计算正确的结果。最后是判断用户是否答对了,答对了就返回1,不对则返回0(用来计算做对的题数)。以此循环!
这个程序的缺陷是,当用户输入答案时,若用户输入了一个非整型字符,系统会崩溃;还有只是0~10之间的简单的运算,把范围局限了,但可以改进。还有是不能进行小数的运算
代码说明:
include <stdio.h>
#include <stdlib.h>
void main() {
int n=0,count=0; printf(" 欢迎使用小学生四则运算练习软件 ");
int ch=0;
printf("
欢迎使用小学生四则运算练习软件
");
while(1)
{
if(count==10)
{
printf("恭喜你在10道练习里做对了%d题!
",n);
printf(" 1.继续练习
2.退出");
scanf("%d",&ch);
if(ch==2)
{
break;
}
}
n+=yusuan(); count++;
}
}
int yusuan()
{
int ranswer=0; //正确答案
int uanswer=0; //用户输入的答案
int t=0,n=0; //临时变量
char op; //运算类别
int num1=0; //操作数1
int num2=0; //操作数2
srand(time(NULL)); //初始化随机数
num1=rand()%10; //取0—9之间的随机数
num2=rand()%10;
n=rand()%4+1; switch(n)
{ case 1: op='+'; break;
case 2: op='-'; break;
case 3: op='*'; break;
case 4: op='/'; break;
}
//加入一条防止“不够减”的语句,当选择减法且num1小于num2时不够减
//不够减的时候,用临时变量交换两个操作数
if((op=='-') && (num1<num2))
{ t=num1;
num1=num2;
num2=t;
}
//防止“除数为0”的程序漏洞
//当num2被随机取值到0时,就将num2强制置为1
//做除法时,将num1的值强制赋值给num1*num2,防止不能整除
if(op=='/')
{
if(num2==0)
{ num2=1; }
num1=num1*num2;
//防止num1不能被num2整除的语句 }
//输出测试题本身、提示用户输入
printf(" %d%c%d= ",num1,op,num2);
scanf("%d",&uanswer);
//程序计算正确结果
switch(op)
{ case '+': ranswer=num1+num2; break;
case '-': ranswer=num1-num2; break;
case '*': ranswer=num1*num2; break;
case '/': ranswer=num1/num2; break;
}
//评判,做对返回1,做错返回0
if(uanswer==ranswer)
{ printf(" 做对了! ");
return 1;
} else
{ printf(" 做错了! ");
return 0; }
}
运行结果:
PSP环节:
•前期需求分析及设计文档 做的越详细越正确后期写代码就会越轻松。因为程序架构与流程有了,写代码时只需特定的地方写详细就好。如果一开始就写代码,没有架构后期调试就会很麻烦且代码臃肿。当然写好架构的前提是先学好一门语言。
•学习看和查英文帮助文档。毕竟网上的大多个人博客写不是很详细(写这个小程序就有这种感觉了)。
•认真学习C++一门。在各门语言之间转来转去实在混乱,通晓一门足以知晓其他语言的大体情况了。