C语言课程设计学生信息管理系统.docx
《C语言课程设计学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计学生信息管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
C语言课程设计学生信息管理系统
C语言课程设计实验报告
一、设计目的:
学生信息包括:
学号、、性别、系名、班级名、出生年月、住址、。
设计一学生信息管理系统,使之能提供以下功能:
1.系统以菜单方式工作;
2.学生信息录入功能(输入);
3.学生信息浏览功能(输出);
4.学生信息检索功能;
5.学生信息的删除与修改功能;
二、总体设计思路:
1>程序设计组成框图
2>N-S流程图
三、详细设计说明:
1>头文件
#include
#include
#include
#include
2>数入口说明
main();主函数;
voidmenu();主菜单界面;
voidadd();添加新的学生信息;
voidprint(inti);打印学生信息;
voidscan();查找学生信息;
voidres();检索学生信息界面;
voidres_name();按检索;
voidres_num();按学号检索;
voiddel(inti);删除学生信息;
voidmodify(inti);修改学生信息;
voidfileopen();打开文件;
voidfilesave();保存文件;
2>调用关系
4.调试与测试:
Ø编译工具
1.C/C++程序设计学习与实验系统
2.Tc
3.VC++6.0
均通过调试!
Ø主菜单
Ø添加新的学生信息
Ø浏览所有学生信息
Ø检索信息库
Ø继续查找下一条
Ø修改学生信息
Ø删除信息库所有记录
五、调试中所遇到的问题及解决方法
1>问题:
程序退出后,再次打开,上次输入的数据无法保存。
解决:
调用fileopen()与filesave()保存文件数据,方便第二次打开程序时仍能调用上次输入的数据。
2>问题:
跳出的界面与选择分支中的对应项不符合。
解决:
改getchar()为getch(),头文件中加”conio.h”.因为getchar()从输入输出流中一次只能读取一个字符,而且需要以回车来确认输入。
本文件中多次用到getchar(),键盘缓冲区的’\n’会被下次调用getchar()时接收。
而getch()则不会,从键盘上读入一个数据,不给回显,不需要回车确认,按下键就实现了函数。
3>问题:
误输入X,导致退出。
解决:
加标志变量flag=1,用while(flag)循环switch语句,当正确输入时,flag=1,跳出循环。
4>问题:
检索时只能查到第一个学生信息。
解决:
定义数组log(100)记录符合的结构体数组。
循环打印。
5>问题:
不能刷新界面。
解决:
调用system(“cls”)清屏函数。
6>问题:
删除某项信息,返回主函数时不能暂停。
解决:
调用system(“PAUSE”)暂停函数。
六、程序源码
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"conio.h"
voidmenu();//声明所有函数;
voidadd();
voidprint(inti);
voidscan();
voidres();
voidres_name();
voidres_num();
voiddel(inti);
voidmodify(inti);
voidfileopen();
voidfilesave();
;//定义全局变量x,减少代码量;
intn=0;//定义全局变量n,代表信息条数;
structstudent//定义结构体数组stu[100];
{
charnum[15];
charname[30];
charsex[2];
charxi[30];
charban[10];
charbirth[10];
charaddress[30];
chartel[20];
}stu[100];
voidmain()//主函数;
{
fileopen();
menu();//调用menu()函数,打开主界面;
filesave();
}
voidfileopen()//打开data文件;
{
FILE*fp;
inti;
if((fp=fopen("data","r+"))==NULL)//若无data文件,则新建;
fp=fopen("data","w+");
for(i=0;i<100;i++)//读取数据;
fread(&stu[i],sizeof(structstudent),1,fp);
fread(&n,4,1,fp);
fclose(fp);
}
voidmenu()//主菜单;
{
intflag=1;//定义标志标量flag;
system("cls");//清屏函数;
printf("┌────────────────────┐\n");//主界面;
printf("│☆欢迎登录学生信息管理系统★│\n");
printf("││\n");
printf("│1.添加新的学生信息│\n");
printf("│2.浏览所有学生信息│\n");
printf("│3.检索学生信息│\n");
printf("│4.保存并退出系统│\n");
printf("││\n");
printf("│byrlk│\n");
printf("└────────────────────┘\n");
while(flag)//防止用户误选导致退出;
switch(getch())//用switch分支选择语句;getch()获取用户键入值;
{
case'1':
flag=0;add();break;//当用户选择1时,调用add()函数,添加新的学生信息;
case'2':
flag=0;scan();break;//当用户选择2时,调用scan()函数,浏览所有学生信息;
case'3':
flag=0;res();break;//当用户选择3时,调用res()函数,检索学生信息;
case'4':
flag=0;printf("√保存成功!
");break;//当用户选择4时,调用flag()函数,退出系统;
default:
printf("※错误!
请重新输入..\n");//其它输入,提示错误;
}
}
voidadd()//信息添加函数;
{
intflag=1;
system("cls");//清屏函数;
printf("──────────%2d───────────\n",n+1);//逐一输入各项数据;
printf("*添加新的学生信息*\n");
printf("①学号:
");
scanf("%s",&stu[n].num);
printf("②:
");
scanf("%s",&stu[n].name);
printf("③性别:
");
scanf("%s",&stu[n].sex);
printf("④系名:
");
scanf("%s",&stu[n].xi);
printf("⑤班级名:
");
scanf("%s",&stu[n].ban);
printf("⑥出生年月:
");
scanf("%s",&stu[n].birth);
printf("⑦住址:
");
scanf("%s",&stu[n].address);
printf("⑧:
");
scanf("%s",&stu[n].tel);
printf("──────────────────────\n");
printf("\n√添加成功!
\n\n☆请选择:
1.继续添加2.返回主菜单\n");
n++;//总信息量增加一项;
while(flag)
switch(getch())
{
case'1':
flag=0;add();break;//选择'1',重新调用add();
case'2':
flag=0;menu();break;//选择'2',调用menu(),返回主菜单;
default:
printf("※错误!
请重新输入..\n");//其它输入,提示错误;
}
}
voidprint(inti)//学生信息打印函数;
{
printf("──────────%2d──────────\n",i+1);
printf("①学号:
%s\n",stu[i].num);
printf("②:
%s\n",stu[i].name);
printf("③性别:
%s\n",stu[i].sex);
printf("④系名:
%s\n",stu[i].xi);
printf("⑤班级名:
%s\n",stu[i].ban);
printf("⑥出生年月:
%s\n",stu[i].birth);
printf("⑦住址:
%s\n",stu[i].address);
printf("⑧:
%s\n",stu[i].tel);
printf("─────────────────────\n");
}
voidscan()//信息浏览函数;
{
inti,flag=1;
system("cls");
if(n==0)//当n==0时,信息库中无记录;
{
printf("──────────────────────\n");
printf("当前信息库记录为0!
\n");
printf("──────────────────────\n");
printf("☆请选择:
1.添加新的学生信息2.返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;add();break;
case'2':
flag=0;menu();break;
default:
printf("※错误!
请重新输入..\n");
}
}
else//当n不为0时,打印信息;
{
printf("**********目前信息库里共有%d条记录.*********\n",n);
for(i=0;iprintf("☆请选择:
1.检索信息库2.添加新的学生信息\n");
printf("3.删除所有记录4.返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;res();break;
case'2':
flag=0;add();break;
case'3':
flag=0;
printf("\n!
!
!
!
!
!
!
!
!
!
!
!
警告:
您将删除信息库所有记录!
!
!
!
!
!
!
!
!
!
!
!
\n");
printf("\n☆请选择:
1.确认删除2.返回\n");
flag=1;
while(flag)
switch(getch())
{
case'1':
flag=0;n=0;printf("√已删除!
\n");system("PAUSE");scan();break;
case'2':
flag=0;scan();
default:
printf("※错误!
请重新输入..\n");
}break;
case'4':
flag=0;menu();break;
default:
printf("※错误!
请重新输入..\n");
}
}
}
voidmodify(inti)//信息修改函数;
{
intflag=1;
printf("────────────────────────\n");//信息修改界面;
printf("☆请输入你想修改的容:
\n");
printf("1.学号2.3.性别4.系名\n");
printf("5.班级名6.出生年月7.住址8.\n");
printf("────────────────────────\n");
while(flag)
switch(getch())
{
case'1':
flag=0;printf("请重新输入学号:
");scanf("%s",&stu[i].num);break;
case'2':
flag=0;printf("请重新输入:
");scanf("%s",&stu[i].name);break;
case'3':
flag=0;printf("请重新输入性别:
");scanf("%s",&stu[i].sex);break;
case'4':
flag=0;printf("请重新输入系名:
");scanf("%s",&stu[i].xi);break;
case'5':
flag=0;printf("请重新输入班级名:
");scanf("%s",&stu[i].ban);break;
case'6':
flag=0;printf("请重新输入出生年月:
");scanf("%s",&stu[i].birth);break;
case'7':
flag=0;printf("请重新输入住址:
");scanf("%s",&stu[i].address);break;
case'8':
flag=0;printf("请重新输入:
");scanf("%s",&stu[i].tel);break;
default:
printf("※错误!
请重新输入..");
}
printf("√修改成功!
\n修改后的学生信息:
\n");
print(i);
system("PAUSE");//暂停函数:
按任意键继续..;
printf("☆请选择:
1.继续修改此学生信息2.查看下一条相关信息3.返回主菜单\n");
flag=1;
while(flag)
switch(getch())
{
case'1':
flag=0;modify(i);break;
case'2':
flag=0;break;
case'3':
flag=0;menu();
default:
printf("※错误!
请重新输入..\n");
}
}
voiddel(inti)//信息删除函数;
{
inta,flag=1;
printf("\n!
!
!
!
!
!
!
!
!
!
!
!
警告:
您将删除此条学生信息!
!
!
!
!
!
!
!
!
!
!
!
");
printf("\n☆请输入:
1.继续删除");
printf("\n2.不删除,返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;
for(a=i;a{
strcpy(stu[a].num,stu[a+1].num);
strcpy(stu[a].name,stu[a+1].name);
strcpy(stu[a].sex,stu[a+1].sex);
strcpy(stu[a].xi,stu[a+1].xi);
strcpy(stu[a].ban,stu[a+1].ban);
strcpy(stu[a].birth,stu[a+1].birth);
strcpy(stu[a].address,stu[a+1].address);
strcpy(stu[a].tel,stu[a+1].tel);
}
n--;
printf("√删除成功!
\n");//总信息量减少一项;
system("PAUSE");
menu();
break;
case'2':
flag=0;
system("PAUSE");//暂停函数:
按任意键继续..;
menu();//返回主菜单;
break;
default:
printf("※错误!
请重新输入..\n");
}
}
voidres_num()//按学号检索函数;
{
inti,j=0,flag=1,log[100];
charxh[15];
system("cls");
printf("******************************************\n");
printf("\n☆请输入要检索的学号:
");
scanf("%s",&xh);
for(i=0;iif(!
strcmp(stu[i].num,xh))//字符串比较函数;
while(j<100){log[j]=i;j++;break;}//记录下相关的信息;
if(!
j)//信息库中没查找到所需信息;
{
printf("对不起,信息库里没要你想要查找的信息!
\n");
printf("\n******************************************\n");
printf("\n☆请选择:
1.继续查找2.返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;res();break;
case'2':
flag=0;menu();break;
default:
printf("※错误!
请重新输入..\n");
}
}
else
{
printf("\n在信息库中共找到%d条相关信息..\n",j);
for(i=0;i{
flag=1;
printf("\n第%d条\n",i+1);
print(log[i]);
printf("\n******************************************\n");
printf("\n☆请选择:
1.修改此学生信息2.删除此学生信息\n");
printf("3.继续查找下一条4.返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;modify(log[i]);break;
case'2':
flag=0;del(log[i]);break;
case'3':
flag=0;break;
case'4':
flag=0;menu();break;
default:
printf("※错误!
请重新输入..\n");
}
}
printf("\n已到最后一条相关信息..\n");
system("PAUSE");//暂停函数:
按任意键继续..;
menu();
}
}
voidres_name()//按检索函数;
{
inti,j=0,flag=1,log[100];
charmz[20];
system("cls");
printf("******************************************\n");
printf("\n☆请输入要检索的:
");
scanf("%s",&mz);
for(i=0;iif(!
strcmp(stu[i].name,mz))//字符串比较函数;
while(j<100){log[j]=i;j++;break;}//记录下相关的信息;
if(!
j)//信息库中没查找到所需信息;
{
printf("对不起,信息库里没要你想要查找的信息!
\n");
printf("\n******************************************\n");
printf("\n☆请选择:
1.继续查找2.返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;res();break;
case'2':
flag=0;menu();break;
default:
printf("※错误!
请重新输入..\n");
}
}
else
{
printf("\n在信息库中共找到%d条相关信息..\n",j);
for(i=0;i{
flag=1;
printf("\n第%d条\n",i+1);
print(log[i]);
printf("\n******************************************\n");
printf("\n☆请选择:
1.修改此学生信息2.删除此学生信息\n");
printf("3.继续查找下一条4.返回主菜单\n");
while(flag)
switch(getch())
{
case'1':
flag=0;modify(log[i]);break;
case'2':
flag=0;del(log[i]);break;
case'3':
flag=0;break;
case'4':
flag=0;menu();break;
default:
printf("※错误!
请重新输入..\n");
}
}
printf("\n※已到最后一条相关信息..\n");
system("PAUSE");
menu();
}
}
voidres()//检索函数;
{
intflag=1;
system("cls");
printf("────────────────────\n");//检索界面;
printf("*检索模式选择*\n");
printf("1.按学号检索\n");
printf("2.按检索\n");
printf("3.返回主菜单\n");
printf("────────────────────\n");
while(flag)
switch(getch())
{
case'1':
flag=0;res_num();break;//调用res_num()函数,按学号检索;
case'2':
flag=0;res_name();break;//调用res_name()函数,按检索;
case'3':
flag=0;menu();break;//调用menu()函数,返回主菜单;
default:
printf("※错误!
请重新输入..\n");
}
}
v