测试方案:按照每个函数功能进行测试,在做完每个函数对其进行测试,主函数测试,先将所有需要的功能模块函数设置为空,每个函数用一个printf语句来测试主函数。
1. 存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月
日之间用空格分隔,但在输出时发现年月日出现错误。
分析原因:用scanf输入年月日时,系统会把用来分隔的空格当做字符读入。 解决方法:将年月日定义为整型,这样就可以用scanf输入,用空格隔开。
2. 存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在读
取后未关闭文件,执行查找时查找不到相关信息。
分析原因:再利用for循环读取全部文件内容后,文件指针将会移至文件末尾,这样再执行查找时就会从文件末尾开始,显然不符合要求,所以会出现错误。
解决方法:在读取完数据后先关闭文件,在查找时再次打开文件,这时文件指针就会指向文件开头。
3. 存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过输入的情况。
分析原因:在使用getchar或者gets输入的时候,系统会将前一步用来确认执行的回车当成字符读入,导致跳过该步输入。
解决方法:再getchar或者gets前面加上getchar()语句,读掉回车,下面的getchar或者gets就可以正常输入。
4. 存在的问题:system(“color attr”)命令中,attr不能是变量! 解决方法:使用switch语句一个一个写。
四、小结
通过编写该程序,熟悉了C语言的基本语法,选择,循环等结构,深入练习了函数的调用方法,和文件的读写方法,熟悉了结构体的使用,更加深化了面向过程语言思想,和一些基本算法。
通过对程序的后期调试,熟悉了C常见错误,锻炼了思维的严密性,和完备性。
通过对程序的注释和画流程图,形成了一套自己编程的风格,和清晰地思路,使思维更加条理化,清晰化。
附件:主要源程序代码(需打印)
#include
FILE *fp; char a; float kqcs=0; struct student { }
stu[100]; //定义储存学生信息的结构体数组
主
函
数
开
始
//********************************************void main() {
void look(); //系统界面颜色这只函数 void record(); //录入数据函数 void amend(); //修改数据函数 void search(); //查询数据函数 void goal(); //计算总评函数 char item;
printf(\※※※※※※※※※※※※※※※※※※※※※\\n\printf(\※ ※\\n\printf(\※ 学 生 考 勤 管 理 系 统 ※\\n\printf(\※ ※\\n\printf(\※ 刘玉柱 河南科技学院 农学122 ※\\n\printf(\※ ※\\n\printf(\※※※※※※※※※※※※※※※※※※※※※\\n\printf(\※ ※\\n\printf(\※ 1.学生信息及考勤情况录入 ※\\n\printf(\※ ※\\n\printf(\※ 2.学生信息及考勤情况修改 ※\\n\printf(\※ ※\\n\printf(\※ 3.学生信息及考勤情况查询 ※\\n\printf(\※ ※\\n\printf(\※ 4.学生考勤总评分数查询 ※\\n\printf(\※ ※\\n\char name[10]; char number[11]; char sex; int year; int month; int day; int kq;
************************************************
}
printf(\※ 5.系统界面设置 ※\\n\printf(\※ ※\\n\printf(\※※※※※※※※※※※※※※※※※※※※※\\n\printf(\
printf(\请选择您需要的操作\\n\scanf(\switch(item) {
case '5': look();break; case '1': record();break; case '2': amend();break; case '3': search();break; case '4': goal();break;
}
//**************************************************主 函 数 结 束**************************************************
///*****************************************录入数据函数内容开始*********************************************************** void record() {
int i,j=0,jx=1;
printf(\************************学 生 基 本 信 息 录 入if((fp=fopen(\{ }
for(i=0;jx==1;i++) //输入信息循环 {
for(;j==0;) //输入确认循环 {
getchar();
printf(\请输入第%d个学生的姓名 \gets(stu[i].name);
printf(\请输入第%d个学生的学号 \gets(stu[i].number);
printf(\请输入第%d个学生的性别(男:m 女:f) \stu[i].sex=getchar();
printf(\请输入第%d个学生的生日(格式:年 月 日) \scanf(\printf(\请输入第%d个学生的当前考勤次数 \printf(\文件打开失败\\n\exit(0);
*****************************\\n\
重 }
scanf(\
printf(\您输入的信息为 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日\\n 0
输
1
确
认
\
}
fclose(fp);
printf(\返回主菜单\\n\getchar(); a=getchar(); getchar();
if(a=='0') main(); //返回主菜单
} j=0;
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf(\文件写入错误\\n\printf(\是否继续输入下一个学生信息 0 终止 1 继续\\n\scanf(\继续输入选择
scanf(\输入确认
//写入文件
///*****************************************录入数据函数内容结束***********************************************************
///*****************************************修改数据函数内容开始*********************************************************** void amend() {
int i=0,j=0,sway,t,x; char name[10],number[10];
printf(\ **********************学 生 考 勤 修 改if((fp=fopen(\将文件内容读入内存 { }
for(i=0;feof(fp)==0;i++) fread(&stu[i],sizeof(struct student),1,fp); //读取fclose(fp); //关闭文件 printf(\选择查找方式 1 按照姓名查找 2 按照学号查找\scanf(\if(sway==1) {
printf(\请输入需要修改学生的姓名 \printf(\文件打开失败\\n\exit(0);
**************************\\n\
文件内容
/**********************按照姓名查找开始*************************///
月
scanf(\for(j=0;t!=0;j++) { }
if(j
printf(\您查找的学生信息如下\\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d
日
当
前
考
勤
次
t=strcmp(stu[j].name,name); if(j==i) { }
t=0;
printf(\未找到您所查询的数据,请重新输入\\n\
数 %d\\n\tu[j-1].day,stu[j-1].kq);
/**********************按照学号查找开始*************************///
if(sway==2) {
printf(\请输入需要修改学生的学号 \scanf(\for(j=0;t!=0;j++) }
}
printf(\是否继续修改其他学生考勤 0 否 1 是\scanf(\if(x==1) amend();
printf(\是否修改该生考勤信息 0 否 1 是\选择是否修改考勤 scanf(\输入选择变量值 if(x==1) { }
printf(\请输入新的考勤值 \
scanf(\输入新的考勤值
if((fp=fopen(\以只写方式打开文件 { }
for(j=0;j
printf(\文件打开失败\\n\exit(0);
printf(\文件写入错误\\n\写入文件
/**********************按照姓名查找结束*************************///