久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

嵌入式程序員C語言筆試經典題

時間:2019-05-12 21:46:47下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《嵌入式程序員C語言筆試經典題》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《嵌入式程序員C語言筆試經典題》。

第一篇:嵌入式程序員C語言筆試經典題

新一篇: 存儲過程,無限級分類 | 舊一篇: 類繼承中構造函數和析構函數的調用

這個測試適于不同水平的應試者,大多數初級水平的應試者的成績會很差,經驗豐富的程序員應該有很好的成績。為了讓你能自己決定某些問題的偏好,每個問題沒有分配分數,如果選擇這些考題為你所用,請自行按你的意思分配分數。

預處理器(Preprocessor).用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)#define SECONDS_PER_YEAR(60 * 60 * 24 * 365)UL 我在這想看到幾件事情:

1)#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

2)懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

3)意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。

4)如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要。.寫一個“標準”宏MIN,這個宏輸入兩個參數并返回較小的一個。#define MIN(A,B)((A)<=(B)?(A):(B))這個測試是為下面的目的而設的:

1)標識#define在宏中應用的基本知識。這是很重要的。因為在嵌入(inline)操作符 變為標準C的一部分之前,宏是方便產生嵌入代碼的唯一方法,對于嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。

2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要的。3)懂得在宏中小心地把參數用括號括起來

4)我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什么事? least = MIN(*p++, b);

3.預處理器標識#error的目的是什么?

如果你不知道答案,請看參考文獻1。這問題對區分一個正常的伙計和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找出象這種問題的答案。當然如果你不是在找一個書呆子,那么應試者最好希望自己不要知道答案。指令 用途

# 空指令,無任何效果

#include 包含一個源代碼文件

#define 定義宏

#undef 取消已定義的宏

#if 如果給定條件為真,則編譯下面代碼

#ifdef 如果宏已經定義,則編譯下面代碼

#ifndef 如果宏沒有定義,則編譯下面代碼

#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼 #endif 結束一個#if……#else條件編譯塊

#error 停止編譯并顯示錯誤信息

死循環(Infinite loops)

4.嵌入式系統中經常要用到無限循環,你怎么樣用C編寫死循環呢? 這個問題用幾個解決方案。我首選的方案是:

while(1){ }

一些程序員更喜歡如下方案:

for(;;){ }

這個實現方式讓我為難,因為這個語法沒有確切表達到底怎么回事。如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:“我被教著這樣做,但從沒有想到過為什么。”這會給我留下一個壞印象。

第三個方案是用 goto Loop:...goto Loop;應試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進入新領域的BASIC/FORTRAN程序員。

數據聲明(Data declarations)

5.用變量a給出下面的定義 a)一個整型數(An integer)

//int a me b)一個指向整型數的指針(A pointer to an integer)

//int *a me c)一個指向指針的的指針,它指向的指針是指向一個整型數(A pointer to a pointer to an intege)r

//int ** a me

d)一個有10個整型數的數組(An array of 10 integers)//int a[10] me e)一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers)

// int * a[10] me f)一個指向有10個整型數數組的指針(A pointer to an array of 10 integers)

//in t(*a)[10] me g)一個指向函數的指針,該函數有一個整型參數并返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)

int(*fun)(int)

h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型數(An array of ten pointers to functions that take an integer argument and return an integer)

//int(*fun[10])(int)答案是:

a)int a;// An integer b)int *a;// A pointer to an integer c)int **a;// A pointer to a pointer to an integer d)int a[10];// An array of 10 integers e)int *a[10];// An array of 10 pointers to integers f)int(*a)[10];// A pointer to an array of 10 integers g)int(*a)(int);// A pointer to a function a that takes an integer argument and returns an integer h)int(*a[10])(int);// An array of 10 pointers to functions that take an integer argument and return an integer

人們經常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間里,我確定我知道這個問題的答案。應試者如果不知道所有的答案(或至少大部分答案),那么也就沒有為這次面試做準備,如果該面試者沒有為這次面試做準備,那么他又能為什么出準備呢?

Static

6.關鍵字static的作用是什么?

這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用: 1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。

2)在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

3)在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。

大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼范圍的好處和重要性。

Const

7.關鍵字const有什么含意?

我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業余者打交道。去年Dan Saks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)

如果應試者能正確回答這個問題,我將問他一個附加的問題: 下面的聲明都是什么意思?

const int a;int const a;const int *a;int * const a;int const * a const;

/******/ 前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意識a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關鍵字const呢?我也如下的幾下理由:

1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)2)通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。

3)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

Volatile

8.關鍵字volatile有什么含意?并給出三個不同的例子。

一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子: 1)并行設備的硬件寄存器(如:狀態寄存器)

2)一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)3)多線程應用中被幾個任務共享的變量

回答不出這個問題的人是不會被雇傭的。我認為這是區分C程序員和嵌入式系統程序員的最基本的問題。搞嵌入式的家伙們經常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。不懂得volatile的內容將會帶來災難。

假設被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。

1)一個參數既可以是const還可以是volatile嗎?解釋為什么。2);一個指針可以是volatile 嗎?解釋為什么。3);下面的函數有什么錯誤:

int square(volatile int *ptr){ return *ptr * *ptr;}

下面是答案:

1)是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。

2);是的。盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。3)這段代碼有點變態。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:

int square(volatile int *ptr){ int a,b;a = *ptr;b = *ptr;return a * b;}

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

long square(volatile int *ptr){ int a;a = *ptr;return a * a;}

位操作(Bit manipulation)

9.嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。對這個問題有三種基本的反應

1)不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。

2)用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon為其較復雜的通信芯片寫的驅動程序,它用到了bit fields因此完全對我無用,因為我的編譯器用其它的方式來實現bit fields的。從道德講:永遠不要讓一個非嵌入式的家伙粘實際硬件的邊。

3)用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下:

#define BIT3(0x1 << 3)static int a;

void set_bit3(void){ a |= BIT3;} void clear_bit3(void){ a &= ~BIT3;}

一些人喜歡為設置和清除值而定義一個掩碼同時定義一些說明常數,這也是可以接受的。我希望看到幾個要點:說明常數、|=和&=~操作。

訪問固定的內存位置(Accessing fixed memory locations)

