数据结构课程设计——成绩管理系统(共五则范文)

时间:2019-05-12 16:53:35下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《数据结构课程设计——成绩管理系统》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《数据结构课程设计——成绩管理系统》。

第一篇:数据结构课程设计——成绩管理系统

数据结构 课程设计

(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

#include #include //文件流 #include #define BookFile “book.txt”

//将字符串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 #include #include /*控制学生记录的容量*/ #define N 40 #define PR printf(“nr%s %s %s %s %s %s %s %s %s %s %s ”,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4],stu[i].score[5],stu[i].score[6],stu[i].score[7],stu[i].score[8],stu[i].ave)struct student {char num[11];char name[20];int score[8];float ave;}stu[N];typedef struct node {unsigned long int key;struct node * link;}HNode;typedef struct{int key;/*排序码*/ float data;/*其他数据项*/}RecNode;/*全新保存函数*/ save(int n)/*保存函数,保存n个记录*/ {FILE *fp;int i;if((fp=fopen(“sc.txt”,“wb”))==NULL)/*以输出打开方式,在此前的记录被覆盖*/ {printf(“n不能打开文件n”);getch();return NULL;} for(i=0;i'9')/*判断学号是否为数字*/ {puts(“Input error!Only be made up of(0-9).Please reinput!n”);w1=1;break;} if(w1!=1)for(k=0;knn 1).学号 2.姓名 3).英语 4).数学n 5).C语言 6).管理学 7).信检 8).体育 9).近代史n 10).线性代数 11).all score 12).all data 13).cancel and back”);printf(“请选择: [ ]bb”);scanf(“%d”,&c);if(c>13||c<1){puts(“n选择错误!重新选择!”);/*判断选择是否错误,若是则重新选择性*/ getchar();/*当输入是字符时可以防止死循环*/ } } while(c>13||c<1);do {switch(c)/*选择要修改的项目*/ {case 1:no_input(i,n);break;/*调用学号输入函数*/ case 2:printf(“姓名:”);scanf(“%s”,stu[i].name);break;case 3:printf(“英语:”);scanf(“%d”,&stu[i].score[0]);break;case 4:printf(“数学:”);scanf(“%d”,&stu[i].score[1]);break;case 5:printf(“C语言:”);scanf(“%d”,&stu[i].score[2]);break;case 6:printf(“管理学:”);scanf(“%d”,&stu[i].score[3]);break;case 7:printf(“:信检”);scanf(“%d”,&stu[i].score[4]);break;case 8:printf(“体育:”);scanf(“%d”,&stu[i].score[5]);break;case 9:printf(“近代史:”);scanf(“%d”,&stu[i].score[6]);break;case 10:printf(“线性代数:”);scanf(“%d”,&stu[i].score[7]);break;case 11:score_input(i);break;/*调用分数输入函数*/ case 12:input(i);break;/*调用输入整条学生记录*/ case 13:teacher();/*直接返回教师介面*/ } if(c>2&&c<10)average(i);/*调用求平均值函数*/ puts(“nNow:n”);printf_face();/*调用显示数据结构项目函数*/ printf_one(i);/*修改后的记录让用户确认*/ printf(“n是否确定?nnt1).确定 2).重新修改 3).不保存返回 [ ]bb”);/*是否确定*/ scanf(“%d”,&w1);/*选择2则表示这次修改错误要重新修改*/ } while(w1==2);return(w1);/*返回控制值*/ } /****************输入模块****************/ enter()/*输入模块*/ {int i,n;printf(“输入学生总数(0-%d)?:”,N);scanf(“%d”,&n);/*要输入的记录个数*/ printf(“n现在输入数据nn”);for(i=0;ikey=k;p->link=NULL;t[i]=p;printf(“n inserted %lun ”,k);return(1);} else {p=t[i];while(p!=NULL)if(p->key==k){printf(“n retrieval %lun ”,k);return(0);} else if(p->link!=NULL)p=p->link;else{p->link=(HNode*)malloc(sizeof(HNode));p=p->link;p->key=k;p->link=NULL;printf(“n inserted %lun ”,k);return(1);getch();} } }

HNode *linksearch(HNode *t[],char k){/*在用拉链法处理冲突的散列表t中查找关键字为给定值k的记录*/ HNode *p;int i;i=h(k);if(t[i]==NULL)return(NULL);p=t[i];while(p!=NULL)if(p->key==k){printf(“%lun”,p->key);return(p);} else p=p->link;return(NULL);} search()/*查找模块*/ {int i,n,k,w1=1,w2,w3,w4;struct student s;n=load();do {do {k=-1;printf(“nn输入查找学号!NO.:”);scanf(“%s”,s.num);/*输入要修改的数据的学号*/ printf_face();/*调用显示数据结构项目函数*/ for(i=0;ij;i--)if(stu[i].ave>stu[i-1].ave){s=stu[i-1];stu[i-1]=stu[i];stu[i]=s;} save(n+1);printf_back();} else if(c!=2)teacher();} while(c==2);} /****************排序模块(按平均成绩)****************/ void sift(RecNode r[],int t,int w)/*用筛选法调整堆*/ {int i,j;RecNode x;i=t;x=r[i];j=2*i+1;while(j<=w){if((jr[j+1].key))j++;if(x.key>r[j].key){r[i]=r[j];i=j;j=2*j+1;} else break;} r[i]=x;}

void heapsort(RecNode r[],int n)/*堆排序*/ {int i;RecNode x;for(i=n/2-1;i>=0;i--)sift(r,i,n-1);for(i=n-1;i>0;i--){x=r[0];r[0]=r[i];r[i]=x;sift(r,0,i-1);} } /****************排序模块(按平均成绩)****************/ order()/*排序模块(按平均成绩)*/ {int i,j,k,n;struct student s;n=load();for(i=0;i

/*****************统计模块*******************/ void fenduantongji(){ int k,u,n,i,j,w1=1,w2;int a,b,c,d,e;a=0;b=0;c=0;d=0;e=0;printf(“ 1.英语 2.数学 3.C语言 4.管理学 5.信检 6.体育 7.近代史 8.线性代数 9.平均分n”);printf(“请输入要统计的科目:”);scanf(“%d”,&u);if(u<=8){n=u;for(i=0;i=90)a=a+1;else if(k<90&&k>=80)b=b+1;else if(k<80&&k>=70)c=c+1;else if(k<70&&k>=60)d=d+1;else if(k<60)e=e+1;}}} else {n=u;for(i=0;i=90)a=a+1;else if(k<90&&k>=80)b=b+1;else if(k<80&&k>=70)c=c+1;else if(k<70&&k>=60)d=d+1;else if(k<60)e=e+1;} } } printf(“学生成绩在 90~100 间有:n %dn”,a);printf(“学生成绩在 80~89 间有 :n %dn”,b);printf(“学生成绩在 70~79 间有 :n %dn”,c);printf(“学生成绩在 60~69 间有 :n %dn”,d);printf(“低于60的有:n %dn”,e);printf(“n是否继续?nnt1).是 2).否 [ ]bb”);scanf(“%d”,&w1);

