结对项目Myapp
·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的更多相关文章
- 结对项目:四则运算题目生成器(C)
一.Github项目地址:https://github.com/Spartaright/myapp(合作人:梁天龙.赖佑铭) 二.PSP表格(如下图) 1.项目地址 PSP表格 PSP2.1 Pers ...
- 结对项目:四则运算(C语言)
github地址:https://github.com/nilonger/arithmetic 结对伙伴:杨锐龙+黄海钊 一.项目要求 1.1 题目:实现一个自动生成小学四则运算题目的命令行程序(也可 ...
- 复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~
结对项目:Web复利计算 搭档博客地址:25江志彬 http://www.cnblogs.com/qazwsxedcrfv/ 个人摘要: (2016-04-09-12:00)补充:之前传送门没做好, ...
- 高级四则运算器—结对项目反思(193 & 105)
高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格 PSP2.1 P ...
- 高级四则运算器—结对项目总结(193 &105)
高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界 ...
- 高级软件工程2017第3次作业——结对项目:四则运算题目生成程序(基于GUI)
Deadline:2017-10-11(周三)21:00pm (注:以下内容参考集大作业 ) 前言 想过和别人一起探索世界吗?多么希望,遇到困难时,有人能一起探讨:想要懈怠时,有人推你一把:当你专注于 ...
- WordCount结对项目
合作者:201631062124,201631062423 代码地址:https://gitee.com/yryx/WordCount 作业地址:https://edu.cnblogs.com/cam ...
- 2018-2019-2 《Java程序设计》结对项目阶段总结《四则运算——整数》(二)
20175218 2018-2019-2 <Java程序设计>结对项目阶段总结<四则运算--整数> 一.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加,减, ...
- 结对项目——四则运算GUI项目
一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...
随机推荐
- 【linux】led子系统
目录 前言 linux子系统 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都 ...
- httpserver ---tcp参数设置
1.SO_REUSEADDR选项: 在服务器程序中,SO_REUSEADDR socket选项通常在调用bind()之前被设置.SO_REUSEADDR可以用在以下四种情况下: (摘自<Unix ...
- tigervnc 编译
1.根据BUILDING.txt安装依赖(建议使用默认路径) 其中X11 development kit使用 yum install libX11* 2.修改CMakeList.txt 在前面添加 s ...
- 剑指offer刷题(算法类_1)
斐波那契数列 007-斐波拉契数列 题目描述 题解 代码 复杂度 008-跳台阶 题目描述 题解 代码 复杂度 009-变态跳台阶 题目描述 题解 代码 复杂度 010-矩形覆盖 题目描述 题解 代码 ...
- Spring MVC——项目的开发流程
创建项目(IDEA下) 打开IDEA,我们开始创建一个简单的Spring MVC项目,流程如下: 这里要注意一下,我们是基于Maven开发项目,当然是要配置Maven环境的,如果大家之前从来没有配置过 ...
- 这个厉害了,ssm框架整合全过程,建议收藏起来好好看看
1.0 环境要求 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 1.1 数据库 创建书籍数据库表,包括书籍编号,书籍名称,书籍数量以及书籍描述. CREATE DATABA ...
- 面试老被问LinkedList源码?看看阿里技术官是怎么深度剖析的吧!
前言 LinkedList底层是基于双向链表,链表在内存中不是连续的,而是通过引用来关联所有的元素,所以链表的优点在于添加和删除元素比较快,因为只是移动指针,并且不需要判断是否需要扩容,缺点是查询和遍 ...
- 阿里面试官:小伙子,你给我说一下Spring Bean初始化的几种常规方式吧
前言 通过构造方法实例化通过静态工厂实例化通过实例工厂实例化通过FactoryBean实例化 RumenzA实体类 package com.rumenz; public class RumenzA { ...
- 关于Folx一些使用方面的问题详细解答
Folx作为一款的专业的Mac系统文件下载工具,相信大家或多或少都对它的主打功能,如智能限速.制定计划任务.直链文件下载等功能有所了解,但是对于它的一些相对少见.冷门的功能,却不太熟悉. 下面小编将通 ...
- Folx专业版任务计划功能详解
Folx专业版的任务计划功能允许用户以时间表的方式,制定下载计划.按照预先设定的时间计划,Folx会在指定的时间段内,自动开启或停止下载任务. 另外,用户还可以设置自动关机功能.当计划下载任务停止时, ...