一. 实验名称:
结构化程序设计
二.实验目的
- 明确结构化程序设计的基本结构。
- 通过对问题的分析,设计合理的结构化程序解决问题;
三.实验内容
对例1的学生信息管理系统,要求完成以下基本任务:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将功能补充完全(基于文件处理,完成刷新和保存功能)。
3.将学生信息改为更好的数据组织,而非离散形式(结构体)。
四.题目分析
1) 把原先以数组存放学生信息的形式改为结构体的形式保存数据
2) 添加保存信息函数,把信息以文件形式保存。
3) 添加刷新信息函数,从文件中读取各个学生的信息。
4) 在输入信息函数中添加学号验证功能,即不能输入重复的学号。
五:算法设计
1.定义结构体(包含学号,姓名,年龄,性别,和三个学科的分数)。并定义结构体数组。
struct Student
{
char* code;
char* name;
int age;
char sex;
float score[3];
}; //建立存储学生信息的结构体
Student stu[N]; //定义一个结构体数组
2.把所有用数组保存数据的地方改为用结构体保存。
3.添加保存函数,用文件输出流把学生信息保存到“student.txt”当中。
void save()
{
FILE*fpWrite=fopen("student.txt","a"); //从文件末尾处开始写入
for(int i=0;i<n;i++)
{
fprintf(fpWrite,"%7s %7s %6d %6c %9.1f %10.1f %10.1f\n",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
} //循环写入每一个学生的信息
fclose(fpWrite); //关闭文件
printf("保存完成!");
menu();
}
4.添加刷新函数,用文件输入流读取学生信息。
void update() //更新函数,读取文档数据记录在结构体数组当中
{
n=0;
stu[n].code=(char *)malloc(10);
stu[n].name=(char *)malloc(15); //分配内存
FILE *fpRead=fopen("student.txt","r");
fscanf(fpRead,"%*[^\n]"); //读取第一行内容但不赋值给任何变量
if(fpRead==NULL)
{
printf("刷新失败!");
}
while (fscanf(fpRead,"%s %s %d %c %f %f %f \n",stu[n].code,stu[n].name,&stu[n].age,&stu[n].sex,&stu[n].score[0],
&stu[n].score[1],&stu[n].score[2])==7)
{
n++;
stu[n].code=(char *)malloc(10);
stu[n].name=(char *)malloc(15);
} //循环读入学生信息
fclose(fpRead); // 关闭文件
printf("刷新成功!");
system("pause");
}
5.在增添信息函数中增加判断学号合法性的语句(学号不重复)
printf("请输入第%d 个学生的学号:\n",j-n+1);
scanf("%s",stu[j].code);
for(int i=0;i<n;i++)
{
if(strcmp(stu[i].code,stu[j].code)==0)
{
printf("学号重复!请重新输入\n");
insert();
}
} // 从第一个结构体开始验证每一个人的学号是否和当前学号相同,如果相同,则重新录入信息
注意事项:
1.结构体的学号变量和姓名变量用的都是指针型变量,所以再给这两个变量赋值之前需要给他们分配内存否则就会出错,开始把分配内存的语句放在循环之外,这样只能分配一次内存,就只能获取第一次的数据。发现错误后,我把分配内存加入到循环语句之内。这样在每一次赋值前都会分配内存。
2.在保存信息中,开始用的是‘w’型使用文件方式写入数据,这样每一次写入数据时,都会把原先的数据覆盖掉。后来改成用‘a’型方式。这样文件指针会自动放在文件末尾。不会把原先的数据覆盖掉。
3.在刷新文件信息当中,用if(fpRead==NULL)和while(fpRead!=NULL)这样的语句来判断文件是否为空,但是这样运行程序时会中断,经检查是判断文件是否为空的语句出错,但不知道问题所在。后来按照书上改while(fscanf(fpRead,"%s %s %d %c %f %f %f \n",stu[n].code,stu[n].name,&stu[n].age,&stu[n].sex,&stu[n].score[0],&stu[n].score[1],&stu[n].score[2])==7)这样的语句后就能正常运行了。