【計算機二級C語言】卷001


選擇題

公共知識

【1】下列敘述中正確的是()。
〖A〗算法的時間復雜度是指算法在執行過程中基本運算的次數
〖B〗算法的時間復雜度是指算法執行所需要的時間
〖C〗算法的時間復雜度是指算法執行的速度
〖D〗算法復雜度是指算法控制結構的復雜程度
算法的時間復雜度是指執行算法所需要的計算工作量, 其計算工作量是用算法所執行的基本運算次數來度量的。
【2】下列敘述中正確的是()。
〖A〗循環隊列是隊列的一種鏈式存儲結構
〖B〗循環隊列是隊列的一種順序存儲結構
〖C〗循環隊列中的隊尾指針一定大於隊頭指針
〖D〗循環隊列中的隊尾指針一定小於隊頭指針
在實際應用中, 隊列的順序存儲結構一般采用循環隊列的形式。
當循環隊列滿或者為空時:隊尾指針=隊頭指針。
【3】某完全二叉樹有256個結點, 則該二叉樹的深度為()。
〖A〗7
〖B〗8
〖C〗9
〖D〗10
根據完全二叉樹的性質:具有n個結點的完全二叉樹的深度為[log 2n] + 1。
本題中完全二叉樹共有256個結點, 則深度為[log 2 256] + 1 = 8 + 1 = 9。
【4】下列敘述中錯誤的是()。
〖A〗線性結構也能采用鏈式存儲結構
〖B〗線性結構一定能采用順序存儲結構
〖C〗有的非線性結構也能采用順序存儲結構
〖D〗非線性結構一定不能采用順序存儲結構
滿二叉樹與完全二叉樹均為非線性結構, 但可以按照層次進行順序存儲。
【5】需求分析的主要任務是()。
〖A〗確定軟件系統的功能
〖B〗確定軟件開發方法
〖C〗確定軟件開發工具
〖D〗確定軟件開發人員
需求分析是軟件開發之前必須要做的准備工作之一。
需求是指用戶對目標軟件系統在功能、行為、性能、設計約束等方面的期望。
故需求分析的主要任務是確定軟件系統的功能。
【6】一個模塊直接調用的下層模塊的數目稱為模塊的()。
〖A〗扇入數
〖B〗扇出數
〖C〗寬度
〖D〗作用域
扇入數指調用一個給定模塊的模塊個數。
扇出數是指由一個模塊直接調用的其他模塊數, 即一個模塊直接調用的下層模塊的數目。
【7】將數據和操作置於對象統一體中的實現方式是()。
〖A〗隱藏
〖B〗抽象
〖C〗封裝
〖D〗結合
對象具有封裝性, 從外面看只能看到對象的外部特性, 對象的內部對外是封閉的。
即封裝實現了將數據和操作置於對象統一體中。
【8】采用表結構來表示數據及數據間聯系的模型是()。
〖A〗層次模型
〖B〗概念模型
〖C〗網狀模型
〖D〗關系模型
關系模型采用二維表來表示, 簡稱表。
【9】在供應關系中, 實體供應商和實體零件之間的聯系是()。
〖A〗多對多
〖B〗一對一
〖C〗多對一
〖D〗一對多
一家供應商可提供多種零件, 一種零件也可被多家供應商提供。
所以實體供應商和實體零件之間的聯系是多對多。
【10】如果定義班級關系如下:
班級(班級號, 總人數, 所屬學院, 班級學生)
則使它不滿足第一范式的屬性是()。
〖A〗班級號
〖B〗班級學生
〖C〗總人數
〖D〗所屬學院
對於關系模式, 若其中的每個屬性都已不能再分為簡單項, 則它屬於第一范式模式。
題目中"班級"關系的"班級學生"屬性, 還可以進行再分, 如學號、姓名、性別、出生日期等, 因此不滿足第一范式。

專業知識

