• C++笔试题(七)


    微软研究院是一个听起来就牛B的地方啊,反正我是进不去,不过不妨碍我看看他的笔试题到底是怎么样的。下面四道题就是微软研究院的笔试题目,题后附有我的解答。
    微软研究院(亚洲)的网址是:http://research.microsoft.com/asia/
    如果您想转载本文,别删我的信息哦,也算帮我宣传下我的网站嘛。

    1.改错
    #include 
    #include 
    class CBuffer
    {
    char * m_pBuffer;
    int m_size;
    public:
    CBuffer()
    {
    m_pBuffer=NULL;
    }
    ~CBuffer()
    {
    Free();
    }
    void Allocte(int size) (3) {
    m_size=size;
    m_pBuffer= new char[size];
    }
    private:
    void Free()
    {
    if(m_pBuffer!=NULL)
    {
    delete m_pBuffer;
    m_pBuffer=NULL;
    }
    }
    public:
    void SaveString(const char* pText) const
    {
    strcpy(m_pBuffer, pText);
    }
    char* GetBuffer() const
    {
    return m_pBuffer;
    }
    };

    void main (int argc, char* argv[])
    {
    CBuffer buffer1;
    buffer1.SaveString(“Microsoft”);
    printf(buffer1.GetBuffer());
    }

    答:改正后
    主要改正SaveString函数

    void SaveString(const char* pText) const
    {
    strcpy(m_pBuffer, pText);
    }
    改为
    void SaveString(const char* pText) (1)
    {
    if(m_pBuffer!=NULL)
    Free();
    Allocte(strlen(pText)+1); (2)
    strcpy(m_pBuffer, pText);
    }
    原因:
    (1) const成员函数表示不会修改数据成员,而SaveString做不到,去掉const声明
    (2) m_pBuffer指向NULL,必须用Allocte分配空间才能赋值。
    (3) 另外需要将Allocte成员函数声明为私有成员函数更符合实际

    2.下来程序想打印“Welcome MSR Asia”,改正错误
    #include 
    #include 
    char * GetName (void)
    {
    //To return “MSR Asia” String
    char name[]=”MSR Asia”;
    return name;
    }
    void main(int argc, char* argv[])
    {
    char name[32];
    //Fill in zeros into name
    for(int i=0;i<=32;i++)
    {
    name[ i ]='';
    }
    //copy “Welcome” to name
    name="Welcome";
    //Append a blank char
    name[8]=" ";
    //Append string to name
    strcat(name,GetName());
    //print out
    printf(name);
    }

    答:改正后为
    #include 
    #include 
    #include //malloc函数的头文件
    char * GetName (void)
    {
    //To return “MSR Asia” String
    //char name[]=”MSR Asia”;
    char *name=(char *)malloc(strlen(“MSR Asia”)+1); //在函数内部定义的变量在函数结束时就清空了,必须动态分配内存
    strcpy(name,”MSR Asia”);
    return name;
    }
    void main(int argc, char* argv[])
    {
    char name[32];
    //Fill in zeros into name
    // for(int i=0;i<=32;i++)
    for(int i=0;i<=31;i++) //数组越界
    {
    name[ i ]='';
    }
    //copy “Welcome” to name
    //name="Welcome";
    strcat(name,"Welcome");//字符串赋值语句错误,应该用strcat
    //Append a blank char
    // name[8]=" ";
    strcat(name, " "); //或者 name[8]= ' ';name[9]= '';
    //Append string to name
    char *p=GetName(); //定义一个指针指向动态分配的内存,用完后需用free语句释放
    strcat(name,p);
    free (p);
    //print out
    printf(name);
    }

    ----------------------------------------------
    插播广告咯:版权所有:朱科 欢迎光临我的网站:www.goodsoft.cn,各位转贴别删,宣传下嘛
    ----------------------------------------------

    3.写出下面程序的输出结果
    #include 
    class A
    {
    public:
    void FuncA()
    {
    printf(“FuncA called ”);
    }
    virtual void FuncB()
    {
    printf(“FuncB called ”);
    }
    };

    class B: public A
    {
    public:
    void FuncA()
    {
    A::FuncA();
    printf(“FuncAB called ”);
    }
    virtual void FuncB()
    {
    printf(“FuncBB called ”);
    }
    };

    void main(void)
    {
    B b;
    A *pa;
    pa=&b;
    A *pa2=new A;
    b.FuncA(); (1)
    b.FuncB(); (2)
    pa->FuncA(); (3)
    pa->FuncB(); (4)
    pa2->FuncA(); (5)
    pa2->FuncB();
    delete pa2;
    }
    答:
    1.b.FuncA(); 输出
    FuncA called
    FuncAB called
    2.b.FuncB();输出
    FuncBB called
    上两者好理解,直接调用类B的相应成员函数
    3.pa->FuncA();输出
    FuncA called 调用类A的FuncA()
    4.pa->FuncB();输出
    FuncBB called调用类B的FuncB(),原因是C++的动态决议机制,当基类函数声明为virtual时,指向派生类对象的基类指针来调用该函数会选择派生类的实现,除非派生类没有才调用基类的虚函数。还有一点注意的是:指向基类类型的指针可以指向基类对象也可以指向派生类对象,如pa=&b;
    5. pa2->FuncA();
    pa2->FuncB();输出
    FuncA called
    FuncB called
    这也好理解,直接调用类A的相应成员函数

    4.In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?
    #include 
    #include 
    int FindSubString(char* pch)
    {
    int count=0;
    char* p1=pch;
    while(*p1!=’′)
    {
    if(*p1==p1[1]-1)
    {
    p1++;
    count++;
    }
    else
    {
    break;
    }
    }
    int count2=count;
    while(*p1!=’′)
    {
    if(*p1==p1[1]+1)
    {
    p1++;
    count2–;
    }
    else
    {
    break;
    }
    }
    if(count2==0)
    return count;
    return 0;
    }

    void ModifyString(char* pText)
    {
    char* p1=pText;
    char* p2=p1;
    while(*p1!=’′)
    {
    int count=FindSubString(p1);
    if(count>0)
    {
    *p2++=*p1;
    sprintf(p2, “%I”, count);
    while(*p2!= ‘′)
    {
    p2++;
    }
    p1+=count+count+1;
    }
    else
    {
    *p2++=*p1++;
    }
    }
    }
    void main(void)
    {
    char text[32]=”XYBCDCBABABA”;
    ModifyString(text);
    printf(text);
    }
    答:XYBCDCBAIBAA
    FindSubString返回连续出现字母增加又递减的个数,且增加个数刚好等于递减个数。如ABA返回1,ABAB返回1,ABCBA返回2,BCBA返回0。
    sprintf(p2, “%I”, count);将*p2=’I',*(p2+1)=’′。

    (转载者注:对原文有部分修改)

  • 相关阅读:
    C/C++字符串转换函数;
    MFC CTreeCtrl 递归遍历算法
    汉字转拼音
    Windows之权限讲解
    Ubuntu 保存文件时报E212
    ON_WM_MOUSEWHEEL无响应
    sln、db、opendb、vcxproj、filters、user文件跟踪说明
    iOS 9: UIStackView入门
    Swift语言Storyboard教程:第一部分
    springboot启动项目报错:ERROR:o.s.b.d.LoggingFailureAnalysisReporter解决办法
  • 原文地址:https://www.cnblogs.com/lpxblog/p/5278384.html
Copyright © 2020-2023  润新知