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


選擇題

公共知識

【1】下列關於棧敘述正確的是()。
〖A〗棧頂元素最先能被刪除
〖B〗棧頂元素最后才能被刪除
〖C〗棧底元素永遠不能被刪除
〖D〗棧底元素最先被刪除
棧是先進后出的數據結構, 所以棧頂元素最后入棧卻最先被刪除。
棧底元素最先入棧卻最后被刪除。
所以選擇A)。
【2】下列敘述中正確的是()。
〖A〗在棧中, 棧中元素隨棧底指針與棧頂指針的變化而動態變化
〖B〗在棧中, 棧頂指針不變, 棧中元素隨棧底指針的變化而動態變化
〖C〗在棧中, 棧底指針不變, 棧中元素隨棧頂指針的變化而動態變化
〖D〗以上說法均不正確
棧是先進后出的數據結構, 在整個過程中, 棧底指針不變, 入棧與出棧操作均由棧頂指針的變化來操作, 所以選擇C)。
【3】某二叉樹共有7個結點, 其中葉子結點只有1個, 則該二叉樹的深度為(假設根結點在第1層)()。
〖A〗3
〖B〗4
〖C〗6
〖D〗7
根據二叉樹的基本性質3:在任意一棵二叉樹中, 多為0的葉子結點總比度為2的結點多一個, 所以本題中度為2的結點為1 - 1 = 0個, 所以可以知道本題目中的二叉樹的每一個結點都有一個分支, 所以共7個結點共7層, 即度為7。
【4】軟件按功能可以分為應用軟件、系統軟件和支撐軟件(或工具軟件)。下面屬於應用軟件的是()。
〖A〗學生成績管理系統
〖B〗C語言編譯程序
〖C〗UNIX 操作系統
〖D〗數據庫管理系統
軟件按功能可以分為:應用軟件、系統軟件、支撐軟件。
操作系統、編譯程序、匯編程序、網絡軟件、數據庫管理系統都屬於系統軟件。
所以B)、C)、D)都是系統軟件, 只有A)是應用軟件。
【5】結構化程序所要求的基本結構不包括()。
〖A〗順序結構
〖B〗GOTO跳轉
〖C〗選擇(分支)結構
〖D〗重復(循環)結構
1966年Boehm和Jacopini證明了程序設計語言僅僅使用順序、選擇和重復三種基本控制結構就足以表達出各種其他形式結構的程序設計方法。
【6】下面描述中錯誤的是()。
〖A〗系統總體結構圖支持軟件系統的詳細設計
〖B〗軟件設計是將軟件需求轉換為軟件表示的過程
〖C〗數據結構與數據庫設計是軟件設計的任務之一
〖D〗PAD圖是軟件詳細設計的表示工具
詳細設計的任務是為軟件結構圖中而非總體結構圖中的每一個模塊確定實現算法和局部數據結構, 用某種選定的表達工具表示算法和數據結構的細節, 所以A)錯誤。
【7】負責數據庫中查詢操作的數據庫語言是()。
〖A〗數據定義語言
〖B〗數據管理語言
〖C〗數據操縱語言
〖D〗數據控制語言
數據定義語言:負責數據的模式定義與數據的物理存取構建; 數據操縱語言:負責數據的操縱, 包括查詢及增、刪、改等操作; 數據控制語言:負責數據完整性、安全性的定義與檢查以及並發控制、故障恢復等功能。
【8】一個教師可講授多門課程, 一門課程可由多個教師講授。則實體教師和課程間的聯系是()。
〖A〗1 : 1聯系
〖B〗1 : m聯系
〖C〗m : 1聯系
〖D〗m : n聯系
因為一個教師可講授多門課程, 而一門課程又能由多個老師講授所以他們之間是多對多的關系, 可以表示為m : n。
【9】有三個關系R、S和T如下:

則由關系R和S得到關系T的操作是()。
〖A〗自然連接
〖B〗
〖C〗
〖D〗
關系T中的元組是關系R中有而關系S中沒有的元組的集合, 即從關系R中除去與關系S中相同元組后得到的關系T。
所以做的是差運算。
【10】定義無符號整數類為UInt, 下面可以作為類UInt實例化值的是()。
〖A〗-369
〖B〗369
〖C〗0.369
〖D〗整數集合 { 1, 2, 3, 4, 5 }
只有B)選項369可以用無符號整數來表示和存儲。
A)選項-369有負號, 選項C)0.369是小數都不能用無符號整數類存儲。
選項D)是一個整數集合得用數組來存儲。

專業知識

【11】以下敘述中錯誤的是
〖A〗C程序在運行過程中所有計算都以二進制方式進行
〖B〗C程序在運行過程中所有計算都以十進制方式進行
〖C〗所有C程序都需要編譯鏈接無誤后才能運行
〖D〗C程序中字符變量存放的是字符的ASCII值
C程序在運行過程中的所有計算都以二進制方式進行, 所以B選項錯誤。
【12】以下關於C語言的敘述中正確的是
〖A〗C語言的數值常量中夾帶空格不影響常量值的正確表示
〖B〗C語言中的變量可以在使用之前的任何位置進行定義
〖C〗在C語言算術表達式的書寫中, 運算符兩側的運算數類型必須一致
〖D〗C語言中的注釋不可以夾在變量名或關鍵字的中間
C語言的數值常量中不能夾帶空格, 所以A錯誤。
C語言中的變量都必須先定義再使用, 對變量的定義通常放在函數體內的前部, 但也可以放在函數外部或復合語句的開頭, 不能隨便放置, 所以B錯誤。
在C語言中運算符兩側的運算數據類型可以不一致, 且結果與精度較高的保持一致, 所以C錯誤。
【13】以下不合法的字符常量是
〖A〗'\\'
〖B〗'\"'
〖C〗'\018'
〖D〗'\xcc'
轉義字符中, 八進制的表示形式為\ddd, 但是八進制中不能包含數字8, 所以C選項不合法。
【14】以下選項中正確的定義語句是
〖A〗double, a, b;
〖B〗double a = b = 7;
〖C〗double a; b;
〖D〗double a = 7, b = 7;
A選項中變量類型符double后面不能有逗號。
B選項中變量b不能先使用再定義, 應該寫成選項D中的格式。
C選項中變量a后面應該是逗號而不是分號。
【15】若有定義語句:
int a = 3, b = 2, c = 1;
以下選項中錯誤的賦值表達式是
〖A〗a = (b = 4) = 3;
〖B〗a = b = c + 1;
〖C〗a = (b = 4) + c;
〖D〗a = 1 + (b = c = 4);
不能將變量或常量賦給一個表達式, 所以A選項中(b = 4) = 3是錯誤的。
【16】若有定義:
int a, b;
通過語句
scanf("%d;%d", &a, &b);
能把整數3賦給變量a, 5賦給變量b的輸入數據是
〖A〗3 5
〖B〗3, 5
〖C〗3; 5
〖D〗35
輸入數據的格式必須與scanf()的格式控制串完全匹配, 所以輸入時必須在3和5之間輸入";"。
【17】已知大寫字母A的ASCII碼是65, 小寫字母a的ASCII碼是97。以下不能將變量c中的大寫字母轉換為對應小寫字母的語句是
〖A〗c = ('A' + c) % 26 - 'a'
〖B〗c = c + 32
〖C〗c = c - 'A' + 'a'
〖D〗c = (c - 'A') % 26 + 'a'
根據題意可知, 小寫字母比與之對應的大寫字母的ASCII碼大32。
A選項中字符A加上c表示的大寫字符再對字母個數26取余, 本身這個表達式沒有任何含義所以選擇A選項。
【18】在以下給出的表達式中, 與while(E)中的(E)不等價的表達式是
〖A〗(E > 0 || E < 0)
〖B〗(E == 0)
〖C〗( !E == 0)
〖D〗(E != 0)
while語句中條件表達式E的值不為0即為真, 認為滿足條件, 所以與B選項中表達式的含義正好相反, 選擇B選項。
【19】以下程序段中, 與語句:
k = a > b ? (b > c ? 1 : 0) : 0;
功能相同的是
〖A〗if ((a > b) || (b > c)) k = 1; else k = 0;
〖B〗if ((a > b) && (b > c)) k = 1; else k = 0;
〖C〗if (a <= b) k = 0; else if (b <= c) k = 1;
〖D〗if (a > b) k = 1; else if (b > c) k = 1; else k = 0;
條件表達式的含義是, 如果表達式1成立, 結果為表達式2的值, 如果不成立為表達式3的值。
所以題干中k的值這樣取值:如果a > b且b > c, k值結果為1, 如果a > b, 且b < c則值為0。
如果a < b, k值為0。
也就是只要a > b與b > c中只要有一個條件不成立, k的值就為0, 所以選擇B選項。
【20】有以下程序:
#include <stdio.h>
void main() {
    int a = 1, b = 2;
    for (; a < 8; a++) {
        b += a;
        a += 2;
    }
    printf("%d,%d\n", a, b);
}
程序運行后的輸出結果是
〖A〗9,18
〖B〗8,11
〖C〗7,11
〖D〗10,14
第一次循環a的值為1, 滿足條件, 執行b += a, 與a += 2, 則b的值變為3, a的值變為3。
執行a++, a的值為4, 滿足條件進入第二次循環, 執行完循環體后b的值為7, a的值為6。
執行a++, a的值為7, 滿足條件進入第三次循環, 執行完循環體后b的值為14, a的值為9。
執行a++, a的值變為10。
所以選擇D選項。
【21】有以下程序:
#include <stdio.h>
void main() {
    int i, j, m = 55;
    for (i = 1; i <= 3; i++)
        for (j = 3; j <= i; j++)
            m = m % j;
    printf("%d\n ", m);
}
程序的運行結果是
〖A〗0
〖B〗1
〖C〗2
〖D〗3
第一次執行外循環i的值為1, 滿足條件, 判斷第一次內循環, j的值為3, 不滿足條件, 跳出內循環。
第二次執行外循環i的值為2, 同理也不滿足內循環條件, 跳出內循環。
第三次執行外循環i的值為3, 此時進入內循環判斷條件時, 條件成立, 執行m = m % j, m的值為1, 跳出內循環, 跳出外循環打印m的值。
【22】有以下程序:
#include <stdio.h>
void main() {
    int x = 8;
    for (; x > 0; x--) {
        if (x % 3) {
            printf("%d,", x--);
            continue;
        }
        printf("%d,", --x);
    }
}
程序的運行結果是
〖A〗7, 4, 2,
〖B〗8, 7, 5, 2,
〖C〗9, 7, 6, 4,
〖D〗8, 5, 4, 2,
coutinue的作用是跳出循環體中剩余的語句而進行下一次循環。
第一次循環x的值為8, 循環體中if條件成立, 打印x的值8后將x減1, 再執行continue語句, 跳出本次循環。
第二次判斷循環條件時, x的值變為6, 不滿足循環體內if條件, 執行打印--x的操作, 即打印5后跳出循環。
第三次判斷循環條件時x的值為4, 滿足循環體中if條件, 執行打印x--的操作, 即打印4, 后將x值減一, 執行continue語句, 跳出本次循環。
第四次判斷循環條件時x的為2, 滿足循環體中if條件, 打印x--, 即打印2后將x減一, 執行continue語句, 跳出本次循環。
在進行for條件表達式中第三個表達式x--的操作后x的值為0, 不滿足條件結束循環。
所以打印結果為8, 5, 4, 2, 。
【23】以下敘述中錯誤的是
〖A〗C程序必須由一個或一個以上的函數組成
〖B〗函數調用可以作為一個獨立的語句存在
〖C〗若函數有返回值, 必須通過return 語句返回
〖D〗函數形參的值也可以傳回給對應的實參
形參是函數定義時由用戶定義的形式上的變量, 實參是函數調用時, 主調函數為被調函數提供的原始數據。
在C語言中, 函數形參的值不可以傳回給對應的實參。
因此D選項正確。
【24】有以下程序:
#include <stdio.h>
void main() {
    int a = 1, b = 3, c = 5;
    int *p1 = &a, *p2 = &b, *p = &c;
    *p = *p1 * (*p2);
    printf("%d\n", c);
}
執行后的輸出結果是
〖A〗1
〖B〗2
〖C〗3
〖D〗4
該程序中int *p1 = &a, *p2 = &b, *p = &c; 指定義三個指針變量, 並賦值, 即使p1指向a; p2指向b; p指向c。
*p = *p1 * (*p2); 該條語句是給p所指的存儲單元c賦值, 就是p1所指的存儲單元的值, 即a的值, 與p2所指的存儲單元b的值相乘, 也就是c = a * b, 等價於c = 1 *3 = 3; 因此C選項正確。
【25】有以下程序:
#include <stdio.h>
void f(int *p, int *q);
void main() {
    int m = 1, n = 2, *r = &m;
    f(r, &n);
    printf("%d,%d", m, n);
}
void f(int *p, int *q) {
    p = p + 1;
    *q = *q + 1;
}
程序運行后的輸出結果是
〖A〗2,3
〖B〗1,3
〖C〗1,4
〖D〗1,2
在f(int * p, int *q)函數中, 執行p = p + 1是將p所對應的地址加1, 而*q = *q + 1是將q所指向的n的地址所對應的值加1, 所以m的得知所對應的值沒有變, 而n的值則為3了。
因此B選項正確。
【26】若有定義語句:int a[2][3], *p[3];
則以下語句中正確的是
〖A〗p = a;
〖B〗p[0] = a;
〖C〗p[0] = &a[1][2];
〖D〗p[1] = &a;
A選項錯誤, 因為p是指向一個指針數組, 作為數組名, 不能指向別的地方。
B選項錯誤, 因為p[0]是一個int指針, 也就是int*; 而a是一個指向指針的指針int * *。
C選項正確, 因為p[0]是一個int*, a[1][2]是int, &a[1][2]是int*, 類型吻合。
D選項錯誤, 因為a作為數組名, 不能取地址。
即使能取, p[1]是int*, &a是int * **, 類型不對。
因此C選項正確。
【27】以下程序中函數f的功能是:當flag為1時, 進行由小到大排序; 當flag為0時, 進行由大到小排序。
#include <stdio.h>
void f(int b[], int n, int flag) {
    int i, j, t;
    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++)
            if (flag ? b[i] > b[j] : b[i] < b[j]) {
                t = b[i];
                b[i] = b[j];
                b[j] = t;
            }
}
void main() {
    int a[10] = { 5, 4, 3, 2, 1, 6, 7, 8, 9, 10 }, i;
    f(&a[2], 5, 0);
    f(a, 5, 1);
    for (i = 0; i < 10; i++)
        printf("%d,", a[i]);
}
程序運行后的輸出結果是
〖A〗1,2,3,4,5,6,7,8,9,10,
〖B〗3,4,5,6,7,2,1,8,9,10,
〖C〗5,4,3,2,1,6,7,8,9,10,
〖D〗10,9,8,7,6,5,4,3,2,1,
本題重點考查函數的參數傳遞, 函數的參數傳遞分為傳值和傳地址兩種情況。
本題就是結合數組考查參數傳遞的情形。
解析:函數f完成的功能是對數據進行排序, 語句f(&a[2], 5, 0)的作用是對從a[2]開始的5個元素進行從大到小排序。
注意:這里傳遞的是地址&a[2], 所以排序操作可看作是直接對數組a操作, 執行后的結果為5, 4, 7, 6, 3, 2, 1, 8, 9, 10。
語句f(a, 5, 1)對數組a的前5個元素從小到大排序, 排序后數組為:3, 4, 5, 6, 7, 2, 1, 8, 9, 10。
因此B選項正確。
【28】有以下程序:
#include <stdio.h>
void main() {
    int s[12] = { 1, 2, 3, 4, 4, 3, 2, 1, 1, 1, 2, 3 }, c[5] = { 0 }, i;
    for (i = 0; i < 12; i++)
        c[s[i]] ++;
    for (i = 1; i < 5; i++)
        printf("%d ", c[i]);
    printf("\n");
}
程序的運行結果是
〖A〗2 3 4 4
〖B〗4 3 3 2
〖C〗1 2 3 4
〖D〗1 1 2 3
在for(i = 0; i < 12; i++)c[s[i]] ++中, 數組元素s[i]的值作為數組c的下標, 當退出循環時, 數組c的4個元素的值分別為4、3、3、2。
因此B選項正確。
【29】以下能正確定義字符串的語句是
〖A〗char str = "\x43";
〖B〗char str[] = "\0";
〖C〗char str = ' ';
〖D〗char str[] = { '\064' };
C語言中, 字符串是用一對雙引號括起來的字符序列, 並用字符型數組來存放, 故C選項和D選項不屬於字符串, A選項定義的是一個字符變量str, 卻用來存放字符串, 顯然也不正確, 因此B選項正確。
【30】以下關於字符串的敘述中正確的是
〖A〗空串比空格打頭的字符串小
〖B〗兩個字符串中的字符個數相同時才能進行字符串大小的比較
〖C〗可以用關系運算符對字符串的大小進行比較
〖D〗C語言中有字符串類型的常量和變量
字符串比較大小是以第1個不相同字符的大小為標准的, 跟長度沒有關系, B選項不正確; 字符串比較大小除了使用庫函數strcn3()以外, 就只能靠自己寫代碼來實現了, 而不能通過關系運算符來比較大小。
因為字符串在表達式中相當於const char*, 即常字符指針, 代表的是字符串的首地址, 關系運算符會將兩個字符串的首地址值比較大小, 這是毫無意義的。
C選項不正確。
C語言中只有字符串常量而沒有字符串變量, D選項描述不正確; 空串的長度為0, 而以空格打頭的字符串的長度至少為1, 因此A選項是正確。
【31】有以下程序:
#include <stdio.h>
void fun(char *a, char *b) {
    while (*a == '*')
        a++;
    while (*b = *a) {
        b++;
        a++;
    }
}
void main() {
    char *s = "*****a*b****", t[80];
    fun(s, t);
    puts(t);
}
程序的運行結果是
〖A〗ab
〖B〗a *b
〖C〗*****a * b
〖D〗a *b * ***
在函數fun(char * a, char *b)中, while (*a == '*') a++的功能是:如果*a的內容為'*', 則a指針向后移動, 直到遇到非'*'字符為止, 退出循環進入下一個while循環, 在while(*b = *a) { b++; a++; } 中, 把字符數組a中的字符逐個賦給字符數組b。
所以在主函數中, 執行fun(s, t)語句后, 字符數組t中的內容為"a*b****"。
因此D選項正確。
【32】下列函數的功能是
void fun(char *a, char *b) {
    while ((*b = *a) != '\0') {
        a++;
        b++;
    }
}
〖A〗將a所指字符串賦給b所指空間
〖B〗使指針b指向a所指字符串
〖C〗將a所指字符串和b所指字符串進行比較
〖D〗檢查a和b所指字符串中是否有'\0'
While循環條件為:(*b = *a) != '\0', 執行時先把指針a所指向的字符賦給指針b所在內存單元, 如果該字符不是結束標識"\0", 執行循環體a++; b++;, 指針a、b分別指向下一個字符單元。
再判斷循環條件, 如果成立, 繼續把指針a所指向的字符賦給指針b所在內存單元, 直到遇到結束標識為止。
因此A選項正確。
【33】有以下程序:
#include <stdio.h>
int fun(int x) {
    int p;
    if (x == 0 || x == 1)
        return (3);
    p = x - fun(x - 2);
    return p;
}
void main() {
    printf("%d\n", fun(7));
}
執行后的輸出結果是
〖A〗2
〖B〗3
〖C〗7
〖D〗0
因為fun(int x)是一個遞歸函數, 所以主函數中fun(7)經過3次遞歸調用, 其過程可以描述為"fun(7)=7-fun(5)=7-(5-fun(3))=7-(5-(3-fun(1)))=7-(5-(3-3))=7-5=2", 所以最后輸出結果為2。
因此A選項正確。
【34】有以下程序:
#include <stdio.h>
int fun() {
    static int x = 1;
    x *= 2;
    return x;
}
void main() {
    int i, s = 1;
    for (i = 1; i <= 2; i++)
        s = fun();
    printf("%d\n", s);
}
程序運行后的輸出結果是
〖A〗0
〖B〗1
〖C〗4
〖D〗8
fun函數中的x為靜態局部變量, 占用固定的內存單元, 下一次調用時仍可保留上次調用時的值。
也就是說, 如果多次調用fun函數, x的定義只在第一次調用時有效, 從第二次調用開始, x的定義相當於不存在, 直接使用x的值。
主函數中調用兩次fun函數:第一次調用:x = 1, x = x *2 = 2, s = 2; 第二次調用:(直接用上次x的值)x = x *2 = 4, s = 4。
因此C選項正確。
【35】以下結構體類型說明和變量定義中正確的是
〖A〗struct REC; { int n; char c; }; REC t1, t2;
〖B〗typedef struct { int n; char c; } REC; REC t1, t2;
〖C〗typedef struct REC; { int n = 0; char c = 'A'; } t1, t2;
〖D〗struct { int n; char c; } REC; REC t1, t2;
本題考查結構體的相關知識, 選項A中struct REC后面不能有分號, C選項中typedef struct REC的后面也不能有分號, 選項D中REC已經是結構體變量, 不能當做結構體類型來使用。
【36】假定已建立以下鏈表結構, 且指針p和q已指向如圖所示的結點:

則以下選項中可將q所指結點從鏈表中刪除並釋放該結點的語句組是
〖A〗p->next = q->next; free(q);
〖B〗p = q->next; free(q);
〖C〗p = q; free(q);
〖D〗(*p).next = (*q).next; free(p);
本題考查刪除鏈表中的節點操作, 其方法是將要刪除節點的上個節點的下個節點指向要刪除節點的下個節點, 然后釋放該要刪除節點, 所以選項A正確。
【37】有以下程序:
#include <stdio.h>
#include <string.h>
struct A {
    int a;
    char b[10];
    double c;
};
void f(struct A t);
void main() {
    struct A a = { 1001, "ZhangDa", 1098.0 };
    f(a);
    printf("%d,%s,%6.1f\n", a.a, a.b, a.c);
}
void f(struct A t) {
    t.a = 1002;
    strcpy(t.b, "ChangRong");
    t.c = 1202.0;
}
程序運行后的輸出結果是
〖A〗1002, ZhangDa,1202.0
〖B〗1002,ChangRong,1202.0
〖C〗1001, ChangRong,1098.0
〖D〗1001,ZhangDa,1098.0
本題考查結構體的相關操作以及傳值、傳址的區別, 該題中調用f函數后, 會生成參數a的一個副本, 而不會改變a的值, 所以a值維持原值, 選項D正確。
【38】有以下程序:
#include <stdio.h>
#define N 5
#define M N + 1
#define f(x) (x * M)
void main() {
    int i1, i2;
    i1 = f(2);
    i2 = f(1 + 1);
    printf("%d  %d\n", i1, i2);
}
程序的運行結果是
〖A〗12 7
〖B〗12 12
〖C〗11 11
〖D〗11 7
本題考查宏定義的用法, 宏定義只是做個簡單的替換, 所以本題中執行f(2) = (2 * N + 1) = 11, 執行f(1 + 1) = (1 + 1 * N + 1) = 7。
選項D正確。
【39】有以下程序:
#include <stdio.h>
void main() {
    int a = 5, b = 1, t;
    t = (a << 2) | b;
    printf("%d\n", t);
}
程序運行后的輸出結果是
〖A〗1
〖B〗11
〖C〗6
〖D〗21
本題考查位運算, 以及按位或操作, 將a左移一位相當於是將a乘以了4, 所以a << 2等於20, 二進制表示為00010100, 與b按位或得到00010101, 即21, 所以選項D正確。
【40】設fp為指向某二進制文件的指針, 且已讀到此文件末尾, 則函數feof(fp)的返回值為
〖A〗0
〖B〗'\0'
〖C〗非0值
〖D〗NULL
本題考查文件的定位, feof函數的用法是從輸入流讀取數據, 如果到達文件末尾(遇文件結束符), eof函數值為非零值, 否則為0, 所以選項C正確。