【11】以下說法正確的是()。
〖A〗C語言只接受十進制的數
〖B〗C語言只接受八進制、十進制、十六進制的數
〖C〗C語言接受除二進制之外任何進制的數
〖D〗C語言接受任何進制的數
C可以使用格式控制符%d, %u, %f等接受十進制的數, 使用%o接受八進制的數, 使用%x接受十六進制的數, 本題答案選B。
【12】以下說法錯誤的是()。
〖A〗由三種基本結構組成的結構化程序不能解決過於復雜的問題
〖B〗由三種基本結構組成的結構化程序能解決一些簡單的問題
〖C〗由三種基本結構組成的結構化程序能解決遞歸問題
〖D〗由三種基本結構組成的結構化程序能解決數學上有解析解的問題
順序結構、選擇結構、循環結構是三種基本結構, 由三種基本結構所構成的程序稱為結構化程序, 由三種基本結構組成的算法可以解決任何復雜的問題, 選項A錯誤, 本題答案A
【13】以下說法錯誤的是()。
〖A〗C語言標識符中可以有多個字母、數字和下划線字符
〖B〗C語言標識符中下划線字符可以出現在任意位置
〖C〗C語言標識符不能全部由數字組成
〖D〗C語言標識符必須以字母開頭
C語言的合法的標識符的命名規則是:標識符可以由字母、數字和下划線組成, 並且第一個字符必須是字母或下划線。
選項D錯誤, 本題答案D
【14】以下說法錯誤的是()。
〖A〗C語言中的常量是指在程序運行過程中經常被用到的變量
〖B〗C語言中的常量是指在程序運行過程中其值不能被改變的量
〖C〗C語言中的常量可以用一個符號名來代表
〖D〗C語言中的常量可以用宏來定義
C語言中的常量是指在程序運行過程中其值不能被改變的量, 它可以用宏來定義, 用一個符號名代表, 選項A錯誤, 選項B、C、D正確, 本題答案A
【15】若有定義:int a = 1234, b = -5678; 用語句 printf("%+-6d%+-6d", a, b); 輸出, 以下正確的輸出結果是()。
〖A〗+1234 -5678 (中間有一個空格,最后有一個空格)
〖B〗+1234 -5678 (最前面有一個空格,中間有一個空格)
〖C〗+-1234+-5678 (最前面和最后均無空格)
〖D〗1234 -5678 (中間有兩個空格,最后有一個空格)
printf函數參數包括格式控制字符串和輸出參數, 其中格式控制字符串中除了格式控制字符外, 其他字符原樣輸出, 本題中, 在%和格式字符d之間, +號表示輸出的數字帶正負號, -號表示輸出數據向左對齊, 6表示表示輸出寬度, 如果輸出數據的寬度不夠6, 那么左對齊, 右邊補空格, 所以本題輸出+1234 - 5678, 中間一個空格, 最后一個空格, 本題答案A
【16】若有定義:double a; float b; short c;
若想把1.2輸入給變量a, 3.4輸入給變量b, 5678輸入給變量c, 程序運行時鍵盤輸入:
1.2 3.4 5678<回車>
則以下正確的讀入語句是()。
〖A〗scanf("%lf%lf%d", &a, &b, &c);
〖B〗scanf("%lf%lf%hd", &a, &b, &c);
〖C〗scanf("%lf%f%hd", &a, &b, &c);
〖D〗scanf("%f%f%d", &a, &b, &c);
scanf函數用於輸入數據, 第一個參數表示輸入格式控制, 本題變量a是double類型, 使用格式控制符%lf, 變量b是float類型, 使用%f, 變量c是short類型, 使用%hd, 選項C正確, 本題答案C
【17】有下列程序
#include <stdio.h>
void main() {
    int a = 1, b = 1, c = 1;
    if (a-- || b-- && --c)
        printf("%d,%d,%d\n", a, b, c);
    else
        printf("%d,%d,%d\n", a, c, b);
}
程序執行后的輸出結果是()。
〖A〗0,1,0
〖B〗0,1,1
〖C〗0,0,1
〖D〗0,0,0
if條件表達式a-- || b-- && --c使用了邏輯或運算符和邏輯與運算符, 由於邏輯與運算符優先級比邏輯或運算符優先級高, 所以條件表達式等價於(a--) || (b-- && --c), 自左向右運算, 執行a--, 由於a初值為1, 所以a--的值為1, 執行完后a的值為0; 又因為邏輯或運算符的短路原則, 當a--的值為1時, 條件為真, 后面的表達式b-- && --c不執行, 程序執行if語句塊, 輸出a、b、c的值為:0, 1, 1, 本題答案B
【18】有下列程序
#include <stdio.h>
void main() {
    int a = 123456, b;
    while (a) {
        b = a % 10;
        a /= 10;
        switch (b) {
            default:
                printf("%d", b++);
            case 1:
                break;
            case 2:
                printf("%d", b++);
                break;
            case 3:
                printf("%d", b++);
            case 4:
                printf("%d", b++);
            case 5:
                printf("%d", b++);
        }
    }
}
程序執行后的輸出結果是()。
〖A〗654321
〖B〗65432
〖C〗65453452
〖D〗654534521
程序首先定義整型變量a和b, a的初值為123456, 接着通過while循環, 判斷a的值是否為0, 若不為0, 則執行循環體, 每次循環將a當前值的個位數字(a % 10)賦給b, a自身除以10, 再通過switch語句判斷b的值執行對應分支語句; 所以對於a的每個個位數, b的取值為6, 5, 4, 3, 2, 1, 當b取值為6時, 執行default, 輸出6, 接着繼續執行case 1, break退出switch, 執行下一次循環; 當b取值為5時, 執行case 5輸出5, 執行下一次循環; 當b取值為4時, 執行case 4輸出4, 繼續執行case 5輸出5, 接着下一次循環; 當b取值為3時, 執行case 3輸出3, 執行case 4輸出4, 執行case 5輸出5; 當b取值為2時, 執行case 2輸出2, break跳出switch; 當b取值為1時, 執行break, 此時a的取值為0, 循環終止, 程序輸出結果為:65453452, 本題答案C。
【19】有下列程序
#include <stdio.h>
void main() {
    int a = 1, b = -2;
    for (; a-- && b++; )
        printf("%d,%d,", a, b);
    printf("%d,%d", a, b);
}
程序執行后的輸出結果是()。
〖A〗0,-1,-1,-1
〖B〗0,-1,-1,0
〖C〗0,-1,-1,0,-1,0
〖D〗0,-1,-1,-1,-1,-1
程序定義整型變量a和b, 初值分別是1, -2, for語句中循環條件式為a-- && b++, 由於--和++的優先級高於邏輯與運算符&&, 所以等價於(a--) && (b++), 自左向右運算

