第四十讲 深入class(3)

       今天,再说新内容之前,想必大家更关心的昨天留给大家的思考题吧,这是一道简单的面试题,想必大家都已经有了自己的想法,不管如何,我们还是来探讨一下这个问题,首先看下面我的实现方案:
——————————————-
#include <iostream>#include <iomanip>using namespace std;

double getA(int n,int m);

int main()
{
int h,m;

double diff;

cout<<“请输入小时和分钟”<<endl;

while(cin>>h>>m)
{
if(m<0 || h<0)
break;

h = h%12;

m = m%60;

diff = getA(h,m);

if(diff<0)
diff = -diff;

cout.fill(‘0’);

cout<<setw(2)<<h<<“:”;

cout<<setw(2)<<m<<“=”<<diff<<endl;

}
        
return 0;

}
double getA(int h,int m)
{

return ((h*30+m/60.0*30) – m*6);

}
———————————————
第四十讲 深入class(3)
我想大家应该都是这样实现的,因为这种写法是最直接最易懂的,但是大家想想,这是C++职位的面试题,我们把程序写成了C风格,这合理吗?合理,肯定合理,只要能够实现相同的功能又有什么不合理呢?不过,我们再来看看下面的实现方案:
———————————————
#include “clock.h”
int main()
{
int h,m;

clock m_clock;

cout<<“请输入小时和分钟”<<endl;

while(cin>>h>>m)
{
m_clock.sethh(h).setmm(m).diffA();

m_clock.Show();

}

return 0;

}
————————————————-
如果我们给出了这个实现是不是觉得更有韵味一些呢?当然,光这样大家看不懂,所以我们可以再提供一个界面:
—————————————–
//clock.h
#pragma once
#include <iostream>#include <iomanip>using namespace std;


class clock{
public:
clock();

//默认构造函数
~clock();

//析构函数
clock&

sethh(int hh);

//设置小时数
clock&

setmm(int mm);

//设置分钟数
int gethh();

//获取小时
int getmm();

//获取分钟
void diffA();

//计算夹角度数
void Show();

//打印结果
private:
int m_mm,m_hh;

double diff;

};


———————————
第四十讲 深入class(3)
两种实现方案大家觉得哪一个更好一些呢?论简单,当然是第一个,但是这是一道C++的面试题,C++是面向对象的语言,所以面试官出这道题不但想要考察应试者的算法思维能力,同时还要考察面应试者对OO的思想的理解,所以,这就是我们上一讲所说的人用户只知其然不知其所以然的道理,至于实现方面我们可以这样来实现:
——————————————-
//clock.cpp
#include “clock.h”
clock::clock():m_mm(0),
m_hh(0),diff(0.0)
{
}

clock::~clock()
{
}

clock&

clock::sethh(int hh)
{
m_hh = hh%12;

return *this;

}
clock&

clock::setmm(int mm)
{
m_mm = mm%60;

return *this;

}
int clock::gethh()
{

return m_hh;

}
int clock::getmm()
{

return m_mm;

}

void clock::diffA()
{
diff = ((m_hh*30+((double)m_mm)/60.0*30) – (double)m_mm*6);

if(diff >180)
diff = 360-diff;

if(diff <0)
diff = -diff;

}

void clock::Show()
{
cout.fill(‘0’);

cout<<setw(2)<<m_hh<<“:”;

cout<<setw(2)<<m_mm<<“=”;
       cout<<diff<<endl;

}
—————————————
两种实现方案,第一种C风格,第二种完彻彻底底的C++风格,C风格的看上去简单明了,但给人一种混乱的感觉,C++的虽然看上去花去的篇幅较多,但是设计思路清晰,重要的是一旦设计好这个类,不只是现在可以用,以后需要用的时候可以拿出来重用。
通过这道面试题,给大家一条经验,如果大家面试的是C程序员,那么我们就使用第一种实现方案,如果面试的是C++职位,最好使用第二种方案。
看了下内容,发现今天说得似乎也不少了,这样吧,今天有些累,就到这里吧,既然昨天留给大家思考的题已经解决,那么大家接下来就思考一下关于我们的SpreadsheetData 的实现吧。

发表评论