标签:图片 左右 创建 实现 解决问题 过程改进 creates cell 编码
魔鬼成员:谢文柱 刘丽昀
魔鬼地址: https://github.com/onetrue/Arithemetic
1. 使用 -n 参数控制生成题目的个数,例如
Myapp.exe -n 10
将生成10个题目。
2. 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如
Myapp.exe -r 10
将生成10以内(不包括10)的四则运算题目。该参数可以设置为1或其他自然数。该参数必须给定,否则程序报错并给出帮助信息。
3. 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 ? e2的子表达式,那么e1 ≥ e2。
4. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数。
5. 每道题目中出现的运算符个数不超过3个。
6. 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目。
例如,23 + 45 = 和45 + 23 = 是重复的题 目,6 × 8 = 和8 × 6 = 也是重复的题目。3+(2+1)和1+2+3这两个题目是重复的,
由于+是左结合的,1+2+3等价于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重复的两道题,因为
1+2+3等价于(1+2)+3,而3+2+1等价于(3+2)+1,它们之间不能通过有限次交换变成同一个题目。
生成的题目存入执行程序的当前目录下的Exercises.txt文件,格式如下:
1. 四则运算题目1
2. 四则运算题目2
……
其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。
7. 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt文件,格式如下:
1. 答案1
2. 答案2
特别的,真分数的运算如下例所示:1/6 + 1/8 = 7/24。
8. 程序应能支持一万道题目的生成。
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
30 |
30 |
|
· Estimate |
· 估计这个任务需要多少时间 |
10 |
30 |
|
Development |
开发 |
600 |
900 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
120 |
|
· Design Spec |
· 生成设计文档 |
10 |
10 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
60 |
60 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
30 |
|
· Design |
· 具体设计 |
30 |
60 |
|
· Coding |
· 具体编码 |
1200 |
900 |
|
· Code Review |
· 代码复审 |
60 |
60 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
30 |
|
Reporting |
报告 |
60 |
60 |
|
· Test Report |
· 测试报告 |
20 |
10 |
|
· Size Measurement |
· 计算工作量 |
10 |
20 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
60 |
|
合计 |
|
|
struct Problem//四则运算问题结构体
{
int numoffuhao;
int numofshu;
char fuhao[3];
int shu[4][2];
};
struct Answer//四则运算答案结构体
{
int fenzi;
int fenmu;
};
void createProblem(Problem *p,int i,int r)//随机生成一个问题
{
int fuhaoshu;//先随机确定符号数
fuhaoshu=rand()%3;
fuhaoshu+=1;
p[i].numoffuhao=fuhaoshu;
p[i].numofshu=fuhaoshu+1;
int j;
int yueshu;
for(j=0;j<fuhaoshu;j++)//循环生成所有随机符号
{
p[i].fuhao[j]=createFuhao();
}
for(j=0;j<fuhaoshu+1;j++)//循环生成所有随机数
{
int k;
k=rand()%2;
if(k==0)
{
p[i].shu[j][0]=createSuijishu(r);
p[i].shu[j][1]=1;
}else
{
p[i].shu[j][0]=createSuijishu(r);
p[i].shu[j][1]=createSuijishu(r);
yueshu=gcd(p[i].shu[j][0],p[i].shu[j][1]);
p[i].shu[j][0]/=yueshu;
p[i].shu[j][1]/=yueshu;
}
}
}
生成具体符号和具体操作数的函数,以及计算最大公约数的函数
char createFuhao()//随机生成运算符
{
int i;
i=rand()%4;
if(i==0) return ‘+‘;
if(i==1) return ‘-‘;
if(i==2) return ‘*‘;
if(i==3) return ‘/‘;
}
int createSuijishu(int r)//随机生成不大于r的随机数
{
int i;
do
i=rand()%r;
while(i==0);
return i;
}
int gcd(int a,int b)
{
if(a>b)
return (b>0)?gcd(b,a%b):a;
return (a>0)?gcd(a,b%a):b;
}
void countAnswer(Problem* p,int i,Answer* a)//计算问题的答案
{
int fuhaoshu;
fuhaoshu=p[i].numoffuhao;
char fuhaos[3];
int shus[4][2];
int temAns[2];
int j,k,l;
int flag;//判断符号优先级
for(j=0;j<fuhaoshu;j++)//获取符号数组
{
fuhaos[j]=p[i].fuhao[j];
}
for(j=0;j<fuhaoshu+1;j++)//获取数字数组
{
shus[j][0]=p[i].shu[j][0];
shus[j][1]=p[i].shu[j][1];
}
for(j=0;j<fuhaoshu;j++)//循环进行一次运算
{
flag=0;
for(k=0;k<fuhaoshu-j;k++)//判断哪个运算优先
{
if(fuhaos[k]==‘*‘||fuhaos[k]==‘/‘)
{
flag=k;
break;
}
}
jisuan(fuhaos[flag],shus[flag],shus[flag+1],temAns);
shus[flag][0]=temAns[0];
shus[flag][1]=temAns[1];
for(k=flag+1;k<fuhaoshu-j;k++)
{
fuhaos[k-1]=fuhaos[k];
shus[k][0]=shus[k+1][0];
shus[k][1]=shus[k+1][1];
}
}
a[i].fenzi=shus[0][0];
a[i].fenmu=shus[0][1];
}
void printProblem(Problem* p,int i,char *s)//将问题编程字符串形式
{
char c[50];
char tc[10];
int j;
for(j=0;j<p[i].numoffuhao;j++)
{
if(p[i].shu[j][1]==1)
{
itoa(p[i].shu[j][0],tc,10);
strcat(c,tc);
}else
{
if(p[i].shu[j][0]<p[i].shu[j][1])
{
itoa(p[i].shu[j][0],tc,10);
strcat(c,tc);
strcat(c,"/");
itoa(p[i].shu[j][1],tc,10);
strcat(c,tc);
}else
{
int zhengshu,zhenfenzi,zhenfenmu;
zhenfenmu=p[i].shu[j][1];
zhengshu=p[i].shu[j][0]/zhenfenmu;
zhenfenzi=p[i].shu[j][0]%zhenfenmu;
itoa(zhengshu,tc,10);
strcat(c,tc);
strcat(c,"‘");
itoa(zhenfenzi,tc,10);
strcat(c,tc);
strcat(c,"/");
itoa(zhenfenmu,tc,10);
strcat(c,tc);
}
}
strcat(c," ");
tc[0]=p[i].fuhao[j];
tc[1]=‘\0‘;
strcat(c,tc);
strcat(c," ");
}
if(p[i].shu[j][1]==1)
{
itoa(p[i].shu[j][0],tc,10);
strcat(c,tc);
}else
{
if(p[i].shu[j][0]<p[i].shu[j][1])
{
itoa(p[i].shu[j][0],tc,10);
strcat(c,tc);
strcat(c,"/");
itoa(p[i].shu[j][1],tc,10);
strcat(c,tc);
}else
{
int zhengshu,zhenfenzi,zhenfenmu;
zhenfenmu=p[i].shu[j][1];
zhengshu=p[i].shu[j][0]/zhenfenmu;
zhenfenzi=p[i].shu[j][0]%zhenfenmu;
itoa(zhengshu,tc,10);
strcat(c,tc);
strcat(c,"‘");
itoa(zhenfenzi,tc,10);
strcat(c,tc);
strcat(c,"/");
itoa(zhenfenmu,tc,10);
strcat(c,tc);
}
}
strcat(c," = ");
strcpy(s,c);
}
int main(int argc,char *argv[])
{
srand(time(NULL));
FILE *fp1,*fp2;
if((fp1=fopen("F:\\university\\大三第一学期\\课程\\软件工程\\第二次作业\\ArithmeticProgram\\ArithmeticProgram\\bin\\Debug\\Exercises.txt","w"))==NULL)
{printf("can not open file\n");
exit(0);
}
if((fp2=fopen("F:\\university\\大三第一学期\\课程\\软件工程\\第二次作业\\ArithmeticProgram\\ArithmeticProgram\\bin\\Debug\\Answers.txt","w"))==NULL)
{printf("can not open file\n");
exit(0);
}
int n,r;
if((strcmp(argv[1],"-n")==0)&&(strcmp(argv[3],"-r")==0))
{
n=atoi(argv[2]);
r=atoi(argv[4]);
}
Problem *problems = (Problem*)malloc(n*sizeof(Problem));//创建一个问题数组,保存所有的问题
Answer *answers = (Answer*)malloc(n*sizeof(Answer));//创建一个答案数组,保存所有答案
int i;
for(i=0;i<n;i++)//循环生成题目
{
char s[50];
char s1[50]="";
do
{
createProblem(problems,i,r);//生成一个问题,存在问题结构体中
countAnswer(problems,i,answers);//计算这个问题的答案,存在答案结构体中
}while(answers[i].fenzi<=0||answers[i].fenmu<=0);
printProblem(problems,i,s);//将问题转换为字符串
char tc[10];
if(answers[i].fenmu==1)
{
itoa(answers[i].fenzi,tc,10);
strcat(s1,tc);
}else
{
if(answers[i].fenmu>answers[i].fenzi)
{
itoa(answers[i].fenzi,tc,10);
strcat(s1,tc);
strcat(s1,"/");
itoa(answers[i].fenmu,tc,10);
strcat(s1,tc);
}else
{
int zhengshu,zhenfenzi,zhenfenmu;
zhenfenmu=answers[i].fenmu;
zhengshu=answers[i].fenzi/answers[i].fenmu;
zhenfenzi=answers[i].fenzi%answers[i].fenmu;
itoa(zhengshu,tc,10);
strcat(s1,tc);
strcat(s1,"‘");
itoa(zhenfenzi,tc,10);
strcat(s1,tc);
strcat(s1,"/");
itoa(zhenfenmu,tc,10);
strcat(s1,tc);
}
}
printf("%d\t%s%s\n",i+1,s,s1);
char bianhao[10];
itoa(i+1,bianhao,10);
fputs(bianhao,fp1);
fputs("\t",fp1);
fputs(s,fp1);
fputs("\n",fp1);
fputs(bianhao,fp2);
fputs("\t",fp2);
fputs(s1,fp2);
fputs("\n",fp2);
strcpy(s1,"");
}
return 0;
}
输入命令
命令行结果
题目文件Exercise.txt
答案文件Answers.txt
标签:图片 左右 创建 实现 解决问题 过程改进 creates cell 编码
原文地址:https://www.cnblogs.com/onetrue/p/9728955.html