一、作业信息
博客班级 | ahpu软件工程 |
---|---|
作业要求 | 实现四则运算 |
作业目标 | 能对需求进行分析并实现;写一个能自动生成小学四则运算题目的程序 |
学号 | 3180701228 |
二、作业要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24
2)程序要求能处理用户的输入,判断对错,累积分数
3)程序支持可以由用户自行选择加、减、乘、除运算
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目
三、代码提交
1.代码结构
①加法整/分数运算函数
void add_oper()
{
int a,b,c,q;
q=rand()%2;//随机选择整数或分数进行运算
if(q == 1)
{
a=rand()%100;
b=rand()%100;
printf("请回答:
%d + %d = ",a,b);
scanf("%d",&c);
if(a+b==c)
{
printf("回答正确!
");
r++;
}
else
{
printf("回答错误!
");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串
deno_1=rand()%100+1;
nume_1=rand()%deno_1;
deno_2=rand()%100+1;
nume_2=rand()%deno_2;
printf("%d/%d+%d/%d=
",nume_1,deno_1,nume_2,deno_2);
//真分数分母要比分子大且分母不能为0;
nume_s=(nume_1*deno_2)+(nume_2*deno_1);
deno_s=deno_1*deno_2;
//↑计算真分数相加的结果
scanf("%s", sum);
len = strlen(sum);
// for(i=0; i<len; i++)
// {
// printf("%c", sum[i]);
//
// }
int flag=0;
for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母
{
if(sum[i] != '/')
{
int i_sum = sum[i] - '0';//将char型转换为int型
// printf("
i_sum=%d",i_sum);
if(flag == 0){
nume *= 10;
nume += i_sum;
}
if(flag == 1){
deno *= 10;
deno += i_sum;
}
}
else if(sum[i] == '/')
{
// printf("
/");
flag = 1;
}
}
if(nume == nume_s && deno == deno_s)
{
// printf("转换后的结果 %d/%d", nume, deno);
printf("答案正确!");
r++;
}
else
{
// printf("转换后的结果 %d/%d", nume, deno);
printf("答案错误!");
w++;
}
}
}
②减法整/分数运算函数
void sub_oper()
{
int a,b,c,q;
q=rand()%2;
if(q == 0)
{
a=rand()%100;
b=rand()%100;
printf("请回答:
%d - %d = ",a,b);
scanf("%d",&c);
if(a-b==c)
{
printf("回答正确!
");
r++;
}
else
{
printf("回答错误!
");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串
deno_1=rand()%100+1;
nume_1=rand()%deno_1;
deno_2=rand()%100+1;
nume_2=rand()%deno_2;
printf("%d/%d-%d/%d=
",nume_1,deno_1,nume_2,deno_2);
//真分数分母要比分子大且分母不能为0;
nume_s=(nume_1*deno_2)-(nume_2*deno_1);
deno_s=deno_1*deno_2;
//↑计算真分数相减的结果
scanf("%s", sum);
len = strlen(sum);
int flag=0;//判断比值符
int sign=0;//判断正负符号
for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母
{
if(sum[i] != '/' && sum[i] != '-')
{
int i_sum = sum[i] - '0';//将char型转换为int型
if(flag == 0){
nume *= 10;
nume += i_sum;
}
if(flag == 1){
deno *= 10;
deno += i_sum;
}
}
else if(sum[i] == '/')
{
flag = 1;
}
else if(sum[i] == '-')
{
sign = 1;//说明用户输入的结果是负数
}
}
if(nume_s > 0 && nume == nume_s && deno == deno_s)
{
printf("答案正确!");
r++;
}
else if(nume_s < 0 && nume == -nume_s && deno == deno_s && sign == 1)
{
printf("答案正确!");
r++;
}
else
{
printf("答案错误!");
w++;
}
}
}
③乘法整/分数运算函数
void mul_oper()
{
int a,b,c,q;
q=rand()%2;
if(q == 0)
{
a=rand()%100;
b=rand()%100;
printf("请回答:
%d * %d = ",a,b);
scanf("%d",&c);
if(a*b==c)
{
printf("回答正确!
");
r++;
}
else
{
printf("回答错误!
");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串
deno_1=rand()%100+1;
nume_1=rand()%deno_1;
deno_2=rand()%100+1;
nume_2=rand()%deno_2;
printf("%d/%d*%d/%d=
",nume_1,deno_1,nume_2,deno_2);
//真分数分母要比分子大且分母不能为0;
nume_s=nume_1*nume_2;
deno_s=deno_1*deno_2;
// printf("%d * %d", nume_s, deno_s);
//↑计算真分数相乘的结果
scanf("%s", sum);
len = strlen(sum);
int flag=0;//判断比值符
for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母
{
if(sum[i] != '/')
{
int i_sum = sum[i] - '0';//将char型转换为int型
if(flag == 0){
nume *= 10;
nume += i_sum;
}
if(flag == 1){
deno *= 10;
deno += i_sum;
}
}
else if(sum[i] == '/')
{
flag = 1;
}
}
if(nume == nume_s && deno == deno_s && nume_s != 0)
{
printf("答案正确!");
r++;
}
else if(nume == nume_s && nume_s == 0)
{
printf("答案正确!");
r++;
}
else
{
// printf("%d", nume);
printf("答案错误!");
w++;
}
}
}
④除法整/分数运算函数
void div_oper()
{
int a,b,c,q;
q=rand()%2;
if(q == 0)
{
a=rand()%100;
b=rand()%100;
printf("请回答:
%d / %d = ",a,b);
scanf("%d",&c);
if(a/b==c)
{
printf("回答正确!
");
r++;
}
else
{
printf("回答错误!
");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串
deno_1=rand()%100+1;
nume_1=rand()%deno_1;
deno_2=rand()%100+2;
nume_2=rand()%deno_2;//除数不能为零!!!
printf("%d/%d ÷%d/%d=
",nume_1,deno_1,nume_2,deno_2);
//真分数分母要比分子大且分母不能为0;
nume_s=nume_1*deno_2;
deno_s=deno_1*nume_2;
// printf("%d * %d", nume_s, deno_s);
//↑计算真分数相乘的结果
scanf("%s", sum);
len = strlen(sum);
int flag=0;//判断比值符
// int sign=0;//判断正负符号
for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母
{
if(sum[i] != '/')
{
int i_sum = sum[i] - '0';//将char型转换为int型
if(flag == 0){
nume *= 10;
nume += i_sum;
}
if(flag == 1){
deno *= 10;
deno += i_sum;
}
}
else if(sum[i] == '/')
{
flag = 1;
}
}
if(nume == nume_s && deno == deno_s && nume_s != 0)
{
printf("答案正确!");
r++;
}
else if(nume == nume_s && nume_s == 0)
{
printf("答案正确!");
r++;
}
else
{
printf("答案错误!");
w++;
}
}
}
⑤头文件、宏定义、全局变量
include<stdio.h>
include<math.h>
include<string.h>
include<windows.h>
define N 10 //出十道题
define DIGIT 20 //用户输入答案数组的大小
int r = 0;//计数正确答题数
int w = 0;//计数错误答题数
void add_oper();//加法整/分数运算函数
void sub_oper();//减法整/分数运算函数
void mul_oper();//乘法整/分数运算函数
void div_oper();//除法整/分数运算函数
⑥主函数
int main()
{
int sel_oper, flag=1;
int con = 0;
printf("
欢迎进入简易四则运算
");
while(flag <= N)
{
printf("请选择:
");
printf(" 加法整/分数运算(请输入1)
");
printf(" 减法整/分数运算(请输入2)
");
printf(" 乘法整/分数运算(请输入3)
");
printf(" 除法整/分数运算(请输入4)
");
printf(" 退出整/分数运算(请输入5)
");
// sto = rand()%4;//随机生成四则运算选择数
if(con0)
scanf("%d",&sel_oper);
switch(sel_oper)
{
case 1:
printf("第%d题:", flag);
add_oper();
flag++;
break;
case 2:
printf("第%d题:", flag);
sub_oper();
flag++;
break;
case 3:
printf("第%d题:", flag);
mul_oper();
flag++;
break;
case 4:
printf("第%d题:", flag);
div_oper();
flag++;
break;
case 5:
return;
}
printf("
继续运算?(请输入1)
");
printf("
重新选择?(请输入2)
");
printf("
退出运算?(请输入3)
");
scanf("%d",&con);
if(con1)
con=1;
else if(con2)
con=0;
else if(con3)
break;
else
printf("抱歉!,你输入的指令有误!请重新输入!
");
}
printf("您总共完成了 %d 道题
正确 %d 道
错误 %d 道
",r+w,r,w);
return 0;
}
2.运行截图
整数加法
整数减法
整数乘法
整数除法
四、个人小结
第一次用博客园来写代码,完成相关作业,感觉对于自己来说还是有一点难度。关于这个题目,完成的还有很多不足,其中最大的不足就是,没有关于真分数的计算。总体来说,通过这次作业可以看出,编程能力还需要提高。
psp | 任务内容 | 计划完成的时间(min) | 实际完成时间(min) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 50 | 60 |
Development | 开发 | 20 | 20 |
Design | 设计 | 15 | 15 |
Test | 测试 | 6 | 6 |
Postmortem & Process Improvement Plan | 事后总结 | 5 | 5 |