if(w1==1)fenduantongji(w1);else teacher();} /****************教师界面****************/ teacher()/*教师界面*/ {int n,w1;do {system(“cls”);/*清屏*/ puts(“tt*********************MENU*********************nn”);puts(“tttt1.输入新数据”);puts(“tttt2.添加数据”);puts(“tttt3.修改数据”);puts(“tttt4.删除数据”);puts(“tttt5.浏览全部”);puts(“tttt6.学号查询”);puts(“tttt7.插入数据”);puts(“tttt8.按平均分排序”);puts(“tttt9.分段统计”);puts(“tttt10.退出”);puts(“tttt11.返回主界面”);puts(“nntt**********************************************n”);printf(“请选择序号:(1-11): [ ]bb”);scanf(“%d”,&n);if(n<1||n>11)/*对选择的数字作判断*/ {w1=1;getchar();} else w1=0;} while(w1==1);/*选择功能*/ switch(n){case 1:enter();break;/*输入模块*/ case 2:add();break;/*追加模块*/ case 3:modify();break;/*修改模块*/ case 4:del();break;/*删除模块*/ case 5:browse();break;/*浏览模块*/ case 6:search();break;/*查找模块*/ case 7:insert();break;/*插入模块*/ case 8:order();break;/*排序模块*/ case 9:fenduantongji();break;/*统计模块*/

case 10:exit(0);/*退出*/ case 11:menu();/*返回主界面*/ getch();} } /****************密码函数****************/ distin()/*密码函数*/ { int f;char mima[]={“gdut09”};char mi[6];printf(“输入密码:”);scanf(“%s”,mi);if(strcmp(mima,mi)==0){ teacher();} else

{ printf(“密码错误!n”);printf(“nn请选择:nt1).目录 2).退出 [ ]bb”);scanf(“%d”,&f);switch(f){ case 1: menu();break;case 2: exit(0);break;} } } /****************学生界面****************/ st()/*学生界面*/ {int i,n,k,w1=1,w2,w3,w4;struct student s;n=load();do {system(“cls”);do {k=-1;printf(“nn请输入学号 NO.:”);scanf(“%s”,s.num);printf_face();for(i=0;i

case 1: distin();break;case 2: st();break;case 3: exit(0);break;} } }

/*****************主函数****************/ main(){menu();getch();}

三、实验结果和数据处理: 1.、运行该程序,初始界面为欢迎界面:

2、输入数字1,按enter后,然后输入密码gdut09,进入教师菜单:

3、教师界面:

4、输入1,选择输入功能,再输入3个学生信息:

5、输入1,浏览全部数据:

6、返回教师界面,输入3,进行修改:

7、返回教师界面,输入2,进行追加数据

8、返回教师界面,输入4,进行删除数据:

9、返回教师界面,输入5,进行浏览:

10、返回教师界面,输入6,进行查找:

11、返回教师界面,输入7,进行插入数据:

12、进入教师界面后,输入进行按平均成绩(从小到大)排序:

13、在教师界面输入9,完成分段统计功能:

14、返回主界面,输入2,进入学生界面,按学号进行查找学生成绩:

四、参考文献:

《数据结构 C语言》 严蔚敏 清华大学出版社

《c语言程序设计》 谭浩强 清华大学出版社 《数据结构》 高教出版社

《数据结构习题》 李春保 清华大学出版社 《数据结构习题》 严蔚敏 清华大学出版社 《c语言与数据结构》 王立柱 清华大学出版社

《数据结构(C语言篇)习题与解析)李春葆 清华大学出版社

