| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4407 人关注过本帖
标题:华为又出变态面试题!大家请看以下代码 在看懂的同时 修改错误!
取消只看楼主 加入收藏
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
 问题点数:0 回复次数:6 
华为又出变态面试题!大家请看以下代码 在看懂的同时 修改错误!
#include<iostream>
using namespace std;
#include <ctime>

class CLF_DateTime
{
private:

    struct tm *local;

public:
    CLF_DateTime(int year, int month, int day,int hour, int min,int sec);

    CLF_DateTime(CLF_DateTime &x);
    
    CLF_DateTime()
    {
        
    }    
    ~CLF_DateTime(void);
    void display(char * strdisplay);
    void setdisplay(char * setstrdisplay);
    int compare(CLF_DateTime* pa, CLF_DateTime* pb);

};

CLF_DateTime::CLF_DateTime(CLF_DateTime &x)
    {
        local = new tm;
        local->tm_year =x.local->tm_year;//struct tm中定义的年成员tm_year是以1900为基数的,也就是说他显示2007时tm_year值并不是2007
        local->tm_mon = x.local->tm_mon;//月份可见definition里有说明是[0,11]所以比现实小了一个月
        local->tm_mday = x.local->tm_mday;
        local->tm_hour =x.local->tm_hour;
        local->tm_min =x.local->tm_min;
        local->tm_sec =x.local->tm_sec;
        
    }
CLF_DateTime::CLF_DateTime(int year, int month, int day,int hour, int min,int sec)
    {
        local = new tm;
        local->tm_year = year-1900;//struct tm中定义的年成员tm_year是以1900为基数的,也就是说他显示2007时tm_year值并不是2007
        local->tm_mon = month-1;//月份可见definition里有说明是[0,11]所以比现实小了一个月
        local->tm_mday = day;
        local->tm_hour =hour;
        local->tm_min =min;
        local->tm_sec =sec;
   
    }

CLF_DateTime::~CLF_DateTime(void)
    {
        delete(local);
        local = NULL;
    }

void CLF_DateTime::display(char * strdisplay)
    {
        
        strftime(strdisplay,80,"%Y-%m-%d %H:%M:%S",local);
        

    }
