1. 程式人生 > >中興手機嵌入式開發筆試題2010

中興手機嵌入式開發筆試題2010

中興手機嵌入式開發筆試題
windyleaf07 發表於 2010-5-13 21:45:00
1:將一個整數10002存到磁碟上,以ASCII碼形式儲存和以二進位制形式儲存,佔用的位元組數分別是 c
A.2和2
B.2和5
C.5和2
D.5和5

知識點:資料型別的儲存方式

2:表示式 !x 等效於 b
A.x1
**B.x
0**
C.x!=1
D.x!=0

知識點:邏輯非

3:執行下列程式

  #include  ″stdio. h″
  main 
  {
    printf(%d\n″,NULL);
  }

** 後輸出的結果是b**

A.-1
B.0
C.1
D.2

知識點:NULL的含義

4:下列關於C語言的敘述錯誤的是 d
A.英文字母大小寫不加以區分
B.不同型別的變數可以出現在同一個表示式中
C.在賦值表示式中賦值號兩邊的型別可以不同
D.某些運算子在不同的場合可以有不同的含義

5:設 int a=9,b=20 ;則 printf( ″ %d,%d\n ″ ,a–,--b) ;的輸出結果是 a
A.9 , 19
B.9 , 20
C.10 , 19
D.10 , 20

知識點:運算子的優先順序

6:函式呼叫語句“ f((e1,e2),(e3,e4,e5)) ”中引數的個數是 b
A.1
B.2
C.3
D.5

知識點:函式呼叫

7:以“只讀”方式開啟文字檔案 a: \ aa.dat, 下列語句中哪一個是正確的

d
A.fp=fopen( ” a: \ aa.dat ” , ” ab ” ) //向二進位制檔案尾增加資料
B.fp=fopen( ” a: \ aa.dat ” , ” a ” ) //向文字檔案尾增加資料
C.fp=fopen( ” a: \ aa.dat ” , ” wb ” )//為輸出開啟一個二進位制檔案
D.fp=fopen( ” a: \ aa.dat ” , ” r ” )

知識點:檔案的開啟方式

8:在C語言中,有值函式的資料型別是指 b
A.函式形式引數的資料型別
B.函式返回值的資料型別
C.呼叫該函式時的實參的資料型別
D.任意指定的資料型別

知識點:有值函式

9:表示式 !x||a==b 等效於

d
A.!((x||a)b)
B.!(x||y)b
C.!(x||(a
b))
**D.(!x)||(a
b) **

知識點:運算子的優先順序

10:設int a=10, b=20, c=30;條件表示式a B

A.5
B.10
C.20
D.30

11:下列資料中,不是C語言常量的是 c
A.′\n′
B.″a″
C.e-2
D.012

12:C語言中計算a的3次方,正確的表達是 b
A.a^3
B.pow(a,3)
C.a**3
D.power(a,3)
知識點:c的庫函式

13:下列識別符號中,不是C語言保留字的是 c
A.char
B.while
C.min
D.default

14:呼叫函式時,若實參是一個數組名,則向函式對應的形參傳送的是 b
A.陣列的長度
**B.陣列的首地址 **
C.陣列第一個元素的值
D.整個陣列元素的值

16:執行語句“ k=5 | 3; ”後,變數 k 的當前值是 a
A.1
B.8
C.7
D.2

17:完成 C 原始檔編輯後、到生成執行檔案, C 語言處理系統必須執行的步驟依次為 b
A.連線、編譯
B.編譯、連線
C.連線、執行
D.執行

18:執行語句 printf( " |%9.4f|\n " ,12345.67); 後的輸出結果是 b
A.|2345.6700|
B.|12345.6700|
C.|12345.670|
D.|12345.67|

19:C語言不能選用的字母是 b
A.w
B.π
C.I
D.i

20:若變數定義時未初始化,則其值不確定的是 b
A.靜態全域性變數
B.區域性變數 //堆疊空間
C.靜態區域性變數
D.全域性變數

知識點:變數定義

分析一個細節:C語言中,定義區域性變數時如果未初始化,則值是隨機的,為什麼?
定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的區域性變數定義時如果不顯式初始化,值就是髒的。如果你顯式初始化怎麼樣?
C語言是通過一個小手段來實現區域性變數的初始化的。
int a = 15; // 區域性變數定義時初始化
C語言編譯器會自動把這行轉成:
int a; // 區域性變數定義
a = 15; // 普通的賦值語句
--------------------- 
作者:robert_wzf 
來源:CSDN 
原文:https://blog.csdn.net/robert_wzf/article/details/52462923 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

21:char **p, a[16][8]; 問:p=a是否會導致程式在以後出現問題?為什麼?

可能,有可能指標指向的地址為0,引起系統崩潰

a[0][0]=0,*p=a[0][0],**p的未知

22:命令tail用來列印檔案中最後n行。命令格式為:
  tail [-n] filename
  其中
  -n: n表示需要列印的行數,當省略此引數時,n的預設值為10。
  filename: 給定檔名。
  例如,命令tail –20 example.txt表示列印檔案example.txt的最後20行。
  請用C語言實現該程式,該程式應具有一定的錯誤處理能力,例如能處理非法命令引數和非法檔名。
  提示1:使用命令列引數;
  提示2:可以使用下面的C庫函式:

  • int atoi(char *s)將數字串轉換為相應整數;
  • fopen, fclose, printf, fprintf, exit;
  • fgets(char *s, int n, FILE *fp)從檔案中讀入一行;
  • void *malloc(unsigned size), free申請和釋放記憶體;
  • strlen計算字串長度;
  • strcpy將一個字串拷貝到另一個字串中。
    除此之外,不允許使用其它庫函式。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEFLINS 10
#define LINES  100     
#define MAXLEN 100     //每一行最大字元數量

void error(char *);
int getline(char *, int);

int main(int argc, char *argv[])
{
    char *p;                 //用於指示緩衝區中當前指標的位置 
    char *buf;               //用於指示分配出來的記憶體塊開始處
    char *bufend;            //用於指示分配出來的記憶體塊結尾處
    char line[MAXLEN];       //用於儲存當前輸入
    char *lineptr[LINES];    //定義一個字元指標陣列,這樣能節省很多空間
    int first, i, last, len, n, nlines;

    if (argc == 1)           //沒有可選項,則使用預設配置
        n = DEFLINS;
    else if (argc == 2 && (*++argv)[0] == '-')  
        n = atof(argv[0] + 1);
    else
        error ("usgae: tail [-n]");

    if (n < 1 || n > LINES)   //容錯處理
        n = LINES;

    for (i = 0; i < LINES; i++)   //字元指標陣列初始化
        lineptr[i] = NULL;

    //分配一塊記憶體,用於儲存輸入的文字行
    if ((p = buf = (int *)malloc(LINES * MAXLEN)) == NULL)   
        error ("tail: cannot allocate buf");

    bufend = buf + LINES * MAXLEN;   //指向記憶體末尾後一個字元
    last = 0;         //用於指示最新輸入行所儲存的位置
    nlines = 0;       //用於儲存輸入的文字行總數

    while ((len = getline(line, MAXLEN)) > 0)
    {
        //判斷剩餘空間是否充足,如果不充足則將p重新指向緩衝區的開頭
        if (p + len + 1 >= bufend) 
            p = buf;

        lineptr[last] = p;       //儲存當前緩衝區的地址
        strcpy (lineptr[last], line);   //字串拷貝
        if (++last >= LINES)     //若大於限制的最大行數,則重置  
            last = 0;
        p += len + 1;            //p指到下一個未被使用的緩衝區地址處
        nlines++;
    }
    if (n > nlines)        
        n = nlines;
    first = last - n;   
    if (first < 0)    //輪迴情況,即超過了最大行數,last重置了重新使用陣列,所以小於0
        first += LINES;  //調整起始索引

    for (i = first; n-- > 0; i = (i + 1) % LINES)
        printf ("%s", lineptr[i]);

    return 0;
}

void error(char *s)
{
    printf ("%s\n", s);
    exit (1);
}

int getline(char *s, int lim)
{
    int c, i;

    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;

    if (c == '\n')
    {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}
--------------------- 
作者:talent_CYJ 
來源:CSDN 
原文:https://blog.csdn.net/talent_CYJ/article/details/51820488 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

23:過載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區別?
過載:是指允許存在多個同名函式,而這些函式的引數表不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。
重寫:是指子類重新定義復類虛擬函式的方法。
從實現原理上來說:
過載:編譯器根據函式不同的引數表,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的。也就是說,它們的地址在編譯期就綁定了(早繫結),因此,過載和多型無關!
重寫:和多型真正相關。當子類重新定義了父類的虛擬函式後,父類指標根據賦給它的不同的子類指標,動態的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛擬函式的地址無法給出)。因此,這樣的函式地址是在執行期繫結的(晚繫結)。

24:講述const,static,extern的作用;

const:
1.修飾右邊的基本變數和指標變數;
2.被const修飾的變數只讀,也就是隻能獲取,不能修改。
static:

1、擴充套件生存期;
2、限制作用域;
3、唯一性

extern:
extern作用:宣告外部全域性變數。

