标题:华为又出变态面试题!大家请看以下代码 在看懂的同时 修改错误!
只看楼主
单调黑白
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
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
这个有点想07年的程序员的考试题目.区别在于一个是c语言一个是c++.不知道记错没有
2007-12-17 18:25
破坏神
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-8-7
得分:0 
我是初学者。。。。
完全看不懂啊。。。。
2007-12-17 20:07
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
哎……你好像没看懂的conpare函数。我就举一个例子吧

        if(tm_year>pb.tm_year)
            return 1;
        else if(tm_year<pb.tm_year)
            return -1;
这一句,如果tm_year大于pb.tm_year返回1,反之返回-1,如果相等就判断别的。我的写法
int t;
if(t=tm_year-pb.tm_year)return t>0?1:-1;
这一句,如果tm_year大于pb.tm_year,那么t就是正的,那么就会返回1,反之返回-1,如果相等的话t就是0,也就是false,则会继续向下面运行。这个是以前写汇编程序的时候经常用到的方法,汇编的CMP语句其实就是对两个数相减返回结果。你先好好看我的compare。
你的那个版本的compare我实在是不敢再看了。你要是一直想写这种代码你干脆去研究Java和VB算了……
闰年是懒得写了,那个set...函数比较无聊,有时间不如你写个carry算了(时间进位函数)。那个函数就是个进位的问题。
最后要说的是。对这个结构体做包装本来就是个很无聊的事情……你添一些比较高级点的功能嘛………………

[[italic] 本帖最后由 StarWing83 于 2007-12-17 23:21 编辑 [/italic]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-17 22:38
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
程序代码:
#include <iostream>
using namespace std;
#include <ctime>
#define TM_TIMEBASE 1900
class CLF_DateTime : public tm {
    inline void carry(int& v1,int& v2,int v3){v1+=v2/v3;v2%=v3;}
    inline bool isleap(int y){return y%100?!(y%4):!(y%400);}
public:
    bool isleap(){return isleap(tm_year+TM_TIMEBASE);}
    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;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);
        tm_mday--;//tm_mday属于1~max但是判断属于0~max-1,故这里减一,以前的有Bug
        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++;//恢复mday
        carry(tm_year,tm_mon,12);
        return display(strdisplay);
    }
    int compare(CLF_DateTime& pb) {
        int t;
        if (t=tm_year-pb.tm_year)return t>0?1:-1;
        if (t=tm_mon -pb.tm_mon )return t>0?1:-1;
        if (t=tm_mday-pb.tm_mday)return t>0?1:-1;
        if (t=tm_hour-pb.tm_hour)return t>0?1:-1;
        if (t=tm_min -pb.tm_min )return t>0?1:-1;
        if (t=tm_sec -pb.tm_sec )return t>0?1:-1;
        return t;
    }
};

void main() {
    CLF_DateTime pa(2000,2,28,23,59,59);
    CLF_DateTime pb(pa);
    char testdisplay[100];

    cout<<"Your input date and time is: "<<pa.display(testdisplay)<<endl;
    cout<<"leap year?"<<pa.isleap()<<endl;
    cout<<"Provide rounding:"<<pa.setdisplay(testdisplay)<<endl;
    cout<<"compare time:"<<(pb)<<endl;
    getchar();
}
1和3帮你改好了,2本来就不是错误。从代码看你的四舍五入是指将秒设置成0或者30然后进位。那么pa是调整后的时间,在我的程序里(注意数据跟你的不一样)pa是大于pb的,返回1是正确的。但是compare里面我漏写了一行代码所以没有判断秒,这里改了过来。还有,你的闰年检查有问题,注意年份要加上1900再检查。
程序对于错误的时间不会报错,只是将多出来的日子加到规整后的时间里。比如如果你写2000-2-30那么会被规整成2000-3-2(加了进位的一天,又加了2月份多出来的一天),如果希望报错的话在carry里面检查就可以了。
代码经仔细检查已经没有Bug了。你可以再查一遍。
最后,以后你要是需要别人改代码的时候最好不好带上华为……

[[italic] 本帖最后由 StarWing83 于 2007-12-17 23:56 编辑 [/italic]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-17 23:05
单调黑白
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
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
哦,这个很简单的。我就举个例子好了。你理解以后可以很简单地修改源代码。不过我提醒你,如果你把实现和声明分开的话,那么成员函数不再具有默认的inline修饰符(isleap和carry的inline修饰符是我为了强调加的),你需要手动为一些函数加上inline修饰。
假设有三个文件。test.h包含类声明。test.cpp包含类的实现。main.cpp包含对类的使用。代码如下:
在test.h中:
程序代码:
//下面两行是为了防止一个头文件被载入两次
#ifndef _TEST_H_
#define _TEST_H_

class test{
public:
    test();//注意分号结尾,没有实现代码
    void display();//同上
private:
    void print();
};
/*
和第1,2行呼应。意思是,如果定义了_TEST_H_,
那么就跳过上面的代码,如果没有定义,就定义。
这样这份代码就可以只包含一遍了。如果你使用
VC++2005的话,就只在文件开头加上一句
#pragma once就可以了,不需要这么麻烦
*/
#endif _TEST_H_
在test.cpp中:
程序代码:
//包含头文件
#include "test.h"
#include <iostream>
using namespace std;
test::test() {
    cout<<"in Test::Test\n";
}

void test::display(){
    cout<<"In Test::display\n";
    print();
}


void test::print(){
    cout<<"In Test::print\n";
}

 
在main.cpp中:
程序代码:
//使用源代码的时候,也需要包含头文件
#include "test.h"
#include <iostream>
using namespace std;
int main(){
    test t1;
    t1.display();
    getchar();
} 
我没有对代码进行编译。只是简单地演示一下该怎么做。只需要像上面一样就可以了。实现和使用会被编译到不同的obj里面去。

[[italic] 本帖最后由 StarWing83 于 2007-12-18 16:33 编辑 [/italic]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-18 16:30
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
具体是这样的。
在CLF.h中:
程序代码:
#ifndef _CLF_H_
#define _CLF_H_
#include <ctime>
#define TM_TIMEBASE 1900

class CLF_DateTime : public tm {
    void carry(int& v1,int& v2,int v3);
    bool isleap(int y);
public:
    bool isleap();
    CLF_DateTime(int year=1900,int month=1,int day=1,
        int hour=0,int min=0,int sec=0);
    ~CLF_DateTime(){}
    char* display(char* strdisplay);
    char* setdisplay(char* strdisplay);
    int compare(CLF_DateTime& pb);
};
#endif
在CLF.cpp中:
程序代码:
#include "CLF.h"
#include <iostream>
using namespace std;

inline void CLF_DateTime::carry( int& v1,int& v2,int v3 ) {
    v1+=v2/v3;
    v2%=v3;
}

inline bool CLF_DateTime::isleap( int y ) {
    return y%100?!(y%4):!(y%400);
}

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;
    tm_mon=month-1;
    tm_mday=day;
    tm_hour=hour;
    tm_min=min;
    tm_sec=sec;
}

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

char* CLF_DateTime::setdisplay( char* strdisplay ) {
    tm_min+=tm_sec>=30;
    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);
}

int CLF_DateTime::compare( CLF_DateTime& pb ) {
    int t;
    if (t=tm_year-pb.tm_year)goto ret;
    if (t=tm_mon -pb.tm_mon )goto ret;
    if (t=tm_mday-pb.tm_mday)goto ret;
    if (t=tm_hour-pb.tm_hour)goto ret;
    if (t=tm_min -pb.tm_min )goto ret;
    if (t=tm_sec -pb.tm_sec )goto ret;
    return t;
ret:
    return t>0?1:-1;
}
在main.cpp中:
程序代码:
#include "CLF.h"
    #include "iostream"
    using namespace std;
    
    int main() {
    CLF_DateTime pa(2000,2,28,23,59,59);
    CLF_DateTime pb(pa);
    char testdisplay[100];

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


[[italic] 本帖最后由 StarWing83 于 2007-12-18 17:47 编辑 [/italic]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-18 17:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-191785-1-1.html




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

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