void CLF_DateTime::setdisplay(char * setstrdisplay)
    {
        if(local->tm_sec<30&&local->tm_sec>=0)
        {   
            local->tm_sec=0;
            strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
        }
   
        else if (local->tm_sec>=30&&local->tm_sec<=60)
        {
            local->tm_min+=1;
            local->tm_sec=0;
            strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
        }
        if (local->tm_min>=60)
        {
            local->tm_hour+=1;
            local->tm_min=0;
            strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
        }
        if (local->tm_hour>=24)
        {
            local->tm_mday+=1;
            local->tm_hour=0;
            strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
    
        }
        if (local->tm_mon==1||local->tm_mon==3||local->tm_mon==5||local->tm_mon==7||local->tm_mon==8||local->tm_mon==10||local->tm_mon==12)
        {
            if(local->tm_mday>=31)
            {
                local->tm_mon+=1;
                local->tm_mday=1;
                strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
            
            }
        }
        else if (local->tm_mon==4||local->tm_mon==6||local->tm_mon==9||local->tm_mon==11)
        {
            if(local->tm_mday>=30)
            {
                local->tm_mon+=1;
                local->tm_mday=1;
                strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
                
            }
        }
        else if (local->tm_mon==2&&(local->tm_year%400==0||(local->tm_year%4==0&&local->tm_year%100!==0)))
        {
            if(local->tm_mday>=29)
            {
                local->tm_mon+=1;
                local->tm_mday=1;
                strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
                
            }
        }
        else if (local->tm_mon=2)
        {
            if(local->tm_mday>=28)
            {
                local->tm_mon+=1;
                local->tm_mday=1;
                strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
                
            }
        }
        if (local->tm_mon>=12)
        {
            local->tm_year+=1;
            local->tm_mon=1;
            strftime(setstrdisplay,80,"%Y-%m-%d %H:%M:%S",local);
        
            
        }


int CLF_DateTime::compare(CLF_DateTime* pa, CLF_DateTime* pb)
    {
        
            if(pa.local->tm_year>pb.local->tm_year)
            
            {
                cout<<"1"<<endl;
            }
            else if(pa.local->tm_year<pb.local->tm_year)
            {
                cout<<"-1"<<endl;
            }
            else if(pa.local->tm_yaer==pb.local->tm_year)
            {
                if (pa.local->tm_mon>pb.local->tm_mon)
                {
                    cout<<"1"<<endl;
                }
                else if(pa.local->tm_mon<pb.local->tm_mon)
                {
                    cout<<"-1"<<endl;
                }
                else if(pa.local->tm_mon==pb.local->tm_mon)
                {
                    if(pa.local->tm_mday>pb.local->tm_mday)
                    {
                        cout<<"1"<<endl;
                    }
                    else if(pa.local->tm_mday<pb.local->tm_mday)
                    {
                        cout<<"-1"<<endl;
                    }
                    else if(pa.local->tm_mday==pb.local->tm_mday)
                    {
                        if(pa.local->tm_hour>pb.local->tm_hour)
                        {
                            cout<<"1"<<endl;
                        }
                        else if(pa.local->tm_hour<pb.local->tm_hour)
                            {
                                cout<<"-1"<<endl;
                            }
                        else if(pa.local->tm_hour==pb.local->tm_hour)
                        {
                            if(pa.local->tm_min>pb.local->tm_min)
                            {
                                cout<<"1"<<endl;
                            }
                            else if(pa.local->tm_min<pb.local->tm_min)
                            {
                                cout<<"-1"<<endl;
                            }
                            else if (pa.local->tm_min==pb.local->tm_min)
                            {
                                if(pa.local->tm_sec!=0)
                                {
                                    cout<<"1"<<endl;
                                }
                                else  
                                {
                                    cout<<"0"<<endl;
                                }
                            }
                
                
    }

void main()
{
    CLF_DateTime pa(2007,11,8,14,52,10);
    CLF_DateTime pb(pa);
    char testdisplay[100];

    cout<<"Your input date and time is: ";
    pa.display(testdisplay);
    cout<<strdisplay<<endl;
    cout<<"Provide rounding:";
    pa.setdisplay(testdisplay);
    cout <<setstrdisplay<<endl;
    cout<<"compare time:";
    (pb);
}
搜索更多相关主题的帖子: 华为 代码 面试 
2007-12-11 14:45
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
得分:0 
回复 7# 的帖子
谢谢您的程序 好厉害啊 但是我运行了一下 有一些问题,
1.年输出的是3907
2.题目的意思是原有时间同四舍五入后的时间进行比较 原有时间大输出1,四舍五入时间大输出-1,相等输出0.您的程序不太符合题意.
3.您的程序我没有看到对闰年的判断.
谢谢指教!

雕刻单调的人生
2007-12-17 09:20
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
得分:0 
回复 7# 的帖子
我把您的程序改动了一下 但还是有问题!请您看看再给些指教 谢谢!
#include <iostream>
using namespace std;
#include <ctime>

class CLF_DateTime : public tm
{
    inline void carry(int& v1,int& v2,int v3)
{
    v1+=v2/v3;
    v2%=v3;
}
public:
    CLF_DateTime(int year=0,int month=0,int day=0,int hour=0,int min=0,int sec=0)
    {
            tm_year=year-1900;tm_mon=month-1;tm_mday=day;
            tm_hour=hour;tm_min=min;tm_sec=sec;
       }

    ~CLF_DateTime()
    {
    
    }

char* display(char* strdisplay)
    {
        strftime(strdisplay,80,"%Y-%m-%d %H:%M:%S",this);
        return strdisplay;
    }
char* setdisplay(char* strdisplay)
    {
        tm_min+=tm_sec>=30;
        tm_sec=0;
        carry(tm_hour,tm_min,60);
        carry(tm_mday,tm_hour,24);
        switch (tm_mon)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            carry(tm_mon,tm_mday,31);
            break;
        case 2:
            if (tm_year%400==0||(tm_year%4==0&&tm_year%100!=0))
                carry(tm_mon,tm_mday,29);
            else
                carry(tm_mon,tm_mday,28);
            break;
        default:
            carry(tm_mon,tm_mday,30);            
        }
        carry(tm_year,tm_mon,12);
        return display(strdisplay);
    }
int compare(CLF_DateTime& pb)
    {

        if(tm_year>pb.tm_year)
            return 1;
        else if(tm_year<pb.tm_year)
            return -1;
        else if(tm_yaer==pb.tm_year)
        {
            if (tm_mon>pb.tm_mon)
                return 1;
            else if(>tm_mon<pb.tm_mon)
                return -1;
        }    
        else if(tm_mon==pb.tm_mon)
        {
            if(tm_mday>pb.tm_mday)
                return 1;
            else if(tm_mday<pb.tm_mday)
                return -1;
        }    
        else if(tm_mday==pb.tm_mday)
        {
            if(tm_hour>pa.tm_hour)
                return 1;
            else if(tm_hour<pb.tm_hour)
                return -1;
        }
        else if(tm_hour==pb.tm_hour)
        {
            if(tm_min>pb.tm_min)
                return 1;
            else if(tm_min<pb.tm_min)
                return -1;
        }    
        else if (tm_min==pb.tm_min)
        {
            if(pb.tm_sec!=0)
                return 1;
            else  
                return 0;
                                
        }
    }

};
void main()
{
    CLF_DateTime pa(2007,12,31,23,59,59);
    CLF_DateTime pb(pa);
    char testdisplay[100];

    cout<<"Your input date and time is: ";
    cout<<pa.display(testdisplay)<<endl;
    cout<<"Provide rounding:"<<pa.setdisplay(testdisplay)<<endl;
    cout<<"compare time:"<<(pb)<<endl;
    getchar();
}

雕刻单调的人生
2007-12-17 11:31
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
得分:0 
回复 18# 的帖子
首先我想真心的对您说声谢谢!
对于一个不认识的人 您能如此细致的进行讲解 真的让我十分的感动!
我是一个c++的初学者,对于您写的程序我真的好佩服!其中有很多东西都是我无法想到的!看您的程序让我学习到了很多东西!谢谢
我希望能和您认识!并渴望和您成为朋友!
我的qq:20666839
我的msn:ppxxu@

雕刻单调的人生
2007-12-18 10:08
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
得分:0 
回复 18# 的帖子
我还想问您一下 如果我想把这个程序 的定义和实现部分分开 需要如何改动程序啊 我的意思就是在类里只是定义变量 然后在类外面实现 最后再用main()来调用 一共3个文件 一个.h 两个.cpp 希望您再给些指点 谢谢!

雕刻单调的人生
2007-12-18 13:49
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
得分:0 
高手快来!StarWing83兄弟快来!!
这是之前StarWing83帮我改的程序,但有个人对这段程序做了如下评语,大家觉得他说的有根据吗?如果没有请告诉我他说的哪不对!我好反驳他!急!


#include "CLF_DateTime.h"
#include <iostream>
using namespace std;

lnline void CLF_DateTime::carry( int& v1,int& v2,int v3 )
{
    v1+=v2/v3; //Remark From Terence:  在沒有測試的情況下導入數據 ( 數據完整性)
    v2%=v3; //Remark From Terence:  在沒有測試的情況下導入數據 ( 數據完整性)
}

lnline bool CLF_DateTime::isleap( int y )
{
    return y%100?!(y%4):!(y%400);   //Remark From Terence:  x ? a : b  這種語法是不建議使用的. (可讀性, 可維護性)
                                                    //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性)
 
}

bool CLF_DateTime::isleap()
{
    return isleap(tm_year+TM_TIMEBASE);
}

CLF_DateTime::CLF_DateTime(int year/*=1900*/,int month/*=1*/,int day/*=1*/, int hour/*=0*/,int min/*=0*/,int sec/*=0*/)
{
    tm_year=year-TM_TIMEBASE; //Remark From Terence:  在沒有測試的情況下導入數據 (數據完整性 )
    tm_mon=month-1;//Remark From Terence:  在沒有測試的情況下導入數據 ( 數據完整性)
    tm_mday=day;//Remark From Terence:  在沒有測試的情況下導入數據 ( 數據完整性)
    tm_hour=hour;//Remark From Terence:  在沒有測試的情況下導入數據 ( 數據完整性)
    tm_min=min; //Remark From Terence:  在沒有測試的情況下導入數據 (數據完整性 )
    tm_sec=sec; //Remark From Terence:  在沒有測試的情況下導入數據 (數據完整性 )
}

char* CLF_DateTime::display( char* strdisplay )
{
    strftime(strdisplay,80,"%Y-%m-%d %H:%M:%S",this); //Remark From Terence:  在沒有測試strdisplay指針下使用指針 ( 指針使用安全)
    return strdisplay;
}

char* CLF_DateTime::setdisplay( char* strdisplay )
{
    tm_min+=tm_sec>=30; //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
    tm_sec=0;
    carry(tm_hour,tm_min,60);
    carry(tm_mday,tm_hour,24);
    tm_mday--;
    switch (tm_mon+1)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        carry(tm_mon,tm_mday,31);
        break;
    case 2:
        carry(tm_mon,tm_mday,28+isleap());
        break;
    default:
        carry(tm_mon,tm_mday,30);
    }
    tm_mday++;
    carry(tm_year,tm_mon,12);
    return display(strdisplay);

    //Remark From Terence:  你把四捨五進變成什麼, 我說那是要可以設定進位精度的. 進位至分, 進位至時, 進位至日..............
     //Remark From Terence:  潤年 潤月 的計算已在 time 庫考慮了, 不用自己去做. 而且這樣做也不精確.
      
}

int CLF_DateTime::compare( CLF_DateTime& pb )
{
    int t=0;
    if (t=tm_year-pb.tm_year) //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
        goto ret; //Remark From Terence:  在goto是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性) (只在scriping language 用)
    if (t=tm_mon -pb.tm_mon ) //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
        goto ret; //Remark From Terence:  在goto是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性) (只在scriping language 用)
    if (t=tm_mday-pb.tm_mday) //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
        goto ret; //Remark From Terence:  在goto是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性) (只在scriping language 用)
    if (t=tm_hour-pb.tm_hour) //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
        goto ret; //Remark From Terence:  在goto是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性) (只在scriping language 用)
    if (t=tm_min -pb.tm_min ) //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
        goto ret; //Remark From Terence:  在goto是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性) (只在scriping language 用)
    if (t=tm_sec -pb.tm_sec ) //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
        goto ret; //Remark From Terence:  在goto是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性) (只在scriping language 用)
    return t; //Remark From Terence:  多點回傳, 是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性)
ret:
    return t>0?1:-1; //Remark From Terence:  在判斷式內運算是很差的語法. (可讀性, 可維護性) (若在校時使用這類語法會評係劣級)
                           //Remark From Terence:  多點回傳, 是很差的語法.它破壞了程式的邏輯結構 (可讀性, 可維護性)
}

雕刻单调的人生
2007-12-19 16:25
单调黑白
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-10-4
收藏
得分:0 
回复 27# 的帖子
兄弟 这是这个程序要完成的功能明细:
3. Reture String with specific format (reference to CTime:Format)
        e.g.

        CLF_DateTime a = CLF_DateTime(2007, 11, 4, 22, 29, 54, 9987);

        a.Format("yyyy-mm-dd HH:MM:SS");

        

        output:

        2007-11-04 22:29:54

4. Provide rounding

        CLF_DateTime a = CLF_DateTime(2007, 11, 4, 22, 29, 54, 9987);

        CLF_DateTime b = a.Rounding(MINUTE);

        

        b will be "2007-11-04 22:30:00.0000"

5. Provide Compare functions  

        CLF_DateTime a = CLF_DateTime(2007, 11, 4, 22, 29, 54, 9987);

        CLF_DateTime b = CLF_DateTime(2007, 11, 4, 22, 30, 15, 0000);

        int iresult;

 

        iresult = CLF_DateTime::Compare(a, b, MINUTE, ROUNDING);

 

        Results:

        (a>b, iresult = 1)

        (a=b, iresult = 0)

        (a<b, iresult = -1)


以下是terence再次做的评论(供大家学习参考):
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
對於programme
1. assert 只會在 Debug mode 下實現, 在Release mode 會自動除去.  你的programme 不 Release 的嗎?

2. if(y%400==0||(y%100!=0 && y%4==0)
     我沒有說這不對, 我是說 C 已做了潤年的工作
     況且, 這段 code 也不好理解, 三個月之後自己也看不懂了.
3. goto 的好與不好, 不是我們說的. 多看書吧.

    if (t=tm_year-pb.tm_year) 就是在 if 還運術, 出了bug後是很難Debug的. 以行為單位的 Debug 跟本不知是那裡出錯. 邏輯錯了更難改.

4. "t=sgn(m)?10:-10;绝对比if(sgn(m)!=0)t=10;else t=-10;要清晰可读得多"?

   //Checking the sign of m
   if(sgn(m) == 0)
   {// m is zero , 只有m是零, sgn(m)才會零
          t = -10;
   }else
   {// m is not zero
          t = 10;
   }

   你能看出上面一段的 bug 嗎? 這才叫清晰可讀, 可維護, 程式不是只是給你自己看的.
   binary file size 不會比用 t=sgn(m)?-10:10 多.
   執行速度不會比用 t=sgn(m)?-10:10 慢.
   因為他們確實用相同的機器碼.


   //Checking the sign of m
   if(sgn(m) >= 0)
   {// m is positive number or zero
          t = -10;
   }else
   {// m is negative number
          t = 10;
   }
     x ? a :b 只用在單元測試和內部測試用. (我們叫 quick and ugly)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
还有一个事 您写的这个最新的程序 我运行了 得到的结果不是需求所要的结果啊  您再看看?

谢谢!!

雕刻单调的人生
2007-12-20 17:07
快速回复:华为又出变态面试题!大家请看以下代码 在看懂的同时 修改错误!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033354 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved