c语言课设学生信息管理系统.docx
《c语言课设学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课设学生信息管理系统.docx(37页珍藏版)》请在冰点文库上搜索。
c语言课设学生信息管理系统
沈阳航空航天大学
课程设计报告
课程设计名称:
C语言课程设计
课程设计题目:
学生信息管理系统的设计及实现
院(系):
计算机学院
专业:
计算机科学及技术
班级:
学号:
姓名:
指导教师:
完成日期:
第1章概要设计
1.1题目的内容及要求
课程设计的内容是设计一个简单的单词替换程序,可以替换文本文件中指定的单词。
要求:
(1)输入信息要包括学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。
(2)通过菜单进行信息的录入,查询,修改,删除等等功能。
(3)查询模块要分别用两种方式查询,学号查询,姓名查询。
(4)文件保存到文本中。
(5)采用VC环境进行调试运行。
1.2总体结构
本程序主要分为8个模块(功能模块图见图1.1):
1.主模块,主要显示系统菜单,并且读取所选功能选项。
2.信息录入模块,对学生信息进行录入。
3.信息插入模块,从所有数据中的任一位置插入学生的信息。
4.信息查询模块,对学生的信息进行查询,分两种方式:
学号查询,姓名查询。
5.信息浏览模块,将所有学生的信息逐个显示出。
6.信息删除模块,将指定信息删除。
7.信息修改模块,修改指定信息。
8.学生人数统计模块,统计当前所存储的数据条数。
图1.1功能模块图
第2章详细设计
2.1主模块
控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块,实现各项功能,主要应用循环和switch语句,流程如图2.1所示。
图2.1主模块流程图
注释:
本流程图主要实现了一个switch语句,合法数据域为0~7,输入0则退出,在流程图上没有0是因为数值合法且数值不为1~7的时候即为0。
2.2学生信息录入模块(input函数)
输入要输入的学生信息,可以显示已保存的学生信息内容,并将内容输出,若内容为空,将提示是否录入数据,直到选择不继续,就回到主菜单,主要流程如图2.2所示。
注释:
1.学号为字符串
2.直到输入不继续才会结束。
3.结束为回主菜单,而不是结束程序
图2.2显示模块流程图
2.3信息插入模块
插入新信息,主要将信息插入任意处,其余信息依次下移一条。
不能覆盖某一条信息,而是顺序下移。
主要流程如图2.3所示。
图2.3信息插入模块流程图
注释:
1.检测重复时会将所输入的学号跳过,对之前存在数据进行检测。
2.若没有数据,则会显示无数据并直接退回到主菜单。
2.4信息查询模块
本模块分为两种查询方式,实际上操作方式是相同的,姓名和学号均为字符串形式,主要流程如图2.4所示。
图2.4信息查询模块流程图
注释:
1.学号及学生姓名均为字符串
2.程序中会显示选项,流程图中没有表示。
2.5信息浏览模块
可以将所有已保存信息信息显示到屏幕上,计划是将其作为一个单独函数,然后突然发现该模块可以和信息插入模块联系到一起,并且可以更好地实现两个模块的功能,如果没有数据,则调用信息录入模块录入新信息,若有数据则直接显示出来,主要是将文件中的内容读取到屏幕上。
并且在信息录入时可以显示出已有信息。
2.6信息删除模块
可以删除指定学生的信息,通过学号查找来查找删除目标,在打开文件后会判定是否有数据,可以在删除时确定是否删除。
主要流程如图2.5所示。
图2.5信息删除模块流程图
注释:
1.删除后被删除项之后的数据依次向上移动
2.数据总个数会减一
2.7信息修改模块
可以修改指定学生的信息,通过学号查找来查找修改目标,在打开文件后会判定是否有数据,可以在修改时确定是否修改。
主要流程如图2.6所示。
图2.6信息修改模块统计图
注释:
1.修改时其余数据不会变化
2.8学生人数统计模块
统计数据条数,即学生人数,主要就是应用每条数据所占总长度是固定的,检测共有多少条。
第3章调试分析
1.对主函数进行调试
图为菜单
2.第一次数据录入
3.第二次录入出现问题
图中上部表头不能对齐,通过一次次对show函数中显示内容进行修改,最终正确对齐。
已改正
4.对信息浏览模块的检测
出现问题,出现多余信息。
改正后测试时屏幕一闪而过,但已观测到问题已改正。
5.删除模块出现问题
删除前:
删除:
删除后:
错误的删除了内容。
经仔细查看代码发现将学号的形式错误的定义成整形,已改正,图为改正结果,删除功能完全正常,如下图。
第4章使用说明及执行结果
运行操作及结果:
主界面,输入数字进行操作。
输入1并选择录入新信息,即输入y。
输入学生的个人信息即可。
输入完成,可以选择继续输入或退出。
选择n即回到主菜单界面。
输入2进入信息插入系统,
输入插入位置。
输入插入的信息
插入成功,按任意键返回主菜单。
输入3进入查询系统
可以分别进行学号查找和姓名查找
学号查找
姓名查找
输入4进入学生信息浏览系统,将显示所有已录入学生信息
按任意键返回主菜单
输入5进入学生信息删除界面
通过学号查找方式进行删除
删除后可以输入4确认是否删除
输入6可以进入信息修改界面
查找方式为学号查找
修改完成。
输入7会统计保存的数据有多少条。
输入0退出系统
参考文献
[1]IvorHorton.C语言入门经典(第五版).清华大学出版社,2013
[2]刘艳伟.C函数全能速查宝典.人民邮电出版社,2012
[3]戴艳.零基础学算法(第三版).机械工业出版社,2014
[4]郭旭文.C语言程序设计及项目实践.电子工业出版社,2011
[5]王敬华.C语言程序设计教程(第二版).清华大学出版社,2009
附录(程序清单)
程序源代码:
#include
#include
#include
#defineLENsizeof(structstudent)
#defineFORMAT"%-15s%-10s%-6d%-7s%-13s%-16s%-12s\n"
#defineALLstu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birth,stu[i].address,stu[i].tel
structstudent//定义学生成绩结构体
{
charnum[15];//学号
charname[10];//姓名
intage;//年龄
charsex[7];//性别
charbirth[13];//出生年月
charaddress[16];//地址
chartel[12];//电话
};
structstudentstu[50];
voidinput();//学生信息录入系统
voidshow();//学生信息浏览系统
voidinsert();//学生信息插入系统
voidsearch();//学生信息查询系统
voiddel();//学生信息删除系统
voidmodify();//学生信息修改系统
voidall();//学生人数统计模块
intmain()
{
intnum=0;
while
(1)
{
//系统菜单界面
printf("\t|---------------学生信息管理系统---------------|\n");
printf("\t|0.退出|\n");
printf("\t|1.学生信息录入|\n");
printf("\t|2.学生信息插入|\n");
printf("\t|3.学生信息查询|\n");
printf("\t|4.学生信息浏览|\n");
printf("\t|5.学生信息删除|\n");
printf("\t|6.学生信息修改|\n");
printf("\t|7.学生人数统计|\n");
printf("\t|----------------------------------------------|\n");
printf("\t请输入数字0~7:
");
scanf("%d",&num);
while(num>7||num<0)//判断输入是否合理
{
printf("\t输入错误,请重新输入:
");
scanf("%d",&num);
}
switch(num)
{
case1:
input();
system("cls");//清屏
break;
case2:
insert();
system("pause");
system("cls");
break;
case3:
search();
system("pause");
system("cls");
break;
case4:
show();
system("cls");//清屏
break;
case5:
del();
system("pause");
system("cls");
break;
case6:
modify();
system("pause");
system("cls");
break;
case7:
all();
system("pause");
system("cls");
break;
case0:
printf("\t退出系统\n");
return0;
}
}
}
voidinput()//学生信息录入系统
{
inti,m=0;//m是记录的条数
charch[2];
FILE*fp;
if((fp=fopen("data.txt","a+"))==NULL)//打开指定文件
{
printf("文件无法打开\n");
return;
}
while(!
feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
m++;//统计当前记录条数
}
fclose(fp);
if(m==0)
printf("没有数据\n");
else
{
system("cls");//清屏
show();//显示原有信息
}
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("文件无法打开\n");
return;
}
for(i=0;ifwrite(&stu[i],LEN,1,fp);//向指定的文件写入信息
printf("是否录入新信息(是:
y/否:
n):
");
scanf("%s",ch);
while(strcmp(ch,"y")==0)//判断是否要录入新信息
{
printf("学号:
");
scanf("%s",&stu[m].num);//输入学生学号
for(i=0;iif(strcmp(stu[i].num,stu[m].num)==0)
{
printf("该学号已存在,请按任意键继续!
\n");
getch();
fclose(fp);
return;
}
printf("姓名:
");
scanf("%s",stu[m].name);//输入学生姓名
printf("年龄:
");
scanf("%d",&stu[m].age);//输入年龄
printf("性别:
");
scanf("%s",&stu[m].sex);//输入性别
printf("出生年月:
");
scanf("%s",&stu[m].birth);//输入出生年月
printf("地址:
");
scanf("%s",&stu[m].address);//输入地址
printf("电话:
");
scanf("%s",&stu[m].tel);//输入电话
if(fwrite(&stu[m],LEN,1,fp)!
=1)//将新录入的信息写入指定的磁盘文件
{
printf("无法保存");
getch();
}
else
{
printf("%s已保存\n",stu[m].name);
m++;
}
printf("是否继续(是:
y/否:
n):
");//询问是否继续
scanf("%s",ch);
}
fclose(fp);
printf("\t完成\n");
}
voidshow()//学生信息浏览系统
{
FILE*fp;
inti,m=0;
fp=fopen("data.txt","rb");
while(!
feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
m++;
}
if(m==0)
{
input();
return;
}
fclose(fp);
printf("学号姓名年龄性别出生年月地址电话\t\n");
for(i=0;i{
printf(FORMAT,ALL);//将信息按指定格式打印
}
system("pause");
}
voidinsert()//学生信息插入系统
{
FILE*fp;
inti,j,k,m=0;
charsnum[15];
if((fp=fopen("data.txt","r+"))==NULL)
{
printf("无法打开\n");
return;
}
while(!
feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
if(m==0)
{
printf("没有数据\n");
fclose(fp);
return;
}
printf("请输入插入的位置\n");
scanf("%s",&snum);//输入要插入的位置
for(i=0;iif(strcmp(snum,stu[i].num)==0)
break;
for(j=m-1;j>i;j--)
stu[j+1]=stu[j];//从最后一条记录开始均向后移一位
printf("请输入插入的学号\n");
printf("学号:
");
scanf("%s",&stu[i+1].num);
for(k=0;k{
if(k==(i+1))
continue;
if(strcmp(stu[k].num,stu[i+1].num)==0)
{
printf("该学生已存在\n");
getch();
fclose(fp);
return;
}
}
printf("姓名:
");
scanf("%s",stu[i+1].name);//输入学生姓名
printf("年龄:
");
scanf("%d",&stu[i+1].age);//输入年龄
printf("性别:
");
scanf("%s",&stu[i+1].sex);//输入性别
printf("出生年月:
");
scanf("%s",&stu[i+1].birth);//输入出生年月
printf("地址:
");
scanf("%s",&stu[i+1].address);//输入地址
printf("电话:
");
scanf("%s",&stu[i+1].tel);//输入电话
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("无法打开\n");
return;
}
for(k=0;k<=m;k++)
if(fwrite(&stu[k],LEN,1,fp)!
=1)//将修改后的记录写入磁盘文件中
{
printf("无法保存");
getch();
}
fclose(fp);
}
voidsearch()//学生信息查询系统
{
FILE*fp;
inti,m=0,sear;
charch[2];
charsnum[15];
charsname[10];
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("文件无法打开\n");
return;
}
while(!
feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有数据\n");
return;
}
printf("\t1.学号查找\n");
printf("\t2.姓名查找\n");
printf("\t请选择查找方式:
");
scanf("%d",&sear);
if(sear==1)
{
printf("请输入学号\n");
scanf("%s",&snum);
for(i=0;iif(strcmp(snum,stu[i].num)==0)//查找输入的学号是否在记录中
{
printf("发现该同学信息,是否显示(是:
y/否:
n):
");
scanf("%s",ch);
if(strcmp(ch,"y")==0)
{
printf("学号姓名年龄性别出生年月地址电话\t\n");
printf(FORMAT,ALL);//将查找出的结果按指定格式输出
break;
}
else
return;
}
if(i==m)
printf("没有找到该学生\n");//未找到要查找的信息
}
elseif(sear==2)
{
printf("请输入姓名\n");
scanf("%s",&sname);
for(i=0;iif(strcmp(sname,stu[i].name)==0)//查找输入的学号是否在记录中
{
printf("发现该同学信息,是否显示(是:
y/否:
n):
");
scanf("%s",ch);
if(strcmp(ch,"y")==0)
{
printf("学号姓名年龄性别出生年月地址电话\t\n");
printf(FORMAT,ALL);//将查找出的结果按指定格式输出
break;
}
else
return;
}
if(i==m)
printf("没有找到该学生\n");//未找到要查找的信息
}
else
printf("输入错误\n");
}
voiddel()//学生信息删除系统
{
FILE*fp;
inti,j,m=0;
charsnum[15];
charch[2];
if((fp=fopen("data.txt","r+"))==NULL)
{
printf("无法打开\n");
return;
}
while(!
feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有数据\n");
return;
}
printf("请输入学号:
");
scanf("%s",&snum);
for(i=0;iif(strcmp(snum,stu[i].num)==0)
break;
if(i==m)
{
printf("无此学生信息\n");
return;
}
printf("发现该学生信息,是否删除(是:
y/否:
n):
");
scanf("%s",ch);
if(strcmp(ch,"y")==0)//判断是否要进行删除
{
for(j=i;jstu[j]=stu[j+1];//将后一个记录移到前一个记录的位置
m--;//记录的总个数减1
if((fp=fopen("data.txt","wb"))==NULL)
{
printf("无法打开\n");
return;
}
for(j=0;jif(fwrite(&stu[j],LEN,1,fp)!
=1)
{
printf("无法保存\n");
getch();
}
fclose(fp);
printf("删除成功\n");
}
else
return;
}
voidmodify()//学生信息修改系统
{
FILE*fp;
inti,j,m=0;
charch[2];
charsnum[15];
if((fp=fopen("data.txt","r+"))==NULL)
{
printf("无法打开\n");
return;
}
while(!
feof(fp))
if(fread(&stu[m],LEN,1,fp)==1)
m++;
if(m==0)
{
printf("没有数据\n");
fclose(fp);
return;
}
printf("请输入要修改的信息的学生学号\n");
scanf("%s",&snum);
for(i=0;iif(strcmp(snum,stu[i].num)==0)//检索记录中是否有要修改的信息
break;
if(i==m)
{
printf("无此学生信息\n");
return;
}
printf("发现该学生,是否修改(是y/否n):
\n");
scanf("%s",ch);
if(strcmp(ch,"y")==0)//判断是否要进行删除
{
printf("姓名:
");
scanf("%s",stu[i].name);//输入学生姓名
printf("年龄:
");
scanf("%d",&stu[i].age);//输入年龄
printf("性别:
");
scanf("%s",&stu[i].sex);//输入性别
printf("出生年月:
");
scanf("%s",&stu[i].birth);//输入出生年月
printf("地址:
");
scanf("%s",&stu[i].address);//输入地址
printf("电话:
");
scanf("%s",&stu[i].tel);//输入电话
}
else
return;