第一輪循環, a、b的值為1, -2:首先執行a--, a--的值為1, 執行完后a的值為0, 繼續執行b++, b++的值為-2, 執行完后b的值為-1, 整個表達式a-- && b++的值為真, 程序輸出0, -1;
接着繼續循環

第二輪循環, a、b的值為0, -1:首先執行a--, a--的值為0, 執行完后a的值為-1, 由於a--的值為0, 邏輯與運算的短路原則, 表達式a-- && b++的值一定為假, 表達式b++不再執行, 循環結束, 執行循環體外的printf語句, 輸出a、b的值分別為:-1, -1

所以本題輸出結果為:0, -1, -1, -1, 本題答案A

【20】有下列程序
#include <stdio.h>
void main() {
    int a = 7, i;
    for (i = 1; i <= 3; i++) {
        if (a > 14)
            break;
        if (a % 2) {
            a += 3;
            continue;
        }
        a = a + 4;
        printf("%d,%d,", i, a);
    }
    printf("%d,%d", i, a);
}
程序執行后的輸出結果是()。
〖A〗2,14,3,18,4,18
〖B〗1,14,2,18,3,18
〖C〗2,14,3,18,4,22
〖D〗1,14,2,18,3,18,4,18
程序定義整型變量a和i, 其中a的初值為7, for循環中, 循環變量i的取值為1, 2, 3, 循環體中判斷a的取值, 當a > 14時, break跳出循環; 當a取值為奇數時, a % 2 == 1, a自增3, continue繼續執行循環體; 當a取值為偶數時, a % 2 == 0, a自增4, 輸出i和a的值; 所以:i取值為1時, a取值為7, 自增3后a的值為10, 執行下一個循環

i取值為2時, a取值為10, 自增4后a的值為14, 輸出2, 14 i取值為3時, a取值為14, 自增4后a的值為18, 輸出3, 18 i取值為4時, a取值為18, 循環終止, 輸出4, 18

綜上, 程序輸出:2, 14, 3, 18, 4, 18, 本題答案為A

