第3周-任务2-改造坏程序

题目:(教材P261页第1题)上机前在纸上先找出错误,然后上机调试,使之正常运行。运行时输入时分秒,检查输出是否正确。

要求:在实验报告中,在改动处加注释说明理由

#include <iostream>
using namespace std;
class Time
{ 
	void set_time(void) ;
	void show_time(void);
	int hour;
	int minute;
	int sec;
};
Time t;

int main()
{
	set_time();
	show_time();
	return 0; 
}
int set_time(void)  
{
	cin>>t.hour;
	cin>>t.minute;
	cin>>t.sec;
}


int show_time(void) 
{
	cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}

反思同学们在后面编程中出现的问题,此题中的程序太坏了。甚至我有些后悔布置这道题,此题中的毛病有此传染哩。因此,必须坚决地揭露此程序中的坏分子,让其曝光于这朗朗乾坤。

在改错以前,我先将其中错误及不妥之处标出。我们要从全局的角度看待这个程序,否则,改一处带来的其他错误会将人绕晕。

#include <iostream>
using namespace std;
class Time  
{ 
	void set_time(void) ;
	void show_time(void);
	int hour;
	int minute;
	int sec;
};   //在这个类的定义中,语法并无错误,但其成员的属性都采用了默认值(private),这会导致在使用类的对象时,无法访问其任何成员
     //改进思路:在一般情况下,将数据成员声明为私有(private),而成员函数声明为公有(public)。
     //要极其谨慎地将数据成员声明为公有,必要时,只为本类内使用的成员函数作为私有类型

Time t; //从语法角度,也无任何问题。但是任何时候,使用全局变量(对象)
        //此处既是一坏,改造程序时将t的定义放入main()函数中,作局部变量(对象)使用。本题只在于创建一个时间对象并显示,这样做是合适的

int main()
{
	set_time();   //可以想到在面向对象的程序中,此句为对象的成员函数的调用。这句可能不会出问题,是因为set_time()在后面并未被定义为成员函数;
                      //另外,若真不将set_time()作为成员函数对待的话,先调用、后定义也不妥。
	show_time();  //同上
	return 0; 
}
int set_time(void)  //结合背景,显然这应该要定义在类中声明的成员函数,遗漏了类作用符“Time::”,这是大事。另外,返回值类型和类中的声明也不相同
{
	cin>>t.hour;     //在类的成员函数中,类的数据成员是可以直接使用的。之前将t不当地定义为全局变量(对象)可能避免了编译器检查出此问题|
                         //直接用,即cin>>hour,意味着该类中任何一个对象均可以通过cin为其hour成员获得值
                         //在类的成员函数中,cin>>t.hour意味着是为该类中的一个特殊对象t服务的,天理不容
	cin>>t.minute;   //同上
	cin>>t.sec;      //同上
}


int show_time(void)      //同上一成员函数
{
	cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}

所以,改正的程序是:

#include <iostream>
using namespace std;
class Time
{
public:   //成员函数为public型
	void set_time(void) ;
	void show_time(void);
private:  //数据成员为privte型
	int hour;
	int minute;
	int sec;
};

int main()
{
	Time t;    //声明局部于main()的对象
	t.set_time();   //调用类的公共成员是这样嘀……
	t.show_time();
	return 0; 
}
void Time::set_time(void)  //加上“Time::”,明确set_time是类的成员函数,前面已经声明,现在正式定义(实现)
                           //函数返回值类型改为void,与类中的声明一致
{
	cin>>hour;   //去除hour前的“t.”,意味着哪个对象调用set_time,输入的就是这个对象的hour值
	cin>>minute;
	cin>>sec;
}

void Time::show_time(void) //参见set_time的修改说明
{
	cout<<hour<<":"<<minute<<":"<<sec<<endl;   //数据成员前的“t.”全去除
}

总结:需要不断深刻理解类和对象的概念,并将其思想用于程序设计的实践;通过对此类程序的剖析,加深对基本概念的理解。相辅相成,循环往复,不断进步。


<本文完>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值