学生学籍管理 C语言课程设计实验报告.docx
- 文档编号:9010233
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:27
- 大小:299.84KB
学生学籍管理 C语言课程设计实验报告.docx
《学生学籍管理 C语言课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《学生学籍管理 C语言课程设计实验报告.docx(27页珍藏版)》请在冰点文库上搜索。
学生学籍管理C语言课程设计实验报告
电子科技大学成都学院
电子工程系
C语言
课程设计报告
题目名称学生学籍管理系统
学生姓名XX
学 号XXXXXXXX
专 业电气工程及其自动化
同组成员
2013年12月制成绩:
一、设计题目:
学生学籍管理系统设计
二、设计任务及自己所承担部分
1、设计任务:
(1) 采用链表,数据使用文件存放;
(2) 每个条目要求包含学生姓名,学号,籍贯,出生年月,民族等项目。
(3) 加入创建学生条目,修改条目,统计(包括总人数,各个分项目统计,如籍贯,出生年月等),条件查询等功能。
(4) 开始画面加入简单的菜单便于选择各种功能。
2、自己所承担的部分:
三、总体设计(程序设计组成框图、流程图)
1、程序设计组成框图
2、程序设计流程图
是
否
是
否
是
否
是
否
是
否
是
否
是
四、详细设计(模块功能说明,如函数功能、入口及出口参数说明,函数调用关系描述等)
整个系统除了主函数外,另外还有14个函数,实现七大功能:
创建功能、修改功能、选择功能、统计功能、删除功能、显示功能、查询功能、保存功能。
各个函数的详细设计说明分别如下:
1、voidmain()//主函数
通过调用各模块来实现学生信息的管理。
内含调用模块“建立链表表头(CreateHeadLink();)”、“从文件中读学生信息到链表中(ReadInfoFormFile();)”、“显示菜单(DesplayMenu();)”、“保存链表数据到文件中(SaveLinkToFile();)”
2、定义的结构体
typedefstructSTUDENT
{
charstudentNumber[10];/*学生学号*/
charstudentName[20];/*学生姓名*/
charstudentSex[4];/*学生性别*/
charstudentAge[10];/*出生年月*/
charstudentJiguan[10];/*籍贯*/
charstudentMinzu[30];/*民族*/
structSTUDENT*next;
}STUDENT;
3、voidReadInfoFormFile(void)//从文件中读学生信息到链表中
以只读方式打开文件,然后定义一个指针读取信息。
{
FILE*fp;//定义指向该文件的FILE类型的指针变量
STUDENT*p;//定义一个结构指针
fp=fopen("student.txt","r");//以只读的方式打开文件
if(!
fp)
{printf("文件不存在\n");return;}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%s%s",p->studentNumber,p->studentName,p->studentSex,p->studentAge,p->studentJiguan,p->studentMinzu))//从文件中读取信息
{
InsertOneNode(p);//调用函数
p=MallocNode();
}
fclose(fp);
}
4、voidTotalstudent(void)//统计学生信息
5、voidDesplayMenu(void)//显示菜单
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的七大功能,用switch()-case语句完成相应完成相应选择的函数调用。
等执行完每一个函数功能后,自动回到主界面也要通过这个函数来实现。
6、voidCreateHeadLink(void)//链表表头的建立
{
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));//开辟空间,并初始化赋给p*
headLink=p;
p->next=NULL;
}
7、STUDENT*MallocNode(void)//申请一个新结点,并将其初始化
内部利用for循环利用进行初始化赋值。
8、voidGetInformation(STUDENT*t)//取得用户输入的学生信息
printf("请输入学生学号:
\n");
scanf("%s",t->studentNumber);
……
9、voidInsertOneNode(STUDENT*t)//在链表的结尾处增加一个结点
{
STUDENT*p;
p=headLink;
while(p->next)//链表结束的判断
{
p=p->next;
}
p->next=t;
}
10、voidDesplayInfoBystudent(void)//查询学生的信息
利用switch语句根据用户不同的选择方式调用不同的显示函数:
VoidDesplayInfoBystudentNumber(void)//根据用户输入的学号显示学生信息
voidDesplayInfoByestudentName(void)//根据用户输入的姓名显示学生信息
例如,在用姓名查询学生信息的函数中,用户先输入学生姓名,再用while循环语句依次选择符合该姓名的学生,有符合则输出,否则就提示无此姓名的学生。
11、voidDesplayOneNode(STUDENT*t)//输出一个结点的信息
{printf("%s\t",t->studentNumber);
……
}
12、voidDeleteNodeBystudentNumber(void)//根据用户输入的学生学号删除该学生的信息
用户先输入学生姓名,再用while循环语句依次选择符合该姓名的学生,有符合的学生信息则删除,否则就提示无此姓名的学生。
算法:
从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。
如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。
13、voidOutputInformation(void)//显示所有学生的信息
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
14、voidChangeMarkBystudentName(void)//根据输入的学生姓名修改学生的信息
用户先输入学生学号,再用while循环语句依次选择符合该姓名的学生,有符合的学生则对其输入新的信息,再用strcpy()语句将新的地址复制到旧的地址中去。
15、voidSaveLinkToFile(void)//保存链表数据到文件中
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
五、调试与测试:
调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施
1、调试方法:
总体方法是设断点、单步跟、查变量、看内存,勤思考细分析找出bug直到结果确认。
先写出所需头文件和主函数,再依次对每个小模块进行编辑、编译、连接、运行。
先用一组简单的数据对程序进行调试,看运行结果是否符合。
当数据测试出现错误时,首先找到出错的函数,对函数中各个变量进行观察。
有时出现的错误未必在运行错误的函数里,也许在前面的函数内已有错误,则需从头一个个确定函数的正确性,重点注意对头文件中的各个函数的返回值和它所要传入的参变量及其功能。
常用注释(//)符号来进行调试,确定正常范围,缩小错误范围。
2、在调试过程中主要碰到的问题或分析讨论或采取措施:
(1)在应用指针时没有注意头结点中的数据域中是不存放数据,导致指针指向错误。
(2)因为水平有限,对程序的把握不够,对于学生统计这个模块一直未找到很好的方法,故这需要大家在今后不断学习和努力的一个方面,值得大家深思。
(3)最初有很多东西都不明白:
例如不熟悉链表,不明白两个指针的交换,不熟悉排序,不清楚文件的使用,不了解链表和菜单的建立等等,但大家通过不断分析讨论,复习课本,上网查资料,或照着别人的程序进行复制修改等方法不断修改测试,直到得出结果。
最后针对结果再对程序进行反思总结。
(4)程序测试时,出现学生的信息与所输出的列表头的排列出现问题,以及显示学生信息时,第二个学生的信息会接到第一个学生的信息后面,使信息混乱。
最后通过改变变量范围,在输出的最后一个结点信息后的/s后加/n得以解决。
六、运行结果
(1)运行结果界面如下:
(2)选择1号菜单,输入一名学生的信息:
(3)再按1输入一名学生信息,再按5显示如下:
(4)发现第二个信息错误,按2修改信息,运行结果如下:
(5)再按5显示正确信息如下:
(6)按4进入删除功能,输入删除信息再按5显示删除后的结果:
(7)按6进入选择查询功能,先选2姓名查询,输入一个不存在的姓名:
(8)再按6进入查询系统,选择2姓名查询,输入一个有效的姓名:
(9)按学号查询:
(10)按0退出系统后,桌面生成student.txt文件:
7、教师评语
附:
源程序
#include
#include
#include
#include
typedefstructSTUDENT
{
charstudentNumber[10];/*学生学号*/
charstudentName[20];/*学生姓名*/
charstudentSex[4];/*学生性别*/
charstudentAge[10];/*出生年月*/
charstudentJiguan[10];/*籍贯*/
charstudentMinzu[30];/*民族*/
structSTUDENT*next;
}STUDENT;
STUDENT*headLink;/*链表表头指针*/
/*以下是函数声明*/
voidReadInfoFormFile(void);
voidDesplayMenu(void);
voidCreateHeadLink(void);
STUDENT*MallocNode(void);
voidGetInformation(STUDENT*t);
voidInsertOneNode(STUDENT*t);
voidDesplayInfoBystudentNumber(void);
voidDesplayOneNode(STUDENT*t);
voidDesplayInfoByestudentName(void);
voidDesplayOneNode(STUDENT*t);
voidDesplayInfoBystudent(void);
voidDesplayOneNode(STUDENT*t);
voidDeleteNodeBystudentNumber(void);
voidOutputInformation(void);
voidChangeMarkBystudentName(void);
voidCompositorByTotalstudentJiguan(void);
voidSaveLinkToFile(void);
intchoose;/*用于接受用户的选择*/
/*主函数*/
voidmain()
{
CreateHeadLink();//建立链表表头
ReadInfoFormFile();//从文件中读学生信息到链表中
DesplayMenu();//显示菜单
SaveLinkToFile();//保存链表数据到文件中
}
/************************************
函数功能:
从文件中读学生信息到链表中
************************************/
voidReadInfoFormFile(void)
{
FILE*fp;//定义指向该文件的FILE类型的指针变量
STUDENT*p;//定义一个结构指针
fp=fopen("student.txt","r");//以只读的方式打开文件
if(!
fp)
{
printf("文件不存在\n");
return;
}
p=MallocNode();
while(fscanf(fp,"%s%s%s%s%s%s",p->studentNumber,p->studentName,p->studentSex,
p->studentAge,p->studentJiguan,p->studentMinzu))//从文件中读取信息
{
InsertOneNode(p);//调用函数
p=MallocNode();
}
fclose(fp);
}
/************************************
函数功能:
显示菜单,根据用户的输入
完成相应的功能
************************************/
voidDesplayMenu(void)
{
STUDENT*p;
printf("******************************************\n");
printf("*-------请选择相应的功能-------*\n");
printf("**\n");
printf("*1-------创建学生信息-------1*\n");
printf("*2-------修改学生信息-------2*\n");
printf("*3-------统计学生信息-------3*\n");
printf("*4-------删除学生信息-------4*\n");
printf("*5-------显示学生信息-------5*\n");
printf("*6-------查询学生信息-------6*\n");
printf("*0---------退出系统---------0*\n");
printf("**\n");
printf("*-------请选择相应的功能-------*\n");
printf("******************************************\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case1:
p=MallocNode();/*先申请一个新结点*/
GetInformation(p);/*要求用户输入信息到新结点中*/
InsertOneNode(p);/*将新结点加到链表中*/
break;
case2:
ChangeMarkBystudentName();/*根据用户输入的学生姓名修改该学生信息*/
break;
case4:
DeleteNodeBystudentNumber();/*根据用户输入的学生学号删除该学生信息*/
break;
case5:
OutputInformation();/*显示所有学生的信息*/
break;
case6:
DesplayInfoBystudent();
break;
case0:
SaveLinkToFile();/*保存数据后再退出*/
free(headLink);
default:
break;
}
DesplayMenu();/*递归调用*/
}
/************************************
函数功能:
建立链表表头
************************************/
voidCreateHeadLink(void)
{
STUDENT*p;
p=(STUDENT*)malloc(sizeof(STUDENT));
headLink=p;
p->next=NULL;
}
/****************************************
函数功能:
申请一个新结点,并将其初始化
*****************************************/
STUDENT*MallocNode(void)
{
STUDENT*p;
inti;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
returnNULL;
for(i=0;i<10;i++)
p->studentNumber[i]='\0';
for(i=0;i<20;i++)
p->studentName[i]='\0';
for(i=0;i<4;i++)
p->studentSex[i]='\0';
for(i=0;i<10;i++)
p->studentAge[i]='\0';
for(i=0;i<10;i++)
p->studentJiguan[i]='\0';
for(i=0;i<30;i++)
p->studentMinzu[i]='\0';
p->next=NULL;
returnp;
}
/************************************
函数功能:
取得用户输入的学生信息
************************************/
voidGetInformation(STUDENT*t)
{
printf("请输入学生学号:
\n");
scanf("%s",t->studentNumber);
printf("请输入学生姓名:
\n");
scanf("%s",t->studentName);
printf("请输入学生性别:
\n");
scanf("%s",t->studentSex);
printf("请输入学生出生年月:
\n");
scanf("%s",t->studentAge);
printf("请输入学生籍贯:
\n");
scanf("%s",t->studentJiguan);
printf("请输入学生民族:
\n");
scanf("%s",t->studentMinzu);
}
/************************************
函数功能:
在链表的结尾处增加一个结点
************************************/
voidInsertOneNode(STUDENT*t)
{
STUDENT*p;
p=headLink;
while(p->next)
{
p=p->next;
}
p->next=t;
}
/*************************************************
函数功能:
查询学生的信息
**************************************************/
voidDesplayInfoBystudent(void)
{
STUDENT*p;
intn;
printf("按学号查询请按1,按姓名查询请按2:
");
scanf("%d",&n);
switch(n)
{
case1:
DesplayInfoBystudentNumber();break;
case2:
DesplayInfoByestudentName();break;
}
}
/*************************************************
函数功能:
根据用户输入的学生学号显示该学生的信息
**************************************************/
voidDesplayInfoBystudentNumber(void)
{
STUDENT*p;
charstudentNumber[10];
charflag=0;
p=headLink->next;
printf("请输入学生的学号:
\n");
scanf("%s",studentNumber);
while(p)
{
if(strcmp(p->studentNumber,studentNumber)==0)
{
printf("学生学号\t姓名\t性别\t出生年月\t籍贯\t民族\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在学号为%s的学生\n",studentNumber);
}
/************************************************
函数功能:
根据用户输入的学生姓名显示该学生的信息
*************************************************/
voidDesplayInfoByestudentName(void)
{
STUDENT*p;
charstudentName[20];
charflag=0;
p=headLink->next;
printf("请输入学生姓名:
\n");
scanf("%s",studentName);
while(p)
{
if(strcmp(p->studentName,studentName)==0)
{
printf("学生学号\t姓名\t性别\t出生年月\t籍贯\t民族\n\n");
DesplayOneNode(p);
flag=1;
break;
}
p=p->next;
}
if(!
flag)
printf("对不起,不存在姓名为%s的学生\n",studentName);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生学籍管理 C语言课程设计实验报告 学生 学籍 管理 语言 课程设计 实验 报告