【21】以下正確的字符常量是()。
〖A〗'\089'
〖B〗'\012'
〖C〗'\0XAB'
〖D〗'\0xab'
題意中都以轉義字符\開頭, \開頭的轉義字符中, \ddd表示三位八進制數代表的一個ASCII字符, \xhh表示二位十六進制數代表的一個ASCII字符; 選項A中089是不合法的八進制數, 錯誤; 選項C、D中\0X或\0x不合法, 錯誤; 選項B表示八進制數012代表的ASCII字符, 正確; 本題答案B
【22】有下列程序
#include <stdio.h>
void main() {
    char b[] = "happychristmas", k;
    for (k = 0; b[k]; k++) {
        if (b[k] < 'm')
            b[k] = b[k] - 'a' + 'A';
        printf("%c", b[k]);
    }
}
程序執行后的輸出結果是()。
〖A〗hAppychristmAs
〖B〗happychristmas
〖C〗HAppyCHrIstmAs
〖D〗HAPPYCHRISTMAS
程序定義一個字符數組b, 和一個字符變量k, for循環通過循環變量k, 遍歷數組b中的各個字符, 通過if語句判斷當前下標為k的字符的ASCII碼與字符'm'的大小, 把數組b中ASCII碼小於'm'的字符改成大寫字母(b[k] = b[k] - 'a' + 'A'), 然后輸出b[k], 對於字符串happychristmas, ASCII碼小於'm'的字符有:h, a, c, h, i, a, 所以程序輸出:HappyCHrIstmAs, 本題答案C
【23】有如下形式的函數
int fun(int a[4][5], int *p[10], int n) {
    ……
}
調用函數之前需要對函數進行說明, 即所謂的函數向前引用說明, 以下對fun函數說明正確的是()。
〖A〗int fun(int b[][5], int *r[], int m);
〖B〗int fun(int a[4][], int *p[10], int n);
〖C〗int fun(int a[][], int *p[], int n);
〖D〗int fun(int a[], int *p[], int n);
題意中函數的定義指出了函數名為fun, 返回值為int, 函數包含三個參數, 第一個參數是整型的二維數組, 第二個參數是整型數組, 第三個參數是整型變量, 在定義二維數組時, 必須指定第二維的長度, 所以選項B、C、D錯誤, 選項A正確, 本題答案A
【24】關於指針, 以下說法正確的是()。
〖A〗可以直接向指針中寫入數據
〖B〗若指針指向變量, 則可以向指針所指內存單元寫入數據
〖C〗指針可以指向內存中任何位置, 並寫入數據
〖D〗兩個指針可以通過加運算求和, 形成一個功能更強大的指針
C語言中指針就是變量的地址, 它必須有確定的基類型, 當指針指向某個變量時, 才能向其中寫入數據, 選項A錯誤, 選項B正確; 指針除了指向變量外, 還可以賦值為NULL, 表示未指向任何地址, 此時不能寫入數據, 另外指針必須有基類型, 只能指向基類型相同的變量, 選項C錯誤; 指針只能與一個整數進行運算, 即移動指針, 兩個指針不能運算, 選項D錯誤, 本題答案B
【25】有下列程序
#include <stdio.h>
int *f(int *s) {
    s += 1;
    s[1] += 6;
    *s-- += 7;
    return s;
}
void main() {
    int a[5] = { 1, 2, 3, 4, 5 }, *p;
    p = f(a);
    printf("%d,%d,%d,%d", a[1], a[2], *p, p[1]);
}
程序執行后的輸出結果是()。
〖A〗2,3,1,2
〖B〗9,9,2,9
〖C〗8,10,2,8
〖D〗9,9,1,9
程序定義了一個整型數組a, 它包含5個整型元素, 分別是1, 2, 3, 4, 5, 此時a代表數組的首地址, 另外還定義整型指針p, 將a傳給函數f, 在函數f中, 首先將指針s向右移動一個整型變量的長度, 此時s指向元素2(a[1]), s[1](a[2])表示元素3, 自增6后s[1](a[2])的值為9, 表達式*s-- += 7表示將*(s--)指向的元素自增7, 即s[0](a[1])的值為9, s向左移動一個整型變量的長度, 此時s指向元素1(a[0]), 最后將s返回賦給p, 經過函數f的調用可知:p指向數組a的第一個元素, a[1]和a[2]值為9, 綜上, 輸出結果為:9, 9, 1, 9, 本題答案D
【26】有下列程序
#include <stdio.h>
void swap(int *a, int *b) {
    int *tp, t;
    t = *a;
    *a = *b;
    *b = t;
    tp = a;
    a = b;
    b = tp;
    printf("%d,%d,", *a, *b);
}
void main() {
    int i = 3, j = 7, *p = &i, *q = &j;
    swap(&i, &j);
    printf("%d,%d", *p, *q);
}
程序執行后的輸出結果是()。
〖A〗3,7,3,7
〖B〗7,3,7,3
〖C〗3,7,7,3
〖D〗7,3,3,7
程序定義兩個整型變量i, j, 初值為3, 7, 另外定義兩個整型指針變量p, q, 其中p指向i, q指向j, 將i, j的地址傳給swap函數, 在swap函數中, a指向i, b指向j, 通過臨時變量t交換a和b指向的值, 此時a指向的實參i, b指向的實參j的值發生了交換, 即a指向i的值為7, b指向j的值為3; 再通過臨時變量tp交換a和b的指針值, 使得a指向j, b指向i, 所以swap中輸出a指向的值為3(j), b指向的值為7(i); swap函數調用結束后, 輸出p和q指向的值, 即i, j的值7, 3, 所以程序輸出:3, 7, 7, 3, 本題答案C
【27】有下列程序
#include <stdio.h>
#define N 4
int fun(int a[][N]) {
    int i, y = 0;
    for (i = 0; i < N; i++)
        y += a[i][0] + a[i][N - 1];
    for (i = 1; i < N - 1; i++)
        y += a[0][i] + a[N - 1][i];
    return y;
}
void main() {
    int y, x[N][N] = { { 1, 2, 3, 4 }, { 2, 1, 4, 3 }, { 3, 4, 1, 2 }, { 4, 3, 2, 1 } };
    y = fun(x);
    printf("%d", y);
}
程序執行后的輸出結果是()。
〖A〗30
〖B〗35
〖C〗40
〖D〗32
程序定義一個整型變量y和整型二維數組x, 並對x賦初值, 接着調用函數fun, 在函數fun中, 第一個for循環將數組a的第0列和第N - 1列的所有元素累加到y中, 第二個for循環將數組a的第0行的2, 3和第N - 1行的3, 2累加到y中, 再將y返回, 所以fun函數的功能是將數組a的行列下標為0、N - 1的所有元素累加起來, 即1, 2, 3, 4, 2, 3, 3, 2, 4, 3, 2, 1, 輸出30, 本題答案A
【28】有下列程序
#include <stdio.h>
void fun(int a[], int n, int flag) {
    int i = 0, j, t;
    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++)
            if (flag ? (a[i] < a[j]) : (a[i] > a[j])) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
}
void main() {
    int c[10] = { 7, 9, 10, 8, 3, 5, 1, 6, 2, 4 }, i;
    fun(c, 5, 1);
    fun(c + 5, 5, 0);
    for (i = 0; i < 10; i++)
        printf("%d,", c[i]);
}
程序執行后的輸出結果是()。
〖A〗3,7,8,9,10,6,5,4,2,1,
〖B〗10,9,8,7,3,1,2,4,5,6,
〖C〗10,9,8,7,6,1,2,3,4,5,
〖D〗1,2,3,4,5,10,9,8,7,6,
程序中函數fun的功能是將數組a的n個元素, 按照flag的值進行排序:當flag為0時, 升序排列, 當flag為1時, 降序排列。
main函數中定義數組c, 初始化10個元素的值, 第一次調用fun, flag為1, 即將c的下標為0開始的5個元素降序排列, 第二次調用fun, flag為0, 將c的下標為5開始的5個元素升序排列, 所以數組c的元素為:10, 9, 8, 7, 3, 1, 2, 4, 5, 6, 本題答案B。
【29】有下列程序
#include <stdio.h>
void main() {
    int i, j = 0;
    char a[] = "ab1b23c4d56ef7gh89i9j64k", b[100];
    for (i = 0; a[i]; i++)
        if (a[i] < 'a' || a[i] > 'z')
            b[j++] = a[i];
    for (i = 0; a[i]; i++)
        if (a[i] < '0' || a[i] > '9')
            b[j++] = a[i];
    b[j] = '\0';
    printf("%s", b);
}
程序執行后的輸出結果是()。
〖A〗abbcdefghijk123456789964
〖B〗123456789964abbcdefghijk
〖C〗123445667899abbcdefghijk
〖D〗abbcdefghijk123445667899
程序定義數組a, b, 其中a使用小寫字母和數字構成的字符串完成初始化; 第一個for循環將數組a中所有的非小寫字母字符(數字字符)自左向右存放到b數組中, 第二個for循環將數組a中所有的非數字字符(小寫字母)自左向右存放到b的后續單元中, 在所有字符后添加空字符, 輸出b, 此時b的值為:123456789964abbcdefghijk, 本題答案B
【30】有下列程序
#include <stdio.h>
void main() {
    char v[4][10] = { "efg", "abcd", "mnopq", "hijkl" }, *p[4], t;
    int i, j;
    for (i = 0; i < 4; i++)
        p[i] = v[i];
    for (i = 0; i < 3; i++)
        for (j = i + 1; j < 4; j++)
            if (*p[i] > *p[j]) {
                t = *p[i];
                *p[i] = *p[j];
                *p[j] = t;
            }
    for (i = 0; i < 4; i++)
        printf("%s ", v[i]);
}
程序執行后的輸出結果是()。
〖A〗abcd efg hijkl mnopq
〖B〗afg ebcd hnopq mijkl
〖C〗efg abcd mnopq hijkl
〖D〗mijkl hnopq ebcd afg
程序首先定義二維字符數組v, 使用四個字符串初始化, 另外定義字符指針數組p, 通過第一個for循環, 將v的四個字符串的首地址賦給p, 第二個for循環通過兩層內嵌循環將p中元素指向的字符串首字母進行排序交換, 規則是:將指向的字符串的首字母字符按照字母表中的順序排序后交換, 注意, 這里交換的是首字母, 而不是整個字符串, 所以程序輸出:afg ebcd hnopq mijkl, 本題答案B
【31】有下列程序
#include <stdio.h>
void main() {
    char v[5][10] = { "efg", "abcd", "snopq", "hijkl", "xyz" };
    printf("%s,%c,%s,%c,%s", *v, **(v + 3), v[4] + 2, *(v[2] + 4), v[1] + 1);
}
程序執行后的輸出結果是()。
〖A〗efg,h,z,q,bcd
〖B〗efg,d,zyz,w,bbcd
〖C〗efgabcdsnopqhijklxyz,h,z,q,bcd
〖D〗efgabcdsnopqhijklxyz,d,zyz,w,bbcd
程序定義一個二維字符數組v, 使用5個字符串初始化, 對於表達式:*v等價於*(v + 0), 輸出的是數組v的第一個元素:efg; **(v + 3)等價於*(*(v + 3) + 0), 輸出的是數組v的第四個元素的第一個字符:h; v[4]表示數組v的第五個元素, v[4] + 2表示輸出從下標2開始的所有字符:z; v[2]表示數組v的第三個元素, *(v[2] + 4)表示數組v的第三個元素的下標為4的字符:q, v[1] + 1表示數組v的第二個元素從下標1開始的子字符串, 即:bcd, 本題輸出:efg, h, z, q, bcd, 本題答案A
【32】有下列程序
#include <stdio.h>
#include <string.h>
void main() {
    char a[5][10] = { "efg", "abcd", "mnopq", "hijkl", "rstuvwxyz" };
    char *p[5];
    int i, len;
    for (i = 0; i < 5; i++) {
        p[i] = a[i];
        len = strlen(p[i]);
        printf("%c", p[i][0]);
        printf("%s", p[i] + len / 2);
    }
}
程序執行后的輸出結果是()。
〖A〗eeaabmmnhhirrstu
〖B〗efgabcdmnopqhijklrstuvwxyz
〖C〗efgacdmopqhjklrvwxyz
〖D〗eefgaabcdmmnopqhhijklrrstuvwxyz
程序定義一個二維字符數組a, 使用5個字符串初始化, 另外定義字符指針數組p, for循環中, 每次將數組a當前下標為i的字符串首地址賦給p[i], 再求得p[i]的長度賦給len, 第一個printf輸出p[i]字符串的首字母, 第二個printf輸出p[i]字符串下標從len / 2開始的子字符串, 所以:下標i = 0輸出:efg

