计算机科学与技术系
课程设计报告
2008~2009学年第二期
| 课程 | 程序设计语言Ⅱ课程设计 |
| 课 程 设 计 名 称 | 宾馆住宿信息管理系统 |
| 学生姓名 | 朱峰 |
| 学号 | 0804031020 |
| 专业班级 | 网络工程(1)班 |
| 指导教师 | 徐静 刘登胜 |
(一)课程设计题目:
宾馆住宿信息管理系统
(二)问题的分析
首先建立一个名为passer的类,该类的私有成员应包括宾馆宾客的姓名,性别、出生日期、身份证号码等基本信息,公有成员函数应能够实现宾客信息的删除、添加、查询和显示所有宾客信息的功能,运用链表实现添加功能,getline函数可实现查询、删除功能,此外还将用到I/O流等。
(三)算法的设计:
1、思路的确定:
a、类的确立:
根据题目的要求,要记录宾馆宾客的姓名,性别、出生日期、身份证号码等基本信息和相关的操作;根据c++额度面向对象的思想,定义一个类passer,然后将这些基本信息作为私有的数据成员保存在类中,由于对这些信息的操作要在类外实现,所以要将对这些私有数据成员的操作的函数成员定义为其共有数据成员,方便在主函数之中先定义一个passer类的对象,然后以此来访问其公有成员函数,最终达到对其私有数据成员的操作。
各数据成员:
string name;……姓名
string boretime;……出生日期
string sex;……性别
string country;……国籍
string staydays;……住宿天数
string roomnum;……房间号
string phonenum;……手机号
string idnum;……身份证号
string getintime;……入住时间
函数成员:
passer();//默认构造函数
int inter_face();//首页
void add_person();//添加宾客
void del_person();//删除宾客
void show_all();//显示所有宾客
void select();//查询宾客
b、主函数的确立:
在主函数main()里通过switch语句对程序进行模块化处理,并且在其外部用while语句来控制方便程序的可持续操作,switch语句的使用能够实现功能的选择,即通过先定义一个类的对象然后在各个case语句的执行操作中调用各个成员函数。
重要的程序段:
int main()
{int choose;
passer abj;
while (choose = abj.inter_face())
{
switch (choose)
{case 1: abj.add_person();////添加宾客
break; …………
c、成员函数的确立:
主函数和类的定义实现之后剩下的就是类的成员函数的实现过程。
各个成员函数的声明如下:
passer();//默认构造函数
void add_person();//添加宾客
void del_person();//删除宾客
void show_all();//显示所有宾客
void select();//查询宾客
第一,对构造函数passer()来说,实现的功能是对对象的各个数据成员的初始化工作。passer::passer()
{
name="0";
sex="0";
country=="0";
staydays="0";
roomnum="0";
phonenum="0";
idnum="0";
getintime="0";
boretime="0";
next=0;
}
第二,对添加宾客的函数void add_person()要实现的功能就是增加新的对象,通过链表的使用,先申明一个新的节点指针passer *p,再申请一个新的内存空间new passer返回一个新的内存空间的地址,并把这个地址赋值给先前申明的节点指针 *p ,再通过节点指针调用各个数据成员对各个数据成员进行赋值,最后通过节点中的指向下一个节点的指针来插入一个新的节点并通过建立的文件输出流对象将新增的宾客信息保存到文件之中。
重要的程序段:
passer *p=new passer;
cin >>p->name;
cin >>p->sex;
cin >>p->country;
cin>>p->idnum;
cin>>p->phonenum;
cin >>p->boretime;
cin >>p->getintime;
cin>>p->staydays;
cin>>p->roomnum;
ofstream outData("c:/passer.txt", ios::app)
outData << setiosflags(ios::left) << setw(5) << p->name <<" "
< << setw(5) < << setw(5) < << setw(5) < << setw(5) < << setw(5) < << setw(5) < << setw(5) < < next=p; outData.close(); 第三,删除宾客void del_person(),主要是通过getline() 函数的调用来实现的。通过getline() 函数来将c:/passer.txt中的宾客信息提取出来,然后将这些信息中的身份证号和姓名于你所输入的所要查询的信息所比较,如果不满足就将这些信息转存到c:/temp.txt之中,如果满足就执行if语句中的内容且跳出文件输入流的提取过程并输出此时你要删除人的相关信息(此时c:/temp.txt之中的所存储的信息要比原来的c:/passer.txt中的信息少一个人即你所要删除人的信息),在这之后再分别创建一个文件输入流对象in和一个文件输出流对象out并此时把c:/temp.txt中的信息通过文件输出流对象out重新的保存到c:/passer.txt之中,以此来达到删除你所要删除人的信息的目的。 重要的程序段: ofstream outData("c:/temp.txt", ios::out); ifstream inData("c:/passer.txt", ios::in); while (inData >>name >>idnum) { getline(inData, str); if ((sign==name) || (sign==idnum)) { cout < break; } outData < ofstream out("c:/passer.txt", ios::out); ifstream in("c:/temp.txt", ios::in); while (getline(in, str)) { out < out.close(); in.close(); 第四,查询功能的实现void select(),通过构建一个文件输入流的对象indate,并声明一个string型的变量str来接收从文件之中输入的数据流,并且通过while语句来逐步的将输入流对象中的字符串逐个的输入,以完成将其中的信息与输入的所要查询的信息的比较,如果满足的话就输出这个人的基本信息,如果找不到的话就输出“没有你要找的人!!”。 重要的程序段: ifstream inData("c:/passer.txt",ios::in); while (inData >>name >>idnum>>phonenum>>roomnum) getline(inData, str); if ((name==sign) || (idnum==sign)|| (phonenum==sign)|| (roomnum==sign)) 第五,显示所有的宾客信息void show_all(),就是一个简单的将文件的输入流对象赋给一个字符串型的变量,再将这个字符串型的两输出即可。 重要的程序段: ifstream inData("c:/passer.txt",ios::in); while (getline(inData, record)) { if (flag) { cout < cout < } if (flag) { cout < else { cout < system("pause"); } 2、系统功能模块 , 3、类的层次设计 Passer (四)上机调试过程 a.在主函数之中开始只是简单的用switch语句,使得程序的可持续的运行性极差,后来在其外面添加了一个while之后,可以实现循环的操作,仅当选择5时才调用exit(0),这个系统函数,强制程序的运行的结束。 b.在类的成员函数add_passer()之中,对链表的概念了解的不够清楚,直至现在仍然有许多的问题,所以只能仿照课本上的列题来进行程序的编辑,在这过程之中,用节点指针来访问类的数据成员的时候不能明确格式,导致调试的不通过。 最后是把新输入的宾客的信息保存在文件之中,在ofstream outData("c:/passer.txt", ios::app)这之后没有加“;”,使得多次的调试报错,由此认识到在编写程序段的过程中应当更加的谨慎和小心,要多注意细节。 c.在成员函数select()之中,首先定义一个文件的数入流对象ifstream inData("c:/passer.txt",ios::in);再通过输出流对象将indate之中的数据流通过提取运算符逐个的赋值给name phonenum idnum ,再通过键盘输入的查询信息与之相比较,如果相同的话则输出这个宾客的信息,然而在实现这些功能的时候,开始只能对其姓名进行查找,只有将这些查找方式放在一起的时候才能实现该功能,至今仍不知道其原因。 d.在这次课程设计之中,本来准备实现更多的功能,可是限于时间和精力的,就没能顺利的完成,如对人员信息的查询本可以分类进行的,还有对人员信息的的更改操作,等等。 (五)测试结果及其分析 1)人员的添加 (在这里可以实现选择是否保存) 2)人员的查找 3)人员的删除 4)显示所有宾客的信息 5)退出程序: (六)经验的总结和体会 通过这么长时间的对C++课程的学习和设计,开始的感觉到C++是一门很容易的学科和C语言有许多相似的地方。但随着学习的深入,两课之间的差异便显现了出来,C++给我的最大感觉是这门课是以类为主,以面向对象为目的的一门课。所以在这次的程序设计中,我们所做的课程题目都必须由此来完成,看上去很繁琐但是事实上却更能加强我们的类的思想,使我们学以致用,并且在用的过程中发现问题。在解决问题的同时使我们的基础更加的牢固。 这一次的程序设计是我的第一次自己从无到有编写一个程序,万事开头难,开始的时候的确有一定的不适应,感觉无从下手。后来在老师的指导和同学交流的基础之上,慢慢的开始能够自主的完成程序的编写工作。 在这次设计程序的过程中,使自我清楚地认识到自己在学习中的不足与缺点,并且对c++中类的思想有了更加深刻的认识,同时在这之中,使自我对信息保存到文件和从文件之中读出信息的操作方法有了更加深刻的认识。 (七)参考资料: [1].郑莉 等编著《C++语言程序设计(第三版)》北京:清华大学出版社 [2].郑莉 等编著《C++语言程序设计(第三版)学生用书》北京: 清华大学出版社 [3].刘振安 等编著《C++程序设计课程设计》 机械工业出版社 [4].吴乃陵 等编著《C++程序设计》北京:高等教育出版社 [5].李春葆 等编著《C++程序设计学习与上机实验指导》 北京:清华大学出版社 [6].范辉 等编著《Visual C++6.0程序设计简明教程》 高等教育出版社 [7].李龙澍《C++程序设计实训教程》北京:清华大学出版社 [8].洪国胜 等编著 《C++ Builder程序设计轻松上手》北京:清华大学出版社 [9].宁正元《数据结构(c语言)》 南京:东南大学出版社。2000年6月第1版 [10].严蔚敏等 《数据结构(c语言版)》 北京:清华大学出版社,1997年4月第1版。 [11].胡学钢等《数据结构算法设计指导》北京:清华大学出版社,1999年 第1版。 [12].刘大有《数据结构》(面向21世纪课程教材) 北京:高等教育出版社 [13].明日科技 编著《Visual C++程序开发范例宝典》北京:人民邮电出版社。 (八)源程序代码 #include #include #include #include #include #include using namespace std; class passer { public: passer *next; passer();//默认构造函数 int inter_face();//首页 void add_person();//添加宾客 void del_person();//删除宾客 void show_all();//显示所有宾客 void select();//查询宾客 private: string name; string sex; string country; string staydays; string roomnum; string phonenum; string idnum; string getintime; string boretime; }; passer::passer() { name="0"; sex="0"; country=="0"; staydays="0"; roomnum="0"; phonenum="0"; idnum="0"; getintime="0"; boretime="0"; next=0; } //首页 int passer::inter_face() { system("cls"); cout < cout<<"\\★★★★★★★★★★★★★★★★★★★★★★★★★★" < int choose; cin >>choose; return choose; } //添加宾客 void passer::add_person() {int qt=1; passer *p=new passer; cout < cin >>p->name; cout <<"性别 : "; cin >>p->sex; cout <<"国籍 : "; cin >>p->country; cout<<"身份证号:"; cin>>p->idnum; cout<<"手机号:"; cin>>p->phonenum; cout <<"出生年月 : "; cin >>p->boretime; cout <<"入住时间 : "; cin >>p->getintime; cout<<"住宿天数:"; cin>>p->staydays; cout<<"房间号:"; cin>>p->roomnum; cout<<" ************************************"< string q; cin>>q;int pt=1; while(pt) {if(q=="1") { ofstream outData("c:/passer.txt", ios::app); if (!outData) { cout < return; } outData << setiosflags(ios::left) << setw(5) << p->name <<" " < << setw(5) < << setw(5) < << setw(5) < << setw(5) < << setw(5) < << setw(5) < << setw(5) < < next=p; outData.close(); cout < } if(q=="2") {cout<<"你已经取消了保存!!!"< } else { if(qt==1){cout<<"请正确输入!!!"; cout<<" 请选择:"; cin>>q;} } } system("pause"); } //删除宾客 void passer::del_person() { ofstream outData("c:/temp.txt", ios::out); ifstream inData("c:/passer.txt", ios::in); if (!outData || !inData) { cout < return; } string sign; cout < bool flag = true; string str; while (inData >>name >>idnum) { getline(inData, str); if ((sign==name) || (sign==idnum)) { cout < cout < break; } outData < if (flag) { cout < else { while (getline(inData, str)) { outData < outData.close(); inData.close(); ofstream out("c:/passer.txt", ios::out); ifstream in("c:/temp.txt", ios::in); if (!out || !in) { cout < return; } while (getline(in, str)) { out < out.close(); in.close(); cout < system("pause"); } //显示所有宾客 void passer::show_all() { ifstream inData("c:/passer.txt",ios::in); if (!inData) { cout < return; } bool flag = true; string record; while (getline(inData, record)) { if (flag) { cout < cout < } if (flag) { cout < else { cout < system("pause"); } //查询宾客 void passer::select() {int pt=1; ifstream inData("c:/passer.txt",ios::in); if (!inData) { cout < return; } string sign; cout < string str1; bool flag = true; string str; while (inData >>name >>idnum>>phonenum) { getline(inData, str); if ((name==sign) || (idnum==sign)|| (phonenum==sign)) { cout < flag = false; pt++; } } if(pt==1)cout<<"…………没有你要找的人!!…………"< } int main() {int choose; passer abj; while (choose = abj.inter_face()) { switch (choose) {case 1: abj.add_person();////添加宾客 break; case 2: abj.del_person();////删除宾客 break; case 3: abj.show_all();////显示所有宾客 break; case 4: abj.select();////查询宾客 break; case 5: cout < exit(0); break; default: break; } } return 0; }下载本文