10.嵌入式系統經常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求設置一絕對地址為0x67a9的整型變量的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。這一問題測試你是否知道為了訪問一絕對地址把一個整型數強制轉換(typecast)為一指針是合法的。這一問題的實現方式隨著個人風格不同而不同。典型的類似代碼如下: int *ptr;ptr =(int *)0x67a9;*ptr = 0xaa55;

A more obscure approach is: 一個較晦澀的方法是:

*(int * const)(0x67a9)= 0xaa55;

即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。

中斷(Interrupts)

11.中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展—讓標準C支持中斷。具代表事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程序(ISR),請評論一下這段代碼的。

__interrupt double compute_area(double radius){ double area = PI * radius * radius;printf(“nArea = %f”, area);return area;}

這個函數有太多的錯誤了,以至讓人不知從何說起了:

1)ISR 不能返回一個值。如果你不懂這個,那么你不會被雇用的。

2)ISR 不能傳遞參數。如果你沒有看到這一點,你被雇用的機會等同第一項。

3)在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。此外,ISR應該是短而有效率的,在ISR中做浮點運算是不明智的。

4)與第三點一脈相承,printf()經常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點,那么你的被雇用前景越來越光明了。

代碼例子(Code examples).下面的代碼輸出是什么,為什么?

void foo(void){ unsigned int a = 6;int b =-20;(a+b > 6)? puts(“> 6”): puts(“<= 6”);} 這個問題測試你是否懂得C語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 “>6”。原因是當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。因此-20變成了一個非常大的正整數,所以該表達式計算出的結果大于6。這一點對于應當頻繁用到無符號數據類型的嵌入式系統來說是豐常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。

13.評價下面的代碼片斷:

unsigned int zero = 0;unsigned int compzero = 0xFFFF;/*1's complement of zero */

對于一個int型不是16位的處理器為說,上面的代碼是不正確的。應編寫如下:

unsigned int compzero = ~0;這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經驗里,好的嵌入式程序員非常準確地明白硬件的細節和它的局限,然而PC機程序往往把硬件作為一個無法避免的煩惱。

到了這個階段,應試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應試者不是很好,那么這個測試就在這里結束了。但如果顯然應試者做得不錯,那么我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優秀的應試者能做得不錯。提出這些問題,我希望更多看到應試者應付問題的方法,而不是答案。不管如何,你就當是這個娛樂吧...動態內存分配(Dynamic memory allocation)

14.盡管不像非嵌入式計算機那么常見,嵌入式系統還是有從堆(heap)中動態分配內存的過程的。那么嵌入式系統中,動態分配內存可能發生的問題是什么?

這里,我期望應試者能提到內存碎片,碎片收集的問題,變量的持行時間等等。這個主題已經在ESP雜志中被廣泛地討論過了(主要是 P.J.Plauger, 他的解釋遠遠超過我這里能提到的任何解釋),所有回過頭看一下這些雜志吧!讓應試者進入一種虛假的安全感覺后,我拿出這么一個小節目: 下面的代碼片段的輸出是什么,為什么?

char *ptr;if((ptr =(char *)malloc(0))== NULL)puts(“Got a null pointer”);else puts(“Got a valid pointer”);

這是一個有趣的問題。最近在我的一個同事不經意把0值傳給了函數malloc,得到了一個合法的指針之后,我才想到這個問題。這就是上面的代碼,該代碼的輸出是“Got a valid pointer”。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。

Typedef Typedef 在C語言中頻繁用以聲明一個已經存在的數據類型的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:

#define dPS struct s * typedef struct s * tPS;

以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結構s指針。哪種方法更好呢?(如果有的話)為什么?

這是一個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef更好。思考下面的例子:

dPS p1,p2;tPS p3,p4;第一個擴展為

struct s * p1, p2;.上面的代碼定義p1為一個指向結構的指,p2為一個實際的結構,這也許不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。

晦澀的語法.C語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什么?

int a = 5, b = 7, c;c = a+++b;

這個問題將做為這個測驗的一個愉快的結尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,根據最處理原則,編譯器應當能處理盡可能所有合法的用法。因此,上面的代碼被處理成:

c = a++ + b;

因此, 這段代碼持行后a = 6, b = 7, c = 12。

如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當作問題。我發現這個問題的最大好處是這是一個關于代碼編寫風格,代碼的可讀性,代碼的可修改性的好的話題。

第二篇:嵌入式程序員C語言筆試題目

華碩_嵌入式程序員C語言筆試題目

預處理器(Preprocessor).用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)

#define SECONDS_PER_YEAR(60 * 60 * 24 * 365)UL

我在這想看到幾件事情:

1)#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

2)懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

3)意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。

4)如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要。.寫一個“標準”宏MIN,這個宏輸入兩個參數并返回較小的一個。

#define MIN(A,B)((A)<=(B)?(A):(B))

這個測試是為下面的目的而設的:

1)標識#define在宏中應用的基本知識。這是很重要的。因為在 嵌入(inline)操作符 變為標準C的一部分之前,宏是方便產生嵌入代碼的唯一方法,對于嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。

2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要的。

3)懂得在宏中小心地把參數用括號括起來

4)我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什么事?

least = MIN(*p++, b);

3.預處理器標識#error的目的是什么?

Error directives produce compiler-time error messages.死循環(Infinite loops)

4.嵌入式系統中經常要用到無限循環,你怎么樣用C編寫死循環呢?

這個問題用幾個解決方案。我首選的方案是:

while(1){ }

一些程序員更喜歡如下方案:

for(;;){ }

這個實現方式讓我為難,因為這個語法沒有確切表達到底怎么回事。如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:“我被教著這樣做,但從沒有想到過為什么?!边@會給我留下一個壞印象。

第三個方案是用 goto Loop:...goto Loop;

應試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進入新領域的BASIC/FORTRAN程序員。

數據聲明(Data declarations)

5.用變量a給出下面的定義

a)一個整型數(An integer)

b)一個指向整型數的指針(A pointer to an integer)c)一個指向指針的的指針,它指向的指針是指向一個整型數(A pointer to a pointer to an intege)r

d)一個有10個整型數的數組(An array of 10 integers)e)一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers)

f)一個指向有10個整型數數組的指針(A pointer to an array of 10 integers)

g)一個指向函數的指針,該函數有一個整型參數并返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)

h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型數(An array of ten pointers to functions that take an integer argument and return an integer)

答案是:

a)int a;// An integer