下標i = 1輸出:acd

下標i = 2輸出:mopq

下標i = 3輸出:hjkl

下標i = 4輸出:rvwxyz

程序輸出:efgacdmopqhjklrvwxyz, 本題答案C

【33】有下列程序
#include <stdio.h>
int f(int x) {
    if (x < 2)
        return 1;
    return x * f(x - 1) + (x - 1) *f(x - 2);
}
void main() {
    int y;
    y = f(4);
    printf("%d\n", y);
}
程序執行后的輸出結果是()。
〖A〗11
〖B〗43
〖C〗57
〖D〗53
函數f是一個遞歸函數, 當x >= 2時, 遞歸調用自身, 返回值為:x * f(x - 1) + (x - 1) * f(x - 2), 當x < 2時, 返回值為1。
main函數中, 調用函數f傳入4, 所以y的值是f(4)。

f(4)等價於 4 * f(3) + 3 * f(2)f(3)等價於 3 * f(2) + 2 * f(1)f(2)等價於 2 * f(1) + 1 * f(0)f(0), f(1)等價於1

綜上:f(2)等於3, f(3)等於11, f(4)等於53, 本題答案D

【34】有下列程序
#include <stdio.h>
int a = 5;
int func(int d) {
    int b = 5;
    static int c = 5;
    a--;
    b--;
    --c;
    --d;
    return a + b + c + d;
}
void main() {
    int k, a = 4;
    for (k = 0; k < 3; k++)
        printf("%d,", func(a--));
}
程序執行后的輸出結果是()。
〖A〗15,12,9,
〖B〗15,13,11,
〖C〗15,11,7,
〖D〗15,15,15,
程序定義整型的全局變量a, 初值為5, main函數定義整型局部變量a, 初值也是5, 所以在main函數中, 局部變量a屏蔽全局變量a; func函數中定義局部變量b, 初值為5, 定義靜態變量c, 初值為5, 並且在func函數中變量a引用的是全局變量a。
綜上, 我們使用a_a代表全局變量a, 使用m_a代表main函數中局部變量a。

