1. 程式人生 > >程式設計語言基本概念語 與經典真題

程式設計語言基本概念語 與經典真題

一、基本概念

在計算機中,程式設計語言可劃分為低階語言和高階語言兩大類,與高階語言相比,用低階語言開發的程式,其執行效率高,但開發效率低。與程式設計相關的基本概念如下。

(1)低階語言:又稱面向機器語言,它是特定的計算機系統所固有的語言。

(2)組合語言:是機器語言的一種提升,它使用了一些助記符來表示機器指令中的操作碼和運算元。但它仍然是一種和計算機機器語言十分接近的語言,使用起來仍然不太方便。

(3)高階語言:與人們的自然語言比較接近,使用起來很方便,也極大的提高了程式設計效率。

(4)編譯程式:也稱編譯器,將源程式翻譯成目標語言程式,然後在計算機上執行目標程式。雖然執行效率高,但編寫出來的程式可讀性很差,且難以修改和維護。

(5)解釋程式:也稱直譯器,它或者直接解釋執行源程式,或者將源程式翻譯成某種中間程式碼後再加以執行。

(6)程式設計語言:程式設計語言的定義都涉及語法、語義和語用等方面。

(7)語法是指由程式語言的基本符號組成程式中的各個語法成分(包括程式)的一組規則,其中由基本字元構成的符號(單詞)書寫規則稱為詞法規則,由符號構成語法成分的規則稱為語法規則。

(8)語義是程式語言中按語法規則構成的各個語法成分的含義,分為靜態語義和動態語義。

(9)語用表示了構成語言的各個記號和使用者的關係,涉及符號的來源、使用和影響。

(10)語境是指理解和實現程式設計語言的環境,包括編譯環境和執行環境。

二、程式設計語言的分類

1.命令式程式設計語言

命令式程式設計語言是基於動作的語言,在這種語言中,計算被看成是動作的序列。

結構化程式設計語言屬於命令式語言類,其結構特性主要有:一是用自頂向下逐步精化的方法程式設計,二是按照模組組裝的方法程式設計,三是程式只包含順序、判定(分支)及迴圈結構,而且每種構造只允許單入口和單出口。C語言、PASCAl等都是典型的結構化程式設計語言。

2.面向物件程式設計語言

面向物件的程式設計在很大程度上應歸功於從模擬領域發展起來的Simula,Simula提出了類和物件的概念。C++、Java和smalltalk是面向物件程式設計語言的代表。

3.函式式程式設計語言

函式式程式設計語言是一類以λ-演算為基礎的語言,其概念來自於Lisp,一個在 1958年為了人工智慧應用而設計的語言。函式是一種對應規則(對映),它使定義域中每個元素和值域中唯一的元素對應。

函式定義1:Square[x]:=x×x

函式定義2:Plustwo[x]:= Plusone[Plusone[x]]

函式定義3:fact[n]:=if n =0 then 1 else n×fact[n-1]

4.邏輯型程式設計語言

邏輯型程式設計語言是一類以形式邏輯為基礎的語言,其代表是建立在關係理論和一階謂詞理論基礎上的Prolog(Programming in Logic)。Prolog程式是一系列事實、資料物件或事實間的具體關係和規則的集合。通過查詢操作把事實和規則輸入資料庫。使用者通過輸入查詢來執行程式。在 Prolog中,關鍵操作是模式匹配,通過匹配一組變數與一個預先定義的模式並將該組變數賦給該模式來完成操作。

三、程式設計語言的基本成分

1.資料成分

資料成分指的是一種程式語言的資料型別。

(1)常量和變數

按照程式執行時資料的值能否改變,將資料分為常量和變數。變數具有左值和右值,在程式執行過程中其右值可以改變;常量只有右值,在程式執行過程中不能改變。

(2)全域性變數和區域性變數

按照資料的作用域範圍,可分為全域性變數和區域性變數。系統為全域性變數分配的儲存空間在程式執行的過程中一般是不改變的,而為區域性變數分配的儲存單元是動態改變的。

(3)資料型別

按照資料組織形式不同可將資料分為基本型別、使用者定義型別、構造型別和其他型別。

基本型別:整型(int)、字元型(char)、實型(float、double)和布林型別(bool)。

