论坛: 编程破解 标题: 测试一下你能得多少分?(C/C++试题)(答案已经公布) 复制本贴地址    
作者: lwei889 [lwei889]    论坛用户   登录
高质量C++/C 编程指南,v 1.0
C++/C 试题
本试题仅用于考查C++/C 程序员的基本编程技能。内容限于C++/C 常用语法,不
涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C
的理解程度,但不能反映考生的智力和软件开发能力。
笔试时间90 分钟。请考生认真答题,切勿轻视。

一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。(10 分)
提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”。例如int 变量 n 与“零值”
比较的 if 语句为:
if ( n == 0 )
if ( n != 0 )
以此类推。
请写出BOOL flag 与“零值”比较的 if 语句:

请写出float x 与“零值”比较的 if 语句:

请写出char *p 与“零值”比较的 if 语句:

二、以下为Windows NT 下的32 位C++程序,请计算sizeof 的值(10 分)

char str[] = “Hello” ;              void Func ( char str[100])
char *p = str ;                          {
int n = 10;                                   
请计算                                        请计算 sizeof( str ) =?
sizeof (str ) = ?
                                          }
sizeof ( p ) =?                          void  *p = malloc( 100 );
                                         
sizeof ( n ) =?                            请计算: sizeof ( p ) = ?



三、简答题(25 分)
1、头文件中的ifndef/define/endif 干什么用?

2、#include <filename.h> 和#include “filename.h” 有什么区别?

3、const 有什么用途?(请至少说明两种)

4、在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”声明?

5、请简述以下两个for 循环的优缺点
// 第一个                                // 第二个
for (i=0; i<N; i++)                        if (condition)
{                                              {
  if (condition)                                for (i=0; i<N; i++)
      DoSomething();                                  DoSomething();
  else                                          }
      DoOtherthing();                        else
}                                              {
                                                  for (i=0; i<N; i++)
                                                    DoOtherthing();
                                                }
优点:                                            优点:
缺点:                                            缺点:



四、有关内存的思考题(20 分)
void GetMemory(char *p)                      char *GetMemory(void)
{                                              {
  p = (char *)malloc(100);                        char p[] = "hello world";
}                                                  return p;
void Test(void)                                  }
{                                              void Test(void)
  char *str = NULL;                              { 
  GetMemory(str);                                  char *str =NULL;
  strcpy(str, "hello world");                      str = GetMemory();
  printf(str);                                      printf(str);
}                                                }
请问运行Test函数会有什么样的结果?              请问运行Test函数会有什么样的结果?
答:                                            答:

Void GetMemory2(char **p, int num)              void Test(void)
{                                                  {
*p = (char *)malloc(num);                            char *str = (char *) malloc(100);
}                                                    strcpy(str, “hello”);
void Test(void)                                      free(str);
{                                                    if(str != NULL)
char *str = NULL;                                      {
GetMemory(&str,100);                                    strcpy(str, “world”);
strcpy(str, "hello");                                    printf(str);
printf(str);                                            }
}                                                    }
请问运行Test函数会有什么样的结果?                请问运行Test函数会有什么样的结果?
答:                                                答:



五、编写strcpy 函数(10 分
已知strcpy 函数的原型是:

    char *strcpy(char *strDest, const char *strSrc);

其中strDest 是目的字符串,strSrc 是源字符串。

(1)不调用C++/C 的字符串库函数,请编写函数strcpy


(2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?


六、编写类String 的构造函数、析构函数和赋值函数(25 分)

已知类String 的原型为:

class String
{
  public:
    String(const char *str = NULL);          // 普通构造函数
    String(const String &other);            //拷贝构造函数
  ~ String(void);                          // 析构函数
  String & operate =(const String &other);  // 赋值函数
private:
  char *m_data;                            // 用于保存字符串
};
请编写String的上述4个函数。


摘自高质量c/c++编程指南,希望热爱c/c++的人认真的看一下!并且做一下!
答案几天后公布出来!!









[此贴被 子木(lwei889) 在 12月21日19时50分 编辑过]


[此贴被 子木(lwei889) 在 12月29日11时51分 编辑过]

地主 发表时间: 12/21 19:17

回复: cyshaoping [cyshaoping]   论坛用户   登录
if(flag)
if(!flag)

B1层 发表时间: 12/21 21:43

回复: lwei889 [lwei889]   论坛用户   登录
B1层的不错,继续努力,希望你将试题做完!

我本来想晚些再发这个的,但看到好象没有人太在意这些题目,那就看一看下面的这段话:

首先请做附录B的C++/C试题(不要看答案),考查自己的编程质量究竟如何。然后
参照答案严格打分。
(1)如果你只得了几十分,请不要声张,也不要太难过。编程质量差往往是由于不良习
惯造成的,与人的智力、能力没有多大关系,还是有药可救的。成绩越差,可以进步的
空间就越大,中国不就是在落后中赶超发达资本主义国家吗?只要你能下决心改掉不良
的编程习惯,第二次考试就能及格了。
(2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断进步。如果你
还没有找到合适的工作单位,不妨到上海贝尔试一试。
(3)如果你考出85分以上的好成绩,你有义务和资格为你所在的团队作“C++/C编程”
培训。希望你能和我们多多交流、相互促进。半年前我曾经发现一颗好苗子,就把他挖
到我们小组来。
(4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。

由于时间不多,要上课,答案今天中午公布!

看了286的回复,我就暂时不公布了,如果大家觉得有用的话,
我会在答案公布后,把这本书的内容连续放到这上面的让热爱c/c++的都看一看!


[此贴被 子木(lwei889) 在 12月22日09时30分 编辑过]

B2层 发表时间: 03-12-22 09:16

回复: 286 [unique]   版主   登录
不错,很不错的。建议大家都做一做。先别急着公布答案。
特别是毕业生,你们找工作的单位很可能会有笔试题,而题一般也就是这几个类型。


B3层 发表时间: 03-12-22 09:22

回复: zhoen889 [zhoen889]   论坛用户   登录
威,我已经看了,不错啊!全是最基本的,可又都是最重要的。我会仔细做的!
圣诞节到了,大家同开心!!!


[此贴被 zhoen889(zhoen889) 在 12月22日10时01分 编辑过]

B4层 发表时间: 03-12-22 10:00

回复: yutou [yutou]      登录
谢谢

B5层 发表时间: 03-12-22 10:53

回复: jfyygymtdh [jfyygymtdh]   论坛用户   登录
希望以后多发点这样的题,虽然我不太会,但我可以学到很多东西.

对了,能不能再发一些关于TC的题.我现在只学TC想看看TC都有什么样的好题目.


圣诞节快乐!!!!!!!!!!!!!!!!!!!!!!!!11111

B6层 发表时间: 03-12-23 12:35

回复: TomyChen [quest]   版主   登录
做过了。。。
一本C++书后面的题.
好像我进公司的面试题就是这个

B7层 发表时间: 03-12-23 13:23

回复: lwei889 [lwei889]   论坛用户   登录
高质量C++/C 编程指南,v 1.0
附录C :C++/C 试题的答案与评分标准

一、请填写BOOL , float, 指针变量与“零值”比较的 if 语句。(10 分)
请写出BOOL flag 与“零值”比较的 if 语句。(3 分)
                         
标准答案:                            如下写法均属不良风格,不得分
if ( flag ) if(flag==TRUE)
if ( !flag )                          if(flag==1)
                                        if(flag==FLASE  )
                                        if(flag==0)

                                       
请写出float x 与“零值”比较的 if 语句。(4 分)
标准答案示例:

const float EPSINON = 0.00001;        如下是错误的写法,不得分。
if ((x >= -EPSINON) && (x <= EPSINON)     if(x==0.0)
不可将浮点变量用“==”或“!=”与数字     if(x!=0.0)
比较,应该设法转化成“>=”或“<=”此类
形式。
                                                               
                                                     
                                                   
请写出char *p 与“零值”比较的 if 语句。(3 分)
标准答案:
if (p == NULL)
if (p != NULL)
如下写法均属不良风格,不得分。
if (p == 0)
if (p != 0)
if(p)
if(!)


二、以下为Windows NT 下的32 位C++程序,请计算sizeof 的值(10 分)
char str[] = “Hello” ;                      void Func ( char str[100])
char *p = str ;                                  {
int n = 10;                                      请计算
请计算                                              sizeof( str ) = 4  (2 分)
  sizeof (str ) = 6 (2 分)
                                                  }
  sizeof ( p ) = 4 (2 分)                    void *p = malloc( 100 );
                                                请计算
  sizeof ( n ) = 4 (2 分)                          sizeof ( p ) = 4 (2 分)



三、简答题(25 分)
1、头文件中的ifndef/define/endif 干什么用?(5 分)

  答:防止该头文件被重复引用。

2、#include <filename.h> 和#include “filename.h” 有什么区别?(5 分)

  答:对于#include <filename.h> ,编译器从标准库路径开始搜索filename.h
      对于#include “filename.h” ,编译器从用户的工作路径开始搜索filename.h

3、const 有什么用途?(请至少说明两种)(5 分)
  答:(1)可以定义const 常量
      (2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东
  西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

4、在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”? (5 分)

  答:C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字
  与C 语言的不同。假设某个函数的原型为:void foo(int x, int y);

      该函数被C 编译器编译后在库中的名字为_foo , 而C++ 编译器则会产生像
_foo_int_int 之类的名字。

      C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。

5、请简述以下两个for 循环的优缺点(5 分)

for (i=0; i<N; i++)                        if (condition)
{                                          {
  if (condition)                              for (i=0; i<N; i++)
    DoSomething();                                DoSomething();
  else                                      }
    DoOtherthing();                        else
}                                            {
                                                for (i=0; i<N; i++)
                                                    DoOtherthing();
                                              }

优点:程序简洁        优点:循环的效率高
                           
缺点:多执行了N-1次逻辑判断,并且
                                              缺点:程序不简洁
打断了循环“流水线”作业,使得编译

器不能对循环进行优化处理,降低了效

率。


四、有关内存的思考题(每小题5 分,共20 分)
void GetMemory(char *p)                  char *GetMemory(void)
{                                         
                                          {
  p = (char *)malloc(100);                  char p[] = "hello world";
                                            return p; 
}                                                                         
void Test(void)                            }
{                                          void Test(void)
  char *str = NULL;                          {
  GetMemory(str);                              char *str =NULL;
  strcpy(str, "hello world");                  str = GetMemory();
  printf(str);                                  printf(str);
}                                            }

请问运行Test函数会有什么样的结果?          请问运行Test函数会有什么样的结果?
答:程序崩溃。                              答:可能是乱码。
因为GetMemory 并不能传递动态内存,            因为GetMemory返回的是指向“栈内存”
Test函数中的 str一直都是NULL。              的指针,该指针的地址不是 NULL,但其原
strcpy(str, "hello world");将使程序崩        现的内容已经被清除,新内容不可知。
溃。

void GetMemory2(char **p, int num)          void Test(void)
{                                            {
  *p = (char *)malloc(num);                      char *str = (char *) malloc(100);
}                                                strcpy(str, “hello”);
void Test(void)                                  free(str);
{                                                if(str != NULL)
  char *str = NULL;                              {
  GetMemory(&str,100);                              strcpy(str, “world”);
  strcpy(str, "hello");                              printf(str);
  printf(str);                                    }
}                                              }

请问运行Test函数会有什么样的结果?              请问运行Test函数会有什么样的结果?
答:                                            答:篡改动态内存区的内容,后果难以预
(1)能够输出hello                                料,非常危险。
(2)内存泄漏                                      因为free(str);之后,str成为野指针,
                                                  if(str != NULL)语句不起作用。


五、编写strcpy 函数(10 分)
    已知strcpy 函数的原型是
    char *strcpy(char *strDest, const char *strSrc);
    其中strDest 是目的字符串,strSrc 是源字符串。
  (1)不调用C++/C 的字符串库函数,请编写函数strcpy

  char *strcpy(char *strDest, const char *strSrc);
    {
      assert((strDest!=NULL) && (strSrc !=NULL));      // 2分
      char *address = strDest;                        // 2分
      while( (*strDest++ = * strSrc++) != ‘\0’)      // 2分
        NULL ;
      return address ;       // 2分
    }

(2)strcpy 能把strSrc 的内容复制到strDest,为什么还要char * 类型的返回值?
 
  答:为了实现链式表达式。// 2分
  例如:
      int length = strlen( strcpy( strDest, “hello world”) );

六、编写类String 的构造函数、析构函数和赋值函数(25 分)
    已知类String 的原型为:
    class String
{
  public:
    String(const char *str = NULL);// 普通构造函数
    String(const String &other);//拷贝构造函数
    ~ String(void);// 析构函数
    String & operate =(const String &other);// 赋值函数
  private:
      char *m_data;// 用于保存字符串
};
请编写String的上述4个函数。

标准答案:

  // String的析构函数
  String::~String(void)// 3分
    {
      delete [] m_data;
      // 由于m_data是内部数据类型,也可以写成 delete m_data;
    }

  // String的普通构造函数
  String::String(const char *str)// 6分
    {
      if(str==NULL)
      {
          m_data = new char[1];// 若能加NULL 判断则更好
  *m_data = ‘\0’;
}
else
{
  int length = strlen(str);
  m_data = new char[length+1];// 若能加NULL 判断则更好
          strcpy(m_data, str);
}
    }

  // 拷贝构造函数
  String::String(const String &other) // 3分
    {
int length = strlen(other.m_data);
m_data = new char[length+1];// 若能加NULL 判断则更好
strcpy(m_data, other.m_data);
    }

  // 赋值函数
  String & String::operate =(const String &other) // 13分
    {
      // (1) 检查自赋值// 4分
      if(this == &other)
          return *this;

      // (2) 释放原有的内存资源// 3分
      delete [] m_data;
   
      // (3)分配新的内存资源,并复制内容// 3分
      int length = strlen(other.m_data);
      m_data = new char[length+1]; // 若能加NULL 判断则更好
      strcpy(m_data, other.m_data);
     
      // (4)返回本对象的引用// 3分
      return *this;
    }


由于近几天不能上网,公布的太晚,很抱歉!!!!


B8层 发表时间: 03-12-29 11:53

回复: cncd [cncd]   论坛用户   登录
谢谢子木
欢迎常来

B9层 发表时间: 03-12-29 19:27

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号