void main函數中, k = 0時, a_a = 5, m_a = 4, 調用函數func(4), 函數func中d的值為4, b的值為5, c的值為5, 執行表達式a_a--;
b--;
--c;
--d;
后, a_a的值為4, b的值為4, c的值為4, d的值為3, a + b + c + d的值為15, 程序輸出15 k = 1時, a_a = 4, m_a = 3, 調用函數func(3), 函數func中d的值為3, b的值為5, c的值為4(靜態變量使用上一次調用結束時的值), 執行表達式a_a--;
b--;
--c;
--d;
后, a_a的值為3, b的值為4, c的值為3, d的值為2, a + b + c + d的值為12, 程序輸出12 k = 2時, a_a = 3, m_a = 2, 調用函數func(2), 函數func中d的值為2, b的值為5, c的值為3, 執行表達式a_a--;
b--;
--c;
--d后, a_a的值為2, b的值為4, c的值為2, d的值為1, a + b + c + d的值為9, 程序輸出9。
綜上, 本題答案:A

【35】有下列程序
#include <stdio.h>
#define S1(x, y) x * y
#define S2(x, y) (x) * (y)
void main() {
    int a = 2, b = 5;
    printf("%d,%d,%d,%d", S1(a + b, a + b), S1(a + b, b + a), S2(a + b, a + b), S2(a + b, b + a));
}
程序執行后的輸出結果是()。
〖A〗17,17,49,49
〖B〗17,29,49,49
〖C〗29,29,49,49
〖D〗49,49,49,49
對於題意中的宏, 替換如下:S1(a + b, a + b)等價於:a + b * a + b, 即2 + 5 * 2 + 5, 等於17 S1(a + b, b + a)等價於:a + b * b + a, 即2 + 5 * 5 + 2, 等於29 S2(a + b, a + b)等價於:(a + b) * (a + b), 即(2 + 5) * (2 + 5), 等於49 S2(a + b, b + a)等價於:(a + b) * (b + a), 即(2 + 5) * (5 + 2), 等於49

