第一篇:数据结构课程设计——成绩管理系统
数据结构 课程设计
(1)学生成绩管理问题(建议数据结构:单链表)
学生成绩管理是学校教务管理的重要组成部分,其处理信息量很大,本设计是对学生的成绩管理做一个简单的模拟,用菜单选择操作方式完成下列主要功能:
(1)登记学生成绩;
(2)查询学生成绩;(3)插入学生成绩;(4)删除学生成绩;
要求对每个功能分别用函数实现。
(2)学生成绩管理系统需求与功能分析
学生成绩的录入、统计、查询、修改、删除、输出。
(3)学生成绩管理系统的数据结构表
序号 成员名(字段名)数据类型 长度 字段含义class_0 char 20 班级num int 学号name char 8 姓名elec flaot 电子技术c_prog float C 程序设计media flaot 多媒体技术eng float 大学英语math float 高等数学 sport float 大学体育polity float 马克思主义政治经济学ave float平均成绩order int 名次
画出功能结构图。
(4)学生成绩管理系统测试数据表
class_0 num name elec c_prog media eng math sport polity ave order
网络30331 3033101 办公费 80 70 60 70 70 60 80 表中其余数据自己编造。
(5)使用链表编写程序(手写源程序代码,并给出注解)
0)定义链表结点
1)主函数main():定义链表头指针,调用录入、统计等函数对成绩表进行处理;
2)建立链表函数Create():输入班级到政治课成绩信息;
3)统计函数Statistic():计算平均成绩;
4)查询函数Lookup():查询指定学号学生成绩记录;
5)修改函数Modify():修改指定学号学生成绩记录;
6)删除函数删除():删除指定学号学生记录;
7)输出函数Output():输出班级所有学生成绩记录;
8)插入函数Insert():按平均分顺序插入新结点。
9)排序函数Sort():按平均分对学生成绩记录项进行降序排序;
程序如下:
#include #include #include #include #include
using namespace std;
struct Node//定义链表结点 {
char* class_0;//班级 int number;char* name;//姓名 float elec;//电子技术成绩 float c_prog;//C程序设计成绩 float media;//多媒体技术成绩 float eng;//大学英语成绩 float math;//高等数学成绩
float sport;//大学体育成绩
float polity;//马克思主义政治经济学成绩 float ave;//平均成绩 int order;//名次 Node* link;Node(){link=NULL;} Node(int _number,char* _class_0,char* _name,float _elec, float _c_prog,float _media,float _eng,float _math, float _sport,float _polity,float _ave,int _order,Node* next){ number=_number;class_0=new char[21];strcpy(class_0,_class_0);name=new char[9];strcpy(name,_name);elec=_elec;c_prog=_c_prog;media=_media;eng=_eng;math=_math;sport=_sport;polity=_polity;ave=_ave;order=_order;link=next;} ~Node(){ 删除 []class_0;删除 []name;}
};class StudentScore { private: Node* first;//链表的头指针
int choice;//选择数据的读入方式 int fileNum;//当前文件数减一 int fileLoc;//定位当前文件 string* fileName;int operChoice;int RecordLength;public: StudentScore();void Save();void BuildList();//手工建立成绩链表
void ReadInfo(int k);//从内存中读入学生信息 void ClearList();void Statistic();void Sort();void Add();void 删除();void PrintList();void Menu();};StudentScore::StudentScore(){ RecordLength=0;operChoice=0;first=NULL;choice=0;fileLoc=0;fileNum=0;fileName=new string[10];//最多可以存10个文件 } int GetOrder(Node* first,float ave);void StudentScore::BuildList(){ int _number;//学号
char* _class_0=new char[21];//班级 char* _name=new char[9];//姓名 float _elec;//电子技术成绩 float _c_prog;//C程序设计成绩 float _media;//多媒体技术成绩 float _eng;//大学英语成绩 float _math;//高等数学成绩 float _sport;//大学体育成绩
float _polity;//马克思主义政治经济学成绩 float _ave;//平均成绩 int _order;//名次 char c;Node *p,*r=NULL;first=NULL;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');while(tolower(c)!='n'){ cin>>_class_0;//班级 cin>>_number;cin>>_name;//姓名 cin>>_elec;cin>>_c_prog;cin>>_media;cin>>_eng;cin>>_math;cin>>_sport;cin>>_polity;_ave=(_elec+_c_prog+_media+_eng+_math+_sport+_polity)/7;//求得平均成绩 _order=GetOrder(first,_ave);
p=new Node(_number,_class_0,_name,_elec, _c_prog,_media,_eng,_math,_sport,_polity, _ave,_order,NULL);//建立一个新的结点储存信息
if(first!=NULL)r->link=p;else first=p;r=p;RecordLength++;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');} } int GetOrder(Node* first,float ave)//名次记录有严重问题 { int order=1;Node* temp=first;for(;temp;temp=temp->link){ if(temp->ave>ave)order++;if(temp->aveorder)++;} return order;}
void StudentScore::Statistic(){ Node* temp=first;float a_elec=0.0;//电子技术成绩 float a_c_prog=0.0;//C程序设计成绩 float a_media=0.0;//多媒体技术成绩 float a_eng=0.0;//大学英语成绩 float a_math=0.0;//高等数学成绩 float a_sport=0.0;//大学体育成绩
float a_polity=0.0;//马克思主义政治经济学成绩 int i=0;while(temp){ a_elec+=temp->elec;a_c_prog+=temp->c_prog;a_media+=temp->media;a_eng+=temp->eng;a_math+=temp->math;a_sport+=temp->sport;a_polity+=temp->polity;i++;temp=temp->link;} a_elec=a_elec/i;a_c_prog=a_c_prog/i;a_media=a_media/i;a_eng=a_eng/i;a_math=a_math/i;a_sport=a_sport/i;a_polity=a_polity/i;cout<<“电子技术平均成绩为:”< cout<<“c程序设计平均成绩为:”< cout<<“多媒体技术平均成绩为:”< cout<<“英语平均成绩为:”< cout<<“高等数学平均成绩为:”< cout<<“体育平均成绩为:”< cout<<“政治平均成绩为:”<} void StudentScore::删除(){ int studNum;Node* p;Node* temp=first;cout<<“请输入要删除的学生学号”< cin>>studNum;float average;for(;temp;temp=temp->link){ cout if(temp->number==studNum){ average=temp->ave;if(temp==first)//说明是第一次 { first=first->link;删除 temp;break;//如果不跳出的话 temp=temp->link会出错 } else { p->link=temp->link;删除 temp;break;} } p=temp;RecordLength--; } //下面修改学生排名 temp=first;for(;temp;temp=temp->link)if(temp->aveorder--;} void StudentScore::Add(){ int _number;//学号 char* _class_0=new char[21];//班级 char* _name=new char[9];//姓名 float _elec;//电子技术成绩 float _c_prog;//C程序设计成绩 float _media;//多媒体技术成绩 float _eng;//大学英语成绩 float _math;//高等数学成绩 float _sport;//大学体育成绩 float _polity;//马克思主义政治经济学成绩 float _ave;//平均成绩 int _order;//名次 char c;Node *p,*r=NULL;r=first;while(r->link)r=r->link;// first=NULL;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');while(tolower(c)!='n'){ cin>>_class_0;//班级 cin>>_number;cin>>_name;//姓名 cin>>_elec;cin>>_c_prog;cin>>_media;cin>>_eng;cin>>_math;cin>>_sport;cin>>_polity;_ave=(_elec+_c_prog+_media+_eng+_math+_sport+_polity)/7;//求得平均成绩 //写一个返回排名的程序 _order=GetOrder(first,_ave); p=new Node(_number,_class_0,_name,_elec, _c_prog,_media,_eng,_math,_sport,_polity, _ave,_order,NULL);//建立一个新的结点储存信息 if(first!=NULL)r->link=p;else first=p;r=p;RecordLength++;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');} } void StudentScore::Sort()//简单bubble排序从高分到低分排序 { int i=0;Node* temp=first;Node* before;// Node* p=first;for(;temp->link;){ if(temp->avelink->ave){ if(temp==first)//说明是第一个结点 { first=first->link;// p=temp;// temp=temp->link;temp->link=temp->link->link;first->link=temp;before=first;} else//不是第一个结点 { before->link=temp->link;temp->link=temp->link->link;before->link->link=temp;before=before->link;} } else { temp=temp->link;} i++;//计算次数 } for(;i>0;i--){ temp=first;for(int j=0;j { if(temp->avelink->ave){ cout<<“small!”< if(temp==first)//说明是第一个结点 { first=first->link;// p=temp;// temp=temp->link;temp->link=temp->link->link;first->link=temp;before=first;} else//不是第一个结点 { before->link=temp->link;temp->link=temp->link->link;before->link->link=temp;before=before->link;} } else { temp=temp->link;} } } } /* bool IsSorted(Node* first){ for(;first;first=first->link)if(first->avelink->ave)return false;return true;}*/ void StudentScore::PrintList()//打印链表程序 { cout<<“The list contains:”< Node* temp=first;for(;temp;temp=temp->link){ cout void StudentScore::ClearList()//清除链表 { Node* p=new Node;while(first){ p=first->link;删除 first;first=p;} } //读函数 void StudentScore::ReadInfo(int k)//读第k个文件的信息存入链表 { // int wordLength;//记录子段长度 int _number;//学号 char* _class_0=new char[21];//班级 char* _name=new char[9];//姓名 float _elec;//电子技术成绩 float _c_prog;//C程序设计成绩 float _media;//多媒体技术成绩 float _eng;//大学英语成绩 float _math;//高等数学成绩 float _sport;//大学体育成绩 float _polity;//马克思主义政治经济学成绩 float _ave;//平均成绩 int _order;//名次 Node *p,*r=NULL;first=NULL;ifstream Infile(fileName[k].c_str());if(!Infile){ cout<<“file is not present!”< return;} Infile>>RecordLength;cout< for(int i=0;i { Infile>>_class_0;//班级 // cout<<_class_0;Infile>>_number;Infile>>_name;//姓名 Infile>>_elec;Infile>>_c_prog;Infile>>_media;Infile>>_eng;Infile>>_math;Infile>>_sport;Infile>>_polity;Infile>>_ave;Infile>>_order;_ave=(_elec+_c_prog+_media+_eng+_math+_sport+_polity)/7;//求得平均成绩 //写一个返回排名的程序 _order=GetOrder(first,_ave); p=new Node(_number,_class_0,_name,_elec, _c_prog,_media,_eng,_math,_sport,_polity, _ave,_order,NULL);//建立一个新的结点储存信息 if(first!=NULL)r->link=p;else first=p;r=p;} } void StudentScore::Save(){ string tempName;cout<<“请输入将要保存的文件名:”< //要判断是否跟现有文件重名 cin>>tempName;ofstream savefile(tempName.c_str());//要做一个转换 Node* temp=first;savefile< for(;temp;temp=temp->link){ savefile ifstream Readfileinfo(“FileRecord.txt”);Readfileinfo>>fileNum;for(int i=0;i Readfileinfo>>fileName[i];Readfileinfo.close();fileNum++;fileName[i]=tempName;//修改文件表信息 ofstream changefile(“FileRecord.txt”);changefile< for(i=0;i changefile< changefile.close();} void StudentScore::Menu(){ cout<<“请您选择数据的读入方式:”< cout<<“(1)重新手动建立一份新的数据表”< cout<<“(2)从文件中读入数据”< cout<<“请选择:”;cin>>choice;if(choice==1){ BuildList();} if(choice==2){ cout<<“当前有如下文件,请选择读入文件:”< ifstream fileRecord(“fileRecord.txt”);if(!fileRecord){ cout<<“fileRecord is not present!”< return;} fileRecord>>fileNum;cout<<“当前有”< for(int i=0;i { fileRecord>>fileName[i];cout< cin>>fileLoc;ReadInfo(fileLoc-1);PrintList(); } cout<<“请选择您需要的操作:”< cout<<“(1)统计学生各科成绩”< cout<<“(2)删除某个学生成绩记录”< cout<<“(3)增加某个学生成绩记录”< cout<<“(4)在链表中为所有学生成绩记录排序”< cin>>operChoice;if(operChoice==1)Statistic();if(operChoice==2)删除();if(operChoice==3)Add();if(operChoice==4)Sort();Save();ClearList();} int main(){ cout<<“//////////////////////////////////”< cout<<“欢迎使用学生成绩管理系统!”< cout<<“//////////////////////////////////”< cout< cout< StudentScore s;s.Menu();return 0;} “成绩管理系统”课程设计指导书 课题名称:学生成绩管理系统 设计目标:按照软件工程的规范,以SQL Server或Oracle为后台数据库,以Visual C++、Delphi等为前端开发工具,设计并实现一个能模拟高等学校学生成绩管理的系统。 需求描述: 学生成绩管理系统中: 1.系统用户 系统的用户是学校的学生、教师和管理员。学生使用本系统查询自己的成绩。教师使用本系统录入和查询自己所授课程的考试成绩。教学管理员可以查询所有课程成绩,并使用本系统进行成绩的统计和生成报表。 2.系统功能 (1)成绩录入: 教师可以查询自己本学期所授课程,并录入学生的考试成绩。录入过 程中,可以暂存已录入的成绩,当录入完成后提交。 (2)成绩维护: 教师在提交前,可以修改已录入或暂存的学生成绩;但提交后,则只 能查询不能再进行任何修改。 教学管理员可以清除教师已提交的成绩。 (3)成绩查询: 教师、教学管理员可以查询学生考试成绩。学生只允许查询自己的考 试成绩,教师只允许查询自己所授课程的成绩。 (4)成绩统计: 教学管理员可以按课程、按学生、按班级等进行成绩统计。 教学管理员根据核算出的总评成绩统计处于优、良、中、及格、不及 格的学生人数以及占总人数的百分比。其中100-90为优,89-80为良,79-70为中,69-60为及格,60分以下为不及格。 按要求输出成绩在优、良、中、及格、不及格各区间的学生学号。 结果形式: 提交课程设计报告、源程序和可演示的软件 课程设计报告要求:详见课程设计模板 课程设计参考思路: (1)熟悉数据库和开发工具,掌握开发工具与本地数据库的连接方法。 (2)理解系统的信息需求,进行合理的数据库设计,建立各数据库表。 (3)理解系统的功能需求,设计应用软件。结合Delphi 或VC++进行系统界面 (窗体、菜单以及相应控制按钮)的设计、连接与操纵数据库方案的设计,编写程序。 (4)系统运行、调试并完善。 (5)撰写设计报告。 《数据结构》 课程设计报告书 一.课程设计题目 图书借阅管理系统 二.课程设计内容 实现图书管理信息系统的设计 (一)管理员功能: ①登录:输入管理员密码,若密码错误则不得执行管理员操作。 ②添加新书:增加新的图书资料,同时需检查新书的图书编号是否已存在于原图书资料中,若已存在则应取消添加或提示重新输入。 ③修改图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许修改,否则提示 无该图书信息。 ④删除图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许删除,否则提示无该图书信息。删除对象包括该图书资料以及“图书状态”和“借阅人”中与此书相关的所有记录。 ⑤查找图书: A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 ⑥查看全部图书:显示所有图书资料,包括书号、书名、作者、状态和借阅人等信息。 ⑦修改读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,允许修改,否则提示无该读者信息。 ⑧删除读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,允许删除,否则提示无该读者信息。删除对象包括该读者姓名、班级、电话以及“图书状态”和“借阅人”中与此人相关的所有记录。 ⑨查看所有读者:显示所有读者资料,包括姓名、班级、电话等信息。 (二)读者功能: ①登录:输入读者姓名,若未经注册则不得进入读者服务界面。②注册:新用户经注册方可登录系统并使用读者服务功能。③借书: A.输入所需图书编号,判断该编号是否存在,若不存在则提示重新输入。 B.若所输入图书编号存在,则判断该书籍是否已被借出,若已借则不允许执行借书操作。 C.若所输入图书未借,则提示输入读者姓名,判断所输入读者姓名是否存在,若不存在则提示重新输入。D.若读者姓名存在,则允许执行借书操作。 E.借书处理包括在“图书状态”中加上“已借”标记。④还书: A.输入所借书编号,判断该编号是否存在,若不存在则提示重新输入。B.判断该书是否已借出,若未借则不允许执行还书操作。C.借书处理包括在“图书状态”中加上“未借”标记。⑤查询图书: A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。 ⑥查看借阅情况:输入读者姓名,若该姓名不存在则提示重新输入,若该姓名存在则显示该读者借阅信息。 三.算法设计 1.流程图(部分示例) ①管理员登录 ②读者登录 ③读者借阅图书 ④管理员或读者按书名查找图书 2.代码实现 #include #include //将字符串BookFile替换原文件中的宏名称book #define ReaderFile “reader.txt” using namespace std;//**********读者结构体,用于存放读者基本信息********** class Reader { private: char rname[10]; char rclass[10]; char rtel[10];public: Reader()//构造函数,实现数据初始化 {strcpy(rname,“");strcpy(rclass,”“);strcpy(rtel,”“);} //初始化 void set_rname(char *rn)//设置读者姓名 {strcpy(rname,rn);} //将rn的字符复制给rname char * get_rname()//获得读者姓名 {return rname;} //返回rname的值 void set_rclass(char *rc)//设置班级 {strcpy(rclass,rc);} char *get_rclass() //获得班级 {return rclass;} void set_rtel(char *rt) //设置电话 {strcpy(rtel,rt);} char *get_rtel() //获得电话 {return rtel;} void copy(Reader m)//读者Reader结构体copy函数 {strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };//*********读者管理结构体,实现对读者用户的管理********* class ReaderManage { Reader readers[50];//定义读者结构体数组对象,最多50位 int length; void readFile() //读取读者文件函数 { ifstream fread;//定义输入文件流对象fread length=0; //计数 if(!fread) {cout<<”读取磁盘文件失败!“< fread.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开 int i=0; while((fread.read((char *)&readers[i],sizeof(Reader))))//计算并返回所占字节数 i++; length=i; fread.close();//关闭磁盘文件 } void saveFile()//保存读者文件 { ofstream fwrite; //定义输出文件流对象fwrite if(!fwrite) {cout<<”文件保存失败!n“;exit(1);} fwrite.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开 fwrite.write((char *)readers,length*sizeof(Reader));//计算并返回所占字节数 fwrite.close();//关闭磁盘文件 } public: ReaderManage()//构造函数,读取读者文件 {readFile();} ~ReaderManage()//析构函数,保存读者文件 {saveFile();} void add_reader(Reader r)//添加读者用户函数 { if(length>=50) {cout<<”对不起,注册人数已满!n“;return;} readers[length].copy(r);//调用读者结构体copy函数 length++;} int search(char *rn)//按姓名查找读者函数 { for(int i=0;i if(strcmp(readers[i].get_rname(),rn)==0)//判断是否相等 return i; return-1; } bool revise(Reader reader,int i)//修改读者资料函数 { readers[i].copy(reader);//调用读者结构体cpoy函数 return true;} void delete_reader(int index)//删除读者函数 { for(int i=index;i readers[i].copy(readers[i+1]);//用后面的地址覆盖前面的地址 length--;} bool log_reader(Reader r)//登录时判断读者用户是否存在函数,相当于遍历 { for(int i=0;i if(strcmp(readers[i].get_rname(),r.get_rname())==0) return true; return false; } void reg_reader()//注册用户函数 { char n[10]; //姓名name char c[10]; //班级class char t[10]; //电话tel Reader reader; cout<<”nt请输入您的姓名:“; cin>>n; cout<<”nt请输入您的所在班级:“; cin>>c; cout<<”nt请输入您的联系电话:“; cin>>t; reader.set_rname(n);//调用读者结构体设置读者姓名函数 reader.set_rclass(c);//调用读者结构体设置读者班级函数 reader.set_rtel(t);//调用读者结构体设置联系电话函数 add_reader(reader);//调用读者结构体添加读者函数 cout<<”nt注册成功!“;} void show_reader()//不带参的显示读者信息函数 { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆读★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班级ttt电话n“; for(int i=0;i { cout< cout<<”ttt“< cout<<”ttt“< } } void show_reader(int i)//带参的显示读者信息函数 { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆读★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班级ttt电话n“; cout< cout<<”ttt“< cout<<”ttt“< } }; //********书籍结构体,用于存放书籍基本信息******** class Book { private: char bnum[10]; //书号 char bname[20]; //书名 char bauthor[10]; //作者 char rname[10]; //借阅人 public: int tag; //状态标记判断指标(已借/在架)Book() //构造函数初始化信息 {strcpy(bnum,”“);strcpy(bname,”“);strcpy(bauthor,”“);strcpy(rname,”“);tag=0;} void set_bnum(char *no) //设置书号 {strcpy(bnum,no);} //把字符串no中的字符复制到字符串bnum中 char *get_bnum() //获得书号 { return bnum;} //返回值为bnum void set_bname(char *n) //设置书名 {strcpy(bname,n);} char *get_bname() //获得书名 {return bname;} void set_bauthor(char *a) //设置作者 {strcpy(bauthor,a);} char * get_bauthor() //获得作者姓名 {return bauthor;} void set_tag(int t) //状态设置 {tag=t;} void set_rname(char *rn) //设置借阅人 {strcpy(rname,rn);} char *get_rname() //获得借阅人姓名 {return rname;} void show_tag() //显示图书状态 { if(tag==1) {cout<<”已借“;} else {cout<<”在架“;} } void copy(Book m) //Book结构体copy函数 { strcpy(bnum,m.get_bnum()); //将获得书号函数里的返回值里的字符复制到bnum strcpy(bname,m.get_bname()); strcpy(bauthor,m.get_bauthor()); tag=0; } };//**********书籍管理结构体,实现管理书籍功能********** class BookManage { private: Book books[100]; //定义Book书籍结构体数组对象,最大容量100本 int length; void saveFile() //保存书籍文件 { ofstream fwrite;//定义输出文件流ofstream结构体对象fwrite if(!fwrite) {cout<<”文件保存失败!n“;exit(1); } fwrite.open(BookFile,ios::binary);//使文件流与文件建立关联,以二进制方式打开 fwrite.write((char *)books,length*sizeof(Book));//计算并返回所占字节数 fwrite.close(); //关闭磁盘文件 } void readFile() //读取书籍文件 { ifstream fread;//定义输入文件流对象fread length=0; if(!fread) {cout<<”文件读取失败!“< Book temp; //定义书籍结构体临时对象temp int i=0; fread.open(BookFile ,ios::binary);//使文件流与文件建立关联,以二进制方式打开 while((fread.read((char *)&books[i],sizeof(Book)))) i++; //每读完一次,指针后移一位,直到不能读出正确结果为止 length=i; fread.close();} public: BookManage() //构造函数,读取磁盘文件 { length=0; //从头读起,计数,最大100 readFile(); //调用读取文件函数 } ~BookManage() //析构函数,保存磁盘文件 { saveFile(); //调用保存文件函数 } bool add(Book book) //添加图书资料 { if(length>=100) { cout<<”对不起,储存已满,您无法继续添加!n“; return-1; } else { books[length].copy(book);//调用书籍结构体copy函数 length++; return(length-1); } } int bnu_search(char *bnu) //按书号查找书籍 { for(int i=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比较,判断是否相等 return i; return-1; } int bna_search(char *bna) //按书名查找书籍 { for(int i=0;i if(strcmp(books[i].get_bname(),bna)==0)//判断 return i; return-1; } int bau_search(char *bau)//按作者查找书籍 { for(int i=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判断 return i; return-1; } int rn_search(char *rn)//按借阅人查找书籍 { for(int i=0;i if(strcmp(books[i].get_rname(),rn)==0)//判断 return i; return-1; } void revise(Book book,int i)//带参的修改书籍函数 {books[i].copy(book);} //调用Book结构体copy函数 void deleteBook(int index)//带参的删除书籍资料函数 { for(int i=index;i books[i].copy(books[i+1]);//用后面的地址将当前的地址覆盖 length--; } void show_book()//不带参的显示书籍函数 { cout<<” ☆☆☆☆☆☆☆☆☆☆☆书★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”书号“; cout.width(10); cout<<”书名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”状态“; cout.width(25); cout<<”借阅人n“; for(int i=0;i { cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } } void show_book(int i)//带参的显示书籍函数 { cout<<” ☆☆☆☆☆☆☆☆☆☆☆书★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”书号“; cout.width(10); cout<<”书名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”状态“; cout.width(25); cout<<”借阅人n“; cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } void br_book()//读者借、还书功能函数 { ReaderManage reader; int choi;//选择 int a; //图书状态指标(1已借2在架) char sh[10];//需要还书的书号 char dz[10];//读者姓名 cin>>sh; int index=bnu_search(sh);//定义一个变量等于查找到的书号 if(index>=0) { if(books[index].tag==1)//已借 a=1; if(books[index].tag==0)//在架 a=2; switch(a) { case 1: cout<<”nt该书目前状态为<已借出>n“; cout<<”nt请选择您需要的服务:1:还书 0:返回n“; cin>>choi; cin.ignore();//清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 if(choi!=1&&choi!=0) { cout<<”nt操作有误,请重新选择(0/1)!n“; return; } else if(choi==1) { cout<<”nt请输入您的姓名:“; cin>>dz; cin.ignore(); int index1=reader.search(dz); if(index1==-1) { cout<<”nt对不起,系统无该读者记录,新用户请先注册!“; return; } else { strcpy(dz,”“);//将读者姓名已空白代替 books[index].set_rname(dz);//借阅人一项变为空白 books[index].set_tag(0);//图书状态变为在架 cout<<”nt还书成功!“< } }break; case 2: cout<<”nt该书目前状态为<在馆>n“; cout<<”nt请您需要的服务:1:借书 0:返回n“; cin>>choi; cin.ignore(); if(choi!=1&&choi!=0) { cout<<”nt操作有误,请重新选择(0/1)!n“; return; } else if(choi==1) { cout<<”nt请输入您的姓名:“; cin>>dz; int index1=reader.search(dz); if(index1==-1) { cout<<”nt对不起,系统无改读者记录,新用户请先注册!“; return; } else { books[index].set_rname(dz); books[index].set_tag(1); cout<<”nt借书成功!“< } }break; } } else { cout<<”nt对不起,系统无该书记录!“;} } bool in(int i)//判断图书是否在架函数 { if(books[i].tag==1) return false; return true; } };//**********菜单结构体,实现界面引导********** class Menu { BookManage bm; //定义书籍管理结构体对象bm ReaderManage rm; //定义读者管理结构体对象rm Reader r; //定义读者结构体对象r private: int choice; //菜单序号选择 int key; //管理员密码 public: void header() //页眉 { system(”color fd“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 图 书 借 阅 管 理 系 统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“;} void log_menu() //主界面登录菜单 { system(”color fd“); header(); cout<<”nttt< 请 选 择 登 录 身 份 >n“; cout<<”ntttt1: 管理员nntttt2: 读 者nntttt0: 退 出nt您的选择是: “;choice: cin>>choice; cin.ignore(); //清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 switch(choice) { case 1: log_admin(); //管理员登录,需密码验证 break; case 2: reader_lr(); //读者登录或注册 break; case 0: exit(1); //退出系统 break; default: cout<<”nt您的操作有误,请重新选择(0→2): “; goto choice; } } void admin_menu() //管理员管理菜单 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 系★统★管★理★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 添加新的图书资料 2: 修改已有图书资料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 删除已有图书资料 4: 查找已有图书资料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 查看所有图书资料 6: 修改读者用户信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 7: 删除读者用户信息 8: 查看所有读者信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 9: 返回系统登录界面 0: 退出图书管理系统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt请选择您需要的服务序号: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: //添加图书 addBook(); bm.~BookManage(); break; case 2: //修改图书 reviseBook(); bm.~BookManage(); break; case 3: //删除图书 delBook(); bm.~BookManage(); break; case 4: //查找图书 absearch_menu(); break; case 5: //查看全部图书 bm.show_book(); cout<<”nt显示完毕!“; system(”pause“); admin_menu(); break; case 6: //修改读者 reviseReader(); rm.~ReaderManage(); break; case 7: //删除读者 delReader(); rm.~ReaderManage(); break; case 8: //查看所有读者 rm.show_reader(); cout<<”nt显示完毕!“; system(”pause“); admin_menu(); break; case 9: //返回系统登录界面 system(”cls“); log_menu(); case 0: //退出系统 exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→7): “; goto choice; } } void reader_menu() //读者服务菜单 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 读★者★服★务★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 借 阅 图 书 2: 归 还 图 书 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 查 找 图 书 4: 借 阅 情 况 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 返 上 一 级 0: 退 出 系 统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt请选择您需要的服务序号: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: cout<<”nt请输入您欲借阅的图书书号: “; bm.br_book(); bm.~BookManage(); break; case 2: cout<<”nt请输入您欲归还的图书书号: “; bm.br_book(); bm.~BookManage(); break; case 3: bsearch_menu(); break; case 4: rn_search(); break; case 5: system(”cls“); reader_lr(); break; case 0: exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→5): goto choice; } } void bsearch_menu() //读者查找书籍菜单 { system(“color f2”); cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆ 书★籍★查★找★界★面 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 1: 按 书号查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 2: 按 书名查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 3: 按 作者查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 4: 返 回 上 级 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 0: 退 出 系 统 ☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”; int bsc;//book search choice cout<<“nt请输入您需要的服务序号: ”; cin>>bsc; cin.ignore(); switch(bsc){ case 1: bnu_search(); break; case 2: bna_search(); “; break; case 3: bau_search(); break; case 4: reader_menu(); break; case 5: exit(1); default: cout<<”nt操作有误,请重新选择<0→4>“; break; } } void absearch_menu() //管理员查找书籍菜单 { system(”color f2“); cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 书★籍★查★找★界★面 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 1: 按 书号查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 2: 按 书名查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 3: 按 作者查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 4: 返 回 上 级 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 0: 退 出 系 统 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; int bsc;//book search choice cout<<”nt请输入您需要的服务序号: “; cin>>bsc; cin.ignore(); switch(bsc) { case 1: bnu_search(); break; case 2: bna_search(); break; case 3: bau_search(); break; case 4: admin_menu(); break; case 5: exit(1); default: cout<<”nt操作有误,请重新选择<0→4>“; break; } } void reader_lr()//读者登录或注册菜单 { system(”cls“); header(); system(”color f1“); cout<<”nttt< 读 者 登 录 界 面 >n“; cout<<”nttt 1: 登 录t2: 注 册nnttt 3: 返 回t0: 退 出nt您的选择是: “; int rlc;//reader login choice choice: cin>>rlc; cin.ignore(); switch(rlc) { case 1: //已注册读者登录 cout<<”nt请输入您的姓名: “; char rn[10];//reader name cin>>rn; r.set_rname(rn); if(rm.log_reader(r)) { cout<<”nt登录成功!“; system(”pause“); reader_menu(); } else cout<<”nt登录失败!新用户请先注册!“; system(”pause“); reader_lr(); break; case 2: //新用户注册 rm.reg_reader(); rm.~ReaderManage(); system(”pause“); reader_lr(); break; case 3: system(”cls“); log_menu(); case 0: exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→2): goto choice; } } void log_admin() //管理员登录 { cout<<“nt请输入管理员密码:”; int key; cin>>key; if(key==14125) { cout<<“nt登录成功!nnt”; system(“pause”); admin_menu(); //管理员操作菜单 } else {cout<<“nt登录失败!原因是密码错误!n”; cout<<“nt请选择 <1:返回上一级菜单 0:退出系统> cin>>choice; cin.ignore(); switch(choice) ”;“; { case 1: system(”cls“); log_menu(); break; case 0: exit(1); break; default: cout<<”nt操作有误,请重新选择(0/1)“; } } } void rn_search() //按书号查找函数 { char rn[10];//reader name cout<<”nt请输入您的姓名:“; cin>>rn; int index=bm.rn_search(rn); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无您的借阅记录!“; cout<<”nt“; system(”pause“); reader_menu(); } void bnu_search() //按书号查找函数 { char bnu[10]; cout<<”nt请输入您要查找的书号:“; cin>>bnu; int index=bm.bnu_search(bnu); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bna_search() //按书名查找函数 { cout<<”nt请输入您要查找的书名:“< char bna[20]; cin>>bna; int index=bm.bna_search(bna); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bau_search() //按作者查找函数 { cout<<”nt请输入您要查找的作者:“< char bau[10]; cin>>bau; int index=bm.bau_search(bau); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void addBook() //新增书籍函数 { char numb[10]; //书号 char nameb[20]; //书名 char authorb[10];//作者 Book book; //书籍结构体对象book int tag1;input1:cout<<”nt请输入新书书号:“; cin>>numb; int index=bm.bnu_search(numb); if(index==-1) { cout<<”nt系统目前尚无该书记录,您可以继续操作!n“; cout<<”nt请输入新书书名:“; cin>>nameb; cout<<”nt请输入新书作者:“; cin>>authorb; tag1=0; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); book.set_tag(tag1); bm.add(book); cout<<”nt恭喜您!新书资料录入成功!“; } else { cout<<”nt对不起,该书号纪录已存在!请重新输入!“; goto input1; } system(”pause“); admin_menu();} void reviseBook() //修改书籍函数 { char numb[10]; char nameb[20]; char authorb[10]; Book book; int index=-1;input2: cout<<”nt请输入您要修改书籍的书号:“; cin>>numb; index=bm.bnu_search(numb); if(index==-1) { cout<<”nt对不起,您输入的书号不存在,请重新输入!“< goto input2; return; } bool sta=bm.in(index);//判断是否在馆 if(sta) { cout<<”nt该书目前处于<在架>状态,您可以继续操作!“; cout<<”nt请输入更改后的书名:“; cin>>nameb; cout<<”nt请输入更改后的作者:“; cin>>authorb; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); bm.revise(book,index); cout<<”nt恭喜您!书籍资料修改成功!“;} else cout<<”nt该书已被借出,请于读者归还后再进行相关操作!“< system(”pause“); admin_menu(); } void delBook() //删除书籍函数 { char numb[10]; cout<<”nt请输入您要删除书籍的书号:“; cin>>numb; int index=bm.bnu_search(numb); if(index>=0) { cout<<”nt您确定要删除该书记录吗(y/n) “; char y; cin>>y; if(y=='y'||y=='Y') { bm.deleteBook(index); cout<<”nt删除成功!“; } else cout<<”nt删除取消!“; } else cout<<”nt对不起,系统没有该图书记录!“; system(”pause“); admin_menu(); } void reviseReader()//修改读者用户函数 { char namer[10]; Reader reader;get1: cout<<”nt请输入你要修改读者用户的姓名: “; cin>>namer; int index=rm.search(namer); if(index==-1) { cout<<”nt对不起,系统无改读者记录,重新输入请按1,返回请按0: int a; cin>>a;get2: cin.ignore(); switch(a) { case 1: goto get1; break; case 0: system(“pause”); admin_menu(); break; default: cout<<“nt您的操作有误,请重新选择(0/1): ”; goto get2; } return; } “; else { char namer[10]; char classr[10]; char telr[10]; Reader reader; cout<<”nt请输入更改后的读者姓名:“; cin>>namer; cout<<”nt请输入更改后的班级名称:“; cin>>classr; cout<<”nt请输入更改后的联系电话:“; cin>>telr; reader.set_rname(namer); reader.set_rclass(classr); reader.set_rtel(telr); cout<<”nt是否真的修改该记录(y/n?):“; char y; cin>>y; if(y=='y'||y=='Y') { rm.revise(reader,index); cout<<”nt修改成功!n“; } else cout<<”nt操作取消!n“; } system(”pause“); admin_menu(); } void delReader() //删除读者用户函数 { cout<<”nt请输入您要删除的读者用户的姓名:“< char namer[10]; cin>>namer; int index=rm.search(namer); if(index>=0) { cout<<”nt是否真的删除该记录(y/n?): “; char y; cin>>y; if(y=='y'||y=='Y') { rm.delete_reader(index); cout<<”nt删除成功!n“; } else cout<<”nt操作取消!n“; } else cout<<”nt对不起,系统尚无该读者记录!“; system(”pause“); admin_menu(); } };//********主函数******** int main(){ system(”color fd“);Menu menu;//定义菜单结构体对象menu cout<<”ttt 文计091-1 庞丽萍 200990514125 “;cout<<”ttt 当前日期:2011-6-22 星期三“;cout<<”ttt 当前时间:08:00 “;cout<<”nttt ★ 欢 “;cout<<”★ 迎 “; } cout<<”★ 进 “;cout<<”★ 入 ★nn";menu.log_menu();return 0;四.程序正确性验证 1主页面 2.管理员登陆页面 3.图书添加 五.课程设计过程中出现的问题、原因及解决方法 1.用户登录密码时,不能使用暗码来保护密码。(未解决成功)2.每个界面都能退出到主页面,而不是直接跳出系统。(以解决)3.书名字长太多影响书籍、作者、数量等之间的一一对应关系。(为解决成功) 六.课程设计的主要收获 通过这几天学习设计图书信息管理系统,认识到一切看似简单的事情只有自己动手做,明白了其中的原理才会更好的把它变成自己的东西。图书管理系统主要用到了文件的输入输出,以及利用简单的顺序查找知识,加深了对数据结构的理解与应用。对于这次的课程设计,首先,许多知识不仅仅只是课本上的,需要我们自己去图书馆或网上收集资料。其次,编程过程终遇到各种错误,需要我们耐心分析,讨论,最后得出正确结果。第三,程序无错,进行调试,然后进行加工修改优化。 七.对今后课程设计的建议 希望老师可以分小组做课程设计,题目可以相应的增大难度。分组可以锻炼团对合作能力,队员可以相互讨论解决问题,彼此能够激发更多的思想,做出更完善的作品,同时也防止了互相拷贝的情况,让每个同学都积极的参与到设计中,而不是坐享其成。 学生成绩管理系统 数据结构课程设计 一、课程设计的内容与目的 利用所学数据结构理论知识完成“学生成绩管理系统”的设计。 通过课程设计提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。具体包括: 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 二、课程设计的要求与数据 1.系统功能需求分析: 1、输入功能:可以输入40位同学信息 2、增加功能,能增加学生的信息 3、浏览功能:完成对全部学生记录浏览 4、查询功能:采用散列查找完成按学号查找学生记录 5、排序功能:采用直接选择排序,将学生平均成绩从低到高排序输出 6、删除功能:可以删除学生信息 7、修改功能:可以对学生信息的各项信息进行修改 8、插入功能:完成数据的插入 9、统计功能:统计出各分数段学生人数(60分以下,60~70,71~80,...) 2.存储结构设计分析: 3.学生的信息:学生的信息采用结构体类型定义,每个元素表示一个学生的信息,包括学号,姓名及数据结构平均成绩4个数据项: (1)struct student {char num[11];char name[20];int score[8];float ave;}stu[N];(2)散列表的结点类型定义: typedef struct node {unsigned long int key;struct node * link;}HNode;3.源程序如下: #include第二篇:课程设计--成绩管理系统
第三篇:图书管理系统 数据结构 课程设计
第四篇:学生成绩管理数据结构课程设计报告