五、总结:

通过这次的课程设计,做一个程序设计,真的不容易。很多都不懂得怎么去做,虽然最后做完了这个课程设计,但是有些并不能满足老师的要求,而且因为有很多不懂的地方,所以发了很多时间去看书及请教同学。虽然不能说这个程序是完全自己做的,但是我也有很认真的去寻找错误并修改。我觉得这次自己也有一点点进步的,当自己发现了错误,会修改了也是一种进步吧。看到自己进步,其实也挺欣慰的,至少努力没白费,还是学到了一点知识的。就像我知道了怎样返回某些函数。

开始的时候本来是想要用堆排序进行学生平均分排序,可是做了很久,又问同学,最后还是不会做,虽然在懂堆排序,却不会用。所以只好用直接选择排序。而在分段统计中,原来有很多错误,不明确。之后我跟同学就把它改成按科目及平均分来统计,可是看了很久,改了很多次,其他分数段的没有错误,但是在60分以下的统计却不能实现,不知道该怎样去改。

第五篇:数据结构课程设计—西文图书管理系统

数据结构课程设计报告

课程名称:数据结构课程设计

课设题目: 西文图书管理系统 教师姓名:

本科生姓名:

王瑞林

本科生学号:

20121002932

号:

191124

期:2014年6月20日

题号:十

题目:西文图书管理

1.需求分析

图书管理系统对象有两个,包括读者和管理员。

读者的需求:借书,还书,续借,查询当前所借书籍还书截至日期,查询借阅历史,修改登陆密码。其中借书可以根据书号和书名两种方式查询借阅。

管理员的需求:采编入库,清除库存,注册读者,删除读者,根据书号查询书籍,修改管理员用户名和密码。

2.设计

2.1设计思想

(1)数据与操作特性:

有搜索,插入,删除操作。而数据有:读者信息,书籍信息,读者借阅书籍历史信息,书籍读者借阅历史信息,读者当前所借书籍信息。(2)数据结构设计:

数据的逻辑结构有线性结构和树形结构。

根据书号和书名建立两个B-树,便于读者查询借阅,其中关键字设置为书籍指针,便于找到书籍 后直接进行修改书籍信息。

读者和书籍的信息从文件中读取,由于会不断注册和删除读者以及新增删除书籍,因此书籍和读者的信息采用单链表存储。

