学生学籍管理系统课程设计4.docx
《学生学籍管理系统课程设计4.docx》由会员分享,可在线阅读,更多相关《学生学籍管理系统课程设计4.docx(26页珍藏版)》请在冰豆网上搜索。
学生学籍管理系统课程设计4
软件设计报告
题目:
学生学籍管理系统
院系名称
:
电子工程学院
专业名称
:
电子
班级
:
0902
班内序号
:
05
学生姓名
:
指导教师
:
时间
:
2010年6月21日至2010年7月02日
一、课程设计目的
1.熟悉C语言程序的编辑、编译链接和运行的过程,至少能够用一种编译器较熟练地编辑、编译及调试程序。
2.掌握C语言数据类型,如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。
3.熟练运用if语句和switch语句以及嵌套应用。
涉及循环调用的,了解并掌握三种控制语句while、do-while和for语句。
4.学习并掌握C语言定义函数的基本方法、声明函数及调用函数的方法和过程。
5.掌握文件和文件指针的概念以及文件的定义方法,认识文件打开、关闭、读、写等文件基本操作函数。
6.掌握结构体类型变量、链表的使用。
7.了解指针和链表的概念,掌握指针的定义和使用指针变量的方法以及链表的正确用法。
灵活使用链表来储存学生信息。
8.、通过字符数组存储字符串,进一步使用字符串
二、课程设计内容
学生信息管理主要功能:
(1)能按学生的学号、姓名等完成对学生信息的录入、修改、统计、查询等功能
(2)能实现根据学号进行排序
(3)能按照学号及姓名对学生进行查询
开发工具——VisualC++
运行平台——WindowsXP
三、需求分析
对所开发系统功能、性能的描述,想要实现的目标。
系统功能:
(1)能按学号、姓名、年龄、性别、籍贯等录入学生的基本信息
(2)能进行删除,插入操作。
(3)能根据需要对学生的各项信息进行修改
(4)能根据学生的学号对所有的学生进行简单排序阅览
(5)能按照学号和姓名对学生进行查询
(6)可以保存到文件(附加功能)
(7)可以从文件读入已有的文件(附加功能)
(8)以菜单方式工作
性能描述:
各种功能都可以满足;程序相对较小,因而运行时反应比较迅速,不存在响应不及时地问题。
四、概要设计
1.系统结构图(功能模块图)
学籍管理结构图
;
五、详细设计及运行结果
流程图,函数之间相互调用的图示,程序设计及编码,运行结果。
定义变量
输入
正确输入
密码
错误
进入界面
重新输入
sum=read_message();
Do循环(choice!
=0)
输入数字(0~5)进行选择
Case1
print(head);break;
Case2
insert(head);break;
Case3
delet(head);;break;
Case4
fc(head);;break;
Case5
save_inf(head);;break;
Case6
findnu(head);;break;
Case7
findna(head);;break;
Case8
turn(head);;break;
Case9
case9:
count(head);break;
Case0
exit;
Clrscr();
排序模块
定义三个指针*p*p1*p2,
找到俩个头指针
p=p1=head->next;
p1=p1->next;
p->next=NULL;
p1!
=NULL
p2=p1->next;
p=head;
p->next!
=NULL&&p->next->numnum
p=p->next;
p1->next=p->next;
p->next=p1;
p1=p2;
排序成功返回主菜单
修改模块
定义指针
按学号查choice按姓名查
调用查找函数
选择是否修改学生信息
是否
输入新信息结束
修改成功
选择是否继续修改
2.主要函数说明
structstu*creat_inf()创建一个链表,将信息存入内存,以便随时调用信息structstu*fc(structstu*p)先进行查找然后修改学生基本信息,可以通过学号、姓名来选择所要修改的对象,然后对其各项信息进行修改。
turn(structstu*head),用以对学生进行排序,主要是按照学号的由小到大的顺序进行排列,然后将排列后的学生信息输出来。
structstu*findnu(structstu*s)structstu*findna(structstu*s)
功能是查找目标。
按姓名查询和按学号查询,这是两种不同的查询方式。
intdelet(structstu*s)V功能是删除目标,根据学号找到要删除的对象,然后删除,再将删除结果输出。
structstu*read_inf()功能是将保存在文件中的学生信息读出来
voidsave_inf(structstu*h),完成信息在文件中的存储。
intinsert(structstu*s)功能是向文件中曾加一些信息。
count(structstu*p)功能是统计一下所存学生的个数
Main()
主函数,通过switch,case来选择调用模块,1~8分别为各模块的调用,0为退出程序。
六、调试情况,设计技巧及体会
1、总体过程
编译和调试工具:
选择VisualC++,该工具稳定,其中有一个强大的调试工具,我比较熟悉。
2、遇到的问题
在两周的时间里,不断地对程序及各模块进行修改、编译、调试,其间遇到很多问题,这里只选几个有代表性的具体讨论。
(1)刚开始时,由于没有想好要做的课题,就坐在电脑前发呆。
经过一段时间的考虑,终于选定了课题——学生信息管理。
于是开始构思,开始编写程序。
(2)在第一周,写程序不按章程,导致错误非常多,而又一下子找不出来,又改不出来,整个程序陷入了近乎瘫痪的状态,非常着急。
于是我决定放弃这个写了近200条的程序。
利用周六周日的时间,我重新开始写程序。
这次,我按老师的要求与建议,分模块开始独立完成。
(3)再后来剩下的5天内,一天写两个模块。
在写到排序模块时,我遇到了问题:
无法排序。
用单步跟踪后发现程序甚至无法将信息从文件中读出。
于是我将读文件的语句进行了修改,可还是不行。
思考来思考去,有看书查资料,还是没有搞清楚。
于是我请教了周围的同学,让他们来“找找错”,终于,在一位细心的同学的帮助下,问题解决了。
正确的做法是将读文件的语句fread放在与排序相独立的for循环里,这样才能将信息从文件里成功得读出。
3出现的错误:
1〉E:
\xuesheng2.c(107):
errorC2371:
'inquire_num':
redefinition;differentbasictypes
译:
重复定义;不同的基本类型。
2〉c:
\documentsandsettings\xy\桌面\xuesheng.c(117):
errorC2065:
'i':
undeclaredidentifier
译:
未经宣布的标识符,即未定义。
3〉F:
\xuesheng.c(313):
errorC2198:
'save_file':
toofewactualparameters
译:
实参少(于形参)。
4〉C:
\DocumentsandSettings\XY\桌面\xuesheng.c(131):
warningC4013:
'getch'undefined;assumingexternreturningint
因为程序中没有包含该函数所属的头文件。
5〉F:
\xuesheng.c(30):
warningC4047:
'function':
'constchar*'differsinlevelsofindirectionfrom'constint'
说明是参数的char*与int*类型冲突。
6〉F:
\xuesheng.c(30):
warningC4024:
'strcmp':
differenttypesforformalandactualparameter2
译:
形参和实参的类型不同。
7〉C:
\DocumentsandSettings\user\桌面\学生信息管理系统.c(167):
errorC2018:
unknowncharacter'0xa3'
译:
未知符号。
因为中英文未转换,输入了中文标点,该调试工具不能识别。
8〉C:
\DocumentsandSettings\user\桌面\学生信息管理系统.c(75):
warningC4716:
'input':
mustreturnavalue
译:
必须有一个返回值。
C:
\DocumentsandSettings\user\桌面\学生信息管理系统.c(132):
warningC4101:
'a':
unreferencedlocalvariable
译:
'a':
未引用的局部变量。
C:
\DocumentsandSettings\user\桌面\学生信息管理系统.c(112):
warningC4700:
localvariable'num'usedwithouthavingbeeninitialized
译:
局部变量num未经初始化就被使用了
七、参考文献:
1.王曙燕主编,C语言程序设计,科学出版社,2005年
2.谭浩强,《C程序设计》,清华大学出版社2002年
3.《C语言课程设计实例精选与编程指导》,东南大学出版社
八、附录:
源代码
(略,详见电子版实验报告)
#include
#include
#include
#include
#defineNsizeof(structstu)
structstu
{
charname[32];
longnum;
intage;
charsex[2];
charaddr[20];
structstu*next;
};
structstu*creat_inf()
{structstu*head,*r,*s;
inti=1;
charchoice;
head=(structstu*)malloc(N);
head->next=NULL;
r=head;
do
{s=(structstu*)malloc(N);
printf("\n\n第%d个人的信息:
\n",i++);
printf("\n姓名:
\n");
flushall();
scanf("%s",s->name);
printf("\n学号:
\n");
flushall();
scanf("%ld",&s->num);
printf("\n年龄:
\n");
flushall();
scanf("%d",&s->age);
printf("\n性别:
\n");
flushall();
scanf("%s",s->sex);
printf("\n籍贯:
\n");
flushall();
scanf("%s",s->addr);
r->next=s;
r=s;
printf("contine?
(Y/N)");
choice=getch();
}while(choice=='Y'||choice=='y');
r->next=NULL;
return(head);
}
structstu*findnu(structstu*s)
{longnum;
printf("请输入要查的学号:
");
scanf("%ld",&num);
s=s->next;
while(s!
=NULL)
{
if(s->num==num)
{
printf("姓名学号年龄性别籍贯\n");
printf("%s%ld%d%s%s\n",s->name,s->num,s->age,s->sex,s->addr);
returns;
break;
}
s=s->next;
}
if(s==NULL)
printf("无该学生信息\n");
returnNULL;
}
structstu*findna(structstu*s)
{charname[10];
printf("请输入要查找学生的姓名:
");
scanf("%s",name);
s=s->next;
while(s!
=NULL)
{
if(strcmp(s->name,name)==0)
{
printf("姓名学号性别年龄籍贯\n");
printf("%s%ld%s%d%s\n",s->name,s->num,s->sex,s->age,s->addr);
returns;
break;
}
s=s->next;
}
if(s==NULL)
printf("无该学生信息\n");
}
structstu*fc(structstu*p)
{
structstu*s;
intchoice;
while
(1)
{
s=p;
printf("请输入要查找的信息\n");
printf("1.按学号查找\n");
printf("2.按姓名查找\n");
printf("---------------");
scanf("%d",&choice);
switch(choice)
{
case1:
s=findnu(s);break;
case2:
s=findna(s);break;
}
printf("是否对学生信息进行修改?
(y/n)");
getchar();
if(getchar()=='y')
{
printf("请输入学生新的信息!
");
printf("---------------------\n");
printf("请输入学生姓名:
\n");
scanf("%s",s->name);
printf("请输入学生学号:
\n");
scanf("%ld",&s->num);
printf("请输入学生性别:
\n");
scanf("%s",s->sex);
printf("请输入学生年龄:
\n");
scanf("%d",&s->age);
printf("请输入学生籍贯:
\n");
scanf("%s",s->addr);
}
printf("是否继续查找?
(y/n)");
getchar();
if(getchar()=='n')
break;
}
}
intdelet(structstu*s)
{
longnum;
structstu*p;
p=s->next;
if(p==NULL)
return0;
printf("请输入要删除的学号");
scanf("%ld",&num);
while(p!
=NULL)
{if(p->num==num)
{s->next=p->next;
free(p);
return1;
}
s=p;
p=p->next;
}
return0;
}
intinsert(structstu*s)
{structstu*p;
p=(structstu*)malloc(N);
printf("请输入要插入的学号姓名年龄性别籍贯\n");
scanf("%ld%s%d%s%s",&p->num,p->name,&p->age,p->sex,p->addr);
while(s->next!
=NULL&&s->next->numnum)
s=s->next;
if(s->next!
=NULL&&s->next->num==p->num)
{free(p);
return0;
}
p->next=s->next;
s->next=p;
return1;
}
voidsave_inf(structstu*h)
{structstu*s;
FILE*fp;
if((fp=fopen("e:
/xuejiguanli.txt","wt"))==NULL)
{
printf("不能打开");
return;
}
for(s=h->next;s!
=NULL;s=s->next)
{fprintf(fp,"%s%ld%d%s%s\n",s->name,s->num,s->age,s->sex,s->addr);
}printf("\n文件保存成功,按任意键返回");
getch();
fclose(fp);
}
structstu*read_inf()
{
structstu*head,*r,*s;
FILE*fp;
if((fp=fopen("e:
/xuejiguanli.txt","rt"))==NULL)
{
printf("文件未建立!
");
return(0);
}
head=(structstu*)malloc(N);
head->next=NULL;
r=head;
while(!
feof(fp))
{
s=(structstu*)malloc(N);
fscanf(fp,"%s%ld%d%s%s\n",s->name,&s->num,&s->age,s->sex,s->addr);;
r->next=s;
r=s;
}
r->next=NULL;
fclose(fp);
printf("读取文件成功!
");
getchar();
returnhead;
}
print(structstu*h)
{
structstu*s;
printf("\n该班的数据为:
\n");
printf("姓名学号年龄性别籍贯\n");
s=h->next;
while(s!
=NULL)
{
printf("%s%ld%d%s%s\n",s->name,s->num,s->age,s->sex,s->addr);
s=s->next;
}
}
turn(structstu*head)
{
structstu*p1,*p,*p2;
p=p1=head->next;
p1=p1->next;
p->next=NULL;
while(p1!
=NULL)
{
p2=p1->next;
p=head;
while(p->next!
=NULL&&p->next->numnum)
p=p->next;
p1->next=p->next;
p->next=p1;
p1=p2;
}
system("cls");
printf("\n\n排序成功!
!
按任意键返回主菜单!
");
flushall();
getchar();
}
count(structstu*p)
{
inti=0;
system("cls");
p=p->next;
while(p!
=NULL)
{
i++;
p=p->next;
}
printf("\n\n一共存储有%d个学生信息!
",i);
printf("\n\n按任意键返回主菜单!
");
flushall();
getchar();
}
voidlogin()
{
charmi;
chars[9];
inti;
printf("密码:
");
for(i=0;i<8;i++)
{
mi=getch();
printf("*");
s[i]=mi;
}
s[8]='\0';
printf("\n");
if(!
(strcmp(s,"11011900")))
{
system("cls");
printf("\n\n\n\n\n\n\n\n\n您已成功登陆!
");
}
else
{
system("cls");
printf("\n\n\n\n\n\n\n\n\n密码错误,您无权使用该系统!
\n\n");
exit
(1);
}
}
voidmain()
{
structstu*head;
chara[21];
intchoice;
printf("用户名");
scanf("%s",&a);
login();
if(read_inf()==0)
{
printf("文件未建立,请输入数据\n");
head=creat_inf();
save_inf(head);
}
head=read_inf();
while
(1)
{
getch();
system("CLS");
printf("\n\n★*★*★*★*★*★*★*★*★*★欢迎进入本系统★*★*★*★*★*★*★*★*★*★\n\n");
printf("*★1.显示全部学生信息\n\n");
printf("*★2.添加学生信息\t\t\t\t\t\n");
printf("*★3.删除学生信息\t\t\t\t\t\n");
printf("*★4.修改学生信息\t\t\t\t\t\n");
printf("*★5.储存文件\t\t\t\t\t\n");
printf("*★6.按学号查询学生信息\t\t\t\t\t\n");
printf("*★7.按姓名查询学生信息\t\t\t\t\t\n");
printf("*★8.按学号排序\t\t\t\t\t\n");
printf("*★8.按学号排序\t\t\t\t\t\n");
printf("*★9.统计人数\t\t\t\t\t\n");
printf("*★0.退出系统\t\t\t\