课程设计(论文)程序设计实训课程名称公交卡信息管理系统题目信息与控制工程学院院(系)软件1402专业班级姓名学号指导教师年月日目录1. 题目 (2)2. 需求分析 (2)2.1功能分析 (2)3.概要设计 (3)4. 详细设计 (5)4.1、程序流程图 (5)4.2、loading()函数实现用链表读取文件中数据 (6)4.3、display()函数显示所用用户信息 (8)5. 实现与测试 (9)5.1管理员及用户登录界面 (9)5.2管理员操作界面 (9)5.3显示所有用户信息 (9)6.总结 (10)第 1 页第 2 页1.题目公交卡模拟系统2.需求分析2.1功能分析系统需要满足管理员和持卡用户两类使用者,管理员能实现对数据的添加、删除、查找、修改、显示全部用户五项功能。
持卡用户可以实现对数据的添加、查找功能。
添加用户删除用户 查找用户修改用户信息显示全部用户e管理员公交卡模拟系统用 户3.概要设计3.1类的设计1)管理员类及持卡者类管理者类:可实现对数据的添加、删除、查找、修改、显示操作class administratorpublic:administrator();void menu();void add();void Delete();void search();void modify();void display();持卡者类(用户类):实现数据的添加和查找操作。
class userpublic:user();void menu();void add();void search();2)公交卡分为三类一般卡、老年卡和学生卡一般卡:包含可执行多个操作的成员函数及卡号和余额两个数据成员class adult_cardpublic:virtual void add();virtual int Delete(char *p);virtual int search(char *p);virtual int modify(char *p);第 3 页virtual void display();adult_card *loading()double balance;char card_number[10];adult_card *next;老年卡:使用public继承adult_card类并新增姓名、优待证证件号class seniors_card:public adult_cardpublic:virtual void add();virtual int Delete(char *p);virtual int search(char *p);virtual int modify(char *p);virtual void display();seniors_card *loading()char name[20];char discount_number[10];seniors_card *next;学生卡:使用public继承adult_card类并新增姓名、学生证证件号class student_card:public adult_cardpublic:virtual void add();virtual int Delete(char *p);virtual int search(char *p);virtual int modify(char *p);virtual void display();student_card *loading()char name[20];char student_number[10];student_card *next;第 4 页4.详细设计4.1、程序流程图第 5 页Y N开始输入账户、密码登录类型选择管理员(admin)用户(user)定义int变量账号:numberInt变量密码:passward账号密码是否正确功能选择新增用户查找用户删除用户修改用户显示全部用户查找用户结束第 6 页第 7 页4.2、loading()函数实现用链表读取文件中数据adult_card *loading() //loading()函数从文件中载入数据到链表 { adult_card *head, *p1;head = p1 = new adult_cardwhile (!in.eof()) //使用eof()函数判断是否到文件末尾 { in >> p1->card_number >> p1->balance;if (p1->card_number[0] == '\0')break ;p1->next = new adult_card ; p1 = p1->next;}NY新建两个adult_card 类的指针head 、p1将从文件中读取到的值赋给p1->card_number 和p1->balance ;新建adult_card 赋给p1->next开 始创建adult_card 类的指针*head 、*p1打开adult.txt 文件 文件中数据传给P1->number 和p1->balance是否到达文件末尾结 束 返回值headp1=p1->nextp1->next=new adult_card第 8 页4.3、display()函数显示所用用户信息void adult_card ::display() { adult_card *p1=loading(); //调用loading()函数义链表形式从文件中读取数据 while (p1->next != NULL ) { cout << "卡号:" << p1->card_number<<"\t"<< "余额:" << p1->balance; cout << endl << endl; p1 = p1->next;}Y NWhile 语句与链表实现数据的遍历,并输出所有用户信开 始新建adult_card 类的指针*p调用loading()函数(返回值为adult_card 类的指针)将返回值赋给pp1->number 和p1->balance 输出到显示器判断是否到达链表末尾结 束 p1=p1->next5.实现与测试5.1管理员及用户登录界面5.2管理员操作界面5.3显示所有用户信息第9 页第 10 页6.总结参考资料和程序示例,通过链表的使用和文件的输入输出我感受到了自己亲自动手编程序、调程序的重要性,我们要熟悉C++的语法、体会调试的思想,最好的一个手段就是自己动手编程、调试,这会比我们一味的看书效果好得多。
另外,对于学C++的我们来说,对类相关知识的掌握也尤为重要。
在这次课程设计中,通过各个函数实现及文件读取方式,更进一步加深了我们对基础知识的认识。
通过这一次课程设计,我们最大的收获就是分析问题解决问题能力的有了大幅提高。
但仍存在许多不足,不能独自写出功能很齐全的代码,写代码要参考很多资料,所以今后应培养自己独立写代码的能力。
在今后学习中,必须精通至少一门编程语言,并且日后的课程也要认真学习,不断的用知识武装自己的头脑,为以后的学习打一个坚定的基础。
FileTest 类-headhousinginfo:HousingInfo -temphousinginfo1:HousingInfo+ReadFile():void+AppendtoFile(HousingInfo housinginfo):void+OverrideFile(HousingInfo housinginfo):void图3.2文件操作FileTest 类公交卡信息管理系统源码//注意:程序涉及到文件读写,必须提前在相应工程目录新建adult.txt;seniors.txt;student.txt三个txt文件# include<iostream># include<fstream># include<string>using namespace std;class adult_card{public:virtual void add();virtual int Delete(char *p);virtual int search(char *p);virtual int modify(char *p);virtual void display();adult_card *loading() //loading()函数从文件中载入数据到链表{adult_card *head, *p1;head = p1 = new adult_card;ifstream in;in.open("adult.txt", ios::in); //打开目标文件if (!in){cerr << "open error!" << endl;abort();}while (!in.eof()) //利用循环实现链表对数据的连续载入{in >> p1->card_number >> p1->balance;if (p1->card_number[0] == '\0')break;p1->next = new adult_card;p1 = p1->next;}第11 页in.close(); //关闭目标文件return head; //返回值为类的指针};double balance;char card_number[10];adult_card *next;};void adult_card::add(){balance = 0;system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "请输入新添加的卡号:";cin >> card_number;fstream out("adult.txt", ios::app);out << card_number<<"\t"<<balance<<'\n';out.close();cout << "余额:0.00" << endl;};int adult_card::Delete(char *p){adult_card *head, *p1, *p2;head = p1 = p2 =loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){char ch;cout << "!确认删除?";cin >> ch;if (ch == 'y' || ch == 'Y'){p2->next = p1->next;}第12 页p1 = head;remove("adult.txt");ofstream out;out.open("adult.txt");if (!out){cerr << "open error!" << endl;abort();}while (p1->next != NULL){out << p1->card_number << "\t" << p1->balance << '\n';p1 = p1->next;}out.close();return 1;}p2 = p1;p1 = p1->next;}return 0;};int adult_card::search(char *p){adult_card *p1 = loading();while (p1->next!=NULL){if (strcmp(p1->card_number, p)==0){cout << "卡号:" << p1->card_number << "\t" << "余额:" << p1->balance;cout << endl << endl; return 1;}p1 = p1->next;第13 页}return 0;};int adult_card::modify(char *p){adult_card *head, *p1;head = p1 = loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){cout << "请输入修改后的余额:";cin >> p1->balance;p1 = head;remove("adult.txt");ofstream out;out.open("adult.txt");if (!out){cerr << "open error!" << endl;abort();}while (p1->next != NULL){out << p1->card_number << "\t" << p1->balance << '\n';p1 = p1->next;}out.close();return 1;}p1 = p1->next;}return 0;};第14 页void adult_card::display(){adult_card *p1=loading();while (p1->next != NULL){cout << "卡号:" << p1->card_number<<"\t"<< "余额:" << p1->balance;cout << endl << endl;p1 = p1->next;}};class seniors_card:public adult_card{public:virtual void add();virtual int Delete(char *p);virtual int search(char *p);virtual int modify(char *p);virtual void display();seniors_card *loading(){seniors_card *head, *p1;head = p1 = new seniors_card;ifstream in;in.open("seniors.txt", ios::in);if (!in){cerr << "open error!" << endl;abort();}while (!in.eof()){in >> p1->card_number >> p1->name >> p1->discount_number >> p1->balance;if (p1->card_number[0] == '\0')break;第15 页p1->next = new seniors_card;p1 = p1->next;}in.close();return head;};char name[20];char discount_number[10];seniors_card *next;};void seniors_card::add(){balance = 0;system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "请输入新添加的卡号:";cin >> card_number;cout << "请输入持卡人姓名:";cin >> name;cout << "请输入持卡人老年优待证号码:";cin >> discount_number;fstream out("seniors.txt", ios::app);out << card_number << "\t"<< name << "\t"<< discount_number << "\t"<< balance << '\n';out.close();cout << "余额:0.00" << endl;};int seniors_card::Delete(char *p){seniors_card *head, *p1, *p2;head = p1 = p2 = loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){第16 页char ch;cout << "!确认删除?";cin >> ch;if (ch == 'y' || ch == 'Y'){p2->next = p1->next;}p1 = head;remove("adult.txt");ofstream out;out.open("adult.txt");if (!out){cerr << "open error!" << endl;abort();}while (p1->next != NULL){out << p1->card_number << "\t" << p1->name << "\t" << p1->discount_number << "\t" << p1->balance << '\n';p1 = p1->next;}out.close();return 1;}p2 = p1;p1 = p1->next;}return 0;};int seniors_card::search(char *p){seniors_card *p1=loading();while (p1->next != NULL)第17 页{if (strcmp(p1->card_number, p) == 0){cout << "卡号:" << p1->card_number << "\t";cout << "姓名:" << p1->name << "\t";cout << "老年优待证号码:" << p1->discount_number << "\t";cout << "余额:" << p1->balance << "\t";cout << endl << endl;return 1;}p1 = p1->next;}return 0;};int seniors_card::modify(char *p){seniors_card *head, *p1;head = p1 = loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){cout << "请输入修改后的姓名";cin >> p1->name;cout << "请输入修改后的优待卡号";cin >> p1->discount_number;cout << "请输入修改后的余额:";cin >> p1->balance;p1 = head;remove("seniors.txt ");ofstream out;out.open("seniors.txt");if (!out){第18 页cerr << "open error!" << endl;abort();}while (p1->next != NULL){out << p1->card_number << "\t" << p1->name << "\t" << p1->discount_number << "\t" << p1->balance << '\n';p1 = p1->next;}out.close();return 1;}p1 = p1->next;}return 0;};//董老师说:“13级的都说我很慈祥”哈哈哈//朱老师很严厉哈哈哈;void seniors_card::display(){seniors_card *p1 = loading();while (p1->next != NULL){cout << "卡号:" << p1->card_number << "\t";cout << "姓名:" << p1->name << "\t";cout << "老年优待证号码:" << p1->discount_number << "\t";cout << "余额:" << p1->balance << "\t";cout << endl << endl;p1 = p1->next;}};class student_card:public adult_card{第19 页public:virtual void add();virtual int Delete(char *p);virtual int search(char *p);virtual int modify(char *p);virtual void display();student_card *loading(){student_card *head, *p1;head = p1 = new student_card;ifstream in;in.open("student.txt", ios::in);if (!in){cerr << "open error!" << endl;abort();}while (!in.eof()){in >> p1->card_number >> p1->name >> p1->student_number >> p1->balance;if (p1->card_number[0] == '\0')break;p1->next = new student_card;p1 = p1->next;}in.close();return head;};char name[20];char student_number[10];student_card *next;};void student_card::add(){balance = 0;第20 页system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "请输入新添加的卡号:";cin >> card_number;cout << "请输入持卡人姓名:";cin >> name;cout << "请输入持卡人学生证证号码:";cin >> student_number;fstream out("student.txt", ios::app);out << card_number << "\t" << name << "\t" << student_number << "\t" << balance << '\n';out.close();cout << "余额:0.00" << endl;};int student_card::Delete(char *p){student_card *head, *p1, *p2;head = p1 = p2 = loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){char ch;cout << "!确认删除?";cin >> ch;if (ch == 'y' || ch == 'Y'){p2->next = p1->next;}p1 = head;remove("adult.txt");ofstream out;out.open("adult.txt");if (!out){第21 页cerr << "open error!" << endl;abort();}while (p1->next != NULL){out << p1->card_number << "\t" << p1->name << "\t" << p1->student_number << "\t" << p1->balance << '\n';p1 = p1->next;}out.close();return 1;}p2 = p1;p1 = p1->next;}return 0;};int student_card::search(char *p){student_card *p1 = loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){cout << "卡号:" << p1->card_number << "\t";cout << "姓名:" << p1->name << "\t";cout << "学生证号码:" << p1->student_number << "\t";cout << "余额:" << p1->balance << "\t";cout << endl << endl;return 1;}p1 = p1->next;}return 0;第22 页};int student_card::modify(char *p){student_card *head, *p1;head = p1 = loading();while (p1->next != NULL){if (strcmp(p1->card_number, p) == 0){cout << "请输入修改后的姓名:";cin >> p1->name;cout << "请输入修改后的学生证号:";cin >> p1->student_number;cout << "请输入修改后的余额:";cin >> p1->balance;p1 = head;remove("student.txt");ofstream out;out.open("student.txt");if (!out){cerr << "open error!" << endl;abort();}while (p1->next != NULL){out << p1->card_number << "\t" << p1->name << "\t" << p1->student_number << "\t" << p1->balance << '\n';p1 = p1->next;}out.close();return 1;}p1 = p1->next;第23 页}return 0;};void student_card::display(){student_card *p1=loading();while (p1->next != NULL){cout << "卡号:" << p1->card_number<<"\t";cout << "姓名:" << p1->name << "\t";cout << "学生证号码:" << p1->student_number << "\t";cout << "余额:" << p1->balance << "\t";cout << endl << endl;p1 = p1->next;}};void password(){int administrator_number, administrator_password;system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << " 请输入管理员账号:";cin >> administrator_number;while (administrator_number != 123){system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************" << endl;cout << "*** !账号不存在 ***"<< endl;cout << "*** 请重新输入管理员账号: ***"<< endl;cin >> administrator_number;第24 页}cout << " 请输入管理员密码:";cin >> administrator_password;while (administrator_password != 123){cout << "*** !管理员密码错误 ***"<< endl;cout << "*** 请重新输入管理员密码: ***"<< endl;cin >> administrator_password;}};class administrator{public:administrator();void menu();void add();void Delete();void search();void modify();void display();};administrator::administrator(){password();menu();};void administrator::menu(){char m;system("cls");第25 页cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "*** 请选择您需要的操作: ***"<< endl;cout << "*** 1.添加用户信息 ***"<< endl;cout << "*** 2.删除用户信息 ***"<< endl;cout << "*** 3.查找用户信息 ***"<< endl;cout << "*** 4.修改用户信息 ***"<< endl;cout << "*** 5.显示全部用户 ***"<< endl;cout << "*** 6.退出 ***"<< endl;cout << "请选择:";cin >> m;while (m != '1'&&m != '2'&&m != '3'&&m != '4'&&m != '5'&&m != '6'&&m != '7'){cout << "输入错误:";cout << "请重新选择:";cin >> m;}switch (m){case'1':add(); break;case'2':Delete(); break;case'3':search(); break;case'4':modify(); break;case'5':display(); break;case'6':exit(0); break;}};void administrator::add(){int o;system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "*** 请选择需要添加的用户类型: ***"<< endl;cout << "*** 1.普通用户 ***"<< endl;第26 页cout << "*** 2.老年卡用户 ***"<< endl;cout << "*** 3.学生卡用户 ***"<< endl;cout << "请选择:";cin >> o;if (o == 1){adult_card Adult;Adult.add();}else if (o == 2){seniors_card Seniors;Seniors.add();}else if (o == 3){student_card Student;Student.add();}cout << "添加成功" << endl;system("PAUSE");menu();};void administrator::Delete(){char card_number[10];system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << " 请输入您要删除的公交卡卡号:";cin >> card_number;adult_card Adult;seniors_card Seniors;student_card Student;if (Adult.Delete(card_number) == 0 && Seniors.Delete(card_number) == 0 &&第27 页Student.Delete(card_number) == 0)cout << "!无法查到该卡信息" << endl;system("PAUSE");menu();};void administrator::search(){char card_number[10];system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << " 请输入您要查询的公交卡卡号:";cin >> card_number;adult_card Adult;seniors_card Seniors;student_card Student;if (Adult.search(card_number) == 0 && Seniors.search(card_number) == 0 &&Student.search(card_number) == 0){cout << "!无法查到该卡信息" << endl;}system("PAUSE");menu();};void administrator::modify(){char card_number[10];system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << " 请输入您要修改的公交卡卡号:";cin >> card_number;adult_card Adult;seniors_card Seniors;student_card Student;第28 页if (Adult.modify(card_number) == 0 && Seniors.modify(card_number) == 0 &&Student.modify(card_number) == 0)cout << "!无法查到该卡信息" << endl;system("PAUSE");menu();};void administrator::display(){system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "*** 所有用户信息: ***"<< endl;adult_card Adult;seniors_card Seniors;student_card Student;Adult.display();Seniors.display();Student.display();cout << "输出完毕!";system("PAUSE");menu();};class user{public:user();void menu();void add();void search();};user::user(){menu();第29 页};void user::menu(){char m;system("cls");cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "*** 请选择您需要的操作: ***"<< endl;cout << "*** 1.添加用户信息 ***"<< endl;cout << "*** 2.查找用户信息 ***"<< endl;cout << "*** 3.退出 ***" << endl;do{cout << "请选择:";cin >> m;} while (m != '1' && m != '2'&&m!='3');switch (m){case'1':add(); break;case'2':search(); break;case'3':exit(0); break;}};void user::add(){int o;cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "*** 请选择需要添加的用户类型: ***"<< endl;cout << "*** 1.普通用户 ***"<< endl;cout << "*** 2.老年卡用户 ***"<< endl;cout << "*** 3.学生卡用户 ***"<< endl;cout << "请选择:";cin >> o;if (o == 1)第30 页{adult_card Adult;Adult.add();}else if (o == 2){seniors_card Seniors;Seniors.add();}else if (o == 3){student_card Student;Student.add();}cout << "添加成功" << endl;};void user::search(){char card_number[10];cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << " 请输入您要查询的公交卡卡号:";cin >> card_number;adult_card Adult;seniors_card Seniors;student_card Student;if (Adult.search(card_number) == 0 && Seniors.search(card_number) == 0 &&Student.search(card_number) == 0){cout << "!无法查到该卡信息" << endl;}};void main()第31 页{char n;cout << "" << endl;cout << "" << endl;cout << "*******************欢迎使用西安公交卡信息管理系统*******************"<< endl;cout << "*** (管理员登陆请选择 1 / 非管理员请选择 2) ***"<< endl;cout << "*** 1.管理员登陆 ***"<< endl;cout << "*** 2.非管理员登陆 ***"<< endl;do{cout << "请选择:";cin >> n;}while (n!='1'&&n!='2');if (n=='1')administrator A;elseuser B;system("PAUSE");}第32 页学长只能帮你到这了,其他的自己解决吧!第33 页。