2013级C++第4周(春)项目——再和对象找感觉

  1. 云栖社区>
  2. 博客>
  3. 正文

2013级C++第4周(春)项目——再和对象找感觉

贺利坚 2014-03-16 16:17:00 浏览690
展开阅读全文

课程主页在: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中其他成员函数
  注意,将3个set函数和3个get函数设计成内置成员函数,其他函数不作为内置函数。
  
【项目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(选做)】  下载salary.txt文件

  手工输入工资?!太让人不能忍受了。现给出包含了不足500个职工工资的文件salary.txt,从文件中读数据,完成上面的工作。

【项目4扩展3(选做)】

  增加一个成员函数,将排序后结果保存到一个文件中。

【项目4扩展4(选做)】将项目4用多文件的方式组织起来。


    

  
china-pub(正在发售)
卓越网(接受预订) 
图灵社区  官方试读本下载
豆瓣

==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

  
    





  

网友评论

登录后评论
0/500
评论
贺利坚
+ 关注