读者的借阅历史和书籍的读者历史,都采用数组的形式存储,为了节省存储空间,每个借阅历史数组最大空间为15。超过15个借阅历史,则删除最早的借阅历史。2.2设计表示(1)数据类型定义

typedef struct //日期结构体类型 { int year;//记录年

int month;//记录月

int day;//记录日 }Date;//记录借阅者所借书籍的信息结构体 typedef struct {

char bookID[15];//书号 char name[15];//书名 char writer[15];//作者 Date bordate;//借阅时间 Date backdate;//还书时间

int flag;//是否续借,续借为1.否则为0

}BookHistory;//记录借阅者当前所借书籍的信息结构体 typedef struct {

char bookID[15];//书号 char name[15];//书名 char writer[15];//作者 Date bordate;//借阅时间 Date lastdate;//最后还书期限

int flag;//是否续借,续借为1.否则为0

}BookRec;//记录书籍被借阅的读者记录 typedef struct { char readerID[15];//记录读者的借阅证号 char readername[15];//读者的名字

Date bor;//记录读者的借书日期

Date back;//记录读者的还书日期 int flag;//借阅者是否有续借迹象(flag取值0或者1)}ReaderHistory;//记录读者信息的结构体类型(允许读者同时借阅五本书,每本书支持续借一次)typedef struct { char readerID[12];//记录读者的借书证号,一般是学号

//记录书的信息的结构体类型 typedef struct { char bookID[15];//书号 char title[15];//记录书名

char writer[15];//记录著者

int currentnum;//书现存量

int totalnum;//书总存量

int bortimes;//被借的历史总次数 //B_LQueue *B_LQH;

ReaderHistory RH[15];//借书者记录,规定链式队列的最大节点个数为15,来节省空间 char name[15];//读者的名字 char password[16];//读者登陆密码 BookRec rec[5];//读者现在所借书籍 int hn;//总借阅数量 //R_LQueue *R_LQH;

BookHistory bh[15];//记录读者的借阅记录,规定链式队列的最大节点个数为15,来节省空间 int bn;//读者现在所借书籍数量,最大数量为5本

}Reader;}Book;//根据 书名为关键字的B-树的结构体类型

typedef struct Namenode //根据书名为关键字建立的B树 {

typedef struct///根据书名建立的B树的搜索结果 {

//根据书号为关键字的B-树的结构体类型

typedef struct IDnode //根据书号为关键字建立的B树 {

typedef struct///根据书号建立的B树的搜索结果 {

//从文件中读取书籍数据后存储在单链表里 typedef struct BookNode {

//从文件中读取学生数据后存储在单链表里 typedef struct ReaderNode { Book SLbook;struct BookNode *next;BTIDnode *pt;////指向找到的节点指针 int i;//所找关键字在节点里的位置 int tag;//查找成功值为1,查找失败值为0 int n;//记录结点中的关键字(即书号)个数

Book *key[MAXM];//key[0...n-1],Maxsize个关键字(即书号)域 struct IDnode *chd[MAXM];//ptr[0...n],MAXM个指向子结点的指针域 BTNamenode *pt;////指向找到的节点指针 int i;//所找关键字在节点里的位置 int tag;//查找成功值为1,查找失败值为0 int n;//记录结点中的关键字(即书号)个数

Book *key[MAXM];//key[0...n-1],Maxsize个关键字(即书名)域

struct Namenode *chd[MAXM];//ptr[0...n],MAXM个指向子结点的指针域

struct Namenode *par;//指向父结点的指针域

}BTNamenode;}NameResult;struct IDnode *par;//指向父结点的指针域

}BTIDnode;}IDResult;}BookSLNode;Reader SLreader;struct ReaderNode *next;}ReaderSLNode;2.3详细设计

(1)登陆界面login():有管理员和读者登陆,都必须输入密码和用户名。

(2)管理员登陆adminer_login():管理员需输入登录名和密码,为了安全登录,将输入密码错误次数限制在5次。其中管理员密码和用户名以及初始用户名和密码从管理员文件里读出赋值给全局变量。当输入正确时,管理员功能界面函数admin_menu();当密码输入错误达6次以上,将调用锁定系统函数lock_admin_menu(),将系统锁定,下次进入系统时将不再显示登陆界面,而是初始管理员登陆。