本題答案:B

【36】有下列程序
#include <stdio.h>
#include <string.h>
typedef struct stu {
    char name[9];
    char gender;
    int score;
} STU;
STU a = { "Zhao", 'm', 85 };
STU f() {
    STU c = { "Sun", 'f', 90 };
    strcpy(a.name, c.name);
    a.gender = c.gender;
    a.score = c.score;
    return a;
}
void main() {
    STU b = { "Qian", 'f', 95 };
    b = f();
    printf("%s,%c,%d,%s,%c,%d", a.name, a.gender, a.score, b.name, b.gender, b.score);
}
程序執行后的輸出結果是()。
〖A〗Sun,f,90,Sun,f,90
〖B〗Zhao,m,85,Sun,f,90
〖C〗Zhao,m,85,Qian,f,95
〖D〗Sun,f,90,Qian,f,95
程序定義結構體類型stu, 定義全局stu變量a, main函數定義局部stu變量b, 並對它們初始化, 調用函數f, 將局部變量c的各個成員值賦給a, 覆蓋a的舊值, 並將a的新值返回賦給b, 此時a、b的各個成員值都是:"Sun", 'f', 90, 程序輸出:Sun, f, 90, Sun, f, 90, 本題答案A
【37】有下列程序
#include <stdio.h>
typedef struct stu {
    char name[9];
    char gender;
    int score;
} STU;
void f(STU *a) {
    STU c = { "Sun", 'f', 90 }, *d = &c;
    *a = *d;
    printf("%s,%c,%d,", a->name, a->gender, a->score);
}
void main() {
    STU b = { "Zhao", 'm', 85 }, *a = &b;
    f(a);
    printf("%s,%c,%d", a->name, a->gender, a->score);
}
程序執行后的輸出結果是()。
〖A〗Zhao,m,85,Zhao,m,85
〖B〗Sun,f,90,Zhao,m,85
〖C〗Zhao,m,85,Sun,f,90
〖D〗Sun,f,90,Sun,f,90
程序定義結構體類型stu, main函數定義結構體stu變量b, 並將b的地址賦給指針變量a, 調用函數f, 傳入a, 在函數f中, 定義了stu變量c, 並將c的地址賦給d, 再用d指向的值賦給a指向的地址, 接着輸出a指向的值, 也就是c的值:Sun, f, 90; 由於函數f的調用通過指針參數a修改了變量b的值, 所以a指向的值也就是b的值等價於c : Sun, f, 90。
本題答案D
【38】若有定義
typedef int *T[10];
T *a;
則以下與上述定義中a類型完全相同的是()。
〖A〗int *a[10];
〖B〗int **a[10];
〖C〗int *(*a)[10];
〖D〗int *a[][10];
由題意可知, T是一個數組指針, 即int * [], 所以使用T * a定義, 可知a屬於int * *[]類型, 本題答案B。
【39】有下列程序
#include <stdio.h>
void main() {
    int x = 4, y = 2, z1, z2;
    z1 = x && y;
    z2 = x & y;
    printf("%d,%d\n", z1, z2);
}
程序執行后的輸出結果是()。
〖A〗1,0
〖B〗1,1
〖C〗1,4
〖D〗4,4
&&是邏輯與運算符, x, y的取值為4, 2, 兩個都是非0值, 所以x && y的結果為真, 值為1; &是位運算符, x的二進制為0100, y的二進制為0010, 0100 & 0010的結果為0, 本題答案A
【40】有下列程序
#include <stdio.h>
void main() {
    FILE *fp;
    int i, a[6] = { 1, 2, 3, 4, 5, 6 };
    fp = fopen("d.dat", "w+b");
    for (i = 5; i >= 0; i--)
        fwrite(&a[i], sizeof(int), 1, fp);
    rewind(fp);
    fread(&a[3], sizeof(int), 3, fp);
    fclose(fp);
    for (i = 0; i < 6; i++)
        printf("%d,", a[i]);
}
程序執行后的輸出結果是()。
〖A〗6,5,4,4,5,6,
〖B〗1,2,3,4,5,6,
〖C〗4,5,6,4,5,6,
〖D〗1,2,3,6,5,4,
程序定義數組a, 使用6個元素對其初始化, 接着以寫二進制方式打開文件d.dat, 調用fwrite函數將a的6個元素逆序寫入文件(654321), 接着調用rewind函數, 將文件指針移動到文件開始位置, 調用fread函數讀入3個整數, 逐個存放到a開始下標為3的三個位置, 即a[3] = 6, a[4] = 5, a[5] = 4, 關閉文件, 再次調用for循環輸出a, 輸出結果為:1, 2, 3, 6, 5, 4。

