C笔试题

1. 下面这段代码的输出是多少(在32位机上).

    char *p;

    char *q[20];

    char *m[20][20];

    int (*n)[10];

    struct MyStruct

    { 

      char dda; 

      double dda1; 

      int type ;

    }; 

    MyStruct k;

    printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));

答案:4 80 1600 4 24

2.

(1)

char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };

for(int i=0;i<12;i++)

    printf("%d ",_______);

在空格处填上合适的语句,顺序打印出a中的数字

答案:a[0][0][i]

(2)

char **p, a[16][8];  

问:p=a是否会导致程序在以后出现问题?为什么?

3.用递归方式,非递归方式写函数将一个字符串反转.

函数原型如下:char *reverse(char *str);

4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?

5.(1)写一个函数将一个链表逆序.

  (2)一个单链表,不知道长度,写一个函数快速找到中间节点的位置.

  (3)写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).

6.用递归算法判断数组a[N]是否为一个递增数组。

7.有一个文件(名为a.txt)如下,每行有4项,第一项是他们的名次,写一个c程序,将五个人的名字打印出来.并按名次排序后将5行数据仍然保存到a.txt中.使文件按名次排列每行.

2,07010188,0711,李镇豪,

1,07010154,0421,陈亦良,

3,07010194,0312,凌瑞松,

4,07010209,0351,罗安祥,

5,07010237,0961,黄世传,

8.(1)写一个函数,判断一个unsigned char 字符有几位是1.

  (2)写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian).

9.微软的笔试题.

Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).

Please do not use MFC, STL and other libraries in your implementation.

10.有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).

 

 

1. 下面这段代码的输出是多少(在32位机上).

    char *p;

    char *q[20];

    char *m[20][20];

    int (*n)[10];

    struct MyStruct

    { 

      char dda; 

      double dda1; 

      int type ;

    }; 

    MyStruct k;

    printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));

    4 

    80  

    1600  

    4  定义的是一个指向数组的指针

    24 直接对齐

2.

(1)

char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };

for(int i=0;i<12;i++)

    printf("%d ",*(&a[0][0][0]+i));

在空格处填上合适的语句,顺序打印出a中的数字

(2)

char **p, a[16][8];  

问:p=a是否会导致程序在以后出现问题?为什么?

编译能通过?

就算强制转换也会有问题,a和p所采取的内存布局和寻址方式不同,a的内存假定是连续的,对于a[i][j]可等价于*(&a[0][0]+16*i+j),而char**p不假定使用的是连续的内存,p[i][j]=*(p[i]+j);

6.用递归算法判断数组a[N]是否为一个递增数组。

using namespace std;

bool IsAsc(int*begin,int *end){

 if(begin==end) return true;

  if(*begin>*(begin+1)) return false;

  return  IsAsc(++begin,end);

}

8.(1)写一个函数,判断一个unsigned char 字符有几位是1.

   int GetBit(unsigned char val){

       int count=0;

       while(val){

        ++count;

        val&=(val-1);

       }

     return count;

   }

  (2)写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian).

bool IsBigEnd(){ 

   int i=1;

   return !(*((char*)&i));

}

}

10.有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).

PS:鉴于以前某人说用int存储数组就是用了O(N)的辅助空间,现在假设是用char存储数组

int GetTheExtraVal(char*var,int size)

{

  int val;

  int i=0;

  for(;i<size;++i)

  {

      if(var[var[i]&0x7F]&0x80){

       val=var[i]&0x7F;

              break;

      }

     var[var[i]&0x7F]|=0x80;     

  }

 for(i>=0;--I){

  var[var[i]&0x7F]&=0x7F;   

 }

 return val;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robbie1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值