PTA-C理論課學習及答案一
- 客觀題
- 運算子和運算式
- 判斷
- 選擇
- 1.選擇結構
- 判斷
- 選擇
- 2.回圈結構
- 判斷
- 選擇
- 3.陣列與指標等
第一次在CSDN上寫博客(markdown用的不好,排版可能不好看),只是想將這篇文章作為一個學習筆記和實驗,分享下,如果有哪里說錯了,歡迎指出,
客觀題
運算子和運算式
判斷
1-1 假設k是整型變數,計算運算式1/k 后結果的資料型別是整型,
T
小數部分會直接被砍掉,可以理解為數學里的取整函式,如
1/3 = 0
1-2 運算式(x == 0)與運算式(!x)等價,
T
結合
if()函式理解,括號內的判定條件
1-3 運算式 (3<x<5) 的值恒為1,
T
決議:根據C語言運算子順序,從左向右,
第一步,計算3 < x結果為 1 或者 0;
再將 1 或 0 與 5 比較,易知結果恒為1;
1-4 字符‘\0’的ASCII碼值是0,
T
1-5 C 語言的識別符號由字母、數字和其他任意字符組成,
F
百度:C 語言的識別符號
1-6 若變數定義為double x;,則x % 2是符合C語言語法的運算式,
F
1-7 若變數定義為int x, y; ,則x + y = 22是符合C語言語法的運算式,
F
1-8 是關系運算子,用于比較兩個運算元是否相等;而 = 是賦值運算子,表示對變數賦值,
T
1-9 C程式中,用一對大括號{}括起來的多條陳述句稱為復合陳述句,復合陳述句在語法上被認為是一條陳述句,
T
尤其注意再回圈陳述句中的大括號范圍,強烈建議對演算法結構不是很清楚的同學再寫回圈陳述句時都寫大括號,框明范圍 ,
1-10 C語言中,數字字符’1’的值(ASCII碼)就是數字1,
F
在以整形表示的方式下為49;
1-11 C語言中,大寫字母’M’的ASCII碼值比小寫字母 'm’的ASCII碼值大,
F
1-12 以下C語言運算式的值為“真”,
'D' - 'A' == 'd' - 'a'
T
1-13 運算式 !x 等價于x != 1,
F
等價于`(x == 0)
1-14 s(s-a)(s-b)(s-c) 是合法的C語言運算式,
F
1-15 運算式 !!6的值是6,
F
值為 1 ,C語言運算子順序
1-16 若運算式sizeof(int)的值為4,則int型別資料可以表示的最大整數為
2
31
?
1
2^{31}-1
231?1
T
4個位元組,每位元組8位,一共32位,還有一個符號位,
1-17 運算式 (z=0, (x=2)||(z=1),z) 的值是1,
F
值為 0 ;C語言逗號運算子(,)
1-18 與float型資料相比,double型資料的精度高,取值范圍大,
T
1-19 陳述句printf("%.2f",1.0/3);輸出為0.33,
T
選擇
2-1 若有:double x,y,a,b; , 與代數式(xy)/(ab)不等價的C語言運算式是( )
A.xy/ab
B.xy/a/b
C.xy/(ab)
D.x/(ab)*y
A
2-2 運算式:(int)((double)7/2)-7%2的值是( ),
A.0
B.2
C.3
D.4
B
2-3 設int x=25,a=1,b=10;,則條件運算式x>2?a+10:b的值是( ) ,
A.1
B.10
C.11
D.25
C
C語言條件運算子(?:)
2-4 對于數學運算式 2 x + ( a + b ) ÷ s i n 2 x 2x+(a+b)÷sin^2x 2x+(a+b)÷sin2x,對應的C運算式是( ),
A.2x+(a+b)/sin(x)*sin(x)
B.2*x+(a+b)/sin(x)^2
C.2*x+a+b/(sin(x)*sin(x))
D.2*x+(a+b)/sin(x)/sin(x)
D
2-5 C 語言程式中可以對程式進行注釋,注釋部分必須用什么符號括起來?
A.{ 和}
B.[和 ]
C.*/ 和 /*
D./* 和 */
D
2-6 邏輯運算子兩側運算物件的資料型別( ),
A.只能是 0 或 1
B.只能是 0 或非 0 正數
C.只能是整型或字符型的資料
D.可以是任何型別的資料
D
2-7 以下識別符號中,不合法的是( ),
A.4d
B._8_d
C.Int
D.key
A
決議:識別符號不能以數字開頭,另外C語言區分大小寫,C項 Int 與關鍵字 int 不同
2-8 若有char w; int x; float y; double z; 則運算式w*x+z-y值的資料型別為( ),
A.float
B.char
C.double
D.int
C
在同一個運算式中,C語言資料型別
double>float>int>char,即這些資料型別都有時,自動轉換為優先級大的資料型別,C語言資料型別轉換
2-9 在C語言中,要求運算元必須是整型的運算子是( ),
A.%
B./
C.<
D.!
A
2-10 運算式( )的值是0,
A.3/5
B.3<5
C.3%5
D.3/5.0
A
2-11 已知字母’A’的ASCII碼為十進制數65,且ch為字符型變數,則執行陳述句ch=‘A’+‘7’-‘3’;后,ch的ASCII值為( ),
A.68
B.‘E’
C.‘D’
D.69
D
決議:題目所問是
ch的ASCII值,對應的是'A'的值65,加上字符7與字符3的差值4,結果是69,
2-12 如果變數 x、y 已經正確定義,下列哪個選項的陳述句不能正確將x、y的值進行交換?
A.t=x, x=y; y=t;
B.x=x+y, y=x-y, x=x-y;
C.x=t, t=y, y=x;
D.t=y, y=x, x=t;
C
2-13 若int w=4,x=3,y=2,z=1;,則條件表達w>x?w:y>z?y:z的值是( ) ,
A.4
B.3
C.2
D.1
A
決議:轉換有
int p; //將要被賦值的變數
if(w > x){
p = w;
}
else{
if(y > z){
p = y;
}
else{
p = z;
}
}
2-14 設 int a=2, b=0, c=-1;,則運算式 a < b || b < c && b 的值是( )
A.-1
B.0
C.1
D.2
B
決議:從左至右耐心計算
2-15 設:int a=4, b=3, c=2, d=1, m=1, n=3;,執行 ( m=a>b>c) && (n=c>d) 后 n 的值為( )
A.1
B.2
C.3
D.4
C
根據程式運行結果來看
&&后的陳述句未能運行
我并不清楚其中的具體原因,出于探究的精神,我增加了變數k;
可以看見 k 值為 0,那么有可能是對于&&運算子來說當前一個運算式為 0 時就結束不判斷后一個運算式了呢?
將程式稍微改一下;
根據圖片很容易得到結論,猜想成立,
對于&&運算子來說,當前一個運算式為 0 時就結束不判斷后一個運算式,
2-16
1.選擇結構
判斷
1-1 在 if陳述句的三種形式中,如果要想在滿足條件時執行一組(多個)陳述句,則必須把這一組陳述句用{}括起來組成一個復合陳述句,
T
補充:if陳述句的三種形式
- if
if(判斷條件)
{為真時執行陳述句1;陳述句2;…}//單條陳述句可以不用花括弧
- if-else
if(判斷條件)
{同上}//單條陳述句可以不用花括弧
else
{同上}//同上
- if-else if
if(判斷條件)
{同上}
else if (條件1){}
else if (條件2){}
…
else (條件n){}
1-2 在switch陳述句中,每一個的case常量運算式的值可以相同,
F
決議:switch相當于是跳轉,類比函式,一個自變數x只能對應一個y,case中的陳述句相當于是完成跳轉的條件,若case(盒子)出現相同值則會出現同時兩個盒子中的東西都放出,
實際上,在vscode中會直接報錯,(轉載) switch陳述句的具體用法 (轉載)
1-3 case陳述句后如沒有break,順序向下執行,
T
1-4 執行以下程式段后,y的值為-1,
x = 4;
if (x < 0){
y = -1;
}else if (x = 0){
y = 0;
}else{
y = 1;}
F
決議:最后的值是y=1
1-5 在switch陳述句中,不一定使用break陳述句,
T
決議:不使用break只會使程式不會跳出,參見switch陳述句的具體用法
1-6 省略else的if陳述句的一般形式如下,若運算式的值為“真”,則執行陳述句1;否則,就什么也不做,
if (運算式)
陳述句1
T
1-7 如果變數已經正確定義,則執行以下程式段后,x的值不變,
x = 4;
if (x < 0){
y = -1;
}else if (x = 0){
y = 0;
}else{
y = 1;}
F
決議:結果是x=0在第4行代碼中已給x賦值
1-8 在switch陳述句中,必須使用default,
F
決議:不用default只會使得額外的值不能被顯出(沒有任何反應)
1-9 設變數已正確定義,以下是合法的switch陳述句,
switch(choice){
case choice == 1: price = 3.0; break;
case choice == 2: price = 2.5; break;
case choice == 3: price = 4.0; break;
case choice == 4: price = 3.5; break;
default: price = 0.0; break;
}
F
決議:case中的變數值只能是整數常量值,不能有多余的符號,
選擇
2-1 如果要表示a 等于 0 時執行 if ( )后的陳述句,則在if后一對括號中的運算式不能寫為( )
C決議(轉載)
2-2 當a=5,b=8,c=6,d=4,x=0 時,執行完下面一段程式后x的值是( )
if(a<b)
if(c<d) x=1;
else if(a<c)
if(b<d) x=2;
else x=3;
else x=6;
else x=7;
用縮進整理一下:
if(a<b)
if(c<d)
x=1;
else if(a<c)
if(b<d)
x=2;
else x=3;
else x=6;
else x=7;
C
決議:得到x=3
2-3 對下面的程式,以下正確的判斷是( )

A
決議:第六行分句后else無if匹配,C語言if else陳述句詳解
2-4 在嵌套使用if陳述句時,C語言規定else總是( )
B
決議:與上題相同
2-5 在執行以下程式時,為使輸出結果為:t=4,則給a和b輸入的值應滿足的條件是()
int main(void)
{ int a,b,s,t;
scanf("%d,%d",&a,&b);
s = 1; t = 1;
if(a > 0) s = s + 1;
if(a > b) t = s + t;
else if(a == b) t = 5;
else t = 2 * s;
printf("t=%d\n",t);
return 0;}
C
決議:逆推可得
2-6 能正確表示邏輯關系"a≥10 或 a≤0"的C語言運算式是()
D
| 運算子 | 說明 | 結合性 | 舉例 |
|---|---|---|---|
| && | 與運算,雙目,對應數學中的“且” | 左結合 | 1&&0、(9>3)&&(b>a) |
| || | 或運算,雙目,對應數學中的“或” | 左結合 | 1||0、(9>3)||(b>a) |
| ! | 非運算,單目,對應數學中的“非” | 右結合 | !a、!(2<5) |
2-7 下列條件陳述句中,功能與其他陳述句不同的是
D 決議:前三個的語意是若變數a為真(這里可以結合bool型別理解;1即使真,0是假),輸出x;反之輸出y,
2-8 若a、b、c1、c2、x、y均是整型變數,以下正確的switch陳述句是
D
決議:A.switch后多了個;;
???B.標簽重復,break未作為單獨陳述句使用;
???C.case標簽后必須是常量
2-9 有定義陳述句“int a=1,b=2,c=3,x;”,則以下各程式段執行后,x的值不為3的是
C
決議:特別注意B項,當在if中的條件成立后后面的else和else if陳述句都不執行
2-10 陳述句if(x=0) y=1; else y=2;與( )等價,
B
決議:題中陳述句是把x賦值為0再判斷,這個if永遠不會成立
2-11 設變數已正確定義,以下( )與其它switch陳述句不等價,
C
決議:題中只提已定義,當出現case之外的情況時,C項變數會被賦予隨機值,
2-12 設變數已正確定義,以下( )與其它switch陳述句不等價,
D
2-13 已知int x=10,y=20,z=30;以下陳述句:if(x<y) z=x; x=y; y=z;執行后x,y,z的值是( ),
C
2-14 將以下if-else陳述句補充完整,正確的選項是( ),
if(x >= y){
printf("max = %d\n", x);
____________
printf("max = %d\n", y);}
C 原因見補充
2.回圈結構
判斷
1-1 在多層回圈中, 一個break陳述句只向外跳一層,
T
1-2 for陳述句的一般形式如下,其中的運算式1只執行一次,
for (運算式1; 運算式2; 運算式3)
回圈體陳述句
T
1-3 回圈體如包括有一個以上的陳述句,則必須用一對大括號{}括起來,組成復合陳述句,復合陳述句在語法上被認為是一條陳述句,
T
1-4 以下程式段的功能是計算20的階乘,
int i;
double product;
product = 0;
for (i = 1; i <= 20; i++){
product = product * i;
}
F
決議:變數product最初被賦予的是0,最終結果為0,
1-5若變數已正確定義,以下while回圈結束時,i的值為11,
i = 1;
while (i <= 10){
printf("%d\n", i);
}
F
1-6 若變數已正確定義,執行以下while陳述句將陷入死回圈,
i = 1;
while (i <= 10) ;
i++;
F
決議:當i大于10時跳出回圈,補充:a++與++a的區別
a++與++a單獨使用時兩者無區別,當參與賦值運算時,
在便于理解的要求上我們不妨把上述式子轉化一下
b = a++ 即 {c = a,a=a+1,b = c;}
b = ++a 即 {a = a+1,b = a;}
比較上式可以發現在運算a++中實際上先創建了一個副本來儲存這個值,深層次原因可以參照C語言中a++與++a的區別
1-7 若變數已正確定義,執行以下程式段,輸入負數時,回圈結束,
total = 0;
scanf ("%d", &score);
while(score >= 0){
total = total + score;
scanf ("%d", &score);
}
F
決議:個人認為這是個文字游戲,輸入負數時不能進入回圈,故沒有回圈結束的說法,(真是無聊,,,)
1-8 do - while陳述句的一般形式如下,其中的回圈體陳述句至少執行一次,
T
1-9 while陳述句和do - while陳述句的一般形式分別如下,其主要區別是:while 陳述句先判斷回圈條件,只有條件滿足才進入回圈,如果一開始條件就不滿足,則回圈一次都不執行,而do - while陳述句先執行回圈體,后判斷回圈條件,所以無論回圈條件的值如何,至少會執行一次回圈體,
T
1-10 以下兩個程式段等價,其功能是計算 s=1+2+…+10,
/* 程式段A*/
s = 0;
i = 1;
while(i <= 10){
s = s + i;
i++;
}
/* 程式段B */
s = 0;
i = 1;
while(1){
if(i > 10){
break;}
s = s + i;
i++;
}
F
決議:簡要的說吧,break只能跳出一層回圈
1-11 在回圈中使用break陳述句或者continue陳述句,其作用是相同的,
F
C語言break和continue的區別
1-12 執行以下while陳述句,將出現死回圈,
s = 0;
i = 1;
while(1){
if(i > 10){
continue;
}
s = s + i;
i++;}
T
決議:當i大于10后會在if陳述句中不斷回圈
1-13 在嵌套回圈(多層回圈)中, 每一層回圈都應該使用自己的回圈變數,以免互相干擾,
F
個人認為視實際情況而定
選擇
2-1 執行while陳述句時,要想執行回圈體的陳述句,則括號中運算式要滿足的條件是?( )
C
決議:計算機內部運行二進制,只有0與1,而while執行判斷式非0時的陳述句,如 ‘5’,在二進制表示為101,故執行;另,負數也可執行,負數實際是可以理解為一個帶符號位的正整數(在int范圍內),其在二進制中的表達也不為0,故執行while中的陳述句,
2-2 下列程式段執行后s的值為( ),

D
決議:a++與++a的區別
與上題相似,主要靠回圈判斷的問題當while中的陳述句為0時結束回圈當if中的陳述句為 “0” 時執行else,反之執行if,
2-3 設有程式段
int m=0;
while (m=1)
m=0;
則下面描述中正確的是( ),
B(無限回圈)
決議:賦值陳述句運算式為1,為真,在while中的運算式判斷恒為真,回圈體一直執行,是死回圈,
2-4 以下描述中錯誤的是( ) ,
A.在do-while回圈中,是先執行回圈體,再進行判斷
B.do-while的回圈體可以是復合陳述句
C.do-while的回圈體執行次數不可能為0
D.do-while由do開始,用while結束,在while(運算式)后面不能寫分號
D
語法規范,= =
2-5 下面程式的功能是在輸入的一批正數中求最大者,輸入0結束回圈,則在下劃線處應填寫的陳述句是(),

C
2-6 若程式執行時的輸入資料是3564<回車>,則下述程式的輸出結果是( ) ,
D
決議:getchar()詳細用法
解這題要先看看ASCII碼表,數字的ASCII碼是連續的、cs是整形、switch-case 后沒有break程式向下執行,
了解以上這幾點后這題的答案就很容易得出了,
2-7 若變數已正確定義,要求程式段完成求n!的計算,不能 完成此操作的程式段是哪一個?( )
A.
for(i=1,p=1;i<=n;i++)
p*=i;
B.
for(i=1;i<=n;i++)
{ p=1; p*=i; }
C.
i=1;
p=1;
while(i<=n)
{ p*=i; i++; }
D.
i=1;
p=1;
do{
p*=i; i++;
} while(i<=n);
B
決議:B項中每一次回圈都對 p 賦初始值 1,故不能達到計算 n!的效果,
2-8 若int i,j;,則for(i=j=0; i<10||j<8; i+=2,j++)控制的回圈體的執行次數是( )8
A
2-9 以下程式段的回圈次數是( )

A
2-10 陳述句for (運算式1; ; 運算式3)等價于?( )
A.for ( 運算式1; !0 ; 運算式3 )
B.for ( 運算式1; 0 ; 運算式3 )
C.for ( 運算式1; 運算式1; 運算式3 )
D.for ( 運算式1; 運算式3; 運算式3 )
A
決議:先上圖
空了中間的運算式后,判斷恒真,是死回圈
2-11 以下不會構成死回圈的陳述句或陳述句組是( )
A.n=0; do {++n;} while(n=1);
B.n=5; while(n>0);{n- -;}
C.n=0; while(n){n++;}
D.for(n=0,i=1; i<5;n++) n+=i;
D
決議:A、在做一次++n后,while給n再賦值為1;而賦值陳述句為真;故為死回圈,
B、while后有分號,判斷n>0后未能執行到n- -;而是一直判斷;
C、不會進回圈
2-12 下面程式段執行后,n的值是( ),

D(5)
決議:提示當i不為2的倍數時n只加一次(只運行一次n++)if(i%2) continue;會使跳過do——while中的n++,
2-13 有整型變數a和b,若運行以下程式段時從鍵盤輸入:16,10<回車>,回圈結束時變數a、b的值分別為( ),
C( 2 2 )
決議:可以先寫成這樣
在草稿本上用串列的方法來計算,當a==b時退出,實際上這個演算法稍加改進就可以得到更相減損術,不過在求最大公約數方面也還是沒有輾轉相除法高效就是了=.=,
2-14 下面的這個回圈的回圈次數是( ),
for(int i=0,j=10; i=j=10; i++,j--)
B(無限次)
中間一句錯了,中間一句為賦值后再賦值,由于賦值是一個從右向左的計算故最終結果是
j = 10,i = 1,判斷恒成立,死回圈,
2-15 假設變數s、a、b、c均已定義為整型變數,且a、c均已賦值(c大于0),則與以下程式段功能等價的賦值陳述句是(),
s = a;
for(b = 1; b <= c; b++)
s = s + 1;
B(s = a + c;)
決議:代碼為將b分解為一個一個的 1 與a相加,
2-16 回圈 for(i=0, j=5; ++i!=–j; ) printf(“%d %d”, i, j); 將執行_____,
D (無限次)
當回圈執行三次后將判斷 2 與 3 否相等;此后++i將與- -j相差越來越大,是死回圈,
2-17 陳述句for (運算式1; ; 運算式3)等價于?( )
B 同2-10
2-18 下列程式段的功能是
#include <stdio.h>
int main (void)
{
int i, s = 0;
for (i = 1; i < 10; i += 2)
s += i + 1;
printf("%d\n", s);
return 0;
}
D(自然數1~10中的偶數之和)
2-19 以下程式段( )的功能是計算n的階乘,假設計算結果不超過雙精度范圍,
A、int i, n;double product;scanf("%d", &n);product = 0;for (i = 1; i <= n; i++){ product = product * i; }
B、int i, n, product;scanf("%d", &n);product = 1;for (i = 1; i <= n; i++){ product = product * i; }
C、int i, n; double product; scanf("%d", &n); for (i = 1; i <= n; i++){ product = product * i; }
D
A、product初始化錯誤
B、product定義未滿足雙精度
C、product為初始化,一般編譯器初始化為 0
2-20 以下( )回圈并非重復5次?
C、int i;for (i=0; i<=5; i++) {}
C
2-21 下列敘述中正確的是(),
A.break 陳述句只能用于 switch 陳述句體中
B.continue陳述句的作用是使程式的執行流程跳出包含它的所有回圈
C.break 陳述句只能用在回圈體內和 switch 陳述句體內
D.在回圈體內使用 break陳述句和 continue 陳述句的作用相同
C
2-22 運行以下程式后,如果從鍵盤上輸入65 14<回車>,則輸出結果為(),
int main(void)
{
int m, n;
printf("Enter m,n;");
scanf("%d%d", &m,&n);
while (m != n)
{ while (m > n) m = m - n;
while (n > m) n = n - m;
}
printf("m=%d\n",m);
return 0;
}
C(m=1)
同2-13
2-23 若i,j已定義為int型別,則以下程式段中內回圈體的總的執行次數是
for (i = 5; i; i--)
for (j = 0; j < 4; j++) {...}
A(20)
決議:內層回圈次數×內層回圈次數
這篇有點長了分到另一篇去,
3.陣列與指標等
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243835.html
標籤:其他
上一篇:西電研一人工智能復習隨筆

我并不清楚其中的具體原因,出于探究的精神,我增加了變數k;




在草稿本上用串列的方法來計算,當a==b時退出,實際上這個演算法稍加改進就可以得到更相減損術,不過在求最大公約數方面也還是沒有輾轉相除法高效就是了=.=,