C语言程序设计学生籍贯信息记录簿.docx
《C语言程序设计学生籍贯信息记录簿.docx》由会员分享,可在线阅读,更多相关《C语言程序设计学生籍贯信息记录簿.docx(24页珍藏版)》请在冰豆网上搜索。
C语言程序设计学生籍贯信息记录簿
学院
程序设计工程训练报告
C语言程序设计学生籍贯信息记录簿
课程名称C语言程序设计工程训练
姓名
院(系)信息科学与技术学院
专业班级
学号
指导教师
教务处制
目录
1需求分析1
2系统总框图和功能模块说明1
2.1系统总框图1
2.2功能模块说明2
3系统设计2
3.1主要结构体2
3.2主要功能函数2
3.3关键函数的流程图4
4系统调试5
5总结8
6源程序清单9
1需求分析
编制一个学生籍贯信息记录簿,每个学生信息包括:
学号、姓名、籍贯。
具体功能:
1、创建信息链表并以磁盘文件保存
2、读取磁盘文件并显示输出所有学生的籍贯信息
3、按学号或姓名查询其籍贯
4、按籍贯查询并输出该籍贯的所有学生
5、能添加、删除和修改学生的籍贯信息
6、系统以菜单方式工作
2系统总框图和功能模块说明
2.1系统总框图
图1系统总框图
2.2功能模块说明
系统初始化模块:
完成系统初始化。
创建信息链表模块:
在本地创建学生籍贯文件,保存学生籍贯信息。
输入学生信息模块:
完成学生籍贯信息的录入。
修改学生信息模块:
完成学生籍贯信息的修改。
查询学生信息模块:
完成学生籍贯信息的查询。
删除学生信息模块:
完成学生籍贯信息的删除。
重置学生信息模块:
完成学生籍贯信息的重置。
保存学生信息模块:
完成学生籍贯信息的保存。
3系统设计
3.1主要结构体
学生信息:
学号、姓名、籍贯
typedefstruct
{shortzhku_status;
charzhku_number[12];
charzhku_name[10];
charzhku_address[20];
}StuType;
3.2主要功能函数
voidzhku_AddData(void)/*录入数据*/
voidwxw_ListData(void)/*显示所有数据*/
voidwp_Delete(void)/*做删除标记*/
voidwp_Pack(void)/*重置信息*/
voidzhku_UpdateData(void)/*修改*/
voidSH_Search(void)/*查询*/
3.3关键函数的流程图
4系统调试
打开程序后按任意键,将会出现上述界面。
按“1”键,再按回车键,出现以上录入菜单。
录入成功后提示是否继续,选择后按回车键进行操作。
此为查询功能菜单,若输入程序没有录入的学号、姓名、籍贯时,则会显示出“无此人的籍贯信息”。
此为删除学生信息菜单界面,按照菜单操作即可。
如果要退出该程序,直接按“7”后在按回车键即可。
5总结
这次我做的c语言工程实训是“籍贯信息记录簿”,在编写程序时也遇到不少的困难。
其中最困扰我的文件操作方面,因为是记录簿程序,所以文件方面用得较多。
通过再回去认真的复习一遍相关知识后,终于完成了各个模块的编写。
因为这次的程序细分为
voidzhku_AddData(void)/*录入数据*/
voidwxw_ListData(void)/*显示所有数据*/
voidwp_Delete(void)/*做删除标记*/voidwp_Pack(void)/*重置信息*/
voidzhku_UpdateData(void)/*修改*/voidSH_Search(void)*查询*/
六个模块,在完成了全部模块的编写后,又一个困扰我的问题出现了-----就是各模块功能完整,到整合在一起组建时却发生了错误。
经过半天的排查,发现有些模块用了全局变量,致使程序发生错误。
再删除掉全局变量后,程序经过简单的修改又重生了。
总的来说,这次实训给了我亲手完成一个简单系统的编写,经过需求分析、系统总框图和功能模块明、系统设计、系统调试等几个流程,让我实实在在地体验了一番写程序的过程。
同时也发现自己的水平还很有限,应该再加把劲学习好计算机编程。
6源程序清单
#include"stdio.h"//标准输入输出文件包含预处理命令
#include"stdlib.h"
#include"string.h"//字符串文件包含预处理命令
#include"conio.h"
#include"ctype.h"//包含tolower()的原型
typedefstruct
{shortzhku_status;
charzhku_number[10];
charzhku_name[10];
charzhku_address[20];
}StuType;
FILE*fp;
voidzhku_AddData(void)/*录入数据*/
{
chara;
StuTypestu;
charzhku_tag;
stu.zhku_status=0;
do
{
printf("\n\n\n\n*****按ESC返回主菜单*****\n");
printf("\n\n*****按Space确认开始录入信息*****\n");
printf("\n\n请输入学生学号:
");
if((a=getch())==27)return;/*这个函数可以让用户按下任意键而不需要回车就可以接受到用户的输入*/
scanf("%s",stu.zhku_number);
while(stu.zhku_number==NULL)
{
printf("输入非法,重新输入:
");
//zhku_tag=getchar();
scanf("%s",stu.zhku_number);
//while(getchar()!
='\n');
}
printf("\n请输入学生姓名:
");
scanf("%s",stu.zhku_name);
while(stu.zhku_number==NULL)
{
printf("输入非法,重新输入:
");
//zhku_tag=getchar();
scanf("%s",stu.zhku_number);
//while(getchar()!
='\n');
}
printf("\n请输入学生籍贯:
");
while(stu.zhku_number==NULL)
{
printf("输入非法,重新输入:
");
//zhku_tag=getchar();
scanf("%s",stu.zhku_number);
//while(getchar()!
='\n');
}
scanf("%s",stu.zhku_address);
fseek(fp,0,SEEK_END);//移动文件内部位置指针
fwrite(&stu,sizeof(StuType),1,fp);//将信息存入文件中
printf("\n录入成功,继续吗?
(y/n):
");
while(getchar()!
='\n');//跳过当前行
//zhku_tag=getchar();
scanf("%s",&zhku_tag);//大写字母转化为小写字母
zhku_tag=tolower(zhku_tag);
while(zhku_tag!
='y'&&zhku_tag!
='n')
{
printf("输入非法,重新输入(y/n):
");
while(getchar()!
='\n');
//zhku_tag=getchar();
scanf("%s",&zhku_tag);
zhku_tag=tolower(zhku_tag);
}
}while(zhku_tag=='y');
printf("\n\n\n\n*****按ESC返回主菜单*****\n\n\n\n\n\n\n");
do{
a=getch();
}while(a!
=27);return;
}
voidwxw_ListData(void)/*显示所有数据*/
{
chara;
StuTypestu;
stu.zhku_status=0;
printf("\n%-15s%-15s%-25s\n","学号","姓名","籍贯");
printf("----------------------------------\n");
rewind(fp);
fread(&stu,sizeof(StuType),1,fp);//读入信息
while(!
feof(fp))//文件未结束
{
if(stu.zhku_status==0)
{
printf("%-15s%-15s%-25s\n",stu.zhku_number,stu.zhku_name,stu.zhku_address);
}
fread(&stu,sizeof(StuType),1,fp);
}
clearerr/*复位错误标志(清除文件结束标志)*/(fp);
printf("\n\n\n\n*****按ESC返回主菜单*****\n\n\n\n\n\n\n");
do{
a=getch();
}while(a!
=27);return;
}
voidwp_Delete(void)/*做删除标记*/
{charelc;
chara;
StuTypestu;
charwp_number[10];
printf("\n*****请选择要删除的方式*****\n\n");
printf("[1].删除个人信息\n\n");
printf("[2].删除全部信息\n\n");
printf("\n\n*****按ESC返回主菜单*****\n");
printf("\n*****按Space确认开始功能选择*****\n\n");
printf("\n请选择功能:
");
if((a=getch())==27)return;
scanf("%s",&elc);
switch(elc)
{
case'1':
{printf("\n输入要删除的学生学号:
");
scanf("%s",wp_number);
rewind(fp);//使位置指针返回到文件的开头
fread(&stu,sizeof(StuType),1,fp);
while(!
feof(fp))
{
if(strcmp(stu.zhku_number,wp_number)==0&&stu.zhku_status==0)//数据状态正常,未作删除标志
break;
fread(&stu,sizeof(StuType),1,fp);
}
if(!
feof(fp))
{
printf("\n\n被删除的记录为:
\n");
printf("\n%-15s%-15s%-25s\n","学号","姓名","籍贯");
printf("----------------------------------\n");
printf("%-15s%-15s%-25s\n",stu.zhku_number,stu.zhku_name,stu.zhku_address);//输出信息
printf("\n删除成功,请重置信息!
\n");
stu.zhku_status=1;
fseek(fp,-sizeof(StuType),SEEK_CUR);//把文件的位置指针从当起始点开始,移动指定位移量的字节数。
成功返回0,失败返回非0
fwrite(&stu,sizeof(StuType),1,fp);
}
else
{
printf("无此学号的学生!
\n");
clearerr(fp);
}
printf("\n\n\n\n*****按ESC返回主菜单*****\n");
do{
a=getch();
getchar();
}while(a!
=27);return;}break;
case'2':
{fclose(fp);
remove("input.dat");
if((fp=fopen("input.dat","rb+"))==NULL)
{
if((fp=fopen("input.dat","wb+"))==NULL)
{printf("打开文件失败!
\n");
system("PAUSE");
exit
(1);
}
}
printf("\n删除成功,请重置信息!
\n");
printf("\n\n\n\n*****按ESC返回主菜单*****\n");
do{a=getch();}while(a!
=27);return;
}break;
}
}
voidwp_Pack(void)/*重置信息*/
{
StuTypestu;
FILE*fpTmp;
if((fpTmp=fopen("xuesheng_tmp.dat","wb"))==NULL)//打开文件xueshneg_tmp.dat失败
{
printf("打开文件xueshneg_tmp.dat失败!
\n");
system("PAUSE");
exit
(2);
}
rewind(fp);//使位置指针返回到文件的开头
fread(&stu,sizeof(StuType),1,fp);//读入信息
while(!
feof(fp))
{
if(stu.zhku_status==0)
fwrite(&stu,sizeof(StuType),1,fpTmp);//写入信息
fread(&stu,sizeof(StuType),1,fp);//继续读入信息
}
fclose(fp);fclose(fpTmp);//关闭文件
remove("input.dat");//删除文件
rename("xuesheng_tmp.dat","input.dat");//更改文件名
if((fp=fopen("input.dat","rb+"))==NULL)
{printf("打开文件失败!
\n");
system("PAUSE");
exit(3);
}
}
voidzhku_UpdateData(void)/*修改*/
{
chara;
StuTypestu;
charzhku_number[10];
printf("\n\n\n\n*****按ESC返回主菜单*****\n\n");
printf("输入要修改的学生的学号:
");
if((a=getch())==27)return;
scanf("%s",zhku_number);
rewind(fp);
fread(&stu,sizeof(StuType),1,fp);
while(!
feof(fp))
{
if(strcmp(stu.zhku_number,zhku_number)==0
&&stu.zhku_status==0)
break;
fread(&stu,sizeof(StuType),1,fp);
}
if(!
feof(fp))
{
printf("\n%-15s%-15s%-25s\n","学号","姓名","籍贯");
printf("----------------------------------\n");
printf("%-15s%-15s%-25s\n",stu.zhku_number,stu.zhku_name,stu.zhku_address);
printf("\n输入修改后的数据:
\n");
printf("\n学生学号:
");
scanf("%s",stu.zhku_number);
printf("\n学生姓名:
");
scanf("%s",stu.zhku_name);
printf("\n籍贯:
");
scanf("%s",stu.zhku_address);
fseek(fp,-sizeof(StuType),SEEK_CUR);
fwrite(&stu,sizeof(StuType),1,fp);
printf("\n\n修改成功,请重置信息!
");
printf("\n\n*****按ESC返回主菜单*****\n");
}
else
{
printf("\n无此学号的学生!
\n\n\n");
clearerr(fp);
}
do{
a=getch();
getchar();
}while(a!
=27);return;
}
voidSH_Search(void)/*查询*/
{
chara;
charSH_tag;
StuTypestu;
charSH;
charSH_number[10];
charSH_name[10];
charwxw_address[20];
do{
printf("[1].按学号查询\n\n");
printf("[2].按姓名查询\n\n");
printf("[3].按籍贯查询\n\n");
printf("\n\n*****按ESC返回主菜单*****\n\n");
printf("请选择:
\n\n");
//getchar();
if((a=getch())==27)
return;
scanf("%s",&SH);
while(SH<'1'||SH>'3')
{
printf("输入错误,请输入1~3的数:
");
scanf("%s",&SH);
}
switch(SH)
{
case'1':
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n输入要查询的学生的学号:
\n");
scanf("%s",SH_number);
rewind(fp);
fread(&stu,sizeof(StuType),1,fp);
while(!
feof(fp))
{
if(strcmp(stu.zhku_number,SH_number)==0
&&stu.zhku_status==0)
break;
fread(&stu,sizeof(StuType),1,fp);
}
if(!
feof(fp))
{
rewind(fp);
printf("%-15s%-15s%-25s\n","姓名","学号","籍贯");
while(!
feof(fp))
{
fread(&stu,sizeof(StuType),1,fp);
if(feof(fp))break;
if(strcmp(stu.zhku_number,SH_number)==0
&&stu.zhku_status==0)
{
printf("%-15s%-15s%-25s\n",stu.zhku_name,stu.zhku_number,stu.zhku_address);
}
}
}
else
{
printf("无此人的籍贯信息!
\n");
clearerr(fp);
}
break;
case'2':
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n输入要查询的学生的姓名:
\n");
scanf("%s",SH_name);
rewind(fp);
fread(&stu,sizeof(StuType),1,fp);
while(!
feof(fp))
{
if(strcmp(stu.zhku_name,SH_name)==0
&&stu.zhku_status==0)
break;
fread(&stu,sizeof(StuType),1,fp);
}
if(!
feof(fp))
{
rewind(fp);
printf("%-15s%-15s%-25s\n","姓名","学号","籍贯");
while(!
feof(fp))
{
fread(&stu,sizeof(StuType),1,fp);
if(feof(fp))break;
if(strcmp(stu.zhku_name,SH_name)==0
&&stu.zhku_status==0)
{
printf("%-15s%-15s%-25s\n",stu.zhku_name,stu.zhku_number,stu.zhku_address);
}
}
}
else
{
printf("无此人的籍贯信息!
\n");
clearerr(fp);
}
break;
case'3':
printf("\n输入要查询的学生的籍贯:
\n");
scanf("%s",wxw_address);
rewind(fp);
fread(&stu,sizeof(StuType),1,fp);
while(!
feof(fp))
{
if(strcmp(stu.zhku_address,wxw_address)==0
&&stu.zhku_status==0)break;
fread(&stu,sizeof(StuType),1,fp);
}
if(!
feof(fp))
{
rewind(fp);
printf("%-15s%-15s%-25s\n","姓名","学号","籍贯");
while(!
feof(fp))
{
fread(&stu,sizeof(S