(3)管理员采编入库insert_stock():输入新书的信息,调用SearchBTree_ID()按照书号在B-树搜索书籍,如果没有找到,返回书籍插入的位置,然后调用插入函数InsertBTree_Name(),InsertBTree_ID(),分别将书籍按书名和书号插入到相应的树中,同时将书籍信息插入到书籍链表里调用ListInsert_Book();同时将全局变量书籍总数booknum加1。

(4)管理员清除库存deletestock():根据书号书名搜索到书籍,在B-树中删除书籍,同时在书籍信息链表里删除。并将书籍总数booknum减1。

(5)管理员读者模块adminer_reader():有删除读者和注册读者两个功能,删除读者,按读者的ID查找到,在读者信息链表里删除读者,读者总数readernum减1;注册读者,初始密码为读者ID后6位,同时读者总数readernum加1。

(6)管理员修改用户名和密码adminer_change_password():连续两次输入新密码,两次结果一样,修改成功。

(7)学生登陆student_login():输入密码成功,调用 stu_menu()功能界面。(8)学生借书borrow():有两种搜索所借书籍的方式,按书名搜索,按书号搜索,使用相应的B-树搜索功能。借书成功后,将书籍信息写到读者当前所借书籍里面。并将书籍当前存量减1.(9)学生还书back():进入还书界面,将显示出读者当前所借书籍,让读者选择归还书籍。归还后将书籍从读者当前所借书籍里删除,此书当前存量加1,并将书籍信息写到读者借阅历史里面。

(10)学生续借renew():显示当前所借书籍信息,读者选择续借书目,当书籍信息的续借标志为0时可以续借,否则 不能续借,续借成功,将对应的读者当前所借书籍的续借标志置为1.(11)学生查询最后还书期限deadline():进入之后显示当前所借书籍信息,里面包含最后还书期限。

(12)学生查询借阅历史history():显示读者信息里面的借阅历史。

(13)学生修改密码change_reader_password():两次新密码输入一致,修改成功。(14)锁定系统admin_lock(),锁定系统后登陆lock_admin_menu():全局变量m_lock,当其值为1时解锁,值为0时锁定。

(15)建立读者书籍链表readreader(),readbook():首先从文件中读取读者总数,采用for循环,将每个读者信息写到链表里,在循环中,读取读者的ID、姓名、密码,然后读取读者当前所借书籍,采用for循环,将所借书籍信息写到数组里面,依次读取所借书籍信息。之后读取读者历史所借书籍数量,当数量大于15时,使用for循环,循环15次,依次读取书籍信息;如果 数量小于等于 15,采用for循环,循环当前借阅历史书籍数量次,将书籍信息写道数组中。然后将每个读者插入到链表里。书籍链表类似读者链表的建立。

(16)B-树的搜索插入删除功能(以按书名建立的B-树为例);搜索,SearchBTree_ID(),搜索成功返回搜索到的位置,搜索失败,返回插入的位置。Search_Name()函数将在当前节点搜索到关键字的位置。

插入,InsertBTree_Name(),如果为空,调用NewRoot_name()函数,建立根节点。如果不为空,将调用Insert_Name()将插入到节点里,判断是否大于最大关键字个数,如果大于,调用Split_Name()进行分裂。删除,并非自己完成,参考网上代码。

(16)建立B-树newBT():按书名建立,使用B树搜索功能,没有找到,将根据返回的位置进行插入。按书号的类似。

(17)打印文件printftxt():分别将书籍和读者 信息写到文件里,同时将管理员信息也写道文件中。在每个退出系统的接口中都进行调用此函数,保证文件不丢失,同时更新文件信息。

3.调试分析

在进行调试时,有很多内存读写错误,问题的根本原因是在进行结构体赋值前,没有将结构体里面包含的结构体或者数组链表进行初始化,导致问题十分严重普遍。

4.用户手册

首先登陆时有两种登陆:读者和管理员。然后管理员登陆功能有采编入库,清除库存,读者模块,书籍查询,修改密码和用户名。读者登陆有借书,还书,续借,修改密码,查询借阅历史,查询截至日期。

管理员登陆用户名:123456,密码:123456 管理员初始用户名:20121002932,初始密码:167350 读者的ID和密码请到reader.txt文件中查询,文件格式见下面说明。文件的格式: 1.reader.txt:

其中第一行的数字“4”为当前读者总数,第二行为: ID 名字 密码 第三行的数字”0“为当前所借书籍数量,之后为所借书籍信息: 书号 名称 作者 借阅时间年 月 日 最后还书日期年 月 日 是否续借 第三行数字 “0”为历史所借书籍数量,之后为所借书籍信息: 书号 名称 作者 借阅时间年 月 日 还书日期年 月 日 是否续借 2.book.txt:

第一行数字”4“为当前书籍总数 第二行为书籍信息:

书号 书名 作者 现存量 总存量

第三行数字”0“为读者借阅历史,以《飞鸟集》为例:

ID

姓名

借阅时间年 月 日

还书时间年 月 日 是否续借 20121002932 王瑞林

114

17

5 17 1 3.adminer.txt:

第一行:管理员名称;

第二行:管理员登陆密码; 第三行:管理员初始用户名; 第四行:管理员初始密码;

第五行:锁定系统标志,此时为未锁定状态。

5.测试数据及测试结果

初始登陆界面:

管理员登陆界面:

采编入库:

清除库存: 读者模块:

删除读者:

此时删除读者后,读者文件中应该不存在该读者。书籍查询:

修改用户名和密码:

修改用户名:

修改密码:

修改用户名和密码后,退出系统后,查看adminer.txt文件,第一行和第二行为用户名和密码,将改变为4567890。读者登陆:

读者借书:

当读者借书成功之后退出系统,在reader.txt文件中对应读者的ID信息的缩进的第二级为读者当前所借书籍数量和所借书籍信息,在此之后可以看到读者现在所借书籍信息 读者还书:

读者还书后,在reader.txt文件中,缩进的第三级为读者历史借阅书籍数量和书籍信息,此时应该看到刚才还书的信息。

读者续借:

当读者还书成功后,对应的当前所借书籍的flag值为1.查询借阅历史:

查询截至日期: 修改登录密码:

当修改成功之后,reader.txt文件中对应读者的信息密码修改为当前密码。

6.致谢

感谢郭老师的指导,让我们在实践中提高了合理设计数据结构的能力,巩固了课堂所学。同时感谢王鑫学姐,帮助我们调试程序,并传输经验。

7.参考文献

《数据结构—使用C语言》第四版 朱站立编著 《C程序设计》第四版 谭浩强编著

下载数据结构课程设计——成绩管理系统(共五则范文)word格式文档
下载数据结构课程设计——成绩管理系统(共五则范文).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    数据结构课程设计—java通讯录管理系统

    import java.io.*; import java.util.*; public class LittleProgram { static boolean isDelete = true; static boolean isFind = true; public static void main(String......

    通讯录管理系统-数据结构课程设计报告

    信息科学与技术学院 程序设计基础课程设计报告 题目名称: 通信管理系统 学生姓名: 学 号: 专业班级: 指导教师: 2016年 12月 31日 目录 1.课程设计题目与要求 .......................

    数据结构课程设计-职工管理系统(精选五篇)

    目录 一、前言--------2 二、需求分析--3 三、概要设计--4 四、详细设计--5 五、调试分析--6 六、用户使用说明---------------------------7 七、测试结果--8 八、......

    数据结构课程设计-学生成绩名次表[精选合集]

    数据结构课程设计-学生成绩名次表 问题描述:建设一个年级(M个班)的学生参加某门课程的考试,每个班最多有N个学生,请输出各班的成绩名次表(M个)、以班级为单位的成绩名次表(1个)、以及......

    语言课程设计-学生成绩管理系统

    1、 课程设计的目的、任务 《汇编语言》课程设计对于巩固汇编语言理论知识,加强学生的实际动手能力和提高学生综合素质十分必要。课程设计的目的主要是通过程序设计方法和技......

    数据结构课程设计 飞机订票系统

    飞机订票系统 1. 需求分析描述要求编程解决的问题。以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定: (a) 输入的形式和输入值的范围;(b) 输出的形式;(c) 程......

    数据结构课程设计-停车场管理

    课 程 设 计 报 告 课程名称 数据 结构题目 停车场管理学生姓名 班级/学号 191103 一、 需求分析 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供 汽车进出。汽......

    2012数据结构课程设计

    数 据 结 构 课程设计报告 题 目: 一元多项式计算 专 业: 信息管理与信息系统 班 级: 2012级普本班 学 号: 201201011367 姓 名: 左帅帅 指导老师: 郝慎学 时 间: 一、课程设计题目......