1.需求分析 1.1 问题描述 网吧管理系统管理信息包括会员的会员名、性别、年龄、积分等。试设计一网吧管理系统,使之能提供以下功能:系统以菜单方式工作,采用密码登录,登陆后可以实现对会员账号的增删改查等操作。 1.2 基本要求 (1)增加新订户,即将新订户的全部信息输入到文件中。 (2)查询功能:可根据订户姓名、性别、单位对已添加的记录进行查询,如果未找到, 给出相应的提示信息,如果找到,则显示相应的记录信息。 (3)显示功能:可显示当前系统中所有记录,每条记录占据一行。 (4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性. (5)删除功能:根据当天的日期对新订户全部信息进行查询,删除已到期的订户记录。 删除记录时要有提示功能。 (6)统计功能:能根据多种参数进行统计。能统计性别、订阅数、订阅期限信息等。 例如:统计本期杂志订户数并打印运算结果 本期订阅信息 订户名 订阅数 单价 全额 李平 2 5.5 11.0 黄海 1 5.5 5.5 合计 3 1.0 16.5 (7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。 (8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。 1)输出的形式和输入值的范围 在开始时输入1~8整数数字来选择要操作的选择项 2) 输出的形式 提示输出数据的数据类型,以及输出对应的用户基本信息 3)程序所能达到的功能 订阅者信息的录入(增加数据)。用结构体和类的数据类型赋初值的方法把订阅者信息送到各个数组中(但要注意使合法数据),然后把它们保存起来。 订阅者信息的显示(查找显示数据)。任意输入一位编号,将他所有的信息从结构体中读取出来。 订阅者信息的编辑(编辑数据)。任意输入一位编号,即可修改他的所有数据。要求能多次修改。 过期订阅者信息的删除(删除数据)。任意输入一位订阅期限编号,删除这个订阅期限内的所有订阅者信息。 订阅者信息的计算统计(统计信息)。自行运算订阅者订阅本数,并结合订阅单价计算出订阅总价, 然后把它们打印出来。 订阅者信息的保存(保存信息)。将订阅者信息保存到文件中。 订阅者信息的加载(加载信息)。再次进入系统后,可以从之前保存的文件中读取到先前保存的订阅者信息。 2. 概要设计 2.1 数据结构 采用了线性结构来实现模块间的调用。 2.2 程序模块 struct MagazineSubscriber//订阅杂志的用户的结构体函数 class MagazineManagementSystem//杂志管理系统类 void addSubscriber()//添加订阅者信息函数 void displayAllSubscribers()//显示订阅者信息函数 void editSubscriber()//编辑订阅者信息函数 void deleteExpiredSubscribers(const string& currentDate)//删除过期订阅者信息函数 void calculateStatistics()//计算统计订阅者信息函数 void saveToFile()//保存订阅者信息到文件函数 void loadFromFile()//从文件中加载订阅者信息函数 void displaySubscriber(const MagazineSubscriber& subscriber)// 添加订阅者信息具体函数 void SetConsoleColor(int color)// 设置控制台文本颜色函数 int getWindowWidth()//获取控制台窗口的宽度函数 void printCentered(const std::string& str)// 计算每行输出字符串前面需要添加的空格数量,使其在控制台窗口居中函数 void menu()//主菜单函数 2.3各模块之间的调用关系以及算法设计 ![](https://i-blog.csdnimg.cn/blog_migrate/c512496733abd8f13faeec417080aa26.png) ![](https://i-blog.csdnimg.cn/blog_migrate/7c8e5133e86f9bc64290467ad5422916.png) 3. 详细设计 void editSubscriber() { int id; cout << "输入要编辑的编号: "; cin >> id; cin.ignore(); //用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 /* b为数组或容器,是被遍历的对象 for(auto &a:b),循环体中修改a,b中对应内容也会修改 for(auto a:b),循环体中修改a,b中内容不受影响 for(const auto &a:b),a不可修改,用于只读取b中内容 */ for (auto& subscriber : subscribers) { if (subscriber.id == id) { cout << "输入新的姓名: "; getline(cin, subscriber.name); cout << "输入新的性别: "; getline(cin, subscriber.gender); cout << "输入新的电话号码: "; getline(cin, subscriber.phoneNumber); cout << "输入新的部门单位: "; getline(cin, subscriber.companyName); cout << "输入新的订阅数: "; cin >> subscriber.subscriptionCount; cin.ignore(); cout << "输入新的订阅期限 (某年某月): "; getline(cin, subscriber.subscriptionDeadline); cout << "订户信息更新成功!" << endl; system("pause"); //调用pause命令,等待用户按任意键,然后返回,等同于getchar() system("cls"); //清屏 return; } } cout << "未找到相应编号的订户" << endl; system("pause"); system("cls"); } 编辑订阅者信息函数,首先用for(auto &a:b),使循环体中修改a,b中对应内容也会修改,之后用if语句判断是否存在该编号的订阅者,如果不存在则显示未找到相应编号的订户,如果存在则继续下列操作。首先创建一个结构体变量,用此变量来保存输入的订阅者信息,在创建一个变量id以此来保存要编辑的订户编号,中间用cin.ignore()函数消除上一次输入对下一次输入的影响。最后用push_back()函数来将最初定义的变量中保存的新增的订户信息存入vector容器中。 void deleteExpiredSubscribers(const string& currentDate) { vector<MagazineSubscriber> validSubscribers; for (const auto& subscriber : subscribers) { if (subscriber.subscriptionDeadline > currentDate) { validSubscribers.push_back(subscriber); } } int deletedCount = subscribers.size() - validSubscribers.size(); subscribers = validSubscribers; if (deletedCount > 0) { cout << deletedCount << "个过期订户被删除!" << endl; } else { cout << "没有找到过期订户!" << endl; } system("pause"); system("cls"); } 删除过期订阅者信息函数,首先用for(const auto&a:b)函数只读取b,也就是vector容器中的内容,之后用if语句判断订户订阅日期是否过期,如果有则用push_back()函数来将最初定义的变量中保存的目前的订户信息存入vector容器中。然后计算删除的个数,用if语句判断有无过期订户被删除,如果没有过期则显示没有找到过期订户,如果有则显示n个过期订户被删除。 void displaySubscriber(const MagazineSubscriber& subscriber) { cout << "编号: " << subscriber.id << endl; cout << "姓名: " << subscriber.name << endl; cout << "性别: " << subscriber.gender << endl; cout << "电话号码: " << subscriber.phoneNumber << endl; cout << "部门单位: " << subscriber.companyName << endl; cout << "订阅数: " << subscriber.subscriptionCount << endl; cout << "订阅期限: " << subscriber.subscriptionDeadline << endl; cout << endl; system("pause"); system("cls"); } 打印订阅者信息函数。首先用引用的方式调用订阅者信息,并且对此信息只调用不修改,用cout语句打印订阅者的各类信息。 4. 测试结果与分析
- 如图4-1 测试结果图1,输入1开始添加订阅者, 所有信息添加完成后会提示“添加成功!”
![](https://i-blog.csdnimg.cn/blog_migrate/20aed808f41a0cf89a22f836353eb8e7.png) 2.如图4-2 测试结果图2,输入2显示添加过的所有订阅者信息 ![](https://i-blog.csdnimg.cn/blog_migrate/7c48f894e7b3984e63bcbec95f40815a.png) (3) 如图4-3 测试结果图3,输入3后,输入订阅者的信息编号,可以重新编辑订阅者的信息,编辑完成后会提示“订户信息更新成功!” ![](https://i-blog.csdnimg.cn/blog_migrate/c6e5afd487d3170a70c6fb604a1029e6.png) (4) 如图4-4 测试结果图4,再次输入2会显示更新后的信息 ![](https://i-blog.csdnimg.cn/blog_migrate/baf920114afaadb34ceb4c787ebd458b.png) (5) 如图4-5 测试结果图5,输入5会显示统计过后的订阅者信息,其中包括订户名、订阅数、单价及金额 ![](https://i-blog.csdnimg.cn/blog_migrate/c3b6c6fe91176c25a99eebd43d6ef23d.png) (6) 如图4-6 测试结果图6,输入6后所有信息将会被保存到文件中,再次进入系统后可以从文件中加载,查看订阅信息 ![](https://i-blog.csdnimg.cn/blog_migrate/5a1af4a698e6c312a6d7edf7827c6a2f.png) (7) 如图4-7 测试结果图7,再次进入系统后,不能直接显示订阅信息 ![](https://i-blog.csdnimg.cn/blog_migrate/9e60762d0161ba9aacb12edbdd170526.png) (8) 如图4-8 测试结果图8,需要先从文件中加载信息 ![](https://i-blog.csdnimg.cn/blog_migrate/a0fcc51bc6656a0c3ad93ebfa321812f.png) (9) 如图4-9 测试结果图9,再次选择显示所有订阅者后,即可显示所有订阅者信息 ![](https://i-blog.csdnimg.cn/blog_migrate/b20e304ce4190308553638ba78c0ad30.png) (10) 如图4-10 测试结果图10,输入4后,输入已过期的订阅期限即可删除这个期限内的所有订阅者信息 ![](https://i-blog.csdnimg.cn/blog_migrate/2425966cbca0e9ee9bc7b7f7f8c10d26.png) (11) 如图4-11 测试结果图11,删除后再次选择显示信息则不会出现删除过的信息 ![](https://i-blog.csdnimg.cn/blog_migrate/40ded292b4394d3ee664bd907b9f39ad.png) 5. 总结与心得 C++是计算机程序设计的重要理论基础,在我们以后的学习和工作中都有着十分重要的地位。经过一个学期对《C++程序设计》的学习,我学习到了基本的理论知识,了解到了C++语言程序设计的思想,这些知识都为我的课程实践和进一步的学习打下了坚实的基础。 在为期近一周的C++课程设计中,我体会颇多,学到了很多东西。我加强了对C++程序设计这门课程的认识,并且复习了自己以前学习到的知识。这些都使得我对计算机语言的学习有了更深入的认识!明白只有多动手,经常编写程序,才能发现我们学习上的漏洞和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。 在我们小组有解决不了的问题时,我们会主动查阅相关的资料,或向其他同学询问,这不仅丰富了我们的知识,还增进了我们同学之间的友谊。为了增大信息的安全性,需要用文件来存储信息,由于我们在上课时不注重对文件的运用,所以在这方面有较大的困难。我先将书本认认真真地看了一遍,又做了一下课后习题来验证和增进自己的理解,终于,经过我们的不懈努力,我们小组的程序有了突破,成功地实现了用文件来保存并查看学生的信息。 设计的程序总体功能大都能够运行顺利,但有许多地方比较复杂,需要进一步修改,进行简化。通过这次课程设计的锻炼,我收获很多,具体归纳为以下几点: 1. 首先,也是最重要的一点,学会如何将一个复杂的问题简化,将一个较大的问题分成几个小问题,再一一解决这些小问题。在设计一个程序之前,要学会对程序功能进行规划,将其分为几个不同的功能模块,要思路清晰,简单易用; 2. 学会灵活运用已有的知识,同时适当的拓展一些知识;比如,这次设计过程中,有一些函数以前就很少用到,甚至没有见过,但对程序的设计及用户界面的改善带来方便; 3. 解决问题时,要尽可能考虑全面。每一个细节都很重要,既要避免功能的重复,也要避免功能疏漏的地方! 4. 在这次课程设计过程中,参考了许多资料,发现C语言真的很有意思!比如我看到一个关于用C++编写的小程序:五子棋、俄罗斯方块、推箱子等,等这次课程结束后,我就想利用C++编写这些小游戏。曾经认为C++是个挺枯燥的课程,现在发现这不仅仅是个简单的课程,而是个很实用的计算机工具! 在这次课程设计中,我们首先对系统的整体功能进行了构思,然后用结构化分析方法进行分析,将整个系统清楚的划分为几个模块,再根据每个模块的功能编写代码。由于我们是分工编写代码,最后需要将每个人的代码放到一起进行调试。因为我们每个人写的函数的思想不都一样,所以在调试的过程中也遇到了困难,但经过我们耐心的修改,终于功夫不负有心人,我们成功了! 参考文献 1、邵兰洁.C++面向对象程序设计.北京:清华大学出版社,2015年 2、钱能.C++程序设计教程.北京:清华大学出版社,2013年 3、谭浩强.C++程序设计(第三版).北京:清华大学出版社,2016年 评阅意见: 教师签名: 年 月 日 |