项目 | 内容 |
---|---|
课程班级博客链接 | https://edu.cnblogs.com/campus/xbsf/nwnu2020SE/ |
这个作业要求链接 | https://https://www.cnblogs.com/nwnu-daizh/p/12416880.html |
我的课程学习目标 | (1)学习掌握PSP开发流程;(2)掌握Github发布软件项目的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | (1)开发疫情上报系统;(2)浏览《构建之法——现代软件工程》 |
项目Github的仓库链接地址 | https://github.com/sisi-713/survey |
任务1:陈述学生疫情每日上报子系统使用体验;
(1)界面设计比较粗糙;
(2)没有提醒功能,总是忘记打卡;
(3)在填写完成后又弹出一个空白框造成干扰;
(4)基本功能已实现,可以记录师生的疫情情况;
(5)系统后期可以记录我们的信息,不需要每天都填写。
任务2:详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。
我选择第一类开发:
第一类开发要求:
有一个数据文件,保存了100天 2000 个教职工/学生的所有防疫信息,请设计一个命令行程序,支持查询某人在某一天的疫情情况,查询某种数据的周/月的疫情统计情况,并用柱状图显示统计结果。
1、需求分析
2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施: 2020年1 月23 日10时起对武汉“封城”,全国 31个省市也相继实施了严格的防控措施;全国各省市向武汉和湖北派遣医疗队参与救治工作;在全国范围内调配口罩、防护服、药品等急需的医疗资源支援武汉;指导和督促全国范围内拥有医疗物资生产资质的企业尽快恢复生产能力;定向拨付专项财政资金用于疾病防控;从其他省份调集物资保障武汉市民日常生活。
中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。以腾讯为例,围绕应对疫情管控需求开发了十一款产品。其中疫情在线问诊功能,对于减少发热病人之间的相互交叉感染具有重要的作用,患者在家通过互联网向在线医生问诊,减少了病毒传播或感染的风险;谣言粉碎对于公众采取理性态度看待疫情的发展具有重要意义。滴滴出行还在武汉专门组建车队,服务于医护人员的通勤,这在实施交通管制的武汉具有重要作用。此外,还有新型肺炎确诊患者同行程查询工具,用户只需要输入自己所乘坐交通工具的时间和班次,就可以确认是否与被确诊感染者同行,提前做好自我隔离和就诊工作。在疫情防控中,中国互联网企业不仅发展壮大,在承担社会责任方面也越来越成熟。
为有效配合防控机构有关疫情信息的采集、统计与排查,我校开发了教职工/学生疫情上报系统,该系统由教职工疫情每日上报、学生疫情每日上报、二级部门疫情每日汇总表、疫情防控填报统计四个子系统组成。实现对我校各类人员基本情况、所在区域及活动轨迹及健康状况的信息收集。师生通过我校企业微信服务大厅访问该系统进行远程信息填报。
2、功能设计
- 基本功能
- 通过学号,姓名来查询某人的疫情信息
- 按日统计疫情情况
- 扩展功能
- 添加疫情信息
- 显示疫情信息
3、设计实现
if(r>='0'&&r<='4')
{
switch(r)
{
case '1':
add();//调用添加信息的函数
printf("\n");
break;
case '2':
scan();//调用显示信息的函数
printf("\n");
break;
case '3':
query();//调用查询信息的函数
printf("\n");
break;
case '4':
statis();//调用按日期查找的函数
printf("\n");
break;
default:
printf("再见!\n");
}
}
通过调用add(),scan(),query(),statis()函数来分别实现对信息的添加,显示,查询,按日期统计。
4、测试运行
添加疫情信息:
按姓名查询疫情信息:
按学号查询疫情信息:
按日期查询疫情信息:
按日期统计感染人数:
5、关键代码
void add() //添加疫情信息
{
FILE *fp;
int i=0;
char sign='y'; //定义sign='y'
person p[200] ;
while(sign!='n'&&sign!='N') //只有当输入N或n时才跳出循环
{
printf("\n请输入您的ID:");
scanf("%s",per[i].id);
printf("\n请输入您的姓名:");
scanf("%s",per[i].name);
//判断性别是否输入正确
while(1)
{
printf("\n请输入您的性别:");
scanf("%s",per[i].sex);
if(strcmp(per[i].sex,"男")==0||strcmp(per[i].sex,"女")==0)
{
break;
}
else
{
printf("输入有误!");
}
}
printf("\n请输入您所在院系:");
scanf("%s",per[i].academy);
int len=0;
//判断电话号码是否输入正确,默认为11位
while(1)
{
printf("\n请输入您的电话号码:");
scanf("%s",per[i].phone);
len=strlen(per[i].phone);
if(len==11)
{
break;
}
else
{
printf("输入有误,请重新输入!");
}
}
printf("\n请问您当前所在地址:");
scanf("%s",per[i].address);
while(1)
{
printf("\n请问您是否留校(是/否):");
scanf("%s",per[i].school);
if(strcmp(per[i].school,"是")==0||strcmp(per[i].school,"否")==0)
{
break;
}
else
{
printf("输入有误!");
}
}
while(1)
{
printf("\n请问您是否为湖北籍人员(是/否):");
scanf("%s",per[i].native);
if(strcmp(per[i].native,"是")==0||strcmp(per[i].native,"否")==0)
{
break;
}
else
{
printf("输入有误!");
}
}
while(1)
{
printf("\n请问您是否近14日内与湖北疫区人员接触(是/否):");
scanf("%s",per[i].touch);
if(strcmp(per[i].touch,"是")==0||strcmp(per[i].touch,"否")==0)
{
break;
}
else
{
printf("输入有误!");
}
}
while(1)
{
printf("\n请问您是否有被感染现象(是/否):");
scanf("%s",per[i].infected);
if(strcmp(per[i].infected,"是")==0||strcmp(per[i].infected,"否")==0)
{
break;
}
else
{
printf("输入有误!");
}
}
printf("\n请输入日期:");
scanf("%s",per[i].date);
printf("信息成功录入系统!\n");
i++;
num=num+1;
printf("是否继续添加?(y/n)");
scanf("\t%c",&sign);
}
if((fp=fopen("data.txt","ab"))==NULL) //以二进制形式在文件尾部追加保存//
{
printf("cannot open the files\n");
return; //如果文件出现错误 就返回
}
for(i=0; i<num; i++)
{
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
per[i].id,per[i].name,per[i].sex,per[i].academy,
per[i].phone,per[i].address,per[i].school,
per[i].native,per[i].touch,per[i].infected,per[i].date);
}
fclose(fp);//关闭文件
}
//信息查询//
void query()
{
person p[200];
FILE *fp;
int i=0;
int n=0;
int m;
//可按不同方式查询信息
printf("\t\n请选择查询方式:\n");
printf("\t1------姓名 \n");
printf("\t2------学号 \n");
printf("\t3------日期\n");
printf("请输入你要查询的方式\n");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=3)
{
printf("输入错误请重新查询!\n");
scanf("%d",&m);
}
if((fp=fopen("data.txt","r"))==NULL)
{
printf("cannot open the files\n");
}
while(fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
per[i].id,per[i].name,per[i].sex,per[i].academy,
per[i].phone,per[i].address,per[i].school,per[i].native,
per[i].touch,per[i].infected,per[i].date)!=EOF);
{
i++;
n=n+1;
}
if(m==1) //姓名查询
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) //比较per[i].name与所输入姓名是否相同//
{
i++;
}
if(i==n)
{
printf("查找失败!");
}
else
{
printf("学号\t姓名\t性别\t所在院系\t电话\t地址\t留校\t湖北籍\t接触疫区人员\t感染\t日期\n");
printf("%s\t",per[i].id);
printf("%s\t",per[i].name);
printf("%s\t",per[i].sex);
printf("%s\t",per[i].academy);
printf("%s\t",per[i].phone);
printf("%s\t",per[i].address);
printf("%s\t",per[i].school);
printf("%s\t",per[i].native);
printf("%s\t",per[i].touch);
printf("%s\t",per[i].infected);
printf("%s\n",per[i].date);
}
}
if(m==2) //学号查询
{
char s[15];
int i=0;
printf("\t请输入想查询的学号:");
scanf("\t%s",s);
while(strcmp(per[i].id,s)!=0&&i<n) //比较per[i].id与所输入学号是否相同//
{
i++;
}
if(i==n)
{
printf("\t查找失败!\n");
}
else
{
printf("学号\t姓名\t性别\t院系\t电话\t地址\t留校\t湖北籍\t接触疫区人员\t感染\t日期\n");
printf("%s\t",per[i].id);
printf("%s\t",per[i].name);
printf("%s\t",per[i].sex);
printf("%s\t",per[i].academy);
printf("%s\t",per[i].phone);
printf("%s\t",per[i].address);
printf("%s\t",per[i].school);
printf("%s\t",per[i].native);
printf("%s\t",per[i].touch);
printf("%s\t",per[i].infected);
printf("%s\n",per[i].date);
}
}
if(m==3) //日期查询
{
char s[12];
int i=0;
printf("\t请输入想查询的日期:");
scanf("\t%s",s);
while(strcmp(per[i].date,s)!=0&&i<n)//比较per[i].date与所输入日期是否相同
{
i++;
}
if(i==n)
{
printf("这天没有记录!");
}
else
{
printf("学号\t姓名\t性别\t院系\t电话\t地址\t留校\t湖北籍\t接触疫区人员\t感染\t日期\n");
printf("%s\t",per[i].id);
printf("%s\t",per[i].name);
printf("%s\t",per[i].sex);
printf("%s\t",per[i].academy);
printf("%s\t",per[i].phone);
printf("%s\t",per[i].address);
printf("%s\t",per[i].school);
printf("%s\t",per[i].native);
printf("%s\t",per[i].touch);
printf("%s\t",per[i].infected);
printf("%s\n",per[i].date);
}
}
fclose(fp);
}
6、总结
通过这次动手实现疫情上报系统,我对PSP开发流程有了基本的认识。通过这次设计,我遇到了很多问题,刚开始想用java语言实现,但是在连接数据库上出现了问题,后面转用C语言实现,在编程方面花费的时间比较长,编程能力还有待提高。
7、PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 8 | 10 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 |
Development | 开发 | 685 | 1429 |
· Analysis | 需求分析 (包括学习新技术) | 6 | 15 |
· Design Spec | · 生成设计文档 | 5 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 4 | 10 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 5 |
· Design | 具体设计 | 20 | 30 |
· Coding | 具体编码 | 600 | 1200 |
· Code Review | · 代码复审 | 7 | 9 |
· Test | · 测试(自我测试,修改代码,提交修改) | 40 | 150 |
Reporting | 报告 | 8 | 14 |
· Test Report | · 测试报告 | 3 | 8 |
· Size Measurement | 计算工作量 | 2 | 3 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 3 | 3 |