當前位置:首頁 » 編程語言 » 2017年省賽c語言c組
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

2017年省賽c語言c組

發布時間: 2023-04-28 20:55:57

『壹』 2017年計算機二級c語言模擬題及答案(2)

大家做好准備迎接考試了嗎?誠意整理「2017年計算機二級C語言模擬題及答案(2)」,歡迎廣大考生前來學習。

2017年計算機二級C語言模擬題及答案(2)

1). 若變數已正確定義並賦值,以下符合C語言語法的表達式是

A.a:=b+1

B.a=b=c+2

C.int 18.5%3

D.a=a+7=c+b

正確答案:B

答案解析:選項A中包含一個不合法的運算符":=";選項C應改為(int)18.5%3;選項D可理解為兩個表達式:a+7=c+b和a=a+7,其中第一個是錯的,因為C語言規定賦值號的左邊只能是單個變數,不能是表達式或常量等。因此,正確答案是選項B,它實際上相當於a=(b=c+2),進而可分解為兩個表達式:b=c+2和a=b。

2). 結構化程序設計的基本原則不包括( )

A.多元性

B.自頂向下

C.模塊化

D.逐步求精

正確答案:A

答案解析:結構化程序設計方法的主要原則可以概括為:自頂向下,逐步求精,模塊化和限制使用GOTO語句,其中不包括多態性。

3). 下面選項中關於位運算的敘述正確的是( )

A.位運算符都需要兩個操作數

B.左移運算的結果總是原操作數據2倍

C.右移運算時,高位總是補0

D.位運算的對象只能是整型或字元型數據

正確答案:D

答案解析:位運算則是以位(bit)一級進行的運算,位運算符中除″~″以外,均為二元運算符,即要求兩側各有一個運算量,運算量只能是整型或字元型的數據,不能為實型數據。其中右移時,右端(低位)移出的二進制數舍棄,左端(高位)移入的二進制數分兩種情況:對於無符號整數和正整數,高位補0;對於負整數,高位補1。而左移運算在沒有溢出的前提下每移動一位,相當於原數據的2倍。

4). 定義無符號整數類為UInt,下面可以作為類UInt實例化值的是( )

A.-369

B.369

C.0.369

D.整數集合{1,2,3,4,5}

正確答案:B

答案解析:UInt表示的是無符號整數類,所以它的每個實例都是一個無符號整數,所以排除選項A和選項C,選項D是整數集合,所以也排除。

5). 下列關於類、對象、屬性和方法的敘述中,錯誤的是( )。

A.類是對一類具有相同的屬性和方法對象的描述

B.屬性用於描述對象的狀態

C.方法用於表示對象的行為

D.基於同一個類產生的兩個對象不可以分別設置自己的屬性值

正確答案:D

答案解析:類是對一類具有相同的屬性和方法對象的描述,屬性用於描述對象的狀態,方法用於表示對象的行為,基於同一個類產生的兩個對象是可以分別設置自己的屬性值。

6). 下列描述中正確的是( )

A.軟體交付使用後還需要再進行維護

B.軟體工具交付使用就不需要再進行維護

C.軟體交付使用後其生命周期就結束

D.軟體維護是指修復程序中被破壞的指令

正確答案:A

答案解析:通常將軟體產品從提出、實現、使用維護到停止使用退役的過程稱為軟體生命周期。軟體生命周期分為軟體定義、軟體開發及軟體運行維護三個階段。已交付的軟體投入運行後,應在運行使用中不斷地維護,根據新提出的需要進行必要而且可能的擴充和刪改。

7). 資料庫設計包括兩個方面的設計內容,它們是

A.概念設計和邏輯設計

B.模式設計和內模式設計

C.內模式設計和物理設計

D.結構特性設計和行為特性設計

正確答案:A

答案解析:資料庫設計包括資料庫概念設計和資料庫邏輯設計兩個方面的內容。

8). 以下不能輸出字元A的語句是(註:字元A的ASCII碼值為65,字元a的ASCII碼值為97)( )

A.printf (″%c ″, ′a′-32);

B.printf (″%d ″, ′A′);

C.printf (″%c ″, 65);

D.printf (″%c ″, ′B′-1);

正確答案:B

答案解析:在選項B的輸出函數中,大寫字元′A′以整型數據的形式輸出。

9). 下列描述中正確的是( )

A.程序就是軟體

B.軟體開發不受計算機系統的限制

C.軟體既是邏輯實體,又是物理實體

D.軟體是程序、數據與相關文檔的集合

正確答案:D

答案解析:計算機軟體與硬體是計算機系統中相互依存的兩部分。計算機軟體是包括程序、數據及相關文檔的完整集合。軟體由兩部分組成:一部分是機器可執行的程序和數據;二是機器不可執行的,與軟體開發、運行、維護、使用等有關的文檔。軟體具有以下六個特點:①軟體是一種邏輯實體,而不是物理實體,具有抽象性。②軟體的生產與硬體不同,它沒有明顯的製作過程。③軟體在運行、使用期間不存在磨損、老化問題。④軟體的開發、運行對計算機系統具有依賴性,受計算機系統的限制,這導致了軟體移值的問題。⑤軟體復雜性高,成本昂貴。⑥軟體的開發涉及諸多社會因素。

10). 以下不合法的用戶標識符是( )。

A.804zhang

B._ hh

C.yy614

D.If

正確答案:A

答案解析:C語言規定,標識符是由字母、數字或下劃線組成,並且它的第一個字元必須是字母或下劃線。

『貳』 藍橋杯c語言c組什麼水平

中高水平。沖敏鍵根據查詢大眾點評可知,藍橋杯c語言c組是中高散巧水平。藍橋杯的比拿或賽分為初賽和決賽,初賽是省內賽,省賽拿了省一才可以進入決賽。

『叄』 求試題,17屆NOIP(C語言)普及組初賽試題

一、單項選擇題(共20題,每題1.5分,共計30分。每題有且僅有一個正確選項。)
1.在二進制下,1101001 + ( ) = 1110110。
A. 1011 B. 1101 C. 1010 D. 1111
2.字元「0」的ASCII碼為48,則字元「9」的ASCII碼為( )。
A. 39 B. 57 C. 120 D. 視具體的計算機而定
3.一片容量為8GB的SD卡能存儲大約( )張大小為2MB的數碼照片。
A. 1600 B. 2000 C. 4000 D. 16000
4.摩爾定律(Moore's law)是由英特爾創始人之一戈登•摩爾(Gordon Moore)提出來的。根據摩爾定律,在過去幾十年以及在可預測的未來幾年,單塊集成電路的集成度大約每( )個月翻一番。
A. 1 B. 6 C. 18 D. 36

5.無向完全圖是圖中每對頂點之間都恰有一條邊的簡單圖。已知無向完全圖G有7個頂點,則它共有( )條邊。
A. 7 B. 21 C. 42 D. 49

6.寄存器是( )的重要組成部分。
A. 硬碟 B. 高速緩存 C. 內存 D. 中央處理器(CPU)

7.如果根結點的深度記為1,則一棵恰有2011個葉結點的二叉樹的深度最少是( )。
A. 10 B. 11 C. 12 D. 13

8. 體育課的鈴聲響了,同學們都陸續地奔向操場,按老師的要求從高到矮站成一排。每個同學按順序來到操場時,都從排尾走向排頭,找到第一個比自己高的同學,並站在他的後面。這種站隊的方法類似於( )演算法 。
A. 快速排序 B. 插入排序 C. 冒泡排序 D. 歸並排序

9.一個正整數在二進制下有100位,則它在十六進制下有( )位。
A. 7 B. 13 C. 25 D. 不能確定

10.有人認為,在個人電腦送修前,將文件放入回收站中就是已經將其刪除了。這種想法是( )。
A. 正確的,將文件放入回收站意味著徹底刪除、無法恢復
B. 不正確的,只有將回收站清空後,才意味著徹底刪除、無法恢復
C. 不正確的,即使將回收站清空,文件只是被標記為刪除,仍可能通過恢復軟體找回
D. 不正確的,只要在硬碟上出現過的文件,永遠不可能被徹底刪除

11.廣度優先搜索時,需要用到的數據結構是( )。
A. 鏈表 B. 隊列 C. 棧 D. 散列表

12.在使用高級語言編寫程序時,一般提到的「空間復雜度」中的「空間」是指( )。
A. 程序運行時理論上所佔的內存空間
B. 程序運行時理論上所佔的數組空間
C. 程序運行時理論上所佔的硬碟空間
D. 程序源文件理論上所佔的硬碟空間

13.在含有n個元素的雙向鏈表中查詢是否存在關鍵字為k的元素,最壞情況下運行的時間復雜度是( )。
A. O(1) B. O(log n) C. O(n) D. O(n log n)

14.生物特徵識別,是利用人體本身的生物特徵進行身份認證的一種技術。目前,指紋識別、虹膜識別、人臉識別等技術已廣泛應用於政府、銀行、安全防衛等領域。以下不屬於生物特徵識別技術及其應用的是( )。
A. 指靜脈驗證 B. 步態驗證 C. ATM機密碼驗證 D. 聲音驗證

15.現有一段文言文,要通過二進制哈夫曼編碼進行壓縮。簡單起見,假設這段文言文只由4個漢字「之」、「乎」、「者」、「也」組成,它們出現的次數分別為700、600、300、200。那麼,「也」字的編碼長度是( )。
A. 1 B. 2 C. 3 D. 4

16.關於匯編語言,下列說法錯誤的是( )。
A. 是一種與具體硬體相關的程序設計語言
B. 在編寫復雜程序時,相對於高級語言而言代碼量較大,且不易調試
C. 可以直接訪問寄存器、內存單元、以及I/O埠
D. 隨著高級語言的誕生,如今已完全被淘汰,不再使用

17.( )是一種選優搜索法,按選優條件向前搜索,以達到目標。當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇。
A. 回溯法 B. 枚舉法 C. 動態規劃 D. 貪心法

18.1956年( )授予肖克利(William Shockley)、巴丁(John Bardeen)和布拉頓(Walter Brattain),以表彰他們對半導體的研究和晶體管效應的發現。
A. 諾貝爾物理學獎
B. 約翰•馮•諾依曼獎
C. 圖靈獎
D. 高德納獎(Donald E. Knuth Prize)

19.對一個有向圖而言,如果每個節點都存在到達其他任何節點的路徑,那麼就稱它是強連通的。例如,右圖就是一個強連通圖。事實上,在刪掉邊( )後,它依然是強連通的。
A. a B. b C. c D. d

20.從ENIAC到當前最先進的計算機,馮•諾依曼體系結構始終佔有重要的地位。馮•諾依曼體系結構的核心內容是( )。
A. 採用開關電路 B. 採用半導體器件
C. 採用存儲程序和程序控制原理 D. 採用鍵盤輸入

二、問題求解(共2題,每題5分,共計10分)

1.每份考卷都有一個8位二進制序列號。當且僅當一個序列號含有偶數個1時,它才是有效的。例如,00000000、01010011都是有效的序列號,而11111110不是。那麼,有效的序列號共有________個。

2.定義字元串的基本操作為:刪除一個字元、插入一個字元和將一個字元修改成另一個字元這三種操作。將字元串A變成字元串B的最少操作步數,稱為字元串A到字元串B的編輯距離。字元串"ABCDEFG"到字元串"BADECG"的編輯距離為________。

三、閱讀程序寫結果(共4題,每題8分,共計32分)

1.
#include<stdio.h>
int main() {
int i, n, m, ans;

scanf("%d%d", &n, &m);
i = n;
ans = 0;
while (i <= m) {
ans += i;
i++;
}
printf("%d\n", ans);
return 0;
}
輸入:10 20
輸出:_________

2.
#include <stdio.h>
#include <string.h>
#define SIZE 20

int main()
{
char map[] = "22233344455566677778889999";
char tel[SIZE];
int i;

scanf("%s", tel);
for (i = 0; i < strlen(tel); i++)
if ((tel[i] >= '0') && (tel[i] <= '9'))
printf("%c", tel[i]);
else if ((tel[i] >= 'A') && (tel[i] <= 'Z'))
printf("%c", map[tel[i] - 'A']);
return 0;
}

輸入:CCF-NOIP-2011
輸出:_________

3.
#include <stdio.h>
#include <string.h>
#define SIZE 100

int main()
{
int n, i, sum, x, a[SIZE];

scanf("%d", &n);
memset(a, 0, sizeof(a));
for (i = 1; i <= n; i++) {
scanf("%d", &x);
a[x]++;
}

i = 0;
sum = 0;
while (sum < (n / 2 + 1)) {
i++;
sum += a[i];
}
printf("%d\n", i);
return 0;
}

輸入:
11
4 5 6 6 4 3 3 2 3 2 1
輸出:_________

4.
#include <stdio.h>

int solve(int n, int m)
{
int i, sum;

if (m == 1)
return 1;
sum = 0;
for (i = 1; i < n; i++)
sum += solve(i, m - 1);
return sum;
}

int main()
{
int n, m;

scanf("%d %d", &n, &m);
printf("%d\n", solve(n, m));
return 0;
}

輸入:7 4
輸出:_________

四、完善程序(前11空,每空2分,後2空,每空3分,共計28分)

1.(子矩陣)輸入一個n1*m1的矩陣a,和n2*m2的矩陣b,問a中是否存在子矩陣和b相等。若存在,輸出所有子矩陣左上角的坐標;若不存在輸出「There is no answer」。

#include <stdio.h>
#define SIZE 50

int n1, m1, n2, m2, a[SIZE][SIZE], b[SIZE][SIZE];

int main()
{
int i, j, k1, k2, good, haveAns;

scanf("%d %d", &n1, &m1);
for (i = 1; i <= n1; i++)
for (j = 1; j <= m1; j++)
scanf("%d", &a[i][j]);
scanf("%d %d", &n2, &m2);
for (i = 1; i <= n2; i++)
for (j = 1; j <= m2; j++)
① ;

haveAns = 0;
for (i = 1; i <= n1 - n2 + 1; i++)
for (j = 1; j <= ② ; j++) {
③ ;
for (k1 = 1; k1 <= n2; k1++)
for (k2 = 1; k2 <= ④ ; k2++) {
if (a[i + k1 - 1][j + k2 - 1] != b[k1][k2])
good = 0;
}
if (good == 1) {
printf("%d %d\n", i, j);
⑤ ;
}
}
if (haveAns == 0)
printf("There is no answer\n");
return 0;
}

2.(大整數開方)輸入一個正整數n(1≤n<10100),試用二分法計算它的平方根的整數部分。

#include <stdio.h>
#include <string.h>
#define SIZE 200

typedef struct node {
int len, num[SIZE];
} hugeint;
//其中len表示大整數的位數;num[1]表示個位、num[2]表示十位,以此類推

hugeint times(hugeint a, hugeint b)
//計算大整數a和b的乘積
{
int i, j;
hugeint ans;

memset(ans.num, 0, sizeof(ans.num));
for (i = 1; i <= a.len; i++)
for (j = 1; j <= b.len; j++)
① += a.num[i] * b.num[j];
for (i = 1; i <= a.len + b.len; i++) {
ans.num[i + 1] += ans.num[i] / 10;
② ;
}
if (ans.num[a.len + b.len] > 0)
ans.len = a.len + b.len;
else
ans.len = a.len + b.len - 1;
return ans;
}

hugeint add(hugeint a, hugeint b)
//計算大整數a和b的和
{
int i;
hugeint ans;

memset(ans.num, 0, sizeof(ans.num));
if (a.len > b.len)
ans.len = a.len;
else
ans.len = b.len;
for (i = 1; i <= ans.len; i++) {
ans.num[i] += ③ ;
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
if (ans.num[ans.len + 1] > 0)
ans.len++;
return ans;
}

hugeint average(hugeint a, hugeint b)
//計算大整數a和b的平均數的整數部分
{
int i;
hugeint ans;

ans = add(a, b);
for (i = ans.len; i >= 2; i--) {
ans.num[i - 1] += ( ④ ) * 10;
ans.num[i] /= 2;
}
ans.num[1] /= 2;
if (ans.num[ans.len] == 0)
ans.len--;
return ans;
}

hugeint plustwo(hugeint a)
//計算大整數a加2後的結果
{
int i;
hugeint ans;

ans = a;
ans.num[1] += 2;
i = 1;
while ((i <= ans.len) && (ans.num[i] >= 10)) {
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
i++;
}
if (ans.num[ans.len + 1] > 0)
⑤ ;
return ans;
}

int over(hugeint a, hugeint b)
//若大整數a>b則返回1,否則返回0
{
int i;

if ( ⑥ )
return 0;
if (a.len > b.len)
return 1;
for (i = a.len; i >= 1; i--) {
if (a.num[i] < b.num[i])
return 0;
if (a.num[i] > b.num[i])
return 1;
}
return 0;
}

int main()
{
char s[SIZE];
int i;
hugeint target, left, middle, right;

scanf("%s", s);
memset(target.num, 0, sizeof(target.num));
target.len = strlen(s);
for (i = 1; i <= target.len; i++)
target.num[i] = s[target.len - i] - ⑦ ;
memset(left.num, 0, sizeof(left.num));
left.len = 1;
left.num[1] = 1;
right = target;
do {
middle = average(left, right);
if (over( ⑧ ) == 1)
right = middle;
else
left = middle;
} while (over(plustwo(left), right) == 0);
for (i = left.len; i >= 1; i--)
printf("%d", left.num[i]);
printf("\n");
return 0;
}

『肆』 計算機二級C語言測試題及答案解析

2017年計算機二級C語言測試題及答案解析

全國計算機等級考試(National Computer Rank Examination,以下簡稱 NCRE),是經原國家教育委員會(現教育部)批准,由教育部考試中心主辦,面向社會,用於考查非計算機專業應試人員計算機應用知識與技能的全國性計算機水平考試體系。下面是2017年計算機二級C語言測試題及答案解析。歡迎閱讀。

2017年計算機二級C語言測試題及答案解析

1.(A )是構成C語言程序的基本單位。

A、函數

B、過程

C、子程序

D、子常式

2.C語言程序從 C 開始執行。

A、 程序中第一條可執行語句

B、 程序中第一個函數

C、 程序中的main函數

D、包含文件中的第一個函數

3、以下說法中正確的是( C )。

A、C語言程序總是從第一個定義的函數開始執行

B、在C語言程序中,要調用的函數必須在main( )函數中定義

C、C語言程序總是從main( )函數開始執行

D、C語言程序中的main( )函數必須放在程序的開始部分

4.下列關於C語言的說法錯誤的是( B ) 。

A、 C程序的工作過程是編輯、編譯、連接、運行

B、 C語言不區分大小寫。

C、 C程序的三種基本結構是順序、選擇、循環

D、C程序從main函數開始執行

5.下列正確的標識符是(C)。

A、-a1

B、a[i]

C、a2_i

D、int t

5~8題為相同類型題

考點:標識符的命名規則

只能由字母、數字、下劃線構成

數字不能作為標識符的開頭

關鍵字不能作為標識符

選項A中的“-” ,選項B中“[”與“]”不滿足(1);選項D中的int為關鍵字,不滿足(3)

6.下列C語言用戶標識符中合法的是(B )。

A、3ax

B、x

C、case

D、-e2 E)union

選項A中的標識符以數字開頭不滿足(2);選項C,E均為為關鍵字,不滿足(3);選項D中的“-”不滿足(1);

7.下列四組選項中,正確的C語言標識符是( C )。

A、 %x

B、a+b

C、a123

D、123

選項A中的“%” ,選項B中“+”不滿足(1);選項D中的標識符以數字開頭不滿足(2)

8、下列四組字元串中都可以用作C語言程序中的標識符的是( A)。

A、print _3d db8 aBc

B、Iam one_half start$it 3pai

C、str_1 Cpp pow while

D、Pxq My->book line# His.age

選項B中的“”,”$” ,選項D中“>”,”#”,”.”,”-”不滿足(1);選項C中的while為關鍵字,不滿足(3)

9.C語言中的簡單數據類型包括(D )。

A、整型、實型、邏輯型

B、整型、實型、邏輯型、字元型

C、整型、字元型、邏輯型

D、整型、實型、字元型

10.在C語言程序中,表達式5%2的結果是 C 。

A、2.5

B、2

C、1

D、3

%為求余運算符,該運算符只能對整型數據進行運算。且符號與被模數相同。5%2=1; 5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1;

/為求商運算符,該運算符能夠對整型、字元、浮點等類型的數據進行運算,5/2=2

11.如果int a=3,b=4;則條件表達式"aA、 3

B、 4

C、 0

D、1

詳見教材P97.

表達式1?表達式2:表達式3

先計算表達式1,

若表達式1成立, 則選擇計算表達式2,並表達式2的值作為整個大表達式的值;

若表達式1不成立,則選擇計算表達式3,並將表達式3的值作為整個大表達式的值

此題中的aa為3,b為4。a12.若int x=2,y=3,z=4 則表達式x

A、4

B、3

C、2

D、0

E)1

