·Github地址:https://github.com/Dioikawa/Myapp

·成员:陈杰才(3118005089)

蔡越(3118005086)

·耗费时间估计:

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30  
Estimate 估计这个任务需要多少时间 30  
Development 开发 13  
Analysis 需求分析 (包括学习新技术) 60  
Design Spec 生成设计文档 0  
Design Review 设计复审 (和同事审核设计文档) 0  
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10  
Design 具体设计 180  
Coding 具体编码 1000  
Code Review 代码复审 30  
Test 测试(自我测试,修改代码,提交修改) 30  
Reporting 报告 120  
Test Report 测试报告 60  
Size Measurement 计算工作量 30  
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30  
总计   1460

·程序结构(函数调用关系):

·关键代码展示:

  ·生成题目文件函数:只能生成六种固定格式的题目,受数学题目的合法性限制,没能生成形式任意且合法的运算式。

  1 int question(int y,int r)//生成题目
2 {
3 FILE *fp;
4 fp=fopen("Exercises.txt","a");
5 //time_t t;
6 //srand(time(NULL));
7 int num,num1,num2,num3,num4,ans;
8 char opt1,opt2,opt3;
9 char str[25]={};//用于传进答案函数
10 char strf[25]={};//用于写进文件
11 char strt[5]={" ÷ "};
12 opt1=getopt();
13 opt2=getopt();
14 opt3=getopt();
15
16 num1=rand()%r;
17 num2=rand()%r;
18 num3=rand()%r;
19 num4=rand()%r;
20
21 if(r<3) num=rand()%4+1;//r小于3时,不产生分数
22 else num=rand()%6+1;
23
24 if(num==1)//a+b
25 {
26 while(r==1&&opt1==-10)
27 opt1=getopt();//r是1则除号不参与运算
28
29 while(opt1==-10&&num2==0)
30 num2=rand()%r;//0不可作为除数
31
32 char str1[5]={};
33 itoa(num1,str1,10);
34 strcat(str,str1);
35 strcat(strf,str1);
36
37 char str2[5]={' ',opt1,' '};
38 strcat(str,str2);
39 if(opt1==-10) strcat(strf,strt);
40 else strcat(strf,str2);
41
42 char str3[5]={};
43 itoa(num2,str3,10);
44 strcat(str,str3);
45 strcat(strf,str3);
46 }
47 if(num==2)//a+b+c
48 { while(r==1&&(opt1==-10||opt2==-10))
49 {
50 opt1=getopt();
51 opt2=getopt();
52 }//r是1则除号不参与运算
53
54 while(opt1==-10&&num2==0)
55 num2=rand()%r;//0不可作为除数
56 while(opt2==-10&&num3==0)
57 num2=rand()%r;//0不可作为除数
58
59 char str1[5]={};
60 itoa(num1,str1,10);
61 strcat(str,str1);
62 strcat(strf,str1);
63
64 char str2[5]={' ',opt1,' '};
65 strcat(str,str2);
66 if(opt1==-10) strcat(strf,strt);
67 else strcat(strf,str2);
68
69 char str3[5]={};
70 itoa(num2,str3,10);
71 strcat(str,str3);
72 strcat(strf,str3);
73
74 char str4[5]={' ',opt2,' '};
75 strcat(str,str4);
76 if(opt2==-10) strcat(strf,strt);
77 else strcat(strf,str4);
78
79 char str5[5]={};
80 itoa(num3,str5,10);
81 strcat(str,str5);
82 strcat(strf,str5);
83 }
84 if(num==3)//a+b+c+d
85 {
86 while(r==1&&(opt1==-10||opt2==-10||opt3==-10))
87 {
88 opt1=getopt();
89 opt2=getopt();
90 opt3=getopt();
91 }//r是1则除号不参与运算
92
93 while(opt1==-10&&num2==0)
94 num2=rand()%r;//0不可作为除数
95 while(opt2==-10&&num3==0)
96 num3=rand()%r;//0不可作为除数
97 while(opt3==-10&&num4==0)
98 num4=rand()%r;//0不可作为除数
99
100 char str1[5]={};
101 itoa(num1,str1,10);
102 strcat(str,str1);
103 strcat(strf,str1);
104
105 char str2[5]={' ',opt1,' '};
106 strcat(str,str2);
107 if(opt1==-10) strcat(strf,strt);
108 else strcat(strf,str2);
109
110 char str3[5]={};
111 itoa(num2,str3,10);
112 strcat(str,str3);
113 strcat(strf,str3);
114
115 char str4[5]={' ',opt2,' '};
116 strcat(str,str4);
117 if(opt2==-10) strcat(strf,strt);
118 else strcat(strf,str4);
119
120 char str5[5]={};
121 itoa(num3,str5,10);
122 strcat(str,str5);
123 strcat(strf,str5);
124
125 char str6[5]={' ',opt3,' '};
126 strcat(str,str6);
127 if(opt3==-10) strcat(strf,strt);
128 else strcat(strf,str6);
129
130 char str7[5]={};
131 itoa(num4,str7,10);
132 strcat(str,str7);
133 strcat(strf,str7);
134 }
135
136 if(num==5)//a/b+c
137 {
138 while(opt1==-10&&num1==0)
139 num1=rand()%r;//0不可作为除数
140
141 Truescore(r,str);
142 strcpy(strf,str);
143
144 char str1[5]={' ',opt1,' '};
145 strcat(str,str1);
146 if(opt1==-10) strcat(strf,strt);
147 else strcat(strf,str1);
148
149 char str2[5]={};
150 itoa(num1,str2,10);
151 strcat(str,str2);
152 strcat(strf,str2);
153 }
154
155 if(num==6)//a+b/c+d
156 {
157 while(opt2==-10&&num2==0)
158 num2=rand()%r;//0不可作为除数
159
160 char str1[5]={};
161 itoa(num1,str1,10);
162 strcat(str,str1);
163 strcat(strf,str1);
164
165 char str2[5]={' ',opt1,' '};
166 strcat(str,str2);
167 if(opt1==-10) strcat(strf,strt);
168 else strcat(strf,str2);
169
170 char str3[8]={};
171 Truescore(r,str3);
172 strcat(str,str3);
173 strcat(strf,str3);
174
175 char str4[5]={' ',opt2,' '};
176 strcat(str,str4);
177 if(opt2==-10) strcat(strf,strt);
178 else strcat(strf,str4);
179
180 char str5[5]={};
181 itoa(num2,str5,10);
182 strcat(str,str5);
183 strcat(strf,str5);
184 }
185
186 if(num==4)//a+(b+c)
187 {
188 while(r==1&&(opt1==-10||opt2==-10))
189 {
190 opt1=getopt();
191 opt2=getopt();
192 }//r是1则除号不参与运算
193
194 while(opt1==-10&&num2==0)
195 num2=rand()%r;//0不可作为除数
196 while(opt2==-10&&num3==0)
197 num3=rand()%r;//0不可作为除数
198
199 char str1[5]={};
200 itoa(num1,str1,10);
201 strcat(str,str1);
202 strcat(strf,str1);
203
204 char str2[5]={' ',opt1,' '};
205 strcat(str,str2);
206 if(opt1==-10) strcat(strf,strt);
207 else strcat(strf,str2);
208
209 char left[3]={'('};
210 strcat(str,left);
211 strcat(strf,left);
212
213 char str3[5]={};
214 itoa(num2,str3,10);
215 strcat(str,str3);
216 strcat(strf,str3);
217
218 char str4[5]={' ',opt2,' '};
219 strcat(str,str4);
220 if(opt2==-10) strcat(strf,strt);
221 else strcat(strf,str4);
222
223 char str5[5]={};
224 itoa(num3,str5,10);
225 strcat(str,str5);
226 strcat(strf,str5);
227
228 char right[3]={')'};
229 strcat(str,right);
230 strcat(strf,right);
231 }
232
233 // ans=Answer(str,y);//将题目字符串str传进生成答案函数Answer
234 if(Answer(str,y)<0)
235 { fclose(fp);
236 return -1;
237 }//若计算答案过程中产生负数,则返回-1给main()处理
238 else//否则将题目写进Exercises.txt文件,并返回1给main()处理
239 {
240 //printf("%d.%s",y,str) ;
241 fprintf(fp,"%d.%s = \n",y,strf);
242 fclose(fp);
243 return 1;
244 }
245 }

  ·生成答案函数:将题目字符串作为参数,利用栈计算运算结果并转换为字符串写进答案文件,同时想生成问题文件并返回标识。

 1 int Answer(char str[],int y)//答案函数,str为运算式子,y为序号
