摘要:本次课程设计任务是通过编写一个高校学籍管理系统,学习用Visual C++ 6.0开发简单的管理系统。采用Visual C++ 6.0软件为主要开发工具。 本系统主要完成对高校学生学籍信息的管理,包括学生信息的添加、修改、删除等。系统还可以完成对各类信息的浏览、查询、添加、删除、修改等功能。 由于我们还没有学习数据库,所以在有关大量学生信息存储时,此系统显得心有余而力不足。系统的核心是引用I/O流和文本处理来存储和修改学生信息,每一个动作都可能影响到其它的功能,还有数据的改变,当完成对数据的操作时系统会自动地完成数据的修改。
一 系统需求分析
1系统设计的目的与意义
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2 系统功能需求
(1)能够从屏幕上读取一个学生的信息并将信息存入到数据文件中。
(2)能够将指定的信息从文件中删除。
(3)能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。
(4)可以统计全部学生的总成绩,及其在班上的排名。
(5)能够统计各科的平均成绩及及格率。
(6)要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入。
(7)如果检索不到相应的信息应提示用户。
二 总体设计
1 系统功能分析
系统要能够对相应的数据进行很好的测试,系统的统计对每一科的总成绩,平均成绩,及格律都进行了统计;系统数据的录入 除可以手工录入外,还可以采用文件的录入;系统统计学生的基本信息较全面,包括学号,姓名,民族,政治面貌,身份证号,生日,性别,数学、英语、计算机的成绩;程序中查找运用了两种查找方式即学号查找和姓名查找。
2 系统功能模块划分与设计(系统功能模块图)
三 详细设计
1 类设计
类1:student
数据成员:编号,姓名,性别,籍贯,民族,生日,政治面貌,身份证,高等数学成绩,大学英语成绩,线性代数成绩
class student
{
protected:
int number; //学号
char name[20]; //姓名
char sex[6]; //性别
char place[20]; //籍贯
char nation[6]; //民族
char birth[20]; //出生日期
char party[10]; //政治面貌
char id[20]; //身份证号
float score[3]; //成绩
类2:school
成员函数
录入函数input():逐步输入学生信息;
修改函数 mend():按姓名或编号修改学生信息;
统计函数count():统计各科的总成绩,计算平均成绩,统计各科的及格率;
查找函数found():按学号或姓名查找学生的记录;
修改函数mend():修改指定学号学生成绩记录;
删除函数del():删除指定学号学生记录;
输出函数show():输出班级所有学生成绩记录;
class school
{
void input(); //录入函数
void mend(); //修改函数
void del(); //删除函数
int find(student **p,int num,char *pn="^"); //子查找函数
void found(); //查找函数
void show(); //显示函数
void count(); //统计函数
void save(); //保存函数
void begin(); //初始化函数
void clear(); //清空函数
char mainmenu(); //主菜单函数
2 学生信息录入模块
void input()
{
int e=1;
cout<<"按提示输入:"<<endl;
cout<<"请输入编号: ";
cin>>number;
cout<<"请输入姓名: ";
cin>>name;
do
{
cout<<"请输入性别: ";
cin>>sex;
if(strcmp(sex,"男")==0 || strcmp(sex,"女")==0)
{
cout<<"请输入籍贯: ";
cin>>place;
cout<<"请输入民族: ";
cin>>nation;
cout<<"请输入生日[格式xxxx/x/x]: ";
cin>>birth;
cout<<"请输入政治面貌: ";
cin>>party;
cout<<"请输入身份证号: ";
cin>>id;
cout<<"请输入高等高等数学分数: ";
cin>>score[0];
for(;score[0]>100||score[0]<0;)
{
cerr<<"输入错误,请重新输入!"<<endl;
cin>>score[0];
}
cout<<"请输入大学英语分数: ";
cin>>score[1];
for(;score[1]>100||score[1]<0;)
{
cerr<<"输入错误,请重新输入!"<<endl;
cin>>score[1];
}
cout<<"请输入线性代数分数: ";
cin>>score[2];
for(;score[2]>100||score[2]<0;)
{
cerr<<"输入错误,请重新输入!"<<endl;
cin>>score[2];
}
e=0;
}
else
{
cout<<"性别输入错误!重新输入!"<<endl;
e=1;
}
}while(e);
return ;
}
void input(ifstream & is)
{
is>>number>>name>>sex>>place>>nation>>birth>>party>>id
>>score[0]>>score[1]>>score[2];
is.get();
}
3 学生信息显示模块
void output()
{
cout<<"学生基本信息如下:"<<endl;
cout<<" 编号:"<<number<<endl
<<" 姓名:"<<name<<endl
<<" 性别:"<<sex<<endl
<<" 籍贯:"<<place<<endl
<<" 民族:"<<nation<<endl
<<" 生日:"<<birth<<endl
<<" 政治面貌:"<<party<<endl
<<" 身份证号:"<<id<<endl
<<" 高等高等数学:"<<score[0]<<endl
<<" 大学英语:"<<score[1]<<endl
<<" 线性代数:"<<score[2]<<endl
<<" 总分:"<<getg()<<endl<<endl;
}
void output(ofstream & os)
{
os<<number
<<endl<<name
<<endl<<sex
<<endl<<place
<<endl<<nation
<<endl<<birth
<<endl<<party
<<endl<<id
<<endl<<score[0]
<<endl<<score[1]
<<endl<<score[2]<<endl;
}
};
4 学生信息查找模块
void school::found()
{
student *p;
int num=-1,n=9;
char name[20]="^";
do
{
cout<<"1:按编号查找,2:按姓名查找: ";
cin>>n;
}while(n<1||n>2);
if(n==1)
{
cout<<"请输入编号: ";
cin>>num;
}
if(n==2)
{
cout<<"请输入姓名: ";
cin>>name;
}
if(!find(&p,num,name) )
{
cout<<"SORRY!找不到你要查找的内容!"<<endl;
return;
}
(p->next)->output();
}
5 学生信息删除模块
void school::del()
{
student *p,*p2;
int num;
cout<<"请输入编号: ";
cin>>num;
if( !find(&p,num,"^") )
{
cout<<"SORRY!找不到你要删除的内容!"<<endl;
return;
}
(p->next)->output();
p2=p->next;
p->next=p2->next;
delete p2;
school::setkey(1);
}
6 学生信息修改模块
void school::mend()
{
student *p;
int num=-1,n;
char name[20]="^";
do
{
cout<<"1:按编号修改,2:按姓名修改: ";
cin>>n;
}while(n<1||n>2);
if(n==1)
{
cout<<"请输入编号: ";
cin>>num;
}
if(n==2)
{
cout<<"请输入姓名: ";
cin>>name;
}
if( !find(&p,num,name) )
{
cout<<"SORRY!找不到你要修改的内容!"<<endl;
return;
}
(p->next)->output();
(p->next)->input();
school::setkey(1);
}
7 学生信息统计模块
void school::count()
{
student *p;
p=head;
int n=0;
double g[3]={0,0,0};
float j[3]={0,0,0};
while(p->next)
{
p=p->next;
n++;
for(int i=0;i<3;i++)
{
g[i]=g[i]+(p->getscore(i) );
}
}
cout<<"高等高等数学总分:"<<g[0]<<" 平均分:"<<g[0]/n
<<endl<<"大学英语总分:"<<g[1]
<<" 平均分:"<<g[1]/n<<endl
<<"线性代数总分: "<<g[2]<<" 平均分: "<<g[2]/n
<<endl;
}
8 学生信息保存模块
void school::save()
{
student *p;
p=head;
ofstream os("d:\\student.txt",ios::out);
if (school::getkey()==1)
{
while(p->next)
{
(p->next)->output(os);
p=p->next;
}
}
cout<<"文件已保存! "<<endl;
school::setkey(0);
}
四 系统实现
1 欢迎界面
2 录入学生信息界面
3 显示学生信息界面
4 查找学生信息界面
5 删除学生信息界面
6 修改学生信息
7 统计学生信息
五 实习后总结与体会
通过这次的c++课程设计我体会较深的一点是团队互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到了极大的丰富。
根据C++课程所学的概念、理论和方法,按照C++程序设计的基本步骤,设计出一个适当规模的程序;进一步加深对C++语言的理解和掌握。理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高编程能力。
六 参考文献
[1].《c++语言程序与设计教程与实验第三版》 温秀梅 丁学钧 李建华 清华大学出版社
完整代码:
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
class student
{
protected:
int number; /* 学号 */
char name[20]; /* 姓名 */
char sex[6]; /* 性别 */
char place[20]; /* 籍贯 */
char nation[6]; /* 民族 */
char birth[20]; /* 出生日期 */
char party[10]; /* 政治面貌 */
char id[20]; /* 身份证号 */
float score[3]; /* 成绩 */
public:
student *next;
student()
{
}
~student()
{
}
char* getname()
{
return(name);
}
int getnumber()
{
return(number);
}
float getscore( int i )
{
return(score[i]);
}
float getg()
{
return(score[0] + score[1] + score[2]);
}
/* 录入信息 */
void input()
{
int e = 1;
cout << "按提示输入:" << endl;
cout << "请输入编号: ";
cin >> number;
cout << "请输入姓名: ";
cin >> name;
do
{
cout << "请输入性别: ";
cin >> sex;
if ( strcmp( sex, "男" ) == 0 || strcmp( sex, "女" ) == 0 )
{
cout << "请输入籍贯: ";
cin >> place;
cout << "请输入民族: ";
cin >> nation;
cout << "请输入生日[格式xxxx/x/x]: ";
cin >> birth;
cout << "请输入政治面貌: ";
cin >> party;
cout << "请输入身份证号: ";
cin >> id;
cout << "请输入高等高等数学分数: ";
cin >> score[0];
for (; score[0] > 100 || score[0] < 0; )
{
cerr << "输入错误,请重新输入!" << endl;
cin >> score[0];
}
cout << "请输入大学英语分数: ";
cin >> score[1];
for (; score[1] > 100 || score[1] < 0; )
{
cerr << "输入错误,请重新输入!" << endl;
cin >> score[1];
}
cout << "请输入线性代数分数: ";
cin >> score[2];
for (; score[2] > 100 || score[2] < 0; )
{
cerr << "输入错误,请重新输入!" << endl;
cin >> score[2];
}
e = 0;
} else{
cout << "性别输入错误!重新输入!" << endl;
e = 1;
}
}
while ( e );
return;
}
void input( ifstream & is )
{
is >> number >> name >> sex >> place >> nation >> birth >> party >> id
>> score[0] >> score[1] >> score[2];
is.get();
}
/* 显示信息 */
void output()
{
cout << "学生基本信息如下:" << endl;
cout << " 编号:" << number << endl
<< " 姓名:" << name << endl
<< " 性别:" << sex << endl
<< " 籍贯:" << place << endl
<< " 民族:" << nation << endl
<< " 生日:" << birth << endl
<< " 政治面貌:" << party << endl
<< " 身份证号:" << id << endl
<< " 高等高等数学:" << score[0] << endl
<< " 大学英语:" << score[1] << endl
<< " 线性代数:" << score[2] << endl
<< " 总分:" << getg() << endl << endl;
}
void output( ofstream & os )
{
os << number
<< endl << name
<< endl << sex
<< endl << place
<< endl << nation
<< endl << birth
<< endl << party
<< endl << id
<< endl << score[0]
<< endl << score[1]
<< endl << score[2] << endl;
}
};
class school
{
public:
school()
{
head = new student; head->next = NULL; key = 0;
}
~school()
{
delete head;
}
void input(); /* 录入函数 */
void mend(); /* 修改函数 */
void del(); /*删除函数 */
int find( student **p, int num, char *pn = "^" ); /* 子查找函数 */
void found(); /* 查找函数 */
void show(); /* 显示函数 */
void count(); /* 统计函数 */
void save(); /* 保存函数 */
void begin(); /* 初始化函数 */
void clear(); /* 清空函数 */
char mainmenu(); /* 主菜单函数 */
int getkey()
{
return(key);
}
void setkey( int k )
{
key = k;
}
private:
student *head;
int key;
};
/* 录入函数 */
void school::input()
{
student *p, *p2 = NULL;
p = head;
int n;
while ( p->next )
p = p->next;
while ( n )
{
p2 = new student;
p2->input();
p->next = p2;
p2->next = NULL;
p = p->next;
school::setkey( 1 );
cout << "按1继续,按0返回 : ";
cin >> n;
}
}
/* 子查找函数 */
int school::find( student **p1, int num, char *pn )
{
student *p;
p = head;
while ( p->next )
{
(*p1) = p;
if ( (p->next)->getnumber() == num || !strcmp( (p->next)->getname(), pn ) )
return(1);
p = p->next;
}
return(0);
}
/* 查找函数 */
void school::found()
{
student *p;
int num = -1, n = 9;
char name[20] = "^";
do
{
cout << "1:按编号查找,2:按姓名查找: ";
cin >> n;
}
while ( n < 1 || n > 2 );
if ( n == 1 )
{
cout << "请输入编号: ";
cin >> num;
}
if ( n == 2 )
{
cout << "请输入姓名: ";
cin >> name;
}
if ( !find( &p, num, name ) )
{
cout << "SORRY!找不到你要查找的内容!" << endl;
return;
}
(p->next)->output();
}
/*删除函数 */
void school::del()
{
student *p, *p2;
int num;
cout << "请输入编号: ";
cin >> num;
if ( !find( &p, num, "^" ) )
{
cout << "SORRY!找不到你要删除的内容!" << endl;
return;
}
(p->next)->output();
p2 = p->next;
p->next = p2->next;
delete p2;
school::setkey( 1 );
}
/* 显示函数 */
void school::show()
{
student *p;
p = head;
while ( p->next )
{
(p->next)->output();
p = p->next;
}
}
/* 修改函数 */
void school::mend()
{
student *p;
int num = -1, n;
char name[20] = "^";
do
{
cout << "1:按编号修改,2:按姓名修改: ";
cin >> n;
}
while ( n < 1 || n > 2 );
if ( n == 1 )
{
cout << "请输入编号: ";
cin >> num;
}
if ( n == 2 )
{
cout << "请输入姓名: ";
cin >> name;
}
if ( !find( &p, num, name ) )
{
cout << "SORRY!找不到你要修改的内容!" << endl;
return;
}
(p->next)->output();
(p->next)->input();
school::setkey( 1 );
}
/* 保存函数 */
void school::save()
{
student *p;
p = head;
ofstream os( "d:\\student.txt", ios::out );
if ( school::getkey() == 1 )
{
while ( p->next )
{
(p->next)->output( os );
p = p->next;
}
}
cout << "文件已保存! " << endl;
school::setkey( 0 );
}
/* 初始化函数 */
void school::begin()
{
student *p, *p2;
p = head;
clear();
long t;
ifstream is( "d:\\student.txt", ios::in );
if ( !is )
{
ofstream os( "d:\\student.txt", ios::out );
os.close();
return;
}
int num = -1;
while ( 1 )
{
num = -1;
t = is.tellg();
is >> num;
is.seekg( t );
if ( num < 0 )
{
is.close();
return;
}
p2 = new student;
p2->input( is );
p->next = p2;
p2->next = NULL;
p = p->next;
}
}
/* 清空函数 */
void school::clear()
{
student *p, *p2;
p = head->next;
while ( p )
{
p2 = p;
p = p->next;
delete p2;
}
}
/* 统计函数 */
void school::count()
{
student *p;
p = head;
int n = 0;
double g[3] = { 0, 0, 0 };
float j[3] = { 0, 0, 0 };
while ( p->next )
{
p = p->next;
n++;
for ( int i = 0; i < 3; i++ )
{
g[i] = g[i] + (p->getscore( i ) );
}
}
cout << "高等高等数学总分:" << g[0] << " 平均分:" << g[0] / n
<< endl << "大学英语总分:" << g[1]
<< " 平均分:" << g[1] / n << endl
<< "线性代数总分: " << g[2] << " 平均分: " << g[2] / n
<< endl;
}
/* 主选菜单函数 */
char school::mainmenu()
{
char n[6];
cout << "\n\n ☆☆☆☆欢迎进入高校学籍管理系统☆☆☆☆" << endl << endl
<< " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" << endl
<< " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " << endl
<< " * * ☆ ☆ 1: 录入学生信息 ☆ * *" << endl
<< " * * /.\\ ☆ 2: 显示学生信息 /.\\ * *" << endl
<< " * * /..'\\ ☆ 3: 查找学生信息 /..'\\ * *" << endl
<< " * * /'.'\\ ☆ 4: 删除学生信息 /'.'\\ * *" << endl
<< " * * /.''.'\\ ☆ 5: 修改学生信息 /.''.'\\ * *" << endl
<< " * * /.'.'.\\ ☆ 6: 统计学生成绩 /.'.'.\\ * *" << endl
<< " * * /'.''.'.\\ ☆ 7: 保存学生信息 /'.''.'.\\ * *" << endl
<< " * * ^^^[_]^^^ ☆ 0: 退出系统 ^^^[_]^^^ * *" << endl
<< " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " << endl
<< " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" << endl
<< " 请选择:";
cin >> n;
return(n[0]);
}
void main()
{
school p;
int k = 1;
char n;
p.begin();
while ( k == 1 )
{
n = p.mainmenu();
switch ( n )
{
case '1': p.input(); break;
case '2': p.show(); break;
case '3': p.found(); break;
case '4': p.del(); break;
case '5': p.mend(); break;
case '6': p.count(); break;
case '7': p.save(); break;
case '0':
if ( p.getkey() == 1 )
{
cout << "\t\t\t是否保存? 1 : 保存 0:不保存 : ";
cin >> k;
if ( k == 1 )
p.save();
}
p.clear();
k = 0;
break;
}
}
}