2013级C++第4周(春)项目——再和对象找感觉
课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答
有网友在我的博客中,在2011级的页面上留言问:“老师,为什么有的学生写着写着就不更新了呢?”这是我常想起来的痛。我没有能够让我的弟子们开成习惯,这是要我们大家一起解决的问题。
有些同学近日的低迷,读读《大学、软件外包》可能会有启发。生命的流程走上了这条分支,就在这条分支上前行。
在BB平台恢复正常之前,上机材料全从老师CSDN博客的课程主页下载。指导书中已经提供了源代码的,从博客中直接复制,以节约时间。
【项目0-掌握有对象的程序结构】不要求写报告
按照封装与信息隐藏的原则,除非特别需要,类中的数据成员需要设置为私有。由此带来的问题是,在类外如何访问这些私有成员?下面4段程序概括了常用的方法。请仔细阅读下面的程序,在阅读过程中,画出对象、变量在内存中的表示图,写出这些程序的运行结果(包括变量的变化过程及程序的最终输出),达到彻底理解这些机制的目标。
(1)通过公共函数为私有成员赋值
#include <iostream> using namespace std; class Test { private: int x, y; public: void setX(int a) { x=a; } void setY(int b) { y=b; } void printXY(void) { cout<<"x="<<x<<‘\t‘<<"y="<<y<<endl; } } ; int main() { Test p1; p1.setX(3); p1.setY(5); p1.printXY( ); return 0; }
(2)利用指针访问私有数据成员
#include <iostream> using namespace std; class Test { private: int x,y; public: void setX(int a) { x=a; } void setY(int b) { y=b; } void getXY(int *px, int *py) { *px=x; //提取x,y值 *py=y; } }; int main() { Test p1; p1.setX(3); p1.setY(5); int a,b; p1.getXY(&a,&b); //将 a=x, b=y cout<<a<<‘\t‘<<b<<endl; return 0; }
(3)利用函数访问私有数据成员
#include <iostream> using namespace std; class Test { private: int x,y; public: void setX(int a) { x=a; } void setY(int b) { y=b; } int getX(void) { return x; //返回x值 } int getY(void) { return y; //返回y值 } }; int main() { Test p1; p1.setX(3); p1.setY(5); int a,b; a=p1.getX( ); b=p1.getY(); cout<<a<<‘\t‘<<b<<endl; return 0; }
(4)利用引用访问私有数据成员
#include <iostream> using namespace std; class Test { private: int x,y; public: void setX(int a) { x=a; } void setY(int b) { y=b; } void getXY(int &px, int &py) //引用 { px=x; //提取x,y值 py=y; } }; int main() { Test p1,p2; p1.setX(3); p1.setY(5); int a,b; p1.getXY(a, b); //将 a=x, b=y cout<<a<<‘\t‘<<b<<endl; return 0; }
【项目1 - 三角形类1】下面设计一个三角形类,请给出各成员函数的定义
#include<iostream> #include<Cmath> using namespace std; class Triangle { public: void setABC(double x, double y, double z);//置三边的值,注意要能成三角形 void getABC(double *x, double *y, double *z);//取三边的值 double perimeter(void);//计算三角形的周长 double area(void);//计算并返回三角形的面积 private: double a,b,c; //三边为私有成员数据 }; int main() { Triangle tri1; //定义三角形类的一个实例(对象) tri1.setABC(4,5,6); //为三边置初值 double x,y,z; tri1.getABC (&x,&y,&z); //将三边的值为x,y,z赋值 cout<<"三条边为:"<<x<<‘\t‘<<y<<‘\t‘<<z<<endl; cout<<"三角形的周长为:"<< tri1.perimeter()<<‘\t‘<<"面积为:"<< tri1.area()<<endl; return 0; } //请在下面定义Triangle类中的各个成员函数
【项目2 - 三角形类2】程序功能同项目1,main()函数如下,请重新定义Triangle类,其中逻辑特别简单的set和get成员函数,要处理为内置成员函数,直接在类内定义。
int main() { Triangle tri1; //定义三角形类的一个实例(对象) double x,y,z; cout<<"请输入三角形的三边:"; cin>>x>>y>>z; tri1.setA(x); tri1.setB(y); tri1.setC(z); //为三边置初值 if(tri1.isTriangle()) { cout<<"三条边为:"<<tri1.getA()<<‘,‘<<tri1.getB()<<‘,‘<<tri1.getC()<<endl; cout<<"三角形的周长为:"<< tri1.perimeter()<<‘\t‘<<"面积为:"<< tri1.area()<<endl; } else cout<<"不能构成三角形"<<endl; return 0; }
【项目3 - 程序的多文件组织】
一、多文件组织的必要
当程序规模变大后,一个程序用多个文件组织,便于组织生产。这样,不必每次都重复对所有代码进行编译,而只需编译一次即可。把编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。
C++中一种常用的做法是,独立出一个头文件(.h)来。正确使用头文件带来的好处包括:
- 支持代码的局部单独编译,尤其对类及成员函数声明;
- 保证所有文件使用给定实体的同一声明;
- 当声明需要修改时,只有头文件需要更新。
头文件中声明过的类、函数,在另外一个源程序文件(.cpp)中实现。
类的成员函数定义在头文件中只有一个例外,那就是内置(inline)成员函数需要定义在头文件中。
另外,一些const对象要定义在头文件中。
二、Code::Blocks中多文件项目的建立
1、先建立项目(Project)
建好的项目只有一个源文件。在这个文件中,包含有main()函数。
2、维护项目中的各种文件
在菜单中选择File - New - File...,出现如图1所示的窗口,可以加入头文件(header),也可以加入源文件(source)。
图1 新建文件
按向导的指示建立文件,图2显示的是有两个源文件、一个头文件的项目结构。
图2 多文件的项目结构
头文件中做声明,源文件中做定义。在需要的位置,如:#include "Triangle.h"(图2中)。include后用引号,优先在当前文件夹下找包含的文件,而用 <> 符号,是要到系统包含文件夹中找包含文件。
用鼠标右击项目名,有Add files...和Remove files...等菜单选项,可以完成多文件项目的组织。
三、项目3的实践内容利用多文件组织,重新实现项目2。其中,整个项目包括3个文件:
- 主文件: main.cpp,用于定义main()函数
- 头文件: triangle.h,头文件,声明类,定义内置成员函数
- 类定义文件: triangle.cpp,用于定义类Triangle中其他成员函数
【项目4 - 数组作数据成员】阅读教材P255例8.4,注意到类中的数据成员可以是数组。设计一个工资类(Salary),其中的数据成员如下类的声明。
class Salary { public: void set_salarys( ); //(1) void add_salarys(int x); //(2) void sort_salarys(); //(3) void show_salarys( ); //(4) private: double salarys[50]; //工资 int number; //实际人数 };请设计成员函数实现下面的功能:
(1)输入职工工资,工资保存到salary数组中,实际人数保存到number[]中(输入-1标志着工资输入结束);
(2)给每个人涨500元工资(add_salarys是有参函数,在调用时,500当实参);
(3)对涨后的工资进行排序;
(4)输出排序后的工资。
(5)在main函数定义Salary类的对象,调用你自己设计好的成员函数,完成相关的工作。
【项目4扩展1(选做)】
使用salary[50]有限制,实际人数少时,会浪费空间,人数多了,无法完成任务。在main()中先输入职工人数,作为参数传递给输入职工工资的成员函数,然后利用教材P217所讲的动态分配内存的运算符new,开辟一个大小正好的连续空间,完成上面的工作。
【项目4扩展2(选做)】
手工输入工资?!太让人不能忍受了。现给出包含了不足500个职工工资的文件salary.txt,从文件中读数据,完成上面的工作。
【项目4扩展3(选做)】
增加一个成员函数,将排序后结果保存到一个文件中。
【项目4扩展4(选做)】将项目4用多文件的方式组织起来。
china-pub(正在发售) 卓越网(接受预订) 图灵社区 官方试读本下载 豆瓣 | ==================== 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章分类目录(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| ======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ======= |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。