计算机软件编程实习报告.docx
- 文档编号:24721974
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:19
- 大小:182.12KB
计算机软件编程实习报告.docx
《计算机软件编程实习报告.docx》由会员分享,可在线阅读,更多相关《计算机软件编程实习报告.docx(19页珍藏版)》请在冰豆网上搜索。
计算机软件编程实习报告
《计算机软件编程课程设计》报告
一、设计题目
基于链表实现的学生信息管理系统
二、设计要求
利用VC6或者可视化编程设计一个学生信息管理系统,系统内每个学生的信息不少于5项,可以实现增加学生信息、删除学生信息、按条件查找学生信息、修改指定学生信息、显示学生信息。
并且可以将学生信息保存到本地磁盘并实现退出系统再重新进入系统可以查询原有数据。
三、设计思路
基于所学知识局限性以及设计可实现性,此次设计学生信息管理系统将采用线性表中的链式存储结构即单链表来存储,用结构体类型和数组来记录并采用外部文件txt方式记录数据的读取与保存。
系统设计流程图
系统流程图
函数调用程序:
四、设计结果
<一>源代码:
#include
#include
#include
#include
#include
typedefstructstudent{
intxuehao;
charname[30];
chargender[4];
charage[4];
charmajor[20];
structstudent*next;//next指针变量,指向结构体
}student;
structstudent*getMes(){
structstudent*head=(structstudent*)malloc(sizeof(student));//开辟新单元
head->next=NULL;
inti=0;
studenta[200];
FILE*f=fopen("student.txt","r");
assert(f!
=NULL);
structstudent*t=head;
while(fscanf(f,"%d%s%s%s%s",&a[i].xuehao,a[i].name,a[i].gender,a[i].age,a[i].major)!
=EOF){
structstudent*stu=(structstudent*)malloc(sizeof(student));
//strcpy(stu->xuehao,a[i].xuehao);将一个字符串复制到另一个字符串
stu->xuehao=a[i].xuehao;
strcpy(stu->name,a[i].name);
strcpy(stu->gender,a[i].gender);
strcpy(stu->age,a[i].age);
strcpy(stu->major,a[i].major);
t->next=stu;
t=stu;
t->next=NULL;
i++;
}
fclose(f);
returnhead;
}
intsort(structstudent*head){
inti=0;
structstudent*t=head->next;
structstudent*p=t->next;
while(t->next){
while(p){
if(p->xuehao
intxuehao=t->xuehao;
t->xuehao=p->xuehao;
p->xuehao=xuehao;
charname[30];
chargender[4];
charage[4];
charmajor[20];
strcpy(name,t->name);
strcpy(t->name,p->name);
strcpy(p->name,name);
strcpy(gender,t->gender);
strcpy(t->gender,p->gender);
strcpy(p->gender,gender);
strcpy(age,t->age);
strcpy(t->age,p->age);
strcpy(p->age,age);
strcpy(major,t->major);
strcpy(t->major,p->major);
strcpy(p->major,major);
i++;
}
p=p->next;
}
t=t->next;
p=t->next;
}
returni;
}
voidwriteMes(structstudent*head){
FILE*f=fopen("student.txt","w");
assert(f!
=NULL);
structstudent*p=head->next;
while(p){
//printf("%d%s%s\n",p->xuehao,p->name,p->gender);
fprintf(f,"%d%s%s%s%s\n",p->xuehao,p->name,p->gender,p->age,p->major);
p=p->next;
}
fclose(f);
}
//显示学生信息
voidshowMes(){
structstudent*head=getMes();
inti=sort(head);
structstudent*p=head->next;
printf("%s\t%s\t%s\t%s\t%s\n","学号","姓名","性别","年龄","c成绩");
while(p){
printf("%d\t%s\t%s\t%s\t%s\n",p->xuehao,p->name,p->gender,p->age,p->major);
p=p->next;
}
if(i>0){
writeMes(head);
}
}
//删除学生信息
voiddeleteMes(){
intxuehao;
printf("请输入需要删除学生信息的学号:
");
scanf("%d",&xuehao);
structstudent*head=getMes();
structstudent*t=head->next;
structstudent*pret;
while(t){
if(t->xuehao==xuehao&&t->next==NULL){
pret->next=NULL;
free(t);
writeMes(head);
return;
}
//strcmp(head->next->xuehao,xuehao)==0
if(head->next->xuehao==xuehao){
head->next=t->next;
t->next=NULL;
free(t);
writeMes(head);
return;
}
if(t->xuehao==xuehao){
pret->next=t->next;
t->next=NULL;
free(t);
writeMes(head);
return;
}
pret=t;
t=t->next;
}
printf("学号不存在!
");
}
//添加学生信息
voidaddMes(){
intxuehao;
charname[30];
chargender[4];
charage[4];
charmajor[20];
printf("输入新学号:
");
scanf("%d",&xuehao);
printf("输入名字:
");
scanf("%s",&name);
printf("输入性别:
");
scanf("%s",&gender);
printf("输入年龄:
");
scanf("%s",&age);
printf("输入c成绩:
");
scanf("%s",&major);
structstudent*stu=(structstudent*)malloc(sizeof(student));
stu->xuehao=xuehao;
strcpy(stu->name,name);
strcpy(stu->gender,gender);
strcpy(stu->age,age);
strcpy(stu->major,major);
structstudent*head=getMes();
stu->next=head->next;
head->next=stu;
sort(head);
writeMes(head);
}
//修改学生信息
voidupdateMes(){
intxuehao;
printf("请输入需要修改学生信息的学号:
");
scanf("%d",&xuehao);
structstudent*head=getMes();
structstudent*p=head->next;
while(p){
if(p->xuehao==xuehao){
charname[30];
chargender[4];
charage[4];
charmajor[20];
printf("旧名字为%s,请输入新的名字:
",p->name);
scanf("%s",name);
strcpy(p->name,name);
printf("旧信息为%s,请输入性别:
",p->gender);
scanf("%s",gender);
strcpy(p->gender,gender);
printf("旧信息为%s,请输入年龄:
",p->age);
scanf("%s",age);
strcpy(p->age,age);
printf("旧信息为%s,请输入c成绩:
",p->major);
scanf("%s",major);
strcpy(p->major,major);
writeMes(head);
return;
}
p=p->next;
}
printf("学号不存在!
");
}
//查找学生信息
voidsearchMes(){
intxuehao;
printf("请输入需要查询的学生信息的学号:
");
scanf("%d",&xuehao);
structstudent*head=getMes();
structstudent*p=head->next;
while(p){
if(p->xuehao==xuehao){
printf("学号:
%d\n名字:
%s\n性别:
%s\n年龄:
%s\nc成绩%s\n",p->xuehao,p->name,p->gender,p->age,p->major);
return;
}
p=p->next;
}
printf("学号不存在!
");
}
//主函数
intmain()
{
intnum;
do{
printf("1、显示学生信息\n2、删除学生信息\n3、添加学生信息\n4、修改学生信息\n5、查找学生信息\n6、退出\n");
printf("请输入编号选择执行操作:
");
scanf("%d",&num);
switch(num)
{
case1:
showMes();
printf("\n\n===============================\n\n\n");
break;
case2:
deleteMes();
printf("\n\n===============================\n\n\n");
break;
case3:
addMes();
printf("\n\n===============================\n\n\n");
break;
case4:
updateMes();
printf("\n\n===============================\n\n\n");
break;
case5:
searchMes();
printf("\n\n===============================\n\n\n");
break;
case6:
return0;
default:
printf("输入有误!
");
printf("\n\n===============================\n\n\n");
break;
}
}while
(1);
system("pause");
return0;
}
<二>显示界面:
①添加信息
②删除学生信息
③修改学生信息
④查找学生信息
五、设计分析
<一>、设计一个学生成绩管理系统,其功能包括:
①添加函数addMes():
将学生成绩信息插入到链表中;
②查询函数searchMes():
分别可以按学号和按姓名进行学生成绩查询;
③删除函数deleteMes():
当需要删除的学号和姓名一致时则删除对应的学生记录;
④修改函数updateMes():
修改指定的学生成绩信息;
⑤输出函数showMes:
输出全部学生成绩信息;
⑥读取数据函数writeMes():
从外部文件读取学生成绩信息;
(2)线性表的链接存储结构称为单链表,单链表使用一组任意的存储单元存放线性表的元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置。
为了正确表示元素之间逻辑关系,每个存储单元在存储数据元素的同时,还必须存储其后继元素所在地址信息,这个地址信息称为指针,这两部分组成了数据元素的存储映像,称为结点,结点结构如图2.1所示。
图2.1单链表的结点构造
设p是一个指针变量,则p的值是一个指针。
设指针p指向某个结点,则该结点用*p表示,在单链表中,结点p由两个域组成:
存放数据元素的部分和存放后继结点地址的指针部分,分别用p->data和p->next来标识,p->next指向结点ai+1,其指针与结点之间关系如图2.2所示。
图2.2指针与结点之间关系的示意图
<二>、根据功能需求分析,主界面由学生信息查询模块、学生信息添加模块、学生信息修改模块、学生信息删除模块和退出系统组成,可以通过输入相应的数字进入相应的功能模块。
(1)学生信息添加模块
添加的信息包括学号(不允许重复)、姓名(不允许重复)、性别、年龄和c成绩。
流程图如下图4.1所示。
图4.1插入模块流程图
本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图4.2所示。
图4.2尾插法建立单链表操作示意图
(2)学生信息查询模块
按学号查找学生信息的流程图分别如下图4.3所示。
图4.3按姓名查找学生成绩信息流程图
在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。
当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。
直到p为NULL时查找失败。
单链表查找过程如图4.4所示。
图4.4单链表查找过程的示意图
按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。
(3)学生信息修改模块
首先要查找与要修改数据相匹配的信息,若没有则返回失败。
否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。
(4)学生信息删除模块
当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。
其流程图4.5如下:
图4.5删除学生信息模块流程图
删除操作定义为将单链表的第i个结点删去。
因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图4.6所示。
图4.6在单链表中删除结点指针的变化情况
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 编程 实习 报告