学生成绩管理程序及链表管理程序.docx
程序设计课程设计2009级 09专升本汉班内蒙古师范大学程 序 设 计 基 础课 程 设 计题目: 1. 学生成绩管理程序 2. 链表信息管理 姓 名_ _ _班 次_ 学 号_ _ _ 指导教师_成 绩_ 计算机与信息工程学院2009 年 10 月 20 日1 编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第36页 共37页题目1:学生成绩管理程序问题描述设计一个实用的小型学生成绩管理程序,它要求不用链表,而用数组来设计这个程序。它有查询和检索等功能,并且能够对指定文件操作,也可将多个文件组成一个文件。基本要求1功能要求(包括输入、输出、精度等方面的要求)设计要求实现的功能较多,所以将它们分为几个部分叙述。1建立文件(1)可以使用默认文件名或指定文件名将记录存储到文件; (2)文件保存成功返回0,失败返回-1; (3)设置保存标志savedTag作为是否已对记录进行存储操作的信息; (4)写同名文件将覆盖原来文件的内容;2增加学生记录 (1)可在已有记录后面追加新的记录; (2)可以随时用它增加新的记录,它们仅保存在结构数组中; (3)可以将一个文件读入,追加在已有记录之后; (4)如果已经采取用文件追加的方式,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续文件追加操作方式; (5)如果没有记录存在,给出提示信息。3新建学生信息文件 (1)用来重新建立学生信息记录; (2)如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存到一个指定文件,然后重新建立记录; (3)给出相应的提示信息。 4显示记录 (1)如果没有记录可供显示,给出提示信息;(2)可以随时显示内存中的记录;(3)显示表头。5文件存储(1)可以按默认名字或指定名字存储记录文件;(2)存储成功返回0,否则返回-1;(3)更新存储标志。6读取文件(1)可以按默认名字或指定名字将记录文件读入内存;(2)读取成功返回0,否则返回-1;(3)可以将指定或默认文件追加到现有记录的尾部;(4)可以将文件连续追加到现有记录并更新记录的名次。(5)更新存储标志。7删除记录(1)可以按“学号”、“姓名”或“名次”方式删除记录;(2)给出将被删除记录的信息,经确认后再删除;(3)如果已经是空表,删除时应给出提示信息并返回主菜单;(4)如果没有要删除的信息,输出没有找到的信息;(5)应该更新其他记录的名次;(6)删除操作仅限于内存,只有执行存记录时,才能覆盖原记录;(7)更新存储标志。8修改记录(1)可以按“学号”、“姓名”或“名次”方式修改记录内容;(2)给出将被修改记录的信息,经确认后进行修改;(3)如果已经是空表,应给出提示信息并返回主菜单;(4)如果没有找到需要修改的信息,输出提示信息;(5)应该同时更新其他记录的名次;(6)修改操作仅限于内存,只有进行存储操作时,才能覆盖原记录;(7)更新存储标志。9查询记录(1)可以按“学号”、“姓名”或“名次”方式查询记录;(2)能给出查询记录的信息;(3)如果查询的信息不存在,输出提示信息。10对记录进行排序 (1)可以按学号进行升序或降序排序; (2)可以按名称进行升序和降序排序; (3)可以按名次进行升序和降序排序; (4)如果属于选择错误,可以立即退出排序; (5)更新存储标志。11头文件 (1)使用条件编译定义头文件; (2)函数原型声明; (3)数据结构及包含文件;12测试程序 (1)应列出测试大纲对程序进行测试; (2)应保证测试用例测试到程序的各种边缘情况是基本要求,希望通过对本章设计的理解,重新考虑如何改进设计。2运行环境要求dev c+系统分析1 程序系统结构分析程序(系统)结构主程序名称子程序名称调用关系说明主函数(main) insert(Student s,int n)输入“1”时调用show(Student s,int n)输入“2”时调用sort(Student s,int n)输入“3”时调用 search(Student s,int n)输入“4”时调用save(Student s,int n)输入“5”时调用del(Student s,int n)输入“6”时调用2 子程序分析程序描述子程序名称参数名称类型含义子程序功能说明insert(Student s,int n)sStudent学生信息表地址添加学生信息nint学生人数show(Student s,int n)sStudent学生信息表地址显示学生信息nint学生人数sort(Student s,int n)sStudent学生信息表地址按要求对信息排序nint学生人数search(Student s,int n)sStudent学生信息表地址按需要查找信息nint学生人数save(Student s,int n)sStudent学生信息表地址保存信息nint学生人数del(Student s,int n)sStudent学生信息表地址按要求删除信息nint学生人数开始根据需求调用子函数结束并返回是否继续调用3.算法分析主函数流程: Y N添加学生信息:开始输入学生信息返回继续输入 Y N输入选择菜单:1. 按学号排序2. 按姓名排序3. 按成绩排序开始返回是否有重新排序对应记录进行修改相应排序方式对记录排序修改:YN选择查询方式:1.按学号2.按姓名3. 按成绩开始返回是否有重新排序相应显示记录是否有记录查询记录流程:Y Y N N删除记录流程:开始选择删除方式:1. 按学号2. 按姓名3. 按成绩4. 按名次 输入删除记录的对应信息是否有对应记录N输出删除对应记录信息 Y是否删除记录?NY删除记录,修改相应信息结束返回输出学生信息流程:开始输出学生信息返回结束返回i<n关闭文件,并赋值savedTag=0;n+文件是否打开读取记录保存到文件中开始定义输出文件流保存记录流程:YNYYN测试数据1 功能测试数据及结果2 正常值、边界值及异常值测试数据及结果a) 在主菜单选择功能时,调用子函数,若输入的数不是1-6则程序忽略这次输入,进入下一次调用,进行输入。b) 选择功能数为2时,若输入成员代号不存在,则程序给出提示信息。3 调试记录调试记录序号程序名称调试记录解决方法1save()学生信息最后一条记录显示不正确值保存记录时,最后一条记录不用保存换行符,不然读取记录时,换行符独占一行,导致数据显示错误2del()出现二义性修改错误课程设计小结通过对程序三的编写,进一步加深学习了while循环、for循环等循环语句。学会了通过函数间的返回值控制程序运行,使程序实现了菜单选择功能。在修改程序时通过对错误的修改和完善,使思路更加谨慎和完善。锻炼了思路,完善了编程习惯。源代码#include<iostream>#include<fstream> #include<iomanip>using namespace std;struct Student /定义结构体 string num; /学号 string name; /姓名 float score;/成绩 short int mingci;/名次;Student s100; /结构体数组变量int insert(Student s,int n) /输入学生信息 bool sf; int i=0; string sr; while(sr!="n"|sr!="N") cout<<"请输入学生学号:"<<endl; cin>>sn+i.num; cout<<"请输入学生的姓名:" <<endl; cin>>sn+i.name; cout<<"请输入学生的成绩:"<<endl; cin>>sn+i.score; cout<<"是否继续输入记录?(Y/N)"<<endl; cin>>sr; i+; return(n+i); int show(Student s,int n) /显示 int i; cout<<setw(7)<<"学号"<<setw(10)<<"姓名"<<setw(10)<<"成绩"<<setw(10)<<"名次"<<endl; cout<<endl; for(i=0;i<n;i+) cout<<setw(6)<<si.num<<setw(10)<<si.name<<setw(10)<<si.score<<setw(10)<<si.mingci<<endl; void sort(Student s,int n)/排序 Student p; int i,j; int m,w,t; cout<<"请选择排序方式:"<<endl; cout<<"1.按学号排序:"<<endl; cout<<"2.按姓名排序:"<<endl; cout<<"3.按成绩排序:"<<endl; cin>>m; switch(m) case 1: for(i=0;i<n;i+) for(j=i;j<n;j+) if(si.num>sj.num) p=si;si=sj;sj=p; goto px; case 2: for(i=0;i<n;i+) for(j=i;j<n;j+) if(si.name>sj.name) p=si;si=sj;sj=p; goto px; case 3: for(i=0;i<n;i+) for(j=i;j<n;j+) if(si.score>sj.score) p=si; si=sj;sj=p; px: cout<<"请选择输出方式:1:升序,0:降序"<<endl; cin>>t; cout<<endl; if(t=1) for(i=0;i<n;i+) si.mingci=i+1; cout<<" 学号 姓名 成绩 名次 "<<endl; cout<<si.num<<" "<<si.name<<" "<<si.score<<" "<<si.mingci<<endl; cout<<endl; else for(i=n-1;i>-1;i-) si.mingci=n-i; cout<<" 学号 姓名 成绩 名次 "<<endl; cout<<si.num<<" "<<si.name<<" "<<si.score<<" "<<si.mingci<<endl; cout<<endl; break; int delnum(Student s,int n)/按学号删除 int i,j; string a; char sr; cout<<"请输入该学生学号:"<<endl; cin>>a; for(i=0;i<n;i+) if(si.num=a) cout<<"是否保存删除记录?(Y/N)"<<endl; cin>>sr; if(sr='y'|sr='Y') for(j=i;j<n;j+) sj=sj+1; cout<<"信息删除成功!"<<endl; return n-1; else return n; cout<<"无法找到该信息!"<<endl; return(n); int delname(Student s,int n)/按姓名删除 int i,j; string a; char sr; cout<<"请输入该学生姓名:"<<endl; cin>>a; for(i=0;i<n;i+) if(si.name=a) cout<<"是否保存删除记录?(Y/N)"<<endl; cin>>sr; if(sr='y'|sr='Y') for(j=i;j<n;j+) sj=sj+1; cout<<"信息删除成功!"<<endl; return n-1; else return n; cout<<"无法找到该信息!"<<endl; return(n); int delscore(Student s,int n)/按成绩删除 int i,j; float m; char sr; cout<<"请输入该学生成绩:"<<endl; cin>>m; for(i=0;i<n;i+) if(si.score=m) cout<<"是否保存删除记录?(Y/N)"<<endl; cin>>sr; if(sr='y'|sr='Y') for(j=i;j<n;j+) sj=sj+1; cout<<"信息删除成功!"<<endl; return n-1; else return n; cout<<"无法找到该信息!"<<endl; return n; int delsort(Student s,int n)/按名次删除 int i,j; int m; char sr; cout<<"请输入该学生的名次:"<<endl; cin>>m; for(i=0;i<n;i+) if(si.mingci=m) cout<<"是否保存删除记录?(Y/N)"<<endl; cin>>sr; if(sr='y'|sr='Y') for(j=i;j<n;j+) sj=sj+1; cout<<"信息删除成功!"<<endl; return n-1; else return n; cout<<"无法找到该信息!"<<endl; return(n); int del(Student s,int n) /删除 int t; cout<<"请选择删除方式:"<<endl; cout<<"1.按学号删除:"<<endl; cout<<"2.按姓名删除:"<<endl; cout<<"3.按成绩删除:"<<endl; cout<<"4.按名次删除:"<<endl; cin>>t; switch(t) case 1: n=delnum(s,n);break; case 2: n=delname(s,n);break; case 3: n=delscore(s,n);break; case 4: n=delsort(s,n);break; return n;void search(Student s,int n) /查询方式修改记录 string a; Student q; int i=0; int b=0; float p; cout<<"请输入查询方式:"<<endl; cout<<"1.按学生学号查找:"<<endl; cout<<"2.按学生姓名查找:"<<endl; cout<<"3.按学生成绩查找:"<<endl; cout<<"4.按学生名次查找:"<<endl; int m; char sr; cin>>m; switch(m) i=0; case 1: cout<<"请输入要查询的学生的学号:"<<endl; cin>>a; while(i<n) if(si.num=a) goto loop; case 2: cout<<"请输入要查询的学生姓名:"<<endl; cin>>a; while(i<n) if(si.name=a) goto loop; case 3: cout<<"请输入要查询的学生成绩:"<<endl; cin>>p; while(i<n) if(si.score=p) goto loop; case 4: cout<<"请输入要查询的学生的名次:"<<endl; cin>>b; while(i<n) if(si.mingci=b) goto loop; loop: cout<<"该学生的学号:"<<si.num<<endl; cout<<"该学生的学号:"<<si.name<<endl; cout<<"该学生的成绩:"<<si.score<<endl; cout<<"是否要修改该学生的记录:(Y/N)"<<endl; cin>>sr; if(sr='Y'|sr='y') cout<<"请输入新的学生学号:"<<endl; cout<<"请输入新的学生姓名:"<<endl; cout<<"请输入新的学生成绩:"<<endl; cin>>q.num; cin>>q.name; cin>>q.score; si.num=q.num; si.name=q.name; si.score=q.score; cout<<"该学生的学号:"<<si.num<<endl; cout<<"该学生的学号:"<<si.name<<endl; cout<<"该学生的成绩:"<<si.score<<endl; return; i+; if(sr='n'|sr='N')return; if(i=n) cout<<"无法找到该信息!"<<endl; return; break; return;void save(Student s,int n)/保存 int i=0; ofstream fout("xueshengxinxi.txt"); if(!fout) cout<<"打开文件失败"<<endl; return ; fout<<"学生学号"<<""<<"学生姓名"<<""<<"学生成绩"<<""<<"学生名次"<<endl; while(i<n) fout<<si.num<<""<<si.name<<""<<si.score<<""<<si.mingci<<endl; i+; cout<<"文件保存成功!" fout.close();int main() int n=0; while(1) int r; cout<<"-"<<endl; cout<<" 对学生信息系统可执行的操作"<<endl; cout<<"0.退出程序"<<endl; cout<<"1.输入学生记录"<<endl; cout<<"2.显示学生记录"<<endl; cout<<"3.删除学生记录"<<endl; cout<<"4.查询修改学生记录"<<endl; cout<<"5.保存学生记录"<<endl; cout<<"6.对记录排序"<<endl; cout<<"-"<<endl; cout<<"请选择选项操作:(0-6):"<<endl; cin>>r; switch(r) case 0: exit(0);break; case 1: n=insert(s,n); break; case 2: n=show(s,n); break; case 3: sort(s,n);break; case 4: search(s,n);break; case 5: save(s,n);break; case 6: n=del(s,n);break;default : cout<<"请选择选项操作:(0-6):"<<endl; system("pause"); return 0;题目4:链表信息管理问题描述设计的目的是学习建立链表,使用链表存储结构信息,增加链表节点及删除链表节点等基本操作.实际设计时,可以增加数据信息及检索等功能.基本要求1功能要求(1).本课程设计时将重点放在整体设计上,直选成员代号和电话.(2).如果已经有记录,只能在其后追加;(3).显示整个记录的内容(含有新追加的记录);(4).号可由6位字符和数字的混合编码组成,例如下面的形式: A201 3405d 01001(5).使电话号码可由18位支付和数字组成,例如下面形式:(86)-551-369946980451-8822757-345613900110011(6).以删除全部记录,可以随时增加新记录;(7).使用菜单实现增加,删除,和显示等功能的选择;(8)测试程序;2.运行环境要求:dev c+系统分析1.程序系统结构分析程序(系统)结构主程序名称子程序名称调用关系说明主函数(main)insert(worker *&head)直接调用可添加成员信息display(worker *head)直接调用可输出成员信息del(worker *&head)直接调用可删除某个成员信息release(worker *&head)删除所有成员信息释放空间2.子程序分析程序描述子程序名称参数名称类型含义子程序功能说明void insert(worker *&head)headworker *结构体类型的指针添加成员信息void display(worker *head)headworker *结构体类型的指针输出成员信息void del(worker *&head)headworker *结构体类型的指针删除某个成员信息void release(worker *&head)headworker *结构体类型的指针删除所有成员信息释放空间3.算法分析说明本程序所选用的算法,计算公式和计算步骤和流程图。在main()中根据提示信息,按照需要可以选择不同的操作。程序中共有5个子程序,可以增加数据信息及检索等功能。实际设计时,在 worker ()结构体中定义了两个数组char num7和char telphone19,还定义了一个指针struct worker *next用于指示下一个结点的位置便于操作。对于子程序insert ()、display()、del()、release()是通过参数的传递实现对链表的操作;而exit()是对库内函数的调用。主函数:输入要选择的功能根据输入调用相应子函数结束子函数返回值开始输出主菜单1.增加记录2.显示记录3.删除某个记录4.删除所有记录5.退出输入的功能号void insert 添加成员信息如下:开始表是否空空创建链表结点准备输入信息分别输入电话号码和代号是否继续输入输入结束开始表是否空空输出表空输出表中内容zhong返回主页面void display 输出成员信息如下:删除成员信息开始表是否空空输出表空删除表中内容zhong返回主页面如下:测试数据1.功能测试数据及结果2.正常值、边界值及异常值测试数据及结果在原始数据文件内没有数据时,选择2会显式“链表为空,无记录!”信息,当原始数据内容非空时,则显示成员信息。其余情况下,输入相应项都可执行相应功能。当输入1到5以外的数据则给出的是原始的数据内容。3.调试记录调试记录序号程序名称调试记录解决方法1insert(worker *&head)编译不通过引用的加入可解决2p->next指针指向不明确给指针指向合适位置课程设计小结通过对这次的题目研究,发现自己很多学习上的问题,如掌握问题不够扎实,运用中总是得不到想要的结果,仔细检查源代码寻找问题所在,修改使其合乎正确思路。遇到问与人多讨论交流有助于我们的学习和提高。扎扎实实学好理论基础,才能更好的编写出合乎逻辑的代码。 源代码#include <iostream>#include <stdlib.h>using namespace std;struct worker /定义结构体 char num7;char telphone19;struct worker *next; void insert(worker *&head) /添加成员信息 struct worker *p=NULL,*end=NULL;char temple;cout<<"添加成员信息如下:"<<endl;if(head=NULL)p=new struct worker;head=p;cout<<"输入成员代号:"<<endl;cin>>p->num;cout<<"输入成员电话:"<<endl;cin>>p->telphone;p->next=0;cout<<"是否继续输入?(y/n)"<<endl; cin>>temple;while(temple='y'|temple='Y') p->next=new struct worker; p=p->next;cout<<"输入成员代号:"<<endl;cin>>p->num; cout<<"输入成员电话:"<<endl;cin>>p->telphone; p->next=0;cout<<"是否继续输入?(y/n)"<<endl;cin>>temple; p->next=0; end=p; else do p=end;p->next=new struct worker;p=p->next;cout<<"输入成员代号:"<<endl; cin>>p->num; cout<<"输入成员电话:"<<endl; cin>>p->telphone;p->next=0;cout<<"是否继续输入?(y/n)"<<endl; cin>>temple;p->next=0;end=p;while(temple='y'|temple='Y'); void display(worker *head) /输出成员信息 worker *p;p=head;cout<<"输出成员信息如下:"<<endl;if(p=NULL)cout<<" 链表为空,无记录!"<<endl;else while(p)cout<<"成员的代号:"<<p->num<<endl; cout<<"成员的电话:"<<p->telphone<<endl;p=p->next; void del(worker *&head) /删除某个成员信息 worker *p=NULL,*q=NULL; char number7,phone19;cout<<"删除某个成员信息如下:"<<endl; if(head=