首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 俺们公司的C语言笔试题, 因换新题了, 就把老的发上来给大家分享下!
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • prostar
    • 等级:
    发表于:2008-05-20 20:42:10 楼主
    题目是小弟出的, 用来招聘工程师时候用的笔试题, 给大家分享吧, 反正我们换新题了. 也不怕泄密, 这里只列出与C语言有关的, 后面的和特定相关领域有关的就不拿出来丢人拉。呵呵:


    一, 假设有如下的数据结构定义,请编写C语言程序,完成下面的要求.
    1)
    C/C++ code
    typedef struct _tree { struct _tree * Left; struct _tree * Right; int Value } BTREE;


    编写程序,完成下面的函数,每个函数完成的功能再后:
    // 创建一个值为Value的BTREE结点
    BTREE * CreateTree(int Value);

    // 返回指定BTREE结点的值
    int GetNodeValue(BTREE * node) ;

    // 遍历整个BTREE,打印所有的结点的值
    void Tree(BTREE * tree);


    二,再写程序的时候,我们会经常使用“断言(Assert)”来预测某些可能出现程序问题,有效的使用这一技术可以使绝大多数程序设计上的错误再调试一开始的阶段就暴露出来。但不幸的是,断言并不是C语言标准的一部分。我们使用的编译器都是用宏来实现断言的。下面也请你写一个自己的断言实现。为了照顾到一些不知道断言的同学,请看下面的例子:

    int a = 10;
    ASSERT(a == 11);

    我们要求你实现的ASSERT()必须能检查到a实际上不等于11的这个错误,并且输出某些信息给用户,比如出错的文件,出错的源代码行数等等。为了进一步减少难度,我们假定使用Microsoft的C/C++编译器上。


    四,每个人再自己的编程生涯中调用最多的函数都是与内存操作相关的,事实上写一个自己的memcpy这样的函数是非常有帮助的。下面我们要求你写两个这样的函数。函数原型题后给出,要求这个函数执行的尽可能的快,要知道这样一个可能会调用成千上万次的函数的性能对整个项目的性能至关重要。为了降低难度,我们假定这个函数永远只工作再Intel IA-32架构的微处理器,以及使用了DDR2双通道内存的平台上,芯片组假定为Intel Lakeport。

    C/C++ code
    void memcpy(const void * dst, const void * src, size_t count); void memset(const void * src, unsigned char value, size_t count);


    Note: size_t is a compiler specific type. We can use size_t as a 32bit integer on machine which based on Intel IA-32 architecture.
    0  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 20:57:321楼 得分:0
    有意思的测试题。
    不过不同意第四题的看法。
    优化的东东,我一向觉得应该交给编译器。针对特定平台进行优化本身就与C语言的特性相违背。还不如用汇编。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 21:15:112楼 得分:0
    招聘的同学必须经常泡论坛,或者真的有工作经验才行
    现在的笔试题很多都是这样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 21:21:003楼 得分:0
    C/C++ code
    void memcpy(const void * dst, const void * src, size_t count); void memset(const void * src, unsigned char value, size_t count); 你这里不要乱加const void * __cdecl memcpy ( void * dst, const void * src, size_t count ) { void * ret = dst; #if defined (_M_IA64) { __declspec(dllimport) void RtlCopyMemory( void *, const void *, size_t count ); RtlCopyMemory( dst, src, count ); } #else /* defined (_M_IA64) */ /* * copy from lower addresses to higher addresses */ while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } #endif /* defined (_M_IA64) */ return(ret); } void * __cdecl memset ( void *dst, int val, size_t count ) { void *start = dst; #if defined (_M_IA64) || defined (_M_AMD64) { __declspec(dllimport) void RtlFillMemory( void *, size_t count, char ); RtlFillMemory( dst, count, (char)val ); } #else /* defined (_M_IA64) || defined (_M_AMD64) */ while (count--) { *(char *)dst = (char)val; dst = (char *)dst + 1; } #endif /* defined (_M_IA64) || defined (_M_AMD64) */ return(start); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 21:42:084楼 得分:0
    哇...断言那个好难哦,,,不会
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • canybox
    • 等级:
    发表于:2008-05-20 21:57:075楼 得分:0
    1.
    // 创建一个值为Value的BTREE结点
    BTREE * CreateTree(int Value)
    {
      BTREE* pNode = (BTREE*)malloc(sizeof(BTREE));

      if ( pNode != NULL )
      {
        pNode->Value = Value;
        pNode->Left  = NULL;
        pNode->Right = NULL;
      }
     
      return pNode;
    }

    // 返回指定BTREE结点的值
    int GetNodeValue(BTREE * node)
    {
    ASSERT( node != NULL );
    return node->Value;
    }

    // 遍历整个BTREE,打印所有的结点的值
    void Tree(BTREE * tree);
    {
      if ( tree != NULL )
      {
      printf("%d ",tree->Value);
      Tree( tree->Left );
      Tree( tree->Right );
      }
    }

    2.
    自己写了一个
    #define assert(_X) (void)( (!(_X)) ¦ ¦ (warning(_X, __FILE__, __LINE__)))
    //warning 是提示对话框...


    不过标准的是
    #define assert(_Expression) (void)( (!!(_Expression)) ¦ ¦ (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

    3.
    //dst 不能为const
    void  memcpy(void* dst,void* src, size_t count)
    {
    assert( dst != NULL ¦ ¦ src != NULL );

    char *_dst = (char*)dst;
    char *_src = (char*)src;

    while( count-- )
    *_dst++ = *_src++;
    }

    //src 不能为const
    void  memset(void* src, unsigned char value, size_t count)
    {
    assert( src != NULL );

    char *_src = (char*)src;

    while( count-- )
    *_src++ = value;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • canybox
    • 等级:
    发表于:2008-05-20 21:59:216楼 得分:0
    3楼是优化的...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 22:22:277楼 得分:0
    引用 3 楼 baihacker 的回复:
    C/C++ codevoidmemcpy(constvoid*dst,constvoid*src, size_t count);voidmemset(constvoid*src, unsignedcharvalue, size_t count);
    你这里不要乱加constvoid*__cdecl memcpy (void*dst,constvoid*src,
            size_t count
            )
    {void*ret=dst;#ifdefined (_M_IA64){


            __declspec(dllimport)voidRtlCopyMemory(void*,constvoid*, size_t count );

            RtlCopyMemory( dst, src, count );

            }#else/*…

          /*
            * copy from lower addresses to higher addresses
            */
    为什么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 22:24:318楼 得分:0
    推荐bsd的实现:
    http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/bcopy.c
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 22:33:009楼 得分:0
    慢慢研究下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 22:48:1510楼 得分:0
    我还以为那把“新”的拿出来了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 23:14:5511楼 得分:0
    * copy from lower addresses to higher addresses
            */
            while (count--) {
                    *(char *)dst = *(char *)src;
                    dst = (char *)dst + 1;
                    src = (char *)src + 1;
            }


    这个实现memcpy在下面这个调用中会不会有问题?
    void* p = malloc(10);
    memcpy(p,p+4,1000);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 23:45:3112楼 得分:0
    这么复杂,以后都不敢找工作了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 23:53:4213楼 得分:0
    引用 11 楼 Shatty 的回复:
    * copy from lower addresses to higher addresses
            */
            while (count--) {
                    *(char *)dst = *(char *)src;
                    dst = (char *)dst + 1;
                    src = (char *)src + 1;
            }


    这个实现memcpy在下面这个调用中会不会有问题?
    void* p = malloc(10);
    memcpy(p,p+4,1000);

    事实上这个问题,标准c专门提供了memmov()解决的。
    如果memcpy解决了,反而不是memcpy了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 08:51:0014楼 得分:0
    我还是个学生啊~~我就会做第一题啊~~不要吓我啊~~~5555555
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 09:50:5315楼 得分:0
    楼主的void    memcpy(const void * dst, const void * src, size_t count);
    应该写成:void    memcpy( void *const dst,  void *const src, size_t count);吧!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 11:23:0016楼 得分:0
    不错!楼上的问题有意思!!???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 11:23:1217楼 得分:0
    想法。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 11:47:5918楼 得分:0
    引用 15 楼 jumpjumpYE 的回复:
    楼主的void    memcpy(const void * dst, const void * src, size_t count);
    应该写成:void    memcpy( void *const dst,  void *const src, size_t count);吧!

    这道题可能也是道改错题,以判断应聘者对const用法的熟悉程度!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 12:22:3219楼 得分:0
    楼主是哪家公司的,我不打算投简历到你们公司了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 12:44:2420楼 得分:0
    第二题不会,看来还要继续努力学习才行啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 12:53:2321楼 得分:0
    学习学习!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oo
    • 等级:
    发表于:2008-05-21 13:02:3322楼 得分:0
    引用 21 楼 vipzqs 的回复:
    学习学习!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 13:08:3623楼 得分:0
    顶!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 13:12:5324楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 13:57:1125楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 14:26:4326楼 得分:0
    楼主不妨贴出来你没贴出来的相关领域的问题,你这些基础的问题俺不会,很想见识相关行业的问题会是什么样的问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 14:27:0427楼 得分:0
    MARK 学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 14:44:1128楼 得分:0
    大学生~
    求职难啊~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 17:03:5129楼 得分:0
    假的吧,是不是太基础了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 17:08:1730楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 17:27:3131楼 得分:0
    学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 17:36:5032楼 得分:0
    学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 17:40:3333楼 得分:0
    mark
    修改