2 {
3 Stack1 num;//分数数栈
4 Stack2 opt;//运算符栈
5 int i = 0, tmp = 0;
6 int s,m;
7 int a1,a2,a3,a4,a5;
8 char temps[20]="\0";//存放中间运算结果
9 char fans[20]="\0";//答案字符串
10 FILE *fp;
11 fp=fopen("Answers.txt","a");
12
13 if(InitStack1(&num) != OK || InitStack2(&opt) != OK)
14 {
15 printf("Init Failure!\n");
16 exit(1);
17 }
18
19 while(str[i] != '\0' || EmptyStack(&opt) != OK)
20 {
21 if(str[i]==32)
22 {
23 i++;
24 continue;
25 }
26 if(str[i] >= '0' && str[i] <= '9')
27 {
28 tmp = tmp * 10 + str[i] - '0';
29 i++;
30 if(str[i] < '0' || str[i] > '9')
31 {
32 if(Push1(&num,1,tmp)==ERROR)
33 printf("Push1 ERROR!");//数字tmp/1入栈
34 tmp = 0;
35 }
36 }
37 else
38 {
39 if((EmptyStack(&opt) == OK) || (GetTop(&opt) == '(' && str[i] != ')') || Priority(str[i]) > Priority(GetTop(&opt)))//进栈不参与运算
40 {
41 if(Push2(&opt,str[i])==ERROR)
42 printf("Push2 ERROR!");//运算符入栈
43 i++;
44 continue;
45 }
46 if(GetTop(&opt) == '(' && str[i] == ')')//出栈不参与运算
47 {
48 Popt(&opt);
49 i++;
50 continue;
51 }
52 if((str[i] == '\0' && EmptyStack(&opt) != OK) || (str[i] == ')' && GetTop(&opt) != '(') || Priority(str[i]) <= Priority(GetTop(&opt)))//出栈并参与运算
53 { a1=Pop2(&num);
54 a2=Pop1(&num);
55 a3=Pop2(&num);
56 a4=Pop1(&num);
57 a5=Popt(&opt);
58 Calculator(a1,a2,a3,a4,a5,temps);//计算中间结果,得到字符串temps
59 // getfenzifenmu(&s,&m,temps);
60 if(temps[0]=='-')
61 return -1;//判断中间结果是否为负
62
63 getfenzifenmu(&s,&m,temps);
64 if(Push1(&num,m,s)==ERROR)
65 printf("Push3 ERROR!");//非负则中间结果入栈
66 continue;
67 }
68 }
69 }
70
71 Simplify(s,m,fans);//化简分数,得到字符串fans
72 //printf("%d.是%s\n",y,fans);
73 fprintf(fp,"%d.%s\n",y,fans);//将答案写进文件
74 fclose(fp);
75 return 1;
76 }

  ·分数化简函数:将原始分数化简为整数,真分数或带分数,将结果返回生成答案函数以写进答案文件。

 1 void Simplify(int s,int m,char str[])//分数化简
2 {
3 int d,g,s1; //d为带分数的整数部分或者整数,g为s和m的最大公约数
4 char son[20]={'\0'};
5 char mom[20]={'\0'};
6 char n[20]={'\0'};
7 if(s%m==0){
8 d=s/m;
9 itoa(d,str,10);
10 }
11 else if(s>m){
12 d=s/m;
13 s1=s-d*m;
14 g=gcd(s1,m);
15 itoa(d,n,10);
16 itoa(s1/g,son,10);
17 itoa(m/g,mom,10);
18 strcat(n,"'");
19 strcat(n,son);
20 strcat(n,"/");
21 strcat(n,mom);
22 strcpy(str,n);
23 }
24 else{
25 g=gcd(s,m);
26 itoa(s/g,son,10);
27 itoa(m/g,mom,10);
28 strcat(son,"/");
29 strcat(son,mom);
30 strcpy(str,son);
31 }
32 }

  ·生成成绩函数:以给定题目文件和答案文件作为参数,由题目文件利用求答案函数计算正确答案,并与给定答案进行比对,最后生成成绩文件,显示正确和错误的            题目数和具体题号。

 1 void check(char exercisefile[],char answerfile[])
2 {
3 FILE *f1,*f2,*f3;
4 int correct=0,wrong=0; //分别为对和错的题目数量
5 int n1=0,n2=0;//题目序号
6 int i;
7 int correctno[10000]={0};
8 int wrongno[10000]={0};
9 char question[25]="\0";
10 char answer[25]="\0";
11 char canswer[25]="\0"; //正确答案
12 f1=fopen(exercisefile,"r");
13 f2=fopen(answerfile,"r");
14 f3=fopen("Grade.txt","w");
15 while(!feof(f1))
16 {
17 if(getquestion(f1,&n1,question)) //读取题目失败
18 break;
19 getanswer(f2,&n2,answer);
20 Answer1(question,canswer);
21 if(!strcmp(canswer,answer)) //答案正确
22 {
23 correctno[correct]=n1;
24 correct++;
25 }
26 else{
27 wrongno[wrong]=n2;
28 wrong++;
29 }
30 }
31 fprintf(f3,"Correct: %d (",correct);
32 for(i=0;i<correct;i++)
33 {
34 fprintf(f3,"%d",correctno[i]);
35 if(i!=correct-1)
36 fprintf(f3,", ");
37 }
38 fprintf(f3,")\nWrong: %d (",wrong);
39 for(i=0;i<wrong;i++)
40 {
41 fprintf(f3,"%d",wrongno[i]);
42 if(i!=wrong-1)
43 fprintf(f3,", ");
44 }
45 fprintf(f3,")");
46 fclose(f1);
47 fclose(f2);
48 fclose(f3);
49 }

·测试运行:

  ·生成10道题目且数字不超过10的文件Exercises.txt同时生成答案文件Answers.txt:

 

  ·当-r后的参数为1时,即出现的数字均为0,此时没有分数出现且没有除运算:

  ·给定题目文件Exercises.txt和答案文件Answers.txt,生成成绩文件Grade.txt:

  ·当用户参数输入缺漏时,将输出提示:

·PSP:

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 15
Estimate 估计这个任务需要多少时间 30 15
Development 开发 1310 1410
Analysis 需求分析 (包括学习新技术) 60 100
Design Spec 生成设计文档 0 0
Design Review 设计复审 (和同事审核设计文档) 0 0
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 30
Design 具体设计 180 210
Coding 具体编码 1000 1020
Code Review 代码复审 30 30
Test 测试(自我测试,修改代码,提交修改) 30 20
Reporting 报告 120 145
Test Report 测试报告 60 120
Size Measurement 计算工作量 30 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 15
总计   1460 1570

·项目小结,结对感受:

  ·结对编程,重在协助与交流,及时反馈进度,不断互相帮助,共同完成任务。

  ·要将自己的需求或遇到的难题表达清楚,表达模糊会为后续的工作带来麻烦。

  ·该项目存在许多细节问题,开发前应尽量做到全面思考和程序结构组织,有利于开发工作的顺利进行。

结对项目Myapp的更多相关文章

  1. 结对项目:四则运算题目生成器(C)

    一.Github项目地址:https://github.com/Spartaright/myapp(合作人:梁天龙.赖佑铭) 二.PSP表格(如下图) 1.项目地址 PSP表格 PSP2.1 Pers ...

  2. 结对项目:四则运算(C语言)

    github地址:https://github.com/nilonger/arithmetic 结对伙伴:杨锐龙+黄海钊 一.项目要求 1.1 题目:实现一个自动生成小学四则运算题目的命令行程序(也可 ...

  3. 复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~

    结对项目:Web复利计算 搭档博客地址:25江志彬  http://www.cnblogs.com/qazwsxedcrfv/ 个人摘要: (2016-04-09-12:00)补充:之前传送门没做好, ...

  4. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  5. 高级四则运算器—结对项目总结(193 &105)

    高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界 ...

  6. 高级软件工程2017第3次作业——结对项目:四则运算题目生成程序(基于GUI)

    Deadline:2017-10-11(周三)21:00pm (注:以下内容参考集大作业 ) 前言 想过和别人一起探索世界吗?多么希望,遇到困难时,有人能一起探讨:想要懈怠时,有人推你一把:当你专注于 ...

  7. WordCount结对项目

    合作者:201631062124,201631062423 代码地址:https://gitee.com/yryx/WordCount 作业地址:https://edu.cnblogs.com/cam ...

  8. 2018-2019-2 《Java程序设计》结对项目阶段总结《四则运算——整数》(二)

    20175218 2018-2019-2 <Java程序设计>结对项目阶段总结<四则运算--整数> 一.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加,减, ...

  9. 结对项目——四则运算GUI项目

    一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...

随机推荐

  1. 流量控制--3.Linux流量控制的组件

    Linux流量控制的组件 流量控制元素与Linux组件之间的相关性: traditional element Linux component 入队列 修订:从用户或网络接收报文 整流 class 提供 ...

  2. leetcode 30day--1

    Single Number Given a non-empty array of integers, every element appears twice except for one. Find ...

  3. python <12> socket 编程

    1.socket编程需要两个部分 服务器与客户端我们的python中调用 socket包就不需要自己写协议了(socket编程中windows 与Linux中的效果是完全不相同了,次代码最好是放在Li ...

  4. 利用s3-test进行ceph的接口兼容性测试

    前言 ceph的rgw能够提供一个兼容性的s3的接口,既然是兼容性,当然不可能是所有接口都会兼容,那么我们需要有一个工具来进行接口的验证以及测试,这个在其他测试工具里面有类似的posix接口验证工具, ...

  5. centos6安装calamari

    安装操作系统 首先安装操作系统centos6,安装过程选择的是base server,这个不相同不要紧,出现缺少包的时候去iso找出来安装就可以了 calamari的简单介绍 首先简单的介绍下cala ...

  6. 【开发实录】在鸿蒙开发板上使用websocket(移植自librws库)

    librws: Tiny, cross platform websocket client C library 相关代码可在下面下载,也可进入librws: 将librws移植到鸿蒙Hi_3861开发 ...

  7. [head first 设计模式] 第一章 策略模式

    [head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...

  8. 如何使用Camtasia给视频或者图片调色

    喜欢摄影过着做视频的朋友一定知道,一张好看的照片或者一段精美视频的构成因素很多,取景本身肯定是个很重要的条件,相机的素质是非常重要的硬件条件,接下来的就是后期的编辑和处理了,而在后期处理过程中调色就显 ...

  9. 使用ABBYY FineReader 14查看和编辑PDF

    使用ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF,以及在其中添加注释和进行搜索,即使这些 PDF 是从扫描纸质文档生成.因而不包含任何可疑搜索或编辑的文本.是一款名副其实的 ...

  10. 【移动自动化】【一】环境依赖:android sdk 环境配置(windows + linux)

    Android自动化前提依赖 android sdk 模拟器: mumu模拟器, 逍遥模拟器 真机 windows 环境下Android SDK 配置 配置java环境 去官网下载jdk http:/ ...