25:耶穌有13個門徒,其中有一個就是出賣耶穌的叛徒,請用排除法找出這位叛徒:13人圍坐一圈,從第一個開始報號:1,2,3,1,2,3……,凡是報到“3”就退出圈子,最後留在圈內的人就是出賣耶穌的叛徒,請找出它原來的序號。

int a[13] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
    int number = 13;//記錄當前人數
    int count = 0;//1,2,3報數
    int i = 0;
    while (number > 1) {
        if (a[i] != 0) {
            count++;
        }
        if (count == 3) {
            a[i] = 0;//剔除的人
            count = 0;
            number--;
        }
        i++;
        if (i == 13) {
            i = 0;
        }
      }
    for ( i = 0; i < 13; i++) {
        if (a[i] > 0) {
            printf("%d", a[i]);
        }
    }

26:C/C++原始碼中,檢查花括弧“(”與 “)”,“{”與“}”)是否匹配,若不匹配,則輸出不匹配花括弧所在的行與列。

程式碼模型
char c;
while(1){
c = getc(std);//從檔案或輸入流、控制檯讀入一個字元
if(c=='\n')   line++;//如果讀到回車行數加一
if(c=='(')  push(c,line);//no代表當前行號
if(c==')'){  
       if(isempty()==0){//判斷棧空否
            pop();
           //如果不空說明(有不匹配,則把不匹配的行號都打出來
       }else{
           //如果空了則說明)括號不匹配
       }
}
同理{ }也能判斷出來。

27:寫一個病毒。

28:一堆數在一個集合中,總共2n個,問如何將這些數分成A,B兩分,每分n個,要求A中的數均小於B中的數,需要考慮時間複雜度。

摘要:利用對手論證法證明中位數問題的比較次數下界 
 
 
5個數通過6次比較求中位數的方法如下:

5個數之間的大小關係構成的一個樹形圖T。T中的一個結點代表一個數,而一條邊代表它所關聯的兩個數的大小關係,T的根就是中位數。顯然T中的一條邊要由一次比賽來確定。在下面的圖中,如果x大於y,則節點x在節點y的上方且x和y有一條邊相連。另外,*表示一般的數,o表示下一次即將進行比較的兩個數。

第1步,先任取兩個數比較,結果為:

  *
  |
  *  o o *2步,再取另外兩個數比較,結果為:

  o  o
  |  |
  *  *  *3步,按照上圖比較其中兩個標記為o的數,比較結果只有一種情況:

   *
  / \
 *   o
 |  
 *      o
 
第4步,按照上圖比較其中兩個標記為o的數,比較結果有兩種情況:

   *    o               *
  /  \ /               / \
 o    *               o   o
 |                    |   |
 *                    *   *5步,按照上圖比較其中兩個標記為o的數,比較結果有兩種情況:

  *    *               *
 / \  / \             /
/   \/   \           /
|   /\   |          /
|  /  \  |         *
| /    \ |         | \
|/      \|         |  \
o        o         |   \
|                  o    o
|                       |
|                       |
*                       *6步,按照上圖比較其中兩個標記為o的數,比較結果有兩種情況:

 
*   *         *   *            *               *
 \ /           \ /             |               |
  x             x              *               *
  |            / \             |               |
  *           *   *            x               x
  |                            |              / \
  *                            *             *   *
                               |
                               *

其中的x就是中位數。


事實上,可以證明:對於n個數求中位數,至少需要3(n-1)/2次比較,並且存在一個O(n)次比較的演算法。

下面介紹如何利用對手論證方法來證明中位數問題的比較次數下界。

首先介紹“對手論證(Adversary Argument)”方法。

若用P表示所討論的問題,I表示問題的輸入,A表示求解問題P的基於比較運算的演算法T(A,I)表示對於輸入I演算法A的計算時間複雜性,那麼,函式
       U(n)=min{max{T(A,I)}, for each I}, for each A,
是問題P當輸入的大小為n時在最壞情況下的最好下界。它是問題所固有的。

問題P的這個最好下界通常很難按其定義計算得到,因為對於一個具體的A,要得到
       max{T(A,I)}, for each I
就是一件很難的事,更何況對於一切的A。因此,人們往往不去精確地求U(n),而是退而求其次,即找一個f(n),它不大於U(n)但儘量地接近於U(n),使f(n)成為問題P的一個好下界。

29:設計一函式,求整數區間[a,b]和[c,d]的交集

public int[] rangeOfOveride(int a, int b, int c, int d) {
	int begin = Math.max(a, c);
	int end = Math.min(b, d);
	int[] range = new int[2];
	if(begin > end) return null;
	else {
		range[0] = begin;
		range[1] = end;
	}
	return range;
}

**30:unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
請問: p1+5=(unsigned char *)0x801005; **

     p2+5=unsigned long *)0x810019;