·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. Spring Boot 创建 Docker 镜像

    随着越来越多的组织转向容器和虚拟服务器,Docker正成为软件开发工作流程中一个更重要的部分.为此,Spring Boot 2.3中最新的功能之中,提供了为Spring Boot应用程序创建 Dock ...

  2. Angular 之装饰器@Input

    Input 一个装饰器,用来把某个类字段标记为输入属性,并提供配置元数据. 该输入属性会绑定到模板中的某个 DOM 属性.当变更检测时,Angular 会自动使用这个 DOM 属性的值来更新此数据属性 ...

  3. laravel5.5 如何创建Facades并使用

    laravel Facades概念略,自行百度. 如何创建Facades使用步骤1. 创建一个php文件,App\Utils\SmsSend.php.<?php namespace App\Ut ...

  4. Python_列表相减(判断长度后长的减短的)

    #定义一个方法,可进行列表相减 class V(object): def __init__(self,*value): self.value=value def __sub__(self,other) ...

  5. Linux系统学习07-Centos软件安装几种方法

    配置好Centos一些基础设置后,接下来就是学习平时使用最多的软件安装. windwos下软件安装非常简单,就是下载好安装包,然后双击就会自动安装. 而Centos里面安装软件的方式方法有区别,熟悉几 ...

  6. Linux(Centos6.8)配置Nginx环境

    1.环境配置 操作系统:centos6.8 [root@host79 ~]# uname -a Linux host79.pluto 2.6.32-642.el6.x86_64 #1 SMP Tue ...

  7. 学会网页制作,web app开发,必须先从语法基础开始学习

    做软件开发,是从事编程开发工作,必须先从语法基础开始学习,通过语法组成产品效果.      前端开发的基础语法,由HTML+CSS+JavaScript组成,这是前端开发最基本的3个语言.       ...

  8. 安装Ubuntu时到底该如何分区

    安装系统:Ubuntu16.04(单系统) /(根分区),主分区,   Ext4文件系统,100G-200G /boot分区,   逻辑分区,Ext4文件系统,~200MB /home分区, 逻辑分区 ...

  9. Ubuntu14.04下安装Composer

    下载Composer: curl -sS https://getcomposer.org/installer | php 安装Composer: /usr/bin/php composer.phar ...

  10. 【bzoj2588/P2633】count on a tree —— LCA + 主席树

    (以下是luogu题面) 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问 ...