13.C語言中,關系表達式和邏輯表達式的值是( B ) 。

A、0

B、 0或1

C、 1

D、‘T’或’F’

14. 下面( D )表達式的值為4.

A、 11/3

B、 11.0/3

C、 (float)11/3

D、 (int)(11.0/3+0.5)

14~16題為同一類型

詳見教材P54~56.

(1)相同數據類型的元素進行數學運算(+、-、*、/)得到結果還保持原數據類型。

(2)不同數據類型的元素進行數學運算,先要統一數據類型,統一的標準是低精度類型轉換為高精度的數據類型。

選項A,11與3為兩個整數,11/3結果的數據類型也應為整數,因此將3.666666的小數部分全部舍掉,僅保留整數,因此11/3=3.

選項B,11.0為實數,3為整數,因此首先要統一數據類型,將整型數據3轉換為3.0,轉換後數據類型統一為實型數據,選項B變為11.0/3.0,結果的數據類型也應為實型數據,因此選項B 11.0/3=3.666666

選項C,先將整數11強制類型轉換,轉換為實型11.0,因此選項C變為11.0/3,其後計算過程、結果與選項B同

選項D,首先計算11.0/3,其計算過程、結果與選項B同,得到3.666666;再計算3.666666+0.5=4.166666,最後將4.166666強制類型轉換為整型,即將其小數部分全部舍掉,結果為4

15.設整型變數 a=2,則執行下列語句後,浮點型變數b的值不為0.5的是( B)

A、b=1.0/a

B、b=(float)(1/A、

C、b=1/(float)a

D、b=1/(a*1.0)

16. 若“int n; float f=13.8;”,則執行“n=(int)f%3”後,n的值是(A)

A、1

B、4

C、4.333333

D、4.6

“(int)f“表示將f中的值強制類型轉換為整型,即將13.8的小數部分舍掉,轉換為13;然後計算13%3,結果為1,再將結果賦給變數n,因此n的值為1

17. 以下對一維數組a的正確說明是: D

A、char a(10);

B、 int a[];

C、int k=5,a[k];

D、char a[3]={‘a’,’b’,’c’};

詳見教材P143~144,一維數組的定義、初始化

類型符 數組名 [常量表達式]

類型符是指數組中數組元素的類型;數組名要符合標識符命名規則;常量表達式是指數組的長度(數組中包含元素的個數),其值只能是整數,不可以是變數,而且從1開始計數。

選項A,常量表達式只能放在中括弧 [ ]中

選項B,只有在對數組初始化(即賦值)的時候才可以省略數組的長度,B中並未對a進行初始化。

選項C,常量表達式不能為變數。

18.以下能對一維數組a進行初始化的.語句是:( C )

A、int a[5]=(0,1,2,3,4,)

B、 inta(5)={}

C、 int a[3]={0,1,2}

D、 int a{5}={10*1}

詳見教材P145,一維數組的定義、初始化

選項B,D,常量表達式只能放在中括弧 [ ]中

選項A,數組可以看做是若干個相同數據類型元素的有序集合,因此以集合的形式對其初始化,使用{ }對其初始化,選項A用了().

19.在C語言中對一維整型數組的正確定義為 D 。

A、int a(10);

B、int n=10,a[n];

C、int n;a[n];

D、#define N 10

int a[N];

20、已知:int a[10]; 則對a數組元素的正確引用是( D )。

A、a[10]

B、a[3.5]

C、a(5)

D、a[0]

詳見教材P144,數組元素的引用

數組名[下標]

引用數組元素時,[ ]中的下標為邏輯地址下標,只能為整數,可以為變數,且從0開始計數

int a[10]表示定義了一個包含10個整型數據的數組a,數組元素的邏輯地址下標范圍為0~9,即a[0] 表示組中第1個元素; a[1] 表示組中第2個元素; a[2] 表示組中第3個元素; ......;a[9] 表示組中第10個元素.

選項A,超過了數組a的邏輯地址下標范圍;

選項B,邏輯地址下標只能為整數

選項C,邏輯地址下標只能放在[ ]中

21.若有以下數組說明,則i=10;a[a[i]]元素數值是(C)。

int a[12]={1,4,7,10,2,5,8,11,3,6,9,12};

A、10

B、9

C、6

D、5

先算a[a[i]]內層的a[i],由於i=10,因此a[i]即a[10].

a[10]對應下面數組中的元素為9. 因此a[a[i]]即為a[9]

a[9]對應下面數組中的元素為6. 因此a[9]即為6

22.若有說明:int a[][3]={{1,2,3},{4,5},{6,7}}; 則數組a的第一維的大小為: ( B )

A、2

B、3

C、4

D、無確定值

5 7

D、3 6 9

二維數組的一維大小,即指二維數組的行數,在本題中,按行對二維數組賦值,因此內層有幾個大括弧,數組就有幾行

23.對二維數組的正確定義是(C)

詳見教材P149~152,二維數組的定義、初始化

類型符 數組名 [常量表達式][常量表達式]

二維數組可以看做是矩陣

類型符是指數組中數組元素的類型;數組名要符合標識符命名規則;第一個常量表達式是指數組的行數;第二個常量表達式是指數組的列數;常量表達式的值只能是整數,不可以是變數,而且從1開始計數。

一維數組初始化時可以省略數組長度

二維數組初始化時可以省略行數,但不能省略列數

選項A,B,都省略了列數

選項D,不符合二維數組定義的一般形式,行、列常量表達式應該放在不同的[]中

A、int a[ ][ ]={1,2,3,4,5,6};

B、int a[2] []={1,2,3,4,5,6};

C、int a[ ] [3]={1,2,3,4,5,6};

D、int a[2,3]={1,2,3,4,5,6};

24.已知int a[3][4];則對數組元素引用正確的是__C___

A、a[2][4]

B、a[1,3]

C、a[2][0]

D、a(2)(1)

詳見教材P150,數組元素的引用

數組名[下標] [下標]

引用數組元素時,[ ]中的下標為邏輯地址下標,只能為整數,可以為變數,且從0開始計數

第一個[下標]表示行邏輯地址下標,第二個[下標]表示列邏輯地址下標。

本題圖示詳見P149圖6.7

因此a的行邏輯地址范圍0~2;a的列邏輯地址范圍0~3;

選項A,列邏輯地址下標超過范圍

選項B,D,的引用形式不正確。

25.C語言中函數返回值的類型是由 A 決定的.

A、函數定義時指定的類型

B、 return語句中的表達式類型

C、 調用該函數時的實參的數據類型

D、形參的數據類型

26. 在C語言中,函數的數據類型是指(A )

A、 函數返回值的數據類型

B、 函數形參的數據類型

C、 調用該函數時的實參的數據類型

D、任意指定的數據類型

27.在函數調用時,以下說法正確的是( B)

A、函數調用後必須帶回返回值

B、實際參數和形式參數可以同名

C、函數間的數據傳遞不可以使用全局變數

D、主調函數和被調函數總是在同一個文件里

28. 在C語言中,表示靜態存儲類別的關鍵字是: ( C )

A、 auto

B、 register

C、static

D、extern

29.未指定存儲類別的變數,其隱含的存儲類別為(A )。

A、auto

B、static

C、extern

D、register

30. 若有以下說明語句:

struct student

{ int num;

char name[ ];

float score;

}stu;

則下面的敘述不正確的是: (D )

A、 struct是結構體類型的關鍵字

B、 struct student 是用戶定義的結構體類型

C、 num, score都是結構體成員名

D、 stu是用戶定義的結構體類型名

31.若有以下說明語句:

struct date

{ int year;

int month;

int day;

}brithday;

則下面的敘述不正確的是__C___.

A、 struct是聲明結構體類型時用的關鍵字

B、 struct date 是用戶定義的結構體類型名

C、 brithday是用戶定義的結構體類型名

D、year,day 都是結構體成員名

32. 以下對結構變數stul中成員age的非法引用是 B

struct student

{ int age;

int num;

}stu1,*p;

p=&stu1;

A、 stu1.age

B、 student.age

C、 p->age

D、(*p).age

33.設有如下定義:

struck sk

{ int a;

float b;

}data;

int *p;

若要使P指向data中的a域,正確的賦值語句是 C

A、 p=&a;

B、 p=datA、a;

C、p=&datA、a;

D、*p=datA、a;

34.設有以下說明語句:

typedef struct stu

{ int a;

float b;

} stutype;

則下面敘述中錯誤的是( D )。

A、struct是結構類型的關鍵字

B、struct stu是用戶定義的結構類型

C、a和b都是結構成員名

D、stutype是用戶定義的結構體變數名

35.語句int *p;說明了 C 。

A、p是指向一維數組的指針

B、p是指向函數的指針,該函數返回一int型數據

C、p是指向int型數據的指針 // 指針的定義教材P223

D、p是函數名,該函數返回一指向int型數據的指針

36.下列不正確的定義是(A )。

A、int *p=&i,i;

B、int *p,i;

C.int i,*p=&i;

D、int i,*p;

選項A先定義一個整型指針變數p,然後將變數i的地址賦給p。然而此時還未定義變數i因此編譯器無法獲得變數i的地址。(A與C對比,選項C先定義變數i,則在內存中為i分配空間,因此i在內存空間的地址就可以確定了;然後再定義p,此時可以為p賦i的地址,C正確)

37. 若有說明:int n=2,*p=&n,*q=p,則以下非法的賦值語句是: (D )

A、p=q

B、*p=*q

C、n=*q

D、p=n

p,q同為整型指針變數,二者裡面僅能存放整型變數的地址。

選項A,q中為地址,因此可將此地址賦給p

選項B,*p表示p所指向對象n的內容,即一個整數;*q表示q所指向對象的內容,由於在定義q時為其初始化,將p中n的地址給q,因此p中存放n的地址,*q表示q所指向對象n的內容.因此*p=*q 相當於 n=n;

選項C,n=*q 等價於n=n;

選項D,p中只能存放地址,不能將n中的整數值賦給p

38.有語句:int a[10],;則 B 是對指針變數p的正確定義和初始化。

A、int p=*a;

B、int *p=a;

C、int p=&a;

D、int *p=&a;

選項A,a是數組名,不是指針變數名,因此不可用*標注數組名a

選項C,a是數組名,數組名就是地址,無需再用地址符號。而且在定義指針變數p時,應在變數名前加*,標明p是指針變數

選項D,a是數組名,數組名就是地址,無需再用地址符號。

39.若有說明語句“int a[5],*p=a;”,則對數組元素的正確引用是( C )。

A、a[p]

B、p[a]

C、*(p+2)

D、p+2

首先定義一個整型數組a,a的長度為5,然後定義一個指針變數p,並同時對p進行初始化,將數組a的地址賦給p。因此此時p中存放的數組a的首地址,即數組中第一個元素a[0]的地址。

對於數組元素下標的引用(詳見p144), 一般形式 數組名[下標] 其中下標為邏輯地址下標,從0開始計數,方括弧中的下標可以是變數,可以是表達式,但結果一定要是整數。

選項A,p中存放的是地址,不是整數,不能做數組元素的下標

選項B,a是數組名,數組名就是地址,不是整數,不能做數組元素的下標

選項C,(重點!!!詳見p231~234) p+2表示指向同一數組中的下兩個元素的地址,當前p指向a[0],則p+2表示a[2]的地址,因此*(p+2)表示a[2]的內容

40. 有如下程序

int a[10]={1,2,3,4,5,6,7,8,9,10},*P=a;

則數值為9的表達式是 B

A、 *P+9

B、 *(P+8)

C、 *P+=9

D、P+8

(重點!!!詳見p231~234)

首先定義一個整型數組a,a的長度為5,然後定義一個指針變數P,並同時對P進行初始化,將數組a的地址賦給P。因此此時P中存放的數組a的首地址,即數組中第一個元素a[0]的地址。

數組中9對應的是a[8], 選項B,P+8表示數組中後8個元素的地址,即a[8]的地址。*(P+8)則表示該地址內所存放的內容,即a[8]的值。

選項A,*P表示P所指向對象的內容,此時P指向a[0], *P即a[0]的值1. *P+9=1+9=10

選項C,*P表示P所指向對象的內容,此時P指向a[0], *P即a[0]的值。因此*P+=9 即*P =*P+9, 等價於a[0]=a[0]+9.

選項D,P+8表示數組中後8個元素的地址,即a[8]的地址,而非a[8]中的值。

41. 在C語言中,以 D 作為字元串結束標志

A、’ ’

B、’ ’

C、 ’0’

D、’’

42.下列數據中屬於“字元串常量”的是(A )。

A、“a”

B、{ABC}

C、‘abc’

D、‘a’

若干個字元構成字元串

在C語言中,用單引號標識字元;用雙引號標識字元串

選項B,C,分別用{}和’’標識字元串

選項D,標識字元。

43.已知char x[]="hello", y[]={'h','e','a','b','e'};, 則關於兩個數組長度的正確描述是 B .

A、相同

B、x大於y

C、x小於y

D、以上答案都不對

C語言中,字元串後面需要一個結束標志位'',通常系統會自動添加。

對一維數組初始化時可採用字元串的形式(例如本題數組x),也可採用字元集合的形式(例如本題數組y)。在以字元串形式初始化時,數組x不盡要存儲字元串中的字元,還要存儲字元串後的結束標志位,因此數組x的長度為6;在以字元集合形式初始化時,數組y,僅存儲集合中的元素,因此數組y長度為5

;

『伍』 藍橋杯省賽(C語言)一般考什麼

還是跟選拔賽一樣的題型
考的是演算法類的題目

『陸』 2017年計算機二級C語言考點解析:函數

7.1 庫函數的正確調用
1.C語言提供了豐富的庫函數,包括常用數學函數、對字元和字元串處理函數、輸入輸出處理函數等。在調用庫函數時要注意以下幾點:

(1)調用C語言標准庫函數時必須在源程序中用include命令,include命令的格式是:

#include″頭文件名″

include命令必須以#號開頭,系統提供的頭文件名都以.h作為後綴,頭文件名用一對雙引號″″或一對尖括弧〈〉括起來。

(2)標准庫函數的調用形式:

函數名(參數表)

2.在C語言中庫函數的調用可以以兩種形式出現:出現在表達式中;作為獨立的語句完成某種操作。

7.2 函數的定義方法

1.C語言函數的一般形式為:

函數返回值的類型名 函數名(類型名 形參1,類型名 形參2,…)

{

說明部分

語句部分

}

定義的第一行是函數的首部,{}中的是函數體。

2.在老的C語言版本中,函數的首部用以下形式:

函數返回值的類型名 函數名(形參1,形參2…)

形參類型說明;

新的ANSI標准C兼容這種形式的函數首部說明。

3.函數名和形參名是由用戶命名的標識符。在同一程序中,函數名必須。形式參數名只要在同一函數中即可,可以與函數中的變數同名。

4.C語言規定不能在一個函數內部再定義函數。

5.若在函數的首部省略了函數返回值的類型名,把函數的首部寫成:

函數名(類型名 形參1,類型名 形參2,…)

則C默認函數返回值的類型為int類型。

6.當沒有形參時,函數名後面的一對圓括弧不能省略。

7.3 函數的類型和返回值

1.函數的類型由函數定義中的函數返回值的類型名確定,函數的類型可以是任何簡單類型,如整型、字元型、指針型、雙精度型等,它指出了函數返回值的具體類型。當函數返回的是整型值時,可以省略函數類型名。當函數只完成特定的操作而沒有或不需要返回值時,可用類型名void(空類型)。

2.函數返回值就是return語句中表達式的值。當程序執行到return語句時,猛空程序的流程就返回到調用該函數的地方(通常稱為退出調用函數),並空胡帶回函數值。

7.4 形式參數與實際參數,參數值的傳遞

1.在函數定義中,出現的參數名稱為形參(形式參數),在調用函數時,使用的參數值稱為實參(實際參數)。

2.調用函數和被調用函數之間的參數值的傳遞是″按值″進行的,即數據只能從實參單向傳遞給形參。也就是說,當簡單變數作為實參時,用戶不能在函數中改變對應實參的值。

7.5 函數的正確調用(嵌套調用,遞歸調用)

1.調用函數時,函數名必須與被調用的函數名字完全一樣。實參的個數與類型和形參的個數與類型一致。

2.C語言規定:函數必須先定義,後調用,也就是被調用函數必須在調用之前加以說明,或被調用函數整個放在調用函數之前。但對返回值類型為int或char類型的函數可以放在調用函數的後面。

3.C語言中函數定義都是互相平行、獨立的,C語言不允許嵌套定義函數,但允許嵌套調用函數,也就是說,在調用一個函數的過程中,又調用另一個函數。

4.在C程序中,調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用。

5.遞歸調用函數是C語言的特點之一,有時遞歸調用會使求解的問題變得更簡單明了。

7.6 局部變數和全局變數

1.局部變數

在一函數內部所定義的變數稱為局部變數,局部變數只在本函數范圍內有效。

注意:

①不同函數可以使用相同的局部變數名,它們將代表不同的對象,互不幹擾;

②一個函數的形參也為局部變數;

③在函數內部,復合語句也可定義變數,這些變數也為局部變數,只在此復合語句中有效。

2.全局變數

在C語言中,程序的編譯單位是源程序文件,一個源程序文件中包含一個或多個函數。在函數之外所定義枝虧瞎的變數稱為外部變數,也稱為全局變數。全局變數可以被包含它的源程序文件中的其他函數所共用,作用域為從定義變數的位置開始到源程序文件結束,全局變數可以增加函數之間數據的聯系。

注意:當在同一個源程序文件中,全局變數與局部變數同名時,在局部變數的作用范圍內,全局變數不起作用,局部變數起作用。

7.7 變數的存儲類別、作用域及生存期

1.變數的存儲類別

在C語言中,有兩類存儲類別:自動類別及靜態類別。

有4個與兩種存儲類別有關的說明符:auto(自動)、register(寄存器)、static(靜態)和extern(外部),這些說明符一般與類型說明一起出現,一般放在類型名的左邊,例如:

auto long I,j;

也可寫成:

long auto I,j;

(1)自動變數:自動變數是C程序中使用最多的一種變數,這種變數的建立和撤消都是在系統中自動進行的。

格式:[auto]數據類型 變數名[=初始化表達式],…;

上面的說明格式中,方括弧中是可省略的部分,auto為自動類別標識符,若省略auto,系統預設的存儲類別也為自動類別。

注意:函數的形參也為自動類別,在定義時不必加存儲類別標識符。

(2)寄存器變數:寄存器變數與自動變數的性質相同,其區別只在於存儲的位置不同,寄存器變數存儲在CPU的寄存器中,而自動變數存儲在內存中的動態存儲區,寄存器變數的存取速度要快些。

格式:register數據類型,變數名[=初始化表達式],…;

上面的說明格式中,register為寄存器變數的存儲類別標識符。

說明:

①CPU中寄存器的數目是有限的,因此只能把少數的變數說明為寄存器變數;

②寄存器變數是存放在寄存器中的,而不是存放於內存中,所以,寄存器變數無地址;

③寄存器變數的說明應盡量放在靠近要使用的地方,用完後盡快釋放,這樣可提高使用效率。

(3)靜態變數:靜態類別變數的存儲空間在程序的整個運行期間是固定的。

格式:static數據類型 變數名[=初始化表達式],…;

在上面的說明格式中,static為靜態變數的存儲類別標識符。

靜態變數的初始化在編譯時進行,定義時可用常量或表達式進行顯式初始化。對於沒有初始化的靜態變數,自動初始化為0(整型)或0.0(實型)。

注意:靜態變數具有可繼承性,這與自動變數有所不同。

(4)外部變數:使用extern可使外部變數使用范圍擴充到需要使用它的函數。外部變數可作顯式的初始化,若不作初始化,系統將自動地初始化為0或0.0。

格式:[extern]數據類型,變數名[=初始化表達式],…;

上面的說明格式中,extern使外部變數的作用范圍擴大到其他源程序文件中。

注意:局部變數既可以說明為自動類別,也可以說明為靜態類別;全局變數只能說明為靜態類別。

2.變數的作用域及生存期

在C語言中,變數必須先說明後使用,在程序中一個已定義的變數的使用范圍就是此變數的作用域。經過賦值的變數在程序運行期間能保持其值的時間范圍為該變數的生存期。

(1)局部變數的使用域及生存期

①自動變數的使用域及生存期

自動變數的存儲單元被分配在內存的動態存儲區,每當進函數體(或復合語句)時,系統自動為自動變數分配存儲單元,退出時自動釋放這些存儲單元。自動變數的作用域為從定義的位置起,到函數體(或復合語句)結束為止。

自動變數在進入到定義它們的函數體(或復合語句)時生成,在退出所在的函數體(或復合語句)時消失,這就是自動變數的生存期。

使用自動變數的優點是使各函數之間造成信息分隔,不同函數中使用同名變數時不會相互影響。

②寄存器變數的使用域及生存期

寄存器變數的使用域及生存期與自動變數相同。

③靜態存儲類別的局部變數

在函數體(或復合語句)內部,用static說明的變數靜態存儲類別的局部變數,這種變數的作用域與自動(或寄存器)變數的作用域相同,但是生存期有所不同。

在整個程序運行期間,靜態局部變數在內存的靜態存儲區中占據著永久的存儲單元,甚至在退出函數後下次再進入函數時,靜態局部變數仍使用原來的存儲單元。由於不釋放存儲單元,所以這些存儲單元中的值將會被保留下來。靜態局部變數的生存期將一直延長到程序運行結束。

靜態局部變數適合於在函數調用之間必須保留局部變數值的獨立變數。