C/C++筆試題(2)

 

1.請完成以下題目。注意,請勿直接調用 ANSI C 函數庫中的函數實現。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 a)請編寫一個 C 函數,該函數給出一個字節中被置 1 的位的個數,並請給出該題的至少一個不同解法。

第一種unsigned   int   TestAsOne0(char   log)  

 {  
          int   i;  
          unsigned   int   num=0,   val;  
          for(i=0;   i<8;   i++)  
          {  
                  val   =   log   >>   i;     //
移位

                  val   &=   0x01;     //
1相與
                  if(val)  
                          num++;  
          }  
          return   num;  
  }  

第二種unsigned   int   TestAsOne1(char   log)  
  {  
          int   i;  
          unsigned   int   num=0,   val;  
          for(i=0;   i<8;   i++)  
          {  
                  val   =   (~log)   >>   i;   //
反碼?

                  val   &=   0x00;           //
0相與
                  if(!val)  
                          num++;  
          }  
          return   num;  
  }  

   b)請編寫一個 C 函數,該函數將給定的一個字符串轉換成整數。

int Invert(char *str)

{

int num=0;

while(*str!='/0')

{

int digital=*str-48;

num=num*10+digital;

str=str+1;

}

return num;

}

   c)請編寫一個 C 函數,該函數將給定的一個整數轉換成字符串。

void   IntToCharChange(int   num,   char*   pval)  
  {  
        char   strval[100];  
          int   i,   j;  
          int   val0   =   0;  
          int   val1   =   0;  
           
          val0   =   num;          
          for(i=0;   i<100;   i++)  
          {  
          val1   =   val0   %   10;   //
取餘

          val0   =   val0   /   10;   //
取整
          strval[i]   =   val1   +   48;  //
數字字符
          if(val0   <   10)  
          {  
          i++;  
          strval[i]   =   val0   +   48;  
          break;  
          }  
          }  
          for(j=0;   j<=i;   j++)     //
倒置
          {  
          pval[j]   =   strval[i-j];  
          }  
          pval[j]   =   '/0';  
  }

   d)請編寫一個 C 函數,該函數將一個字符串逆序。

void   AntitoneValue(char*   father,   char*   child)  
  {  
  int   i;  
          char   source[100];  
  int   j   =   0;  
   
  while(father[j])     //
放入source[j]爲長度

  {  
  source[j]   =   father[j];  
  j++;  
  if(j   >   99)  
  {  
  return;  
  }  
  }  
  source[j]   =   '/0';  
   
  for(i=0;   i<j;   i++)  
  {  
  child[i]   =   source[j-i-1];     //
反序
  }  
  child[i]   =   '/0';  
  }  

 

e)請編寫一個 C 函數,該函數在給定的內存區域搜索給定的字符,並返回該字符所在位置索引值。

int search(char *cpSource, int n, char ch)  //起始地址,搜索長度,目標字符
{
int i;
for(i=0; i<n && *(cpSource+i) != ch; ++i);
return i;
}

   f)請編寫一個 C 函數,該函數在一個字符串中找到可能的最長的子字符串,該字符串是由同一字符組成的。

int  ChildString(char*p)     //自己寫

  {  

  Char *q=p;

int  stringlen=0, i=0,j=1,len=0,maxlen=1;  

while(*q!=’/<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0’)          //不能用strlen,求得長度stringlen

{

  Stringlen++;

q++;

}

  while( i< Stringlen )  

  {  

           if(*(p+i)==*(p+j)&&j< Stringlen)  

           {  

                    len++;                    //統計子串長度

                    i++;

                    j++;  

           }  

           else  

           {  

                    if(len>maxlen)           //統計最大子串長度

                    {  

                             maxlen=len+1;  

                             len=0;

                    }          

                    else {

                             len=0;

                         }  

  i++;

                              j++;

                  

           }  

  } 

  return   maxlen;  

}   

給出演示上述函數功能的一個簡單程序,並請編寫對應的 Makefile 文件

 

2.我們需要編寫一個圖形相關的應用程序,需要處理大量圖形(Shape)信息,圖形有矩形(Rectangle),正方形(Square),圓形 (Circle)等種類,應用需要計算這些圖形的面積,並且可能需要在某個設備上進行顯示(使用在標準輸出上打印信息的方式做爲示意)

    a)請用面向對象的方法對以上應用進行設計,編寫可能需要的類

    b)請給出實現以上應用功能的示例性代碼,從某處獲取圖形信息,

      並且進行計算和繪製

    c)如果你的Square繼承自Rectangle,請給出理由,如果不是,

      請給出理由,並且請比較兩種方式的優劣

    d)請問你所編寫的類,在如下代碼中會有何表現,請解釋

    void test_rectangle_area(Rectangle& r)

    {

        r.set_width(10);

        r.set_height(15);

        assert(r.area() == 150);

}

 

3.假設現有一個單向的鏈表,但是隻知道只有一個指向該節點的指針p,並且假設這個節

點不是尾節點,試編程實現刪除此節點

參考:將下一個節點的內容複製到本節點上,然後刪除下一個節點;

 

4.寫一個程序,把一個100以內的自然數分解因數。(自然數分解因數就是將一個自然數

分解爲幾個素數的乘積,提示,由於該數不是很大,所以可以將質數保存在數組中,以加快計

算速度)

 

5.編寫一個Identify的分配、釋放的函數,爲110000之間的自然數。

6.分別實現itoaatoi.

 

7.Consider the following code:

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[]) {

int i = 1;

char buf[4];

strcpy(buf, "AAAA");

printf("%d/n", i);

return 0;

}

 

a) When compiled and executed on x86, why does this program usually not output what the programmer intended?     x86上爲什麼不能得到預期結果

 

b) Name several ways in which the security problem that causes this program not to output what the programmer intended can be prevented WITHOUT changing the code.

 

參考:第一個問題:  
  32
位情況
:  
  x86
,棧方向向上生長.main的棧中,先分配i空間(4byte),然後分配4個字節的buf(地址在i的上面,i).strcpy越界,0buf開始的第4(0開始)個字節覆蓋掉了.x86LSB排列順序,所以真好覆蓋了i的內個數字1.所以顯示出數字
0.  
  16
位情況同樣分析即可.  

2問?

 

8.int w=1,x=2,y=3,z=4;

m=(w<x)?w:x;

m=(m<y)?m:y;

m=(m<2)?m:z;

printf("m=%d",m);        說出結果

答案:1

 

9.說出結果   ???

#include <stdio.h>

main()

{

    FILE *fp;

    int i,a[4]={1,2,3,4},b;

    fp=fopen("data.dat","wb");//這裏幫忙解釋一下

    for(i=0;i<4;i++)

    fwrite(&a[i],sizeof(int),1,fp);//這裏也幫忙看一下

    fclose(fp);

    fp=fopen("data.dat","rb");

    fseek(fp,-2L*sizeof(int),SEEK_END);//還有這裏

    fread(&b,sizeof(int),1,fp);//這裏還有也看一下

    fclose(fp);

    printf("b=%d/n",b);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章