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

简介: 课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答  有网友在我的博客中,在2011级的页面上留言问:“老师,为什么有的学生写着写着就不更新了呢?”这是我常想起来的痛。我没有能够让我的弟子们开成习惯,这是要我们大家一起解决的问题。  有些同学近日的低迷,读读《大学、软件

课程主页在: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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

  
    





  

目录
相关文章
|
11天前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
13 3
|
1月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
1月前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
2月前
|
存储 安全 编译器
【C++】类和对象(下)
【C++】类和对象(下)
【C++】类和对象(下)
|
2月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
2月前
|
C++
C++ --> 类和对象(三)
C++ --> 类和对象(三)
36 9
|
2月前
|
编译器 C++
【C++】类和对象(中)
【C++】类和对象(中)
|
2月前
|
存储 编译器 程序员
【C++】类和对象(上)
【C++】类和对象(上)
|
2月前
|
编译器 C++ 开发者
C++ --> 类和对象(二)
C++ --> 类和对象(二)
32 7
|
2月前
|
存储 编译器 C++
【C++】类和对象(下)
【C++】类和对象(下)
下一篇
无影云桌面