b)int *a;// A pointer to an integer

c)int **a;// A pointer to a pointer to an integer

d)int a[10];// An array of 10 integers

e)int *a[10];// An array of 10 pointers to integers

f)int(*a)[10];// A pointer to an array of 10 integers

g)int(*a)(int);// A pointer to a function a that takes an integer argument and returns an integer

h)int(*a[10])(int);// An array of 10 pointers to functions that take an integer argument and return an integer

人們經常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間里,我確定我知道這個問題的答案。應試者如果不知道所有的答案(或至少大部分答案),那么也就沒有為這次面試做準備,如果該面試者沒有為這次面試做準備,那么他又能為什么出準備呢? Static

6.關鍵字static的作用是什么?

這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:

1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。

2)在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

3)在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。

大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼范圍的好處和重要性。

Const

7.關鍵字const有什么含意?

我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業余者打交道。去年Dan Saks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)

如果應試者能正確回答這個問題,我將問他一個附加的問題:

下面的聲明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * const a=new int(1);

/******/

前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意識a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關鍵字const呢?我也如下的幾下理由:

1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)

第三篇:2012年最新C和C++程序員筆試題

以下是整理自8月下旬至10月份內的各大公司的筆試面試三十題(注:所有題目基本上全部為軟件開發方向,題目來源:網絡收集),相信一定能給正在參加各種校招的諸多朋友多少幫助,學習參考或借鑒

九月十月百度人搜,阿里巴巴,騰訊華為小米搜狗筆/面試五十題

9月11日,京東:

談談你對面向對象編程的認識

? 8月20日,金山面試,題目如下:

數據庫1中存放著a類數據,數據庫2中存放著以天為單位劃分的表30張(比如table_20110909,table_20110910,table_20110911),總共是一個月的數據。表1中的a類數據中有一個字段userid來唯一判別用戶身份,表2中的30張表(每張表結構相同)也有一個字段userid來唯一識別用戶身份。如何判定a類數據庫的多少用戶在數據庫2中出現過? 百度實習筆試題(2012.5.6)

簡答題1

一個單詞單詞字母交換,可得另一個單詞,如army->mary,成為兄弟單詞。提供一個單詞,在字典中找到它的兄弟。描述數據結構和查詢過程。評點:同去年9月份的一道題,見此文第3題:簡答題2 線程和進程區別和聯系。什么是“線程安全”

簡答題3

C和C++怎樣分配和釋放內存,區別是什么

算法題1

一個url指向的頁面里面有另一個url,最終有一個url指向之前出現過的url或空,這兩種情形都定義為null。這樣構成一個單鏈表。給兩條這樣單鏈表,判斷里面是否存在同樣的url。url以億級計,資源不足以hash。

算法題2

數組al[0,mid-1] 和 al[mid,num-1],都分別有序。將其merge成有序數組al[0,num-1],要求空間復雜度O(1)系統設計題

百度搜索框的suggestion,比如輸入北京,搜索框下面會以北京為前綴,展示“北京愛情故事”、“北京公交”、“北京醫院”等等搜索詞。

如何設計使得空間和時間復雜度盡量低。評點:老題,直接上Trie樹+Hash,Trie樹的介紹見:從Trie樹(字典樹)談到后綴樹。

? ? 人搜筆試

1.快排每次以第一個作為主元,問時間復雜度是多少?(O(N*logN))

2.T(N)= N + T(N/2)+T(2N), 問T(N)的時間復雜度是多少? 點評:O(N*logN)or O(N)? 3.從(0,1)中平均隨機出幾次才能使得和超過1?(e)4.編程題:

一棵樹的節點定義格式如下: struct Node{ Node* parent;Node* firstChild;// 孩子節點 Node* sibling;// 兄弟節點 } 要求非遞歸遍歷該樹。

思路:采用隊列存儲,來遍歷節點。5.算法題:

有N個節點,每兩個節點相鄰,每個節點只與2個節點相鄰,因此,N個頂點有N-1條邊。每一條邊上都有權值wi,定義節點i到節點i+1的邊為wi。求:不相鄰的權值和最大的邊的集合。? 人搜面試,所投職位:搜索研發工程師:面試題回憶

1、刪除字符串開始及末尾的空白符,并且把數組中間的多個空格(如果有)符轉化為1個。

2、求數組(元素可為正數、負數、0)的最大子序列和。

3、鏈表相鄰元素翻轉,如a->b->c->d->e->f-g,翻轉后變為:b->a->d->c->f->e->g

4、鏈表克隆。鏈表的結構為: typedef struct list { int data;//數據字段

list *middle;//指向鏈表中某任意位置元素(可指向自己)的指針 list *next;//指向鏈表下一元素 } list;5、100萬條數據的數據庫查詢速度優化問題,解決關鍵點是:根據主表元素特點,把主表拆分并新建副表,并且利用存儲過程保證主副表的數據一致性。(不用寫代碼)

6、求正整數n所有可能的和式的組合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2)。?

7、求旋轉數組的最小元素(把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個排好序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3, 4, 5, 1, 2}為{1, 2, 3, 4, 5}的一個旋轉,該數組的最小值為1)

8、找出兩個單鏈表里交叉的第一個元素

9、字符串移動(字符串為*號和26個字母的任意組合,把*號都移動到最左側,把字母移到最右側并保持相對順序不變),要求時間和空間復雜度最小

10、時間復雜度為O(1),怎么找出一個棧里的最大元素

11、線程、進程區別

12、static在C和C++里各代表什么含義

13、const在C/C++里什么意思

14、常用linux命令

15、解釋Select/Poll模型 ? 網易有道二面:

判斷一個數字序列是BST后序遍歷的結果,現場寫代碼。

? 8月30日,網易有道面試題

var tt = 'aa';function test(){ alert(tt);var tt = 'dd';alert(tt);} test();? ? 8月31日,百度面試題:不使用隨機數的洗牌算法,9月6日,阿里筆試題:平面上有很多點,點與點之間有可能有連線,求這個圖里環的數目。

?? 9月7日,一道華為上機題:

題目描述: 選秀節目打分,分為專家評委和大眾評委,score[] 數組里面存儲每個評委打的分數,judge_type[] 里存儲與 score[] 數組對應的評委類別,judge_type == 1,表示專家評委,judge_type == 2,表示大眾評委,n表示評委總數。打分規則如下:專家評委和大眾評委的分數先分別取一個平均分(平均分取整),然后,總分 = 專家評委平均分 * 0.6 + 大眾評委 * 0.4,總分取整。如果沒有大眾評委,則 總分 = 專家評委平均分,總分取整。函數最終返回選手得分。

函數接口 int cal_score(int score[], int judge_type[], int n)

上機題目需要將函數驗證,但是題目中默認專家評委的個數不能為零,但是如何將這種專家數目為0的情形排除出去。

9月8日,騰訊面試題:

假設兩個字符串中所含有的字符和個數都相同我們就叫這兩個字符串匹配,比如:abcda和adabc,由于出現的字符個數都是相同,只是順序不同,所以這兩個字符串是匹配的。要求高效!

又是跟上述第3題中簡單題一的兄弟節點類似的一道題,我想,你們能想到的,?? 阿里云,搜索引擎中5億個url怎么高效存儲;

?? 一道C++筆試題,求矩形交集的面積:

在一個平面坐標系上,有兩個矩形,它們的邊分別平行于X和Y軸。

其中,矩形A已知,ax1(左邊), ax2(右邊), ay1(top的縱坐標), ay2(bottom縱坐標).矩形B,類似,就是 bx1, bx2, by1, by2。這些值都是整數就OK了。要求是,如果矩形沒有交集,返回-1,有交集,返回交集的面積。int area(rect const& a, rect const& b){...} 點評: healer_kx:

補齊代碼,最好是簡潔的,別用庫。你可以寫你的輔助函數,宏定義,代碼風格也很重要。ri_aje:struct rect ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? {

// axis alignment assumed // bottom left is(x[0],y[0]), top right is(x[1],y[1])double x [2];double y [2];};

template T const& min(T const& x, T const& y){ return x T const& max(T const& x, T const& y){ return x>y ? x : y;}

// return type changed to handle non-integer rects double area(rect const& a, rect const& b){

// perfectly adjacent rects are considered having an intersection of 0 area double const dx = min(a.x[1],b.x[1])max(a.y[0],b.y[0]);return dx>=0&&dy>=0 ? dx*dy :-1;?? } ?? 下面是一個簡短的證明。

對于平行于坐標軸的矩形 r,假設其左下角點坐標為(rx0,ry0),右上角點坐標為(rx1,ry1),那么由 r 定義的無限有界點集為:{(x,y)|x in [rx0,rx1] && y in [ry0,ry1]}。

根據交集的定義,則任意二維點(x,y)在矩形 a,b 的交集內等價于 {(x,y)|(x,y)in a 并且(x,y)in b} <==>

{(x,y)|x in [ax0,ax1] && x in [bx0,bx1] 并且 y in [ay0,ay1] && y in [by0,by1]} <==> {(x,y)|x in [max(ax0,bx0),min(ax1,bx1)] 并且 y in [max(ay0,by0),min(ay1,by1)]}

因此,交集矩形的邊長分別為 min(ax1,bx1)-max(ax0,bx0)和 min(ay1,by1)-max(ay0,by0)。注意當交集為空時(a,b 不相交),則經此法計算出來的交集邊長為負值,此事實可用于驗證 a,b 的相交性。

鑒于笛卡爾積各個維度上的不相關性,此方法可擴展到任意有限維線性空間,比如,三維空間中平行于坐標軸的長方體的交集體積可以用類似的方法計算。

?? 2012年創新工場校園招聘最后一道筆試題:工場很忙

創新工場每年會組織同學與項目的雙選會,假設現在有M個項目,編號從1到M,另有N名同學,編號從1到N,每名同學能選擇最多三個、最少一個感興趣的項目。選定之后,HR會安排項目負責人和相應感興趣的同學一對一面談,每次面談持續半小時。由于大家平時都很忙,所以咱們要盡量節約時間,請你按照以下的條件設計算法,幫助HR安排面試。

1)同學很忙。項目負責人一次只能與一名同學面談,而同學會在自己第一個面試開始時達到工場,最后一個面試結束后離開工場,如果參加一個項目組的面試后不能立即參加下一個項目組的面試,就必須在工場等待。所以請盡可能讓同學的面試集中在某一時間段,減少同學在工場等待的時間。

2)項目負責人很忙。眾所周知,創業團隊的負責人會有很多事情要做,所以他們希望能夠將自己參與的面試集中在某一段時間內,請在保證1)的情況下,使得項目負責人等待的時間最少。

3)HR很忙。從第一輪面試開始以后,所有HR都必須等到最后一輪面試結束,所以需要在保證1)和2)的同時,也能盡快解放掉所有的HR,即讓第一輪面試到最后一輪面試之間持續的時間最短。

輸入(以文件方式輸入,文件名為iw,例如iw.in):

第1行...第n行:同學的編號 項目的編號

樣例(數據間用空格隔開,兩個0表示輸入結束):

112

0 0

表示M=3,N=3,編號為1的同學選擇了項目1,2和3,編號為2的同學選擇了項目1,編號為3的同學選了項目1和2

輸出(以文件方式輸出,文件名為iw,例如iw.out):

第1行:編號為1的項目依次面試新同學的編號序列

第2行:編號為2的項目依次面試新同學的編號序列...第n行:編號為n的項目依次面試新同學的編號序列

樣例(數據間用空格隔開,0表示沒有面試):3 21 0 0 0 1

表示編號為1的項目在第一輪面試編號為1的同學,第二輪面試編號為3的同學,第三輪面試編號為2的同學

編號為2的項目在第一輪面試編號為3的同學,第二輪面試編號為1的同學,第二輪不用面試

編號為3的項目在第一輪和第二輪都不用面試,第三輪面試編號為1的同學

4**9 的筆試題,比較簡單: 1.求鏈表的倒數第二個節點

2.有一個整數數組,求數組中第二大的數 阿里巴巴二道題 第一道:

對于給定的整數集合S,求出最大的d,使得a+b+c=d。a,b,c,d互不相同,且都屬于S。集合的元素個數小于等于2000個,元素的取值范圍在[-2^28,2^281)^2)。最后我給出了一個巧妙的證明。然后發現如果是m*n的矩陣也是類似的答案,不局限于方陣。此外,題目具體描述可以看看這里:

?? 9月27日,小米兩面:

一面:

除了聊研究,就一道題