特殊型別:空型別(void)。

使用者定義型別:列舉型別(enum)。

構造型別:陣列、結構、聯合。

指標型別:type *。

抽象資料型別:類型別。

2.運算成分

程式語言的運算成分指明允許使用的運算子號及運算規則。大多數高階程式語言的基本運算可分成算術運算、關係運算和邏輯運算,有些語言如C(C++)還提供位運算。

3.控制成分

控制成分指明語言允許表述的控制結構。

(1)順序結構

順序結構用來表示一個計算操作序列,從第一個操作開始,按順序依次執行後續的操作,直到最後一個操作,如圖2-1所示。(2)選擇結構選擇結構提供了在兩種或多種分支中選擇其中一個的邏輯,如圖2-2所示。

 
圖 2-1 順序結構示意圖
 
圖 2-2 選擇結構示意圖

(3)迴圈結構

迴圈結構描述了重複計算的過程,通常由三部分組成:初始化、迴圈體和迴圈條件。主要有兩種形式:while型迴圈結構和do-while型迴圈結構,如圖2-3所示。

 

(4)C(C++)語言提供的控制語句

①複合語句

複合語句用於描述順序控制結構。複合語句是一個整體,要麼全部執行,要麼一條語句也不執行。

② if語句和switch語句

if語句實現的是雙分支的選擇結構,其一般形式為: 

  1. if(表示式)  
  2. 語句1;   
  3. else   
  4. 語句2; 

需要注意的是if和else的匹配關係。

switch語句描述了多分支的選擇結構,其一般形式為: 

  1. switch(表示式){   
  2. case 常量表達式1:語句1;  
  3.  case 常量表達式2:語句2;  
  4.  …  
  5.  case 常量表達式n:語句n;  
  6.  default:語句n+1;   
  7. }  
③ 迴圈語句主要指while語句、do-while語句和for語句。 while語句描述了先判斷條件再執行迴圈體的控制結構,其一般形式為:
  1. while(條件表示式)   
  2. {   
  3. 迴圈體語句;   
  4. }  
do-while語句描述了先執行迴圈再判斷條件的控制結構,其一般格式是:
  1. do   
  2. 迴圈體語句;   
  3. while(條件表示式);  

for語句的基本格式是:

  1. for(表示式1;表示式2;表示式3;)迴圈體語句; 
可用while語句等價地表示為:
  1. 表示式1;   
  2. while(表示式2){   
  3. 迴圈體語句;  
  4. 表示式3;   
  5. }  

4.函式

函式是程式模組的主要成分,它是一段具有獨立功能的程式。函式的使用涉及三個概念:函式定義、函式宣告和函式呼叫。

①函式定義

函式定義包括兩部分:函式首部和函式體。函式定義描述了函式做什麼和怎麼做。其一般格式是:

  1. 返回值型別函式名(形參表)   
  2. {   
  3. 函式體;   

②函式宣告

函式應該先聲明後引用。如果程式中對一個函式的呼叫在該函式的定義之前進行,則應該在呼叫前對被呼叫函式進行宣告。函式原型用於宣告函式。函式宣告的一般形式為:

  1. 返回值型別函式名(形參表); 

③函式呼叫

當在一個函式(稱為主調函式)中需要使用另一個函式(稱為被調函式)實現的功能時,便以名字進行呼叫,稱為函式呼叫。函式呼叫的一般形式為:

  1. 函式名(實參表); 

四、值呼叫和引用呼叫

在C程式的執行過程中,通過函式呼叫實現了函式定義時描述的功能。函式體中若呼叫自己,則稱為遞迴呼叫。C和C++通過傳值方式將實參傳遞給形參。

呼叫函式和被呼叫函式之間交換資訊的方法主要有兩種:一種是由被調函式把返回值返回給主調函式,另一種是通過引數帶回資訊。函式呼叫時實參與形參間交換資訊的方法有值呼叫和引用呼叫兩種。

(1)傳值呼叫(Call by Value)

若實現函式呼叫時實參向形式引數傳遞相應型別的值(副本),則稱為是傳值呼叫。

C語言採用的是傳值呼叫的方式。傳值呼叫最顯著的特徵是被呼叫的函式內部對形參的修改不影響實參的值。傳值呼叫的引數傳遞和被呼叫函式內對引數的使用主要按下述原則:函式定義時形參被當作區域性變數看待,在函式被呼叫時為形參分配儲存單元;呼叫函式前,首先計算實參的值,呼叫時將實參的值放入形參的儲存單元;被呼叫函式內部對形參單元中的資料進行直接訪問。

(2)引用呼叫(Call by Reference)引用是C++中增加的資料型別,當形式引數為引用型別時,形參名實際上是實參的別名,函式中對形參的訪問和修改實際上就是針對相應實際引數所作的訪問和改變。

實際上,引用呼叫是將實參的地址傳遞給形參,使得形參的地址就是對應實參的地址。引用呼叫的引數傳遞和被呼叫函式內對引數的使用主要按下述原則處理:函式定義時形參被當作區域性變數看待,在函式被呼叫時為形參分配儲存單元;呼叫時將實參的地址放入形參的儲存單元;被呼叫函式內部對形參單元中的資料(地址)進行間接訪問。

怎麼考

【試題 2-1】2011年 11月真題 20

若C程式的表示式中引用了未賦初值的變數,則( 20)。

(20)A. 編譯時一定會報告錯誤資訊,該程式不能允許

B. 可以通過編譯並執行,但執行時一定會報告異常

C. 可以通過編譯,但連結時一定會報告錯誤而不能執行

D. 可以通過編譯並執行,但執行結果不一定是期望的結果

分析:全域性變數和靜態區域性變數在定義時如果沒有初始化,編譯時會自動初始化為0;而普通的區域性變數,如果沒有初始化,則其值是一個隨機數。在 C程式表示式中,只要引用的變數定義了,就可以通過編譯並執行,但執行結果不一定是期望的結果。【答案:d】

【試題 2-2】2011年 11月真題 49、50

函式t、f的定義如下所示,其中, a是整型全域性變數。設呼叫函式t前a的值為5,則在函式中以傳值呼叫( call by value)方式呼叫函式f時,輸出為(49);在函式t中以引用呼叫(call by reference)方式呼叫函式時,輸出為(50)。

 

(49)A. 12  B. 16  C. 20  D. 24

(50)A. 12  B. 16  C. 20  D. 24

分析:本題主要考查函式呼叫時引數的傳遞方式。如果採用傳值方式呼叫,則形參值的變化不會影響實參;而採用引用方式呼叫,則形參值的變化直接反映到實參。

本題中如果在函式t中採用傳值方式呼叫函式f,a的值傳給形參r,在函式f中,a的值變為6,r的值為10並返回賦給變數x,由於a是全域性變數,退出函式f後a的值依然為6,所以函式t的輸出結果為16。如果函式t採用傳引用方式呼叫函式f,則形參r就是對實參a的引用,對r的修改就是對a的修改,在執行a=r+1時,a和r的值都變為6,執行r=r*2,a和r的值都變為12,並將r的值返回給x,因此函式t的輸出結果為24。

【答案:(49)B (50)D】

【試題 2-3】2011年 11月真題 57

在KMP模式匹配演算法中,需要求解模式串 p的next函式值,其定義如下(其中, j為模式串字元的序號)。對於模式串“abaabaca”,其next函式值序列為( 57)。

 

(57)A. 01111111  B. 01122341  C. 01234567  D. 01122334

分析:模式串“abaabaca”的next函式值序列如下。

 

當j=1時,next[1]=0;當j=2時,k不存在,next[2]=1;當j=3時,不存在滿足條件的k,next[3]=1;當j=4時,p1=p3=a,存在k=2,使得 ' p1 p2 Lpk .1'=' pj.k +1 pj.k +2 L pj.1' ,故next[4]=2;當j=5時,存在k=2,使得 ' p1 p2 Lpk .1'=' pj.k +1 pj.k +2 L pj.1' ,即p1=p4=a,故next[5]=2;當j=6時,存在k=3,使得’p1p2’ =’p4p5’ ,故 next[6]=3;當j=7時,存在k=4,使得’p1p2 p3’ =’p4p5 p6’ ,故next[7]=4;當j=8時,不存在滿足條件的k值,故 next[8]=1。【答案:B】

【試題 2-4】2011年 5月真題 22

若一種程式設計語言規定其程式中的資料必須具有型別,則有利於( 22)。

①在翻譯程式的過程中為資料合理分配儲存單元

②對參與表示式計算的資料物件進行檢查

③定義和應用動態資料結構

④規定資料物件的取值範圍及能夠進行的運算

⑤對資料進行強制型別轉換

(22)A.①②③ B.①②④ C.②④⑤ D.③④⑤

分析:資料是程式操作的物件,型別說明資料佔用的記憶體和存放形式。資料型別不僅可用於在基礎機器中完成對值得佈局,還可以用於檢查表示式中對運算的應用是否正確。【答案:B】

【試題 2-5】2011年 5月真題 48

以下關於高階程式設計語言翻譯的敘述中,正確的是( 48)。

(48)A.可以先進行語法分析,再進行詞法分析

B.在語法分析階段可以發現程式中的所有錯誤

C.語義分析階段的工作與目標機器的體系結構密切相關

D.目的碼生成階段的工作與目標機器的體系結構密切相關

分析:對於高階程式設計語言,編譯程式會把編寫的源程式翻譯成與之等價的目標程式。編譯程式的工作過程分為:詞法分析、語法分析、語義分析、中間程式碼生成、程式碼優化、目的碼生成。語法分析要在詞法分析的基礎上,根據語言的語法規則將單詞符號序列分解成各類語法單位。可見,要先進行詞法分析,然後進行語法分析,故選項A錯誤。在語法分析階段能發現語法錯誤,但不能發現語義錯誤,因此選項B錯誤。語義分析階段主要檢查源程式是否包含靜態語義錯誤,並收集型別資訊供後面的程式碼生成階段使用,可見,語義分析階段工作與與目標機器的體系結構關聯不大,選項C錯誤。目的碼生成階段的任務是把中間程式碼變化成特定機器上的絕對指令程式碼、可重定位的指令程式碼或彙編指令程式碼,這個階段的工作與具體的機器密切相關。【答案: D】

【試題 2-6】2011年 5月真題 50

傳值與傳地址是函式呼叫時常採用的資訊傳遞方式,( 50)。

(50)A.在傳值方式下,是將形參的值傳給實參

B.在傳值方式下,形參可以是任意形式的表示式

C.在傳地址方式下,是將實參的地址傳給形參

D.在傳地址方式下,實參可以是任意形式的表示式分析:在傳值方式下,是將實參的值傳給形參,形參不能向實際引數傳遞資訊;實參可以是表示式或常量,也可以是變數或陣列元素。

在傳地址方式下,是將實參的地址傳給形參,實參和形參都指向同一個物件,被呼叫函式中對形式引數的修改實際上就是對實際引數的修改,可以實現資料的雙向傳遞。實參必須是變數地址、陣列名,不能是表示式或常量。

形參就是形式引數,用一個變數來代表,不能是表示式。【答案:C】

【試題 2-7】2010年 11月真題 50

以下關於組合語言的敘述中,錯誤的是(50)。

(50)A.組合語言源程式中的指令語句將被翻譯成機器程式碼

B.彙編程式先將源程式中的偽指令翻譯成機器程式碼,然後再翻譯指令語句

C.彙編程式以組合語言源程式為輸入,以機器語言表示的目標程式為輸出

D.組合語言的指令語句必須具有操作碼欄位,可以沒有運算元欄位

分析:彙編程式的功能是將會變語言所編寫的源程式翻譯成機器指令程式。組合語言源程式語句可分為指令語句、偽指令語句和巨集指令語句。指令語句彙編後產生相應的機器程式碼;偽指令語句指示彙編程式在彙編源程式時完成某些操作,彙編後不產生機器程式碼。【答案:B】

【試題 2-8】2010年 11月真題 64

下面C程式段中count++語句執行的次數為(64)。

for(int i=1;i<=11;i*=2)

for(int j=1;j<=i;j++)

count++;

(64)A.15 B.16 C.31 D.32

分析:第1輪迴圈,i=1,count++執行1次,然後i=2;第2輪迴圈,i=2,count++執行2次,然後i=4;第 3輪迴圈,i=4,count++執行4次,然後i=8;第4輪迴圈,i=8,count++執行8次,然後i=16,i>11,不滿足迴圈條件,迴圈結束。可以計算count++語句執行的次數為:1+2+4+8=15【答案:A】

【試題 2-9】2010年 5月真題 33

程式的三種基本控制結構是(33)。

(33)A.過程、子程式分程式 B.順序、選擇和重複

C.遞迴、堆疊和佇列 D.呼叫、返回和跳轉
分析:程式的三種基本控制結構是順序結構、選擇結構和重複結構。【答案:B】

【試題 2-10】2009年 5月真題 20

函式呼叫時,基本的引數傳遞方式有傳值與傳地址兩種,( 20)。

(20)A.在傳值方式下,形參將值傳給實參

B.在傳值方式下,實參不能是陣列元素

C.在傳地址方式下,形參和實參間可以實現資料的雙向傳遞

D.在傳地址方式下,實參可以是任意的變數和表示式

分 析:首先看A選項,傳值方式下,對應的實參和形參是兩個獨立的實體,佔用不同的記憶體單元,呼叫函式時,系統把實參值複製一份給形參,便斷開二者的聯絡,形參值的改變對實參無影響。因此,“傳值”是單向的,只能由實參傳遞給形參。

B選項,形參為傳值方式下的簡單變數,實參可以是與其同類型的常量、變數、陣列元素或表示式。

C選項,在傳址方式下,函式呼叫時,系統將實參的地址傳遞給形參,即這時引數傳遞的不是資料本身,而是資料在記憶體中的地址。所以在函式被呼叫中,任何對形參的訪問,都被認為是對形參的間接訪問。實參與形參佔用相同的儲存單元,傳遞方式是雙向的,形參值的改變將影響實參值。故C選項正確。

D選項,形參為傳址方式時,實參如果為常量或表示式,則傳址無效,相當於傳值方式。【答案: C】

【試題 2-11】2009年 5月真題 22

下面關於程式語言的敘述,錯誤的是( 22)。

(22)A.指令碼語言屬於動態語言,其程式結構可以在執行中改變

B.指令碼語言一般通過指令碼引擎解釋執行,不產生獨立儲存的目標程式

C.php、JavaScript屬於靜態語言,其所有成分可在編譯時確定

D.C語言屬於靜態語言,其所有成分可在編譯時確定

分 析:指令碼語言,又叫動態語言,是一種程式語言控制軟體的應用程式。指令碼語言與程式語言有很多相似地方,其函式與程式語言比較類似,也涉及到變數,它與程式語言最大的區別是程式語言的語法和規則更為嚴格和複雜一些。指令碼語言一般都有相應的指令碼引擎來解釋執行,一般需要直譯器才能執行。 Python、JavaScript、ASP、PHP、PERL、Nuva都是指令碼語言。另外,指令碼語言是一種解釋性的語言,它不像 C\C++等可以編譯成二進位制程式碼,以可執行檔案的形式存在。【答案:C】

【試題 2-12】2008年 12月真題 21

程式設計語言一般都提供多種迴圈語句,例如實現先判斷迴圈條件再執行迴圈體的while語句和先執行迴圈體再判斷迴圈條件的do-while語句。關於這兩種迴圈語句,在不改變迴圈體的條件下,( 21)是正確的。

(21)A.while語句的功能可由do-while語句實現

B.do-while語句的功能可由while語句實現

C.若已知迴圈體的次數,則只能使用while語句

D.迴圈條件相同時,do-while語句的執行效率更高分 析:do-while語句的迴圈體至少執行一次,即執行1~n次,而while語句的迴圈體可以不執行,也可

以執行n次,因此do-while語句的功能可由while語句實現。【答案:B】

【試題 2-13】2008年 5月真題 22

下列敘述中錯誤的是( 22)。

(22)A.面向物件程式設計語言可支援過程化的程式設計

B.給定演算法的時間複雜性與實現該演算法所採用的程式設計語言無關

C.與組合語言相比,採用指令碼語言程式設計可獲得更高的執行效率

D.面向物件程式設計語言不支援對一個物件的成員變數進行直接訪問

分 析:本題考查基本概念問題。C選項明顯是錯誤的,指令碼語言與組合語言不是一個意義層面上的語言,而且組合語言是接近計算機硬體的語言,執行效率是非常高的。【答案:C】