編程題

【41】使用VC++2010打開考生文件夾下blank1中的解決方案。此解決方案的項目中包含一個源程序文件blank1.c。在此程序中, 函數fun的功能是:找出N×N矩陣中每列元素中的最大值, 並按順序依次存放於形參b所指的一維數組中。
請在程序的下畫線處填入正確的內容並把下畫線刪除, 使程序得出正確的結果。
注意:部分源程序在文件blank1.c中。
不得增行或刪行, 也不得更改程序的結構 !
(1) a[0][i]
(2) <
(3) x, y
填空1:數組b用於存放每列元素中的最大值, 首先將第i列的第一個數賦給b[i], 然后用b[i]與其他數進行比較, 因此此空應填a[0][i]。
填空2 : if條件表達式表示當b[i]小於a[j][i]時, 就把a[j][i]的值賦給b[i], 因此此空應該填<。
填空3 : fun函數的調用, 通過fun(int(*a)[N], int *b)可知, 此空應該填x, y。
【42】使用VC++2010打開考生文件夾下modi1中的解決方案。此解決方案的項目中包含一個源程序文件modi1.c。在此程序中, 函數fun的功能是:將主函數中兩個變量的值進行交換。例如, 若變量a中的值為8, b中的值為3, 則程序運行后, a中的值為3, b中的值為8。
請改正程序中的錯誤, 使它能得出正確的結果。
注意:部分源程序在文件modi1.c中。
不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
(1) void fun(int * x, int *y)
(2) t = *x;
*x = *y;
*y = t;
(1) 本題考查指針變量作函數參數。
一般變量作參數時, 不能改變實參的值, 采用指針變量作為參數則能夠改變實參的值。
主函數中fun函數的調用方式表明fun函數的參數應當為指針類型。
(2) 此處是一個變量交換操作錯誤, 可知x、y是指針類型, 變量類型不同, 因而x、y不能與t進行值的交換。
【43】使用VC++2010打開考生文件夾下prog1中的解決方案。此解決方案的項目中包含一個源程序文件prog1.c。在此程序中, 編寫函數int fun(int lim, int aa[MAX]), 其功能是求出小於或等於lim的所有素數並放在aa數組中, 並返回所求出的素數的個數。
注意:部分源程序在文件prog1.c中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入你編寫的若干語句。
同根子題
int fun(int lim, int aa[MAX]) {
    int i, j, k = 0;
    for (i = 2; i <= lim; i++)
        /*求出小於或等於lim的全部素數*/ {
            for (j = 2; j < i; j++)
                if (i % j == 0)
                    break;
            if (j >= i)
                aa[k++] = i;
            /*將求出的素數放入數組aa中*/
        }
    return k;
    /*返回所求出的素數的個數*/
}
本程序使用for循環語句查找小於lim的所有數, 使用內嵌的循環判斷語句判斷該數是否為素數。
在做這道題時, 需要重點掌握素數的判定方法:
for (j = 2; j < i; j++)
if (i % j == 0) break;


免責聲明!

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



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