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中其他成员函数

  注意,将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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

  
    

  

时间: 2024-09-20 04:14:53

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

2013级C++第6周(春)项目——对象指针、const

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 推荐"玻璃罩const"系列的三篇文章(http://blog.csdn.net/sxhelijian/article/details/7385683),掌握利用const完成数据保护. 1. 使用常对象--为共用数据加装一个名为const的玻璃罩: 2. 常(const)+ 对象 + 指针:玻璃罩到底保护哪一个:

2013级C++第2周(春)项目——结构体应用大体验

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 第一部分 结构体应用 [项目1-学生成绩统计]   每位同学的信息学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[12]).姓名(name).三门课的成绩(grade).总分(score).均分(average)). (1)从键盘上输入N名学生的信息(N定义为常变量

2013级C++第11周(春)项目——通过继承拥有基类的资源

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 (注:本课资料由第9周直接到第11周,因为第10周是我校春假期,全校休课.春假,实际是五一.清明.端午打包一起休息,这亲戚的做法对按周安排活动的学校更好一些.) 第一部分 程序阅读 程序阅读1:  #include<iostream> using namespace std; class A { private: int x; protect

2013级C++第8周(春)项目——运算符重载

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目1]实现复数类中的运算符重载(1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(C

2013级C++第9周(春)项目——运算符重载(二)

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [程序阅读]阅读程序"简单C++学生信息管理系统",找出其中出现构造函数.友元函数.运算符重载.静态数成员语法现象出现的位置,仔细体会其用法,在以后的设计中能够灵活应用有关方法和技巧 项目1-3直接复制第8周的代码,加入要求的运算符重载定义后,作为第9周的任务另外发博文.[项目1]在第8周项目1基础上(1)再定义一目运算符 -,-c相

2013级C++第15周(春)项目——输入输出流及文件文件操作

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 本周程序阅读及程序调试中需要的文件,请到http://pan.baidu.com/s/1qW59HTi下载. 第一部分 阅读程序(运行程序时,由上面的链接下载源代码)1.阅读教材例13.1到例13.7的程序,根据所用到的函数在功能上的限制,自己设计输入的测试数据,运行程序.(1)与自己的期望结果相对照,理解各个函数的用法:(2)深入理解数据流类

2013级C++第12周(春)项目——成员的访问属性、多重继承

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读  1.阅读程序,分析类中成员的访问属性 #include <iostream> using namespace std; class A //A为基类 { public: void f1( ); int i; protected: void f2(); int j; private: int k; }; class B:

2013级C++第16周(春)项目——二进制文件及字符流

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 本周程序阅读及程序调试中需要的文件,请到http://pan.baidu.com/s/1i3LxmDZ下载.期末临近,为适应OJ平台及熟悉内容,请自抽时间完成OJ平台的有关练习. 第一部分 阅读程序1.仔细研读例13.16.例13.17和例13.18(见下载链接),体会二进制文件和字符串流操作的一般方法.2.阅读下面的程序,指出其功能,并对比例

2013级C++第1周(春)项目——枚举类型与结构体初步

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目0-闲谈几点] 学习信息技术的大学生,在初接触行业,就能够进入到专业社区,有机会了解行业最新进展.享受海量资源.接触专业人士.获得实践机会,也给自己创造了一个全新.开放的展示空间,我们可以拥抱这样的机会. 与互联网相关的大学生,学习程序设计课程过程中,就同互联网亲密接触,学会驾驭,学会融入,各种观念,乃至于技术会逐渐深入.在进一步的学习过程中,博客.搜索.论坛.Em