本題答案:D

編程題

【41】給定程序中, N名學生的數據已存入類型為STU的結構體數組, 函數fun的作用是:計算出N名學生的平均成績, 將高於平均分的學生的學號存入p所指的存儲單元中, 高於平均分的人數由函數值返回。
請在程序的下划線處填入正確的內容並把下划線刪除, 使程序得出正確的結果。
注意:源程序存放在文件BLANK1.C中, 不得增行或刪行, 也不得更改程序的結構 !
(1) x[i].s
(2) > ave
(3) n++
(1) 根據題意, STU結構體中, num數組存放學生學號, 變量s存放學生成績。
fun()函數需要計算N個學生的平均成績ave。
第一個for循環將x中N名學生的成績累加到ave, 即ave += x[i].s, 循環結束后再除以N。
(2) fun()函數求得N名學生的平均值后, 再次遍歷數組x, 將成績高於平均值ave的學生學號存放到指針p指向的存儲單元中, 所以if語句中需要判斷x[i].s > ave。
(3) n的初值為0, 每次將成績高於平均值ave的學生學號使用strcpy拷貝到p指向的第n個存儲單元后, 需要對n自增1, 表示下一個可用的存儲單元索引, 也表示當前存放到p中的學生學號的個數, 最后會作為函數返回值返回。
【42】給定程序MODI1.C中, 函數fun的功能是:將a串奇數位置(注意:不是下標)上的字符與b串偶數位置上的字符交叉合並, 形成一個新字符串存入c所指的存儲空間。合並過程中, 任何一個字符串到達串尾, 則合並過程結束。
例如, a串為:asderty b串為:zxcvb 則c串為:axdvr
請改正程序中的錯誤, 使它能得出正確的結果。
注意:不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
(1) if (b[i + 1] != '\0')
(2) break;
(3) c[j] = '\0';
(1) 根據題意, fun()函數的每一輪whie循環, 需要將a[i]存放到c[j], b[i + 1]存放到c[j + 1], 直到a[i]或b[i + 1]為空字符為止。
循環最后需要對i自增2, 保證a[i]是a的奇數位置字符, b[i + 1]是b的偶數位置字符, 所以第一處需要修改為:if (b[i + 1] != '\0')
(2) 由(1)可知, else 表示b[i + 1] == '\0', 此時按照題意, 程序應該跳出while循環, 所以continue應該修改為break。
(3) while循環中每次將字符存放到c[j]后, 都對j自增1, 所以j始終指向c最后一個有效字符的下一個位置。
循環結束后只需要對c[j]存放空字符即可, 所以c[j + 1] = '\0'修改為c[j] = '\0'。
【43】程序中定義了N×N的二維數組, 並已在主函數中賦初值。
請編寫函數fun, 其功能是:將a所指數組主對角線上的元素分別乘以2; 次對角線上的元素分別乘以3, 依次放入指針p所指的數組中。計算過程中不得修改a所指數組中的數據。
注意:部分源程序在文件PROG1.C中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入所編寫的若干語句。
void fun(int a[N][N], int *p) {
    int i, k = 0;
    for (i = 0; i < N; i++) {
        p[k++] = a[i][i] * 2;
    }
    for (i = 0; i < N; i++) {
        p[k++] = a[i][N - i - 1] * 3;
    }
}
首先需要理解, 題意中二維數組的主對角線元素是指行下標和列下標相等的元素, 次對角線元素是指行下標和列下標之和為N - 1的元素。
接下來編寫fun函數, 程序定義兩個變量i和k, k初值為0, 通過兩個for循環完成題意要求, 第一個for循環遍歷二維數組的主對角線元素a[i][i], 乘2后賦值給p[k], 再對k自增1; 第二個for循環遍歷二維數組的次對角線元素a[i][N - i - 1], 乘3后賦值給p[k], 再對k自增1。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM