杂例02-学生一卡通消费统计

学生一卡通消费统计

原题链接
gitee Code-ZH_Cpp/Study/Modify-2019JavaTest (Gitee)

总结

  1. map类型如果作为类的static成员,需要在类外定义

  2. 使用istringstream对象配合getline函数可以实现字符串的分割

    例如:Record类的构造函数(配合str_cast辅助函数)

    //辅助函数
    //用于将字符串转换到类型T数值的内联函数
    template<class T>
    inline T str_cast(const string& str) {
        istringstream cast(str);
        T result;
        cast >> result;
        return result;
    }
    //……
    Record::Record(const string& info) {    //构造函数,使用包含所有信息的字符串
            istringstream is(info);
            string s_type,s_amount, s_location;
            getline(is, s_type, ' '); type = str_cast<int>(s_type);
            getline(is, s_amount, ' '); amount = str_cast<double>(s_amount);
            getline(is, s_location, ' '); location = str_cast<int>(s_location);
        }
  3. 适当地声明一些友元函数可以提高这些函数获取私有数据的速度

    例如:Record类中声明了

    friend ostream& operator<<(ostream& out, const Record& record);
    friend class Card;    //便于Card类获取用卡类型和金额
  4. 如果在某一类的方法实现中使用了其他类的对象(或引用),应该在这个对象的类完整定义后再给出这一函数定义

    例如:本题中的Card类setRecord方法使用到了Student类的对象的引用,应该在Student类完整定义后再给出setRecord方法的定义

  5. 位于<algorithm>头文件中的sort方法:

    template <class _RanIt, class _Pr>
    sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred);    // order [_First, _Last), using _Pred

    第一个参数为容器要排序的起始位置对迭代器,第二个参数为终止位置的下一个位置对迭代器,第三个参数(可选)为排序要用的比较大小函数指针(默认升序)

    例如:找到存钱最多的学生中使用了辅助比较函数,以学生存钱为依据降序排列,取第一个元素即为所要找的学生

    //辅助比较函数,以学生存钱为依据降序排列
    bool cmp(const Student& st1, const Student& st2) {
        return (st1.stuCard.getSave() > st2.stuCard.getSave());
    }
    //保存存钱最多的学生到文本文件
    void SaveTop(vector<Student> Students_t, const string& fileName) {
        //这里是值传递,排序不会影响主调方的原来的顺序
        sort(Students_t.begin(), Students_t.end(), cmp);
        ofstream fout(fileName, ios_base::out);
        Students_t[0].show(fout);
        fout.close();
    }
  6. 为了使自定义的数据类型可以比较大小,可以为自定义的类重载比较运算符

    例如本题中,为使得学生类可以用一卡通消费金额作为默认的比较依据,为其重载了<运算符,使得在调用sort方法时可以不用提供排序用的函数:

    //Student类中
    //重载<,用一卡通消费金额作为比较依据
    bool operator<(const Student& stu) const {
        return (this->stuCard.getSpend() < stu.stuCard.getSpend());
    }
    //对vector对象students排序时
    sort(Students.begin(), Students.end());

题目

详见Gitee链接

按以下要求编写程序

题目说明

给定三个文本文件,它们的格式及含义如下:

  1. Stddata.txt 存放了若干学生的基本信息,每个学生一行,各基本信息间以空格分隔

    (格式:14位学号 姓名 入学年份 专业 联系电话)

    例如: 20188374858604 宋和科 2018 电器工程 133279242

  2. Recorddata.txt 存放了一卡通的用卡情况,一张卡可以有若干消费记录,一行对应一条消费记录,消费记录的各信息间以空格分隔

    (格式:10位卡号 用卡类型 发生金额 发生地点编号)

    例如: 0000000007 0 28.72 2

    用卡类型有两种:0-表示存钱操作;1-表示消费操作

    发生地点变化目前有4个点,编号0~3

  3. StdCard.txt 存放了学生持有的一卡通的状况,学生与一卡通间一一对应,每个学生一行,各基本信息间以空格分隔

    (格式:14位学号 10位一卡通卡号)

    例如:20181028947850 0000000005

    表示学号是20181028947850的学生使用的一卡通卡号为0000000005

题目要求

  1. 合理设计:类内部的数据及方法,以及类与类之间的关系。

  2. 完成如下一些功能:

    (1)从消费情况文件Recorddata.txt文件中加载所有用卡信息,从Stddata.txt文件中读取所有学生信息,从学生持卡文件StdCard.txt中读取学生持卡状况,完成数据的导入和整合。

    (2)统计每位学生一卡通的消费情况(注:存钱类操作不关注),并按消费金额的非降序对学生进行排序,将排序后的学生基本信息、其对应的一卡通基本信息和消费总金额发送到屏幕显示。

    (3)将存钱最多的学生的基本信息、其对应的一卡通信息,以及他的详细的用卡信息以文本文件的形式保存到SaveTop.txt文件。

全部评论

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
投递哔哩哔哩等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务