【同济】C++结构体、类和对象- Part II–类和对象[2025-06-18]
§7.结构体、类和对象- Part II–类和对象
首次提醒:6.18为本课程所有作业的最终截止时间,考虑到批改作业需要预留一定时间,不支持任何理由的延期!
[注意:]
1、本次作业不允许使用未学过的知识点,包括 STL容器等
2、除明确要求外,已学过的知识中不允许使用 goto/全局变量/C++的 string类
3、cstdio、cmath、cstring中的系统函数可以直接使用,包括课上未介绍过的,具体可自行查阅相关资料
4、除明确要求外,所有 cpp源程序不允许使用 scanf/printf进行输入/输出
5、多编译器下均要做到“0 errors,0 warnings”
6、输出为浮点数且未指定格式的,均要求为 double型, C++为 cout缺省输出, C为%lf的缺省输出
7、认真阅读格式要求及扣分说明!!!
[输出格式要求:]
1、为方便机器自动判断正确性,作业有一定的输入输出格式要求(但不同于竞赛的无任何提示)
2、每个题目见具体说明,必须按要求输入和输出,不允许有偏差
3、没有特别说明的情况下,最后一行有效输出的最后有一个endl
4、本次作业的比对要求为 txt_compare在–trim right下与 demo做到完全一致
补充:
3、题目同 3-b5(从键盘输入年月日的值,计算这是该年的第几天)
①用类封装的形式实现
基准程序 7-b3.cpp已部分给出,按要求完成即可(不要违规)
4、已知三角形的三点坐标,求三角形的面积
①用类封装的形式实现,要求用两种类封装方式
②类的定义和实现放在 7-b4-1. h/7-b4-2. h中,按要求补充完整即可(不要违规,需要提交)
测试用例放在 7-b4-1. cpp/7-b4-2. cpp中(检查作业时会替换,不需要提交)
④ 7-b4-1.cpp/7-b4-2.cpp的区别就是包含头文件的不同,其余均相同
项目组织结构如下图所示
5、已知有某门课前后两轮的选课名单,对比前后两轮的名单,打印出的相应的选课数据分析
(学习静态链接库的使用方法)
程序已部分给出,按要求完成即可
提供7-b5-demo.exe供参考
附件给出了本课程04班理论课(5000244001604)三轮选课的名单,可以任意两两前后组合,查看程序的输出(将附件给出的文件名改短,不要带空格,也可以改成1.txt等简易形式)
读文件的方法没学过也不用学,通过调用静态链接库中已实现的两个函数read_stulist和print_stulist来完成,具体方法见⑤
如何在项目中使用静态链接库(以7-b5为例)
a)建立7-b5项目,将附件给出的7-b5.cpp、read_stulist.h、lib_read_stulist.lib和lib_read_stulist.pdb文件复制到7-b5项目对应的目录下(注意文件名要去掉多余的前缀),如图所示
b)将基准源文件7-b5.cpp添加到项目中(源文件-鼠标右键菜单-添加-现有项-出现的对话框中选择7-b5.cpp)
将头文件read_stulist.h添加到项目中(头文件-鼠标右键菜单-添加-现有项-出现的对话框中选择 read_stulist.h)
d)将 lib_read_stulist.lib静态链接库文件添加到项目中(项目-右键菜单-添加-现有项-出现的对话框中选择lib_read_stulist.lib)
e)lib_read_stulist.pdb文件不需要放入项目中(但需要在文件目录中存在)
f)完成后的项目组织结构如下图所示
注意:文件命名必须符合图示规则,如果不按要求而造成编译错误则得分为0
选课名单每行一个学生,排列无序且可能重复,除此之外的其它信息正确与否不用管,处理read_stulist读到的结果即可
附件给出的read_stulist.h和lib_read_stulist.lib、lib_read_stulist.pdb不准修改,也不需要提交,检查作业时会用新的lib_read_stulist.lib放入并编译
例:新的 lib_read_stulist.lib用于读取姓名在前、学号在后的选课名单,只要保证放入struct student中正确,就不影响本题你做的部分的正确性
要求最后的输出按学号升序排列
本题仅要求VS方式实现即可
[输出格式要求]
1、每行输出的序号固定宽度为4、学号固定为7、第一轮/第二轮固定为6、姓名需要动态适应(测试方法,给姓名最长的同学再加一个字)
2、每行首尾各空一个空格,列之间为两个空格
3、输出左对齐
4、要求txt_compare在–trim right下与demo保持一致
6、定义一个简单的Date类,能实现以下要求:
①有年、月、日三个成员
②允许用以下方式进行对象初始化
Date d1;
//2000.1.1(无参构造,默认为2000.1.1)
Date d2(2025,6,12);//2025.6.12(三参构造,分别对应年月日)
Date d3(45819);//2025.6.12(一参构造,参数值表示从1900.1.1开始的天数)
定义set成员函数,能设置对象的日期
同时设定年月日(月、日默认均为1):
set(2025,6,12);
//设置当前日期为2025.6.12
set(2025,6);
//设置当前日期为2025.6.1
set(2025);
//设置当前日期为2025.1.1
同时设定年月日(含非法值,若多个非法则按年月日的顺序处理):
set(1899,2,29);
//年1899非法默认为2000,此时月日合法,值问哦2000.2.29
set(1899,13,32);//年1899非法默认为2000,月13非法,默认1,日32非法默认1只设定年、月、日的部分(为0的参数不变)
(假设对象当前日期是2025.6.12)
set(2007,0,0);//设日期为2007.6.12(月日不变)
set(0,3,18);//设日期为2025.3.18(年不变)
定义get成员函数,能取对象当前的日期
(假设对象当前日期是2025.6.12)
get(y,m,d);//y,m,d为int型变量,调用后y,m,d的值分别是2025、6、12
定义 show成员函数,能显示对象当前的日期(xxxx.x.x形式)
[要求:]1、Date类的定义放在7-b6.h中,Date类成员函数的体外实现要求放在7-b6.cpp中,两个文件均已部分给出,按要求完成即可(不要违规)
2、在7-b6-main.cpp中给出了Date类的测试用例,不需要提交,检查作业时会替换
3、限定日期的范围为1900.1.1-2099.12.31,闰年、大小月的合法性要进行考虑
4、在构造函数及set函数中若出现非法年份,均用缺省值2000代替
例:Date d1(1870,3,15),则 d1为 2000.3.15
d1.set(2112,3,4),则d1为2000.3.4
在构造函数及set函数中若出现月、日非法,均按缺省值1处理
例:Date d1(2024,13,15),则d1为2024.1.15
d1.set(2024,5,32),则d1为2024.5.1
非法的判断按年月日的顺序进行处理,多个非法值也按年月日的顺序处理
例:Date d1(1899,2,29),则d1为2000.2.29
d1.set(1899,2,30),则d1为2000.2.1
6、提供7-b6-demo.exe供参考
7、程序注释与实际代码的日期如果不同,以代码为准
8、项目组织结构如下图所示
[编译器要求:]
编译器VS | 编译器Dev | ||
---|---|---|---|
7-b3.cpp | 计算天数(类封装形式) | Y | Y |
7-b4-1.h | 求三角形面积(方法1) | Y | Y |
7-b4-2.h | 求三角形面积(方法2) | Y | Y |
7-b5.cpp | 选课数据分析 | Y | |
7-b6.cpp | 简单Date类 | Y | Y |
[作业要求:]
1、6月18日前网上提交本次作业
2、每题所占平时成绩的具体分值见网页
3、超过截止时间提交作业会自动扣除相应的分数,具体见网页上的说明
再次提醒:6.18为本课程所有作业的最终截止时间,考虑到批改作业需要预留一定时间,不支持任何理由的延期!