收藏 分销(赏)

学生成绩管理程序及链表管理程序模板.doc

上传人:人****来 文档编号:4576397 上传时间:2024-09-30 格式:DOC 页数:49 大小:165KB
下载 相关 举报
学生成绩管理程序及链表管理程序模板.doc_第1页
第1页 / 共49页
学生成绩管理程序及链表管理程序模板.doc_第2页
第2页 / 共49页
点击查看更多>>
资源描述
学生成绩管理程序及链表管理程序 46 资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。 《程 序 设 计 基 础》课 程 设 计 题目: 1. 学生成绩管理程序 2. 链表信息管理 姓 名___ ____________ __ 班 次_________________ 学 号__ _ ____________ 指导教师___________________ 成 绩__________________ 计算机与信息工程学院 年 10 月 20 日 题目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) s[] Student 学生信息表地址 添加学生信息 n int 学生人数 show(Student s[],int n) s[] Student 学生信息表地址 显示学生信息 n int 学生人数 sort(Student s[],int n) s[] Student 学生信息表地址 按要求对信息排序 n int 学生人数 search(Student s[],int n) s[] Student 学生信息表地址 按需要查找信息 n int 学生人数 save(Student s[],int n) s[] Student 学生信息表地址 保存信息 n int 学生人数 del(Student s[],int n) s[] Student 学生信息表地址 按要求删除信息 n int 学生人数 开始 根据需求调用子函数 结束并返回 是否继续调用 3.算法分析 主函数流程: Y N 添加学生信息: 开始 输入学生信息 返回 继续输入 Y N 输入选择菜单: 1. 按学号排序 2. 按姓名排序 3. 按成绩排序 开始 返回 是否有重新排序 对应记录进行修改 相应排序方式 对记录排序修改: Y N 选择查询方式: 1.按学号2.按姓名3. 按成绩 开始 返回 是否有重新排序 相应显示记录 是否有记录 查询记录流程: Y Y N N 删除记录流程: 开始 选择删除方式: 1. 按学号2. 按姓名 3. 按成绩4. 按名次 输入删除记录的对应信息 是否有对应记录 N 输出删除对应记录信息 Y 是否删除记录? N Y 删除记录,修改相应信息 结束返回 输出学生信息流程: 开始 输出学生信息 返回 结束返回 i<n 关闭文件,并赋值savedTag=0; n++ 文件是否打开 读取记录保存到文件中 开始 定义输出文件流 保存记录流程: Y N Y Y N [测试数据] 1. 功能测试数据及结果 2. 正常值、 边界值及异常值测试数据及结果 a) 在主菜单选择功能时, 调用子函数, 若输入的数不是1-6则程序忽略这次输入, 进入下一次调用, 进行输入。 b) 选择功能数为2时, 若输入成员代号不存在,则程序给出提示信息。 3. 调试记录 调试记录 序号 程序名称 调试记录 解决方法 1 save() 学生信息最后一条记录显示不正确值 保存记录时, 最后一条记录不用保存换行符, 不然读取记录时, 换行符独占一行, 导致数据显示错误 2 del() 出现二义性 修改错误 [课程设计小结] 经过对程序三的编写, 进一步加深学习了while循环、 for循环等循环语句。学会了经过函数间的返回值控制程序运行, 使程序实现了菜单选择功能。在修改程序时经过对错误的修改和完善, 使思路更加谨慎和完善。锻炼了思路, 完善了编程习惯。 [源代码] #include<iostream> #include<fstream> #include<iomanip> using namespace std; struct Student //定义结构体 { string num; //学号 string name; //姓名 float score;//成绩 short int mingci;//名次 }; Student s[100]; //结构体数组变量 int insert(Student s[],int n) //输入学生信息 { bool sf; int i=0; string sr; while(sr!="n"||sr!="N") { cout<<"请输入学生学号: "<<endl; cin>>s[n+i].num; cout<<"请输入学生的姓名: " <<endl; cin>>s[n+i].name; cout<<"请输入学生的成绩: "<<endl; cin>>s[n+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)<<s[i].num<<setw(10)<<s[i].name<<setw(10)<<s[i].score<<setw(10)<<s[i].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(s[i].num>s[j].num) {p=s[i];s[i]=s[j];s[j]=p;} goto px; case 2: for(i=0;i<n;i++) for(j=i;j<n;j++) if(s[i].name>s[j].name) {p=s[i];s[i]=s[j];s[j]=p;} goto px; case 3: for(i=0;i<n;i++) for(j=i;j<n;j++) if(s[i].score>s[j].score) {p=s[i]; s[i]=s[j];s[j]=p;} px: cout<<"请选择输出方式: 1: 升序, 0: 降序"<<endl; cin>>t; cout<<endl; if(t==1) {for(i=0;i<n;i++) {s[i].mingci=i+1; cout<<" 学号 姓名 成绩 名次 "<<endl; cout<<s[i].num<<" "<<s[i].name<<" "<<s[i].score<<" "<<s[i].mingci<<endl; } cout<<endl; } else {for(i=n-1;i>-1;i--) {s[i].mingci=n-i; cout<<" 学号 姓名 成绩 名次 "<<endl; cout<<s[i].num<<" "<<s[i].name<<" "<<s[i].score<<" "<<s[i].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(s[i].num==a) { cout<<"是否保存删除记录? (Y/N)"<<endl; cin>>sr; if(sr=='y'||sr=='Y') {for(j=i;j<n;j++) {s[j]=s[j+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(s[i].name==a) { cout<<"是否保存删除记录? (Y/N)"<<endl; cin>>sr; if(sr=='y'||sr=='Y') {for(j=i;j<n;j++) {s[j]=s[j+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(s[i].score==m) { cout<<"是否保存删除记录? (Y/N)"<<endl; cin>>sr; if(sr=='y'||sr=='Y') {for(j=i;j<n;j++) {s[j]=s[j+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(s[i].mingci==m) { cout<<"是否保存删除记录? (Y/N)"<<endl; cin>>sr; if(sr=='y'||sr=='Y') {for(j=i;j<n;j++) {s[j]=s[j+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(s[i].num==a) goto loop; } case 2: { cout<<"请输入要查询的学生姓名:"<<endl; cin>>a; while(i<n) if(s[i].name==a) goto loop; } case 3: { cout<<"请输入要查询的学生成绩:"<<endl; cin>>p; while(i<n) if(s[i].score==p) goto loop; } case 4: { cout<<"请输入要查询的学生的名次:"<<endl; cin>>b; while(i<n) if(s[i].mingci==b) goto loop; } loop: { cout<<"该学生的学号:"<<s[i].num<<endl; cout<<"该学生的学号:"<<s[i].name<<endl; cout<<"该学生的成绩:"<<s[i].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; s[i].num=q.num; s[i].name=q.name; s[i].score=q.score; cout<<"该学生的学号:"<<s[i].num<<endl; cout<<"该学生的学号:"<<s[i].name<<endl; cout<<"该学生的成绩:"<<s[i].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<<s[i].num<<";"<<s[i].name<<";"<<s[i].score<<";"<<s[i].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) - -3456 (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) head worker * 结构体类型的指针 添加成员信息 void display(worker *head) head worker * 结构体类型的指针 输出成员信息 void del(worker *&head) head worker * 结构体类型的指针 删除某个成员信息 void release(worker *&head) head worker * 结构体类型的指针 删除所有成员信息释放空间 3.算法分析 说明本程序所选用的算法, 计算公式和计算步骤和流程图。 在main()中根据提示信息, 按照需要能够选择不同的操作。程序中共有5个子程序, 能够增加数据信息及检索等功能。实际设计时, 在 worker ()结构体中定义了两个数组char num[7]和char telphone[19], 还定义了一个指针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.调试记录 调试记录 序号 程序名称 调试记录 解决方法 1 insert(worker *&head) 编译不经过 引用的加入可解决 2 p->next 指针指向不明确 给指针指向合适位置 [课程设计小结] 经过对这次的题目研究, 发现自己很多学习上的问题, 如掌握问题不够扎实, 运用中总是得不到想要的结果, 仔细检查源代码寻找问题所在, 修改使其合乎正确思路。遇到问与人多讨论交流有助于我们的学习和提高。扎扎实实学好理论基础, 才能更好的编写出合乎逻辑的代码。 [源代码] #include <iostream> #include <stdlib.h> using namespace std; struct worker //定义结构体 { char num[7]; char telphone[19]; 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 *&hea
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服