·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. fork系统调用关于如何让子进程先运行{wait(),waitpid(),sleep()}

    在父进程里面调用wait()和waitpid()可以确保子进程先运行,因为当子进程运行完后会变成僵尸进程,此时会发送一个信号给父进程,父进程接受到信号才会运行. 有人或许会问如果在父进程调用wait之 ...

  2. 邻居子系统1.5 neigh output

    1.5.1 当邻居项不处于NUD_CONNECTD状态时,不允许快速路径发送报文,函数neigh_resolve_output 用于慢而安全的输出,通常用初始化neigh_ops结构 来实例outpu ...

  3. ceph-deploy 部署加密osd异常的问题

    问题解析 问题 journal encryption with dmcrypt (Reno Rainz) 问题原文: I'm trying to setup a cluster with encryp ...

  4. linux下制作软件包安装服务器

    linux下的软件包在有网络的情况下比较好安装,在ubuntu下,更新sourcelist,然后使用apt-get就可以很方便的安装包,在centos下面,更新yum列表,然后使用yum也可以进行方便 ...

  5. Javaer 进阶必看的 RocketMQ ,就这篇了

    每个时代,都不会亏待会学习的人. 大家好,我是 yes. 继上一篇 头条终面:写个消息中间件 ,我提到实现消息中间件的一些关键点,今天就和大家一起深入生产级别消息中间件 - RocketMQ 的内核实 ...

  6. Avoided redundant navigation to current location: "/users"

    问题产生的原因:在Vue导航菜单中,重复点击一个菜单,即重复触发一个相同的路由,会报错,但不影响功能 解决:在router的配置文件中加入如下代码: const originalPush = Rout ...

  7. 支付宝电脑网站支付 alipay.trade.page.pay

    只涉及支付接口 其他接口没有使用 支付宝官方文档:https://docs.open.alipay.com/270/105899/ 支付接口文档 https://docs.open.alipay.co ...

  8. Kubernetes K8S之Taints污点与Tolerations容忍详解

    Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...

  9. 【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(上)

    总是做各种Demo,是时候做个什么小应用来练练手了.踌躇了很久,果然还是搞个小游戏才有意思.想到几年前风靡全球的FlappyBird,一个屏幕一个按钮就足够了,正好适合.OLED屏幕.按键的驱动已经有 ...

  10. ABBYY FineReader添加盖章戳记

    PDF编辑器允许您如同在纸质文档上盖章一样在 PDF 文档上添加戳记.您可以从可用的戳记列表中选择戳记或者创建自己的戳记,然后添加任何所需的文本.戳记日期和时间或者图像. 如果要在页面上加上戳记,可以 ...