數組里找到和最接近于0的兩個值。二面:

行列有序的矩陣查找一個數

直方圖最大矩形。點評:這里有此題的具體表述及一份答案: 3 next_permutation 字符串匹配 含有* ?(寫代碼)

實現strcpy memmove(必須寫代碼)//void * memmove(void * destination, const void * source, size_t num);)?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? //是的標準函數,其作用是把從source開始的num個字符拷貝到destination。

//最簡單的方法是直接復制,但是由于它們可能存在內存的重疊區,因此可能覆蓋了原有數據。//比如當source+count>=dest&&source

//解決辦法是從后往前拷貝。//對于其它情況,則從前往后拷貝。

void* memmove(void* dest, void* source, size_t count){

void* ret = dest;

if(dest <= source || dest >=(source + count)){ //正向拷貝

//copy from lower addresses to higher addresses while(count--)*dest++ = *source++;} else {

//反向拷貝

//copy from higher addresses to lower addresses dest += count1;?? ?? ?? ?? ?? while(count--)*dest--= *source--;}

return ret;}

?? 6 讀數(千萬億,百萬億??)變為數字(說思路即可,字符串查找,填寫各個權值的字段,然后判斷是否合法,讀前面那些×權值,累加)。?? 9月27日,Hulu 2013北京地區校招筆試題 填空題:

1、中序遍歷二叉樹,結果為ABCDEFGH,后序遍歷結果為ABEDCHGF,那么前序遍歷結果為?

2、對字符串HELL0_HULU中的字符進行二進制編碼,使得字符串的編碼長度盡可能短,最短長度為?

3、對長度12的有序數組進行二分查找,目標等概率出現在數組的每個位置上,則平均比較次數為?

4、一副撲克(去王),每個人隨機的摸兩張,則至少需要多少人摸牌,才能保證有兩個人抽到同樣的花色。

5、x個小球中有唯一一個球較輕,用天平秤最少稱量y次能找出這個較輕的球,寫出y和x的函數表達式y=f(x)6、3的方冪及不相等的3的方冪的和排列成遞增序列1,3,4,9,10,12,13??,寫出數列第300項

7、無向圖G有20條邊,有4個度為4的頂點,6個度為3的頂點,其余頂點度小于3,則G有多少個頂點

8、桶中有M個白球,小明每分鐘從桶中隨機取出一個球,涂成紅色(無論白或紅都涂紅)再放回,問小明將桶中球全部涂紅的期望時間是?

9、煤礦有3000噸煤要拿到市場上賣,有一輛火車可以用來運煤,火車最多能裝1000噸煤,且火車本身需要燒煤做動力,每走1公里消耗1噸煤,如何運煤才能使得運到市場的煤最多,最多是多少? 10、1,2,3,4?..n,n個數進棧,有多少種出棧順序,寫出遞推公式(寫出通項公式不得分)

11、宇宙飛船有100,000位的存儲空間,其中有一位有故障,現有一種Agent可以用來檢測故障,每個Agent可以同時測試任意個位數,若都沒有故障,則返回OK,若有一位有故障,則失去響應。如果有無限多個Agent可供使用,每個Agent進行一次檢測需要耗費1小時,現在有2個小時時間去找出故障位,問最少使用多少個Agent就能找出故障。

(總共12道填空題,還有一道太復雜,題目很長,還有示意圖,這里沒有記錄下來)大題:

1、n個數,找出其中最小的k個數,寫出代碼,要求最壞情況下的時間復雜度不能高于O(n logk)

2、寫程序輸出8皇后問題的所有排列,要求使用非遞歸的深度優先遍歷

3、有n個作業,a1,a2?..an,作業aj的處理時間為tj,產生的效益為pj,最后完成期限為dj,作業一旦被調度則不能中斷,如果作業aj在dj前完成,則獲得效益pj,否則無效益。給出最大化效益的作業調度算法。?? 有道的一個筆試題,1-9,9個數組成三個三位數,且都是完全平方數(三個三位數 占據 9個數)求解法。?? 點評@林晚楓&歸云見鴻:(a*10+b)(a*10+b)100a^2+20ab+b^2 a 屬于 [1,2,3] a=3,b=1 31 961, a=2,b=3 23 529 400+40b+b^2 25 625 27 729 28 784 29 841 a=1,b=3 13 169 100+20b+b^2 14 196 16 256 17 289 18 324 19 361 =>最終唯一解 529 784 361 具體代碼如下(3個for循環,然后hash):

?? 9月28日,大眾點評北京筆試題目:

1.一個是跳臺階問題,可以1次一級,1次兩級,1次三級,求N級的跳法一共多少種?

點評:老題,?? 2.一個文件有N個單詞,每行一個,其中一個單詞出現的次數大于N/2,怎么樣才能快速找出這個單詞?

點評:還是老題,?? 大眾點評前面還有30道邏輯題,15道文字推理,15道數學推理,一共只給20min。?? 9月28日,網易筆試題:

1、英雄升級,從0級升到1級,概率100%。

從1級升到2級,有1/3的可能成功;1/3的可能停留原級;1/3的可能下降到0級; 從2級升到3級,有1/9的可能成功;4/9的可能停留原級;4/9的可能下降到1級。每次升級要花費一個寶石,不管成功還是停留還是降級。求英雄從0級升到3級平均花費的寶石數目。

點評:題目的意思是,從第n級升級到第n+1級成功的概率是(1/3)^n(指數),停留原級和降級的概率一樣,都為[1-(1/3)^n]/2)。

2、將一個很長的字符串,分割成一段一段的子字符串,子字符串都是回文字符串。有回文字符串就輸出最長的,沒有回文就輸出一個一個的字符。例如: habbafgh 輸出h,abba,f,g,h。

點評:一般的人會想到用后綴數組來解決這個問題,?? 10月9日,騰訊一面試題: 有一個log文件,里面記錄的格式為: QQ號: 時間: flag: 如123456 14:00:00 0

123457 14:00:01 1

其中flag=0表示登錄 flag=1表示退出 問:統計一天平均在線的QQ數。

點評:第8題后的騰訊面試題,讀者可以參看之。

?? 10月9日,騰訊面試題:

1.有一億個數,輸入一個數,找出與它編輯距離在3以內的書,比如輸入6(0110),找出0010等數,數是32位的。2.每個城市的IP段是固定的,新來一個IP,找出它是哪個城市的,設計一個后臺系統。?? 10月9日,YY筆試題: 輸出一個字符串中沒有重復的字符。如“baaca”輸出“bac”。對于一個多叉樹,設計TreeNode節點和函數,返回先序遍歷情況下的下一個節點。函數定義為TreeNode* NextNode(TreeNode* node)3 分割字符串。

對于一個字符串,根據分隔符seperator,把字符串分割,如果存在多個分隔符連在一起,則當做一個分隔符。如果分隔符出現在“ ”符號之間,則不需要分割“ ”之間的字符。比如a++abc,分隔符為+,輸出a abc a+“hu+” 輸出a hu+ a++“HU+JI 輸出a ”HU JI。

請根據上述需求完成函數:void spiltString(string aString,char aSeperator)。?? 10月9日,趕集網筆試

?? 10月9日,阿里巴巴2013校園招聘全套筆試題(注:下圖中所標答案不代表標準答案,有問題,歡迎留言評論)

上述第15題,填空:lower+(upper-lower)/2 lower mid upper 0 6 12 7 9 12 7 7 8 8 8 8

比較4次

上述第16題,解答如下圖所示:

上述第17題,解答如下圖所示:

18、甲包8個紅球 2個藍球,乙包2個紅球 8個藍球。拋硬幣決定從哪個包取球,取了11次,7紅4藍。注,每次取后還放進去,只拋一次硬幣。問選的是甲包的概率? 點評:

貝葉斯公式 + 全概率公式作答(參看鏈接:http://)。具體解答如下圖所示:

注:上述第15~18的解答全部來自讀者Lei Lei來信給出的解答,特此感謝。有任何問題,歡迎隨時討論&指正,同時,更歡迎其他朋友也一起來做這些題目(你的答案一經選用,我可以根據你的要求,貼出你的個人主頁或微博地址或博客地址)。

19、已知一個n個元素的數組,第i個元素在排序后的位置在[i-k,i+k]區間,k<

10月10日,暴風影音筆試:

都是非常基礎的題目,這是其中一道:一個整數轉換成二進制后,問里面有多少個1。10月10日人人網面試題 第一面:

1、(1)++i 和 i++,那個效率高?

(2)++++i,i++++,哪個是合法的?

(3)實現int型的++i 和 i++操作。

2、一段程序,求輸出。(考察靜態變量和模版類)

?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? int g = 0;template class B { public: int static fun(){ static int value = ++g;return value;} };

int main(){ ?? ?? ?? ?? ?? ?? ?? cout << B::fun()<< endl;cout << B::fun()<< endl;cout << B::fun()<< endl;cout << B::fun()<< endl;cout << B::fun()<< endl;return 0;} ??

3、(1)實現二進制轉十進制。

(2)如果有下面這種能直接求二進制轉十進制的代碼,是怎么實現的? binary<1>::value;// 結果為1 binary<11>::value;// 結果為3

4、volatile、explicit、mutable表示的含義。

5、求整形數組的一個子數組,使得該子數組所有元素的和的絕對值最大。

6、(1)寫求單鏈表是否有環的算法。(2)如果有環,如何找出環的第一個結點。

7、實現單例模式。二面:

1、一個文本,一萬行,每行一個詞,統計出現頻率最高的前10個詞(詞的平均長度為Len)。并分析時間復雜度。

2、求數組中最長遞增子序列。

?? 10月10日,網易2013校園招聘全套筆試題:

?? 10月10日,網易,數據挖掘工程師: 1,簡述你對數據與處理的認識;

2,簡述你對中文分詞的理解,說明主要難點和常用算法; 3,常見的分類算法有哪些; 4,簡述K-MEANS算法; 5,設計一個智能的商品推薦系統; 6,簡述你對觀點挖掘的認識。其它題目同 點評:其它題目與上述第56題第一部分所述相同。

第四篇:c語言筆試題總結

一、選擇題(1)~(10)每小題2分,(11)~(50)每小題1分,共60分)

下列各題A)、B)、C)、D)四個選項中,只有一個選項是正確的,請將正確的選項涂寫在答題卡相應位置上,答在試卷上不得分。

(1)在數據結構中,從邏輯上可以把數據結構分為_______。

A)動態結構和靜態結構 B)緊湊結構和非緊湊結構

C)線性結構和非線性結構 D)內部結構和外部結構

答案:C

評析:邏輯結構反映數據元素之間的邏輯關系,線性結構表示數據元素之間一對一的關系,非線性結構表示數據元素之間一對多或多對一的關系。

(2)若進棧序列為l,2,3,4,進棧過程中可以出棧,則下列不可能的一個出棧序列是_______。

A)1,4,3,2 B)2,3,4,l

C)3,1,4,2 D)3,4, 2,1

答案:C

評析:棧是一種后進先出表,選項c中,先出棧的是3,說明此時棧內必然有1,2,由于l先于2進棧,所以l不可能在2之前出棧,故選項C這種出棧序列是不可能的。

(3)排序方法中,將整個無序序列分割成若干小的子序列并分別進行插入排序的方法,稱為_______。

A)希爾排序 B)冒泡排序 C)插入排序 D)選擇排序

答案:A

評析:希爾排序法的基本思想是:將整個無序序列分割成若干小的子序列分別進行插入排序。

(4)在順序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查找關鍵碼值11,所需的關鍵碼比較次數為_______。

A)2 B)3 C)4 D)5

答案:C

評析:二分法查找是用關鍵碼與線性表的中間元素比較,然后根據比較結果來判斷是結束查找,還是在左邊或者右邊子表按相同的方法繼續查找。本題中,與ll比較的關鍵碼分別為15,8,10,12四個。

(5)對于n個結點的單向鏈表(無表頭結點),需要指針單元的個數至少為_______。

A)n-1 B)n C)n+l D)2n

答案:C

評析:在n個結點的單向鏈表(無表頭結點)中,每個結點都有一個指針單元(即指針域),加上頭指針,至少需要n+1個指針單元。

(6)在軟件開發過程中,軟件結構設計是描述_______。

A)數據存儲結構 B)軟件體系結構 C)軟件結構測試 D)軟件控制過程

答案:B

評析:從工程管理角度來看,軟件設計分兩步完成:概要設計和詳細設計。概要設計(又稱結構設計)將軟件需求轉化為軟件體系結構、確定系統級接口、全局數據結構或數據庫模式。

(7)模塊本身的內聚是模塊獨立性的重要性度量因素之一。在7類內聚中,具有最強內聚 的一類是_______。

A)順序性內聚 B)過程性內聚 C)邏輯性內聚 D)功能性內聚

答案:D

評析:內聚性是一個模塊內部各元素間彼此結合的緊密程度的度量。內聚共有7類,它們之間的內聚性由弱到強排列順序為:偶然內聚、邏輯內聚、時間內聚、過程內聚、通信內聚、順序內聚和功能內聚。

(8)數據存儲和數據流都是_______,僅僅是所處的狀態不同。

A)分析結果 B)事件 C)動作 D)數據

答案:D

評析:數據流圖有4種成分:源點或終點、處理、數據存儲和數據流。數據存儲是處于靜止狀態的數據,數據流是處于運動中的數據。

(9)數據的完整性是指數據的正確性、有效性和_______。

A)可維護性 B)獨立性 C)安全性 D)相容性

答案:D

評析:數據模型的完整性規則是給定的數據模型中數據及其聯系所具有的制約和依存規則,用以限定符合數據模型的數據庫狀態及其狀態的變化,以保證數據的正確性、有效性和相容性。

(10)關系代數運算是以_______為基礎的運算。

A)關系運算 B)謂詞運算 C)集合運算 D)代數運算

答案:C

評析:關系代數運算是以關系代數作為運算對象的一組高級運算的集合。它的基本操作是并、交、差、笛卡爾積,另外還包垂直分割(投影)、水平分割(選擇)、關系的結合(連接)等。

(11)能將高級語言程序轉換成目標語言程序的是_______。

A)調試程序 B)解釋程序 C)編譯程序 D)編輯程序

答案:C

評析:用高級語言編寫的程序稱為“源程序”,而計算機只能識別和執行由0和l組成的二進制指令,所以高級語言必須先用一種稱為“編譯程序”的軟件,把源程序翻譯成二進制形式的“目標程序”。

(12)_______是構成c語言程序的基本單位。

A)函數 B)過程 C)子程序 D)子例程

答案:A

評析:c程序是由函數構成的。一個c源程序至少包含一個main函數,也可以包含一個main函數和若干個其他函數,因此,函數是c程序的基本單位。

(13)可以在C語言中用做用戶標識符的是_______。

A)void B)as_b3 C)for D)2c

define _123-abc Do

WORD If cas SIG

答案:B

評析:c語言規定,標識符只能由字母、數字和下劃線三種符號組成,而且第一個字符必須是字母或下劃線。另外還需要注意的是關鍵字不能作標識符。選項A中void,C中for都為關鍵字,D中2c以字母開頭。

(14)若有以下類型說明語句:

char w;int x;float y,z;

則表達式w*x+z-y的結果為________類型。

A)float B)char C)int D)double

答案:A

評析:在進行運算時,不同類型的數據參加運算,需要先將其轉換成同一類型的數據,然后再進行運算。轉換的順序由低到高為:char,short→int→unsigned→long→double→float,故結果為float型。

(15)main(()

{ float x=123A56;

printf(“%-5.2fn”,x); }

以上程序輸出的結果是________。

A)123.4 B)123.5 C)123.45 D)123.46

答案:D

評析:f格式符,用來輸出實數,以小數形式輸出?!埃?m.nf”的含義是:輸出數據共占m列,其中n位小數,如果輸出位數小于m。則右端補空格。如果總長度大于列數,則按實際情況四舍五入輸出。

(16)下面語句的輸出結果是________。

Printf(“%d\n”,strlen(“\t\”\065\xff\n”));

A)14 B)8

C)5 D)輸出項不合法,無正常輸出

答案:C

評析:在c語言中,以“\”開頭的字符均為轉義字符,其中“\”后可跟l~3位八進制數或在“\”后跟字母x及l~2位十六進制數,以此來代表一個特定的字符。

(17)下列程序的輸出結果是________。

main()

{ int a=0,b=0,c=0; if(++a>0lI++b>0)++c;

printf(“\na=%d,b=%d,c=%d”,a,b,C); }

A)a=0,b=0,c=0 B)a=l,b=l,c=1

C)a=l,b=O, c=I D)a=0, b=1.c=1

答案:C

評析:

“︱︱”是或運算,它有個“短路”的特點需特別注意,當“︱︱”運算符左邊的表達式的值為真時,則程序就不再對“︱︱”右邊的表達式的值進行運算,而是使得整個表達式的值直接為真。

(18)下列程序的輸出結果是_________。

Main()

{ int i;

for(i=1;i+l;i++)

{ if(i>4){printlf(”%d”,i++);break;} }

printf(“%d”,i++);

}

A)55 B)56

C)程序錯誤,沒有輸出 D)循環條件永遠為真,死循環

答案:B

評析:本程序中有個for循環,但注意到for循環的條件是“i+l”,也就是只要i+l的值為真(非零值均為真),就執行循環。當i=l的時,i+l的值為真,判斷if條件不成立,執行i++,輸出i的值為5。

(19)下列程序的輸出結果是_________。

#define A 100

main()

{ int i=O,sum=O;

do{ if(I==(i/2)*2)continue;

sum+=i;

}while(++i

printf(“%d\n”,sum); }

A)2500 B)2050 C)4 D)O

答案:A

評析:本題程序的功能是求1到_99之問(包括1和99)所有奇數之和。程序中的while循環的終止條件為++i=100,在while循環體內,如果i是偶數,則執行continue,跳過這一次循環,執行下一次循環,否則求和。最后輸出的值是1到99之間(包括l和99)所有奇數之和(1+99)*50/2=2500。

(20)下列程序的輸出結果是_________。

main()

{ int I=3;

switch(i)

{ case 1:

case 2:printf(”%d”,i); case 3:

case 4:break;

default:printf(”OK”); } }

A)0 B)3 C)OK D)沒有任何輸出

答案:D

評析:在題中,i的值為3,由于“case 3:”后面沒有break語句,所以繼續向下執行“case 4:”后面的語句,由于“case 4:”后面的語句為break強行退出switch語句,所以,本題沒有任何輸出。

(21)下列程序執行后的輸出結果是________。

main()

{ int m[][3]={1,4,7,2,5,8,3,6,9};

int i,k=2:

for(I=0;i<3;i++)

{printf(”%d”,m[k][i]);} }

A)456 B)258 C)369 D)789

答案:C

評析:根據二維數組的定義得出:m[O][O]=1,m[O][1]=4,m[O][2]=7,m[1][0]=2,rail][1]=5,m[1][2]=8,m[2][0]=3,m[2][l]=6,m[2][2]=9,所以本題的輸出是第3行的值m[2][0],m[2][1],m[2][2],即369。

(22)設已定義洱口k為int類型變量,則以下for循環語句_________。

for(i=0;k=-1,k=1;i++,k++)

printf(”****\n”);

A)判斷循環結束的條件不合法 B)是無限循環

C)循環一次也不執行 D)循環只執行一次

答案:B

評析:本題定義了一個for循環,循環變量是i,但由于本題并沒有設置循環條件,所以循環的條件永遠默認為真,即無限次執行循環。

(23)下面程序的輸出結果是___________。

unsigned fun(unsigned num)

{ unsigned k=1;

do{

k*=num%lO;

num/=lO;

}while(num);

return(k);

}

main()

{ unsigned n。26;

printf(”%d\n”,fun(n));

}

A)0 B)4 C)12 D)無限次循環

答案:C

評析:本題定義了一個fun函數,用于num求和,具體執行過程如下:

num=26:k=k*(num%10)=1*(26%10),所以k=6,num=num/10=2;

num=2:k=k*(num%10)=6*(2%10),所以k=12,num=num/lO=O;

num=O:while條件不成立,所以返回k的值12.

(24)已知字母A的ASCII碼值是65,字母a的ASCII碼值是97,以下程序_______。

main()

{ char a=‘A’;

int b=20;

printf(“%d,%o”,(a=a+a,a+b,b),a+‘a’-‘A’,b); }

A)表達式非法,輸出零或不確定值

B)因輸出項過多,無輸出或輸出不確定值

C)輸出結果為20,141

D)輸出結果為20,141,20

答案:C

評析:本題中首先輸出逗號表達式“a=a+a,a+b,b”的值,即20。然后以八進制的形式輸出a+‘a’-‘A’的值為97對應的八進制數141,由于最后一個表達式b沒有對應輸出格式的輸出項表列就不會輸出。

(25)C語言函數返回值的類型是由__________決定的。

A)return語句中的表達式類型 B)調用函數的主調函數類型

C)調用函數時臨時 D)定義函數時所指定的函數類型

答案:D

評析:函數值的類型應當是在定義函數時指定的。在定義函數時對函數值說明的類型一般應該和return語句中的表達式類型一致,如果不_致,則以函數類型為準,即函數類型決定返回值的類型。

(26)下列程序執行后輸出的結果是___________。

int d=l:

fun(int p)

{ int d。5;

d+=p++;

printf(”%d,”,d);

}

main()

{ int a=3;

fun(a);

d+=a++:

printf(”%d\n”,d);

}

A)8,12 B)9,13 C)8,4 D)9,5

答案:C

評析:本題執行過程如下:首先調用fun函數,使得實參a的值3傳遞給形參p,得到局部變量d=8,打印出局部變量d的值8;返回主函數執行“d+=a++”,此處的d為全局變量,所以d=1+3=4(由于本題是值傳遞,所以在函數fun中對p值的改變并不能引起a的改變),故本題的輸出是8,4。

(27)已知下面的程序段,正確的判斷是_________。

#define A 3

#define B(A)((_A+1)‘a)

int a=3: ……

X=3*(A+B(7));

A)程序錯誤,不允許嵌套定義 B)X=93

C)X=8l D)程序錯誤,宏定義不允許有參數

答案:C

評析:本題的宏定義是合法的,宏定義展開為3*(3+((A+1)*a))=3*(3+((7+1)*3))=81。

(28)定義int*swap()指的是_______。

A)一個返回整型值的函數swap()

B)一個返回指向整型值指針的函數swap()

C)一個指向函數swap()的指針,函數返回一個整型值

D)以上說法均錯

答案:B

評析:一個函數可以帶回一個整型值、字符值、實型值等,但也可以帶回指針型數據,即地址。本題的定義中,包括括號和·號,由于f)優先級高于t。故它是一個返回整型指針的函數。

(29)以下程序段的輸出結果是__________。

main()

{ char s1[10],s2[10],s3[10];

scanf(”%s”,s1);gets(s2);gets(s3);

puts(s 1);puts(s2);puts(s3); }

輸入數據如下:(此處代表回車符)aaa bbb

A)aaa B)aaa C)aaa\0bbb\0 D)aaabbb bbb bbb

答案:B

評析:scanf是標準輸入函數,在輸入字符串aaa時,實際的內容為“aaa

主站蜘蛛池模板: 国产免费观看黄av片| 精品无码av无码免费专区| 国产极品美女高潮抽搐免费网站| 国产又色又爽又黄刺激在线视频| 精品蜜臀久久久久99网站| 秋霞午夜| 成人亚洲一区无码久久| 麻豆中字一区二区md| 亚洲日本va一区二区三区| 国产精品青青在线观看爽香蕉| 一道本在线伊人蕉无码| 巨茎爆乳无码性色福利| 中文精品无码中文字幕无码专区| 亚洲 a v无 码免 费 成 人 a v| 日本丰满人妻xxxxxhd| 最新国产精品剧情在线ss| 久久久久久久久久久国产| 一区二区免费视频中文乱码| 亚洲人人玩人人添人人| 中文字幕精品久久久乱码乱码| 日韩美女在线观看一区| 免费国产黄网站在线观看| 精品欧洲av无码一区二区14| 一色桃子中文字幕人妻熟女作品| 五月丁香综合激情六月久久| 欧美人与物videos另类| 日本边添边摸边做边爱的网站| 丝袜a∨在线一区二区三区不卡| 羞羞影院午夜男女爽爽在线观看| 在线无码av一区二区三区| 成人精品一区二区久久久| 亚洲—本道 在线无码| 8天堂资源在线| 性强烈的欧美三级视频| 国产精品www夜色视频| 中文字幕制服丝袜人妻动态图| 精品无码一区在线观看| 国内精品人妻无码久久久影院| 国模丽丽啪啪一区二区| 日韩人妻无码一区2区3区里沙| 久久综合丝袜日本网|