選擇題
公共知識
【1】某帶鏈棧的初始狀態為 top = bottom = NULL, 經過一系列正常的入棧與退棧操作后, top = 10, bottom = 20。該棧中的元素個數為()。
帶鏈的棧是具有棧屬性的鏈表。
線性鏈表的存儲單元是不連續的, 為把存儲空間中一些離散的空閑存儲結點利用起來, 把所有空閑的結點組織成一個帶鏈的棧, 稱為可利用棧。
線性鏈表執行刪除操作運算時, 被刪除的結點可以"回收"到可利用棧, 對應於可利用棧的入棧運算; 線性鏈表執行插入運算時, 需要一個新的結點, 可以在可利用棧中取棧頂結點, 對應於可利用棧的退棧運算。
可利用棧的入棧運算和退棧運算只需要改動top指針即可。
因為是不連續的存儲空間, 所以top指針將不會有規律地連續變化, 因此無法據此判斷棧中的元素個數。
故本題答案為A選項。
線性鏈表的存儲單元是不連續的, 為把存儲空間中一些離散的空閑存儲結點利用起來, 把所有空閑的結點組織成一個帶鏈的棧, 稱為可利用棧。
線性鏈表執行刪除操作運算時, 被刪除的結點可以"回收"到可利用棧, 對應於可利用棧的入棧運算; 線性鏈表執行插入運算時, 需要一個新的結點, 可以在可利用棧中取棧頂結點, 對應於可利用棧的退棧運算。
可利用棧的入棧運算和退棧運算只需要改動top指針即可。
因為是不連續的存儲空間, 所以top指針將不會有規律地連續變化, 因此無法據此判斷棧中的元素個數。
故本題答案為A選項。
【2】設表的長度為15。則在最壞情況下, 快速排序所需要的比較次數為()。
快速排序最壞情況下蛻化為冒泡排序, 在最壞情況下, 對長度為n的線性表排序, 冒泡排序需要比較的次數為n(n - 1) / 2。
本題中n = 15, 15×(15 - 1) / 2 = 105。
故本題答案為A選項。
本題中n = 15, 15×(15 - 1) / 2 = 105。
故本題答案為A選項。
【3】設循環隊列的存儲空間為Q(1 : 100), 初始狀態為空。現經過一系列正常操作后, front = 49, 則循環隊列中的元素個數為()。
循環隊列是隊列的一種順序存儲結構, 用隊尾指針rear指向隊列中的隊尾元素, 用排頭指針front指向排頭元素的前一個位置。
入隊運算時, 隊尾指針進1(即rear + 1), 然后在rear指針指向的位置插入新元素。
退隊運算時, 排頭指針進1(即front + 1), 然后刪除front指針指向的位置上的元素。
只知道front的位置, 不知道rear的位置, 無法判斷隊列里有幾個元素。
故本題答案為A選項。
入隊運算時, 隊尾指針進1(即rear + 1), 然后在rear指針指向的位置插入新元素。
退隊運算時, 排頭指針進1(即front + 1), 然后刪除front指針指向的位置上的元素。
只知道front的位置, 不知道rear的位置, 無法判斷隊列里有幾個元素。
故本題答案為A選項。
【4】某完全二叉樹按層次輸出(同一層從左到右)的序列為ABCDEFGH。該完全二叉樹的中序序列為()。
完全二叉樹是指除最后一層外, 每一層上的結點數均達到最大值, 在最后一層上只缺少右邊的若干結點。
更確切地說, 如果從根結點起, 對二叉樹的結點自上而下, 自左至右用自然數進行連續編號, 則深度為m且有n個結點的二叉樹, 當且僅當其每一個結點都與深度為m的滿二叉樹中編號從1到n的結點一一對應時, 稱之為完全二叉樹。
更確切地說, 如果從根結點起, 對二叉樹的結點自上而下, 自左至右用自然數進行連續編號, 則深度為m且有n個結點的二叉樹, 當且僅當其每一個結點都與深度為m的滿二叉樹中編號從1到n的結點一一對應時, 稱之為完全二叉樹。
中序遍歷:訪問根結點在訪問左子樹和訪問右子樹兩者之間。
即先遍歷左子樹, 然后訪問根結點, 最后遍歷右子樹;
並且在遍歷左子樹和右子樹時, 仍然首先遍歷左子樹, 然后訪問根結點, 最后遍歷右子樹。
因此, 該完全二叉樹的中序序列為HDBEAFCG。
故本題答案為A選項。
【5】下面屬於整數類I的實例的是()。
類是具有共同屬性、共同方法的對象的集合。
229是整數, 0.229是浮點數, 229E - 2是指數, "229"是字符串。
故本題答案為A選項。
229是整數, 0.229是浮點數, 229E - 2是指數, "229"是字符串。
故本題答案為A選項。
【6】某系統總體結構如下圖所示
該系統結構圖的最大扇出數是()。

該系統結構圖的最大扇出數是()。
模塊的扇出是指本模塊的直屬下層模塊的個數。
或者說是由一個模塊直接調用的其他模塊數。
題干中某系統為一個模塊, 其扇出數目為3, 功能2模塊扇出數為3, 功能3模塊扇出數為2, 功能2.2扇出數目為2, 則該系統結構圖的最大扇出數是3。
故本題答案為A選項。
或者說是由一個模塊直接調用的其他模塊數。
題干中某系統為一個模塊, 其扇出數目為3, 功能2模塊扇出數為3, 功能3模塊扇出數為2, 功能2.2扇出數目為2, 則該系統結構圖的最大扇出數是3。
故本題答案為A選項。
【7】下面屬於軟件工程三要素的是()。
軟件工程三要素是方法、工具和過程。
故本題答案為A選項。
故本題答案為A選項。
【8】在數據庫中存儲的是()。
數據庫就是存放數據的倉庫, 只不過數據庫存放數據是按數據所提供的數據模式存放的。
故本題答案為A選項。
故本題答案為A選項。
【9】將數據庫的結構划分成多個層次, 是為了提高數據庫的()。
數據庫領域公認的標准結構是三級模式結構, 它包括外模式、概念模式、內模式, 有效地組織、管理數據, 提高了數據庫的邏輯獨立性和物理獨立性。
用戶級對應外模式, 概念級對應概念模式, 物理級對應內模式, 使不同級別的用戶對數據庫形成不同的視圖。
所謂視圖, 就是指觀察、認識和理解數據的范圍、角度和方法, 是數據庫在用戶"眼中"的反映, 很顯然, 不同層次(級別)用戶所"看到"的數據庫是不相同的。
故本題答案為A選項。
用戶級對應外模式, 概念級對應概念模式, 物理級對應內模式, 使不同級別的用戶對數據庫形成不同的視圖。
所謂視圖, 就是指觀察、認識和理解數據的范圍、角度和方法, 是數據庫在用戶"眼中"的反映, 很顯然, 不同層次(級別)用戶所"看到"的數據庫是不相同的。
故本題答案為A選項。
【10】定義學生選修課程的關系模式如下:
S(S#, Sn, Sd, SA)(其屬性分別為學號、姓名、所在系、年齡);
C(C#, Cn, P#)(其屬性分別為課程號、課程名、先選課);
SC(S#, C#, G)(其屬性分別學號、課程號和成績)。
檢索選修了課程號為2且成績不及格的學生的姓名的表達式是()。
π表示投影運算, 針對屬性; σ表示選擇運算, 針對元組; ∧為關系交; ∞表示自然連接。
首先在SC表中選擇課程號為2且成績不及格的記錄σC#=2∧G < 60(SC), 並找出這些記錄中學生的學號πS#(σC#=2∧G < 60(SC)); 將檢索結果與表S進行自然連接生成中間表πS#(σC#=2∧G < 60(SC))∞S, 最后在中間表中檢索學生的姓名πSn(πS#(σC#=2∧G < 60(SC))∞S)。
故本題答案為A選項。
首先在SC表中選擇課程號為2且成績不及格的記錄σC#=2∧G < 60(SC), 並找出這些記錄中學生的學號πS#(σC#=2∧G < 60(SC)); 將檢索結果與表S進行自然連接生成中間表πS#(σC#=2∧G < 60(SC))∞S, 最后在中間表中檢索學生的姓名πSn(πS#(σC#=2∧G < 60(SC))∞S)。
故本題答案為A選項。
專業知識
【11】以下不能用於描述算法的是
算法的描述有偽代碼、流程圖、N - S結構圖等。
E - R是實體聯系模型。
所以選擇D。
E - R是實體聯系模型。
所以選擇D。
【12】以下選項中合法的實型常量是
A選項為整型數據。
B選項中e后面必須為整數。
D選項是表達式, 不是常量。
所以選擇C。
B選項中e后面必須為整數。
D選項是表達式, 不是常量。
所以選擇C。
【13】以下敘述中正確的是
A選項中a是實型變量, a = 10在C語言中是允許的, 但是實型變量中不可以存放整型數。
C選項中執行a = b后, a的值變為b的值, 為9, b的值不變, 仍為9。
D選項中執行a = b后, a的值為9, b的值為9, 執行b = a后, a的值為9, b的值也為9, 所以選擇B。
C選項中執行a = b后, a的值變為b的值, 為9, b的值不變, 仍為9。
D選項中執行a = b后, a的值為9, b的值為9, 執行b = a后, a的值為9, b的值也為9, 所以選擇B。
【14】以下選項中合法的變量是
變量的命名要符合標識符的命名規則, 即由下划線、字母或數字組成, 且必須以下划線或字母開始, 也不能和關鍵字相同, 所以選擇B。
【15】不能正確表示數學式
的表達式是

/號和*號的優先級處於平級, 結合性都是自左至右?所以選擇C項, C項式子表示的是
。

【16】有以下程序
#include <stdio.h>
void main() {
int a = 3;
printf("%d\n", (a += a -= a * a));
}
程序運行后的輸出結果是
首先計算a * a, 結果為9, 然后執行a = a - 9, 即3 - 9, 結果為-6, 然后執行a = (-6) + (-6), 即a=的值為-12。
所以選擇D。
所以選擇D。
【17】若變量已正確定義, 以下選項中非法的表達式是
B選項中'a'即表示a為字符常量, 再給'a'賦值1 / 2 * (x = y = 20, x * 3), 是不正確的。
因此B選項正確。
因此B選項正確。
【18】有以下程序
#include <stdio.h>
void main() {
int x = 35, B;
char z = 'B';
B = ((x) && (z < 'b'));
printf("%d\n", B);
}
程序運行后的輸出結果是
本題重點考查邏輯運算符和關系運算符的相關知識, 已知變量x為整型變量, 並賦值為35, 變量z為字符型變量, 並賦值為'B'。
語句B = ((x) && (z < 'b')); 中, (x)的值為1, 'B'的asscii碼小於'b'的asscii碼, 所以(z < 'b')的值也為1, 1 && 1結果為1。
因此A選項正確。
語句B = ((x) && (z < 'b')); 中, (x)的值為1, 'B'的asscii碼小於'b'的asscii碼, 所以(z < 'b')的值也為1, 1 && 1結果為1。
因此A選項正確。
【19】與數學表達式x≥y≥z對應的C語言表達式是
本題考查關系表達式和邏輯表達式, y大於等於x同時y小於等於z, 因此x <= y和y <= z是邏輯與的關系。
因此D選項正確。
因此D選項正確。
【20】有以下程序
#include <stdio.h>
void main() {
double x = 2.0, y;
if (x < 0.0)
y = 0.0;
else if ((x < 5.0) && ( !x))
y = 1.0 / (x + 2.0);
else if (x < 10.0)
y = 1.0 / x;
else
y = 10.0;
printf(" %f\n ", y);
}
程序運行后的輸出結果是
本題重點考查if語句, 變量x和y均為double類型, 由於變量x賦值為2.0, 因此執行if((x < 5.0) && ( !x)), 即條件為0, 繼續執行if(x < 10.0), 條件為1, 即執行y = 1.0 / x; 。
依據printf()函數輸出類型中f是以小數形式輸出單、雙精度實數。
因此C選項正確。
依據printf()函數輸出類型中f是以小數形式輸出單、雙精度實數。
因此C選項正確。
【21】有以下程序
#include <stdio.h>
void main() {
int i, sum;
for (i = 1; i < 6; i++)
sum += i;
printf("%d\n", sum);
}
程序運行后的輸出結果是
本題重點考查for語句, 變量沒有初始化的情況下, 默認值與編譯器有關系, 不同的編譯器有不同的值。
因此A選項正確。
因此A選項正確。
【22】有以下程序
#include <stdio.h>
void main() {
int a = 3;
do {
printf("%d,", a -= 2);
} while ( !(--a));
printf("\n");
}
程序運行后的輸出結果是
本題重點考查do……while語句, 該循環語句的特點是, 先執行循環中的語句, 然后再判斷表達式是否為真, 如果為真則繼續循環; 如果為假, 則終止循環。
因此, do - while循環至少要執行一次循環語句。
變量a賦初值為3, 每循環一次需執行語句a -= 2一次, 同時循環條件使變量a自減1, 所以第一次循環后變量a變為1, 第2次循環后變量a變為-2。
因此B選項正確。
因此, do - while循環至少要執行一次循環語句。
變量a賦初值為3, 每循環一次需執行語句a -= 2一次, 同時循環條件使變量a自減1, 所以第一次循環后變量a變為1, 第2次循環后變量a變為-2。
因此B選項正確。
【23】有以下程序
#include <stdio.h>
void fun(int a, int b, int c) {
a = b;
b = c;
c = a;
}
void main() {
int a = 10, b = 20, c = 30;
fun(a, b, c);
printf("%d,%d,%d\n", c, b, a);
}
程序運行后的輸出結果是
函數調用中發生的數據傳送是單向的。
即只能把實參的值傳送給形參, 而不能把形參的值反向地傳送給實參。
因此在函數調用過程中, 形參的值發生改變, 而實參中的值不會變化。
因此B選項正確。
即只能把實參的值傳送給形參, 而不能把形參的值反向地傳送給實參。
因此在函數調用過程中, 形參的值發生改變, 而實參中的值不會變化。
因此B選項正確。
【24】有以下程序
#include <stdio.h>
void main() {
int c[6] = { 10, 20, 30, 40, 50, 60 }, *p, *s;
p = c;
s = &c[5];
printf("%d\n", s - p);
}
程序運行后的輸出結果是
首先初始化一維數組c[6], 語句p = c; 指將c[0]元素的地址賦給指針變量p; 語句s = &c[5]; 指將c[5]元素的地址賦給指針變量s。
程序最后輸出s - p, 即結果為5。
因此A選項正確。
程序最后輸出s - p, 即結果為5。
因此A選項正確。
【25】有以下程序
#include <stdio.h>
void main() {
int a[3] = { 0 }, i, j, k = 2;
for (i = 0; i < k; i++)
for (j = 0; j < k; j++)
a[j] = a[i] + 1;
printf("%d\n", a[1]);
}
程序運行后的輸出結果是
該題首先初始化一維數組a[3]所有元素都為0; 執行嵌套循環for語句, 當i = 0、j = 0時, a[0] = a[0] + 1 = 1; 當i = 0、j = 1時, a[1] = a[0] + 1 = 2; 當i = 1、j = 0時, a[0] = a[1] + 1 = 3; 當i = 1、j = 1時, a[1] = a[1] + 1 = 3; 因此D選項正確。
【26】有以下程序
#include <stdio.h>
void main() {
int a[5] = { 2, 4, 6, 8, 10 }, *p, **k;
p = a;
k = &p;
printf("%d ", *(p++));
printf("%d\n", **k);
}
程序運行后的輸出結果是
首先通過p = a使p指向數組的第1個元素, 所以輸出2; 在輸出2以后, 由於p++, 即p就指向數組的第2個元素, **k就是取出p所指向元素的值, 而p指向的是數組的第2個元素, 即輸出4。
因此D選項正確。
因此D選項正確。
【27】有以下程序
#include <stdio.h>
void main() {
int aa[3][3] = { { 2 }, { 4 }, { 6 } }, i, *p = &aa[0][0];
for (i = 0; i < 2; i++) {
if (i == 0)
aa[i][i + 1] = *p + 1;
else
++p;
printf("%d ", *p);
}
}
程序運行后的輸出結果是
觀察題目, 可以發現, *p = &aa[0][0]語句實際是將數組aa的首地址賦給了指針變量p, 將i的值帶入for循環中, i = 0時, aa[0][1] = 3, *p = 2; *p輸出的是指針所指向的數組值, 此時p所指向的是aa[0][0], 輸出2, 而i = 1時執行了++p操作使指針向后移動指向了aa[0][1], 所以在輸出*p時應為3。
因此B選項正確。
因此B選項正確。
【28】以下fun函數返回數組中最大值的下標
#include <stdio.h>
int fun(int *s, int n) {
int i, k;
for (i = 0, k = i; i < n; i++)
if (s[i] > s[k])
__________;
return (k);
}
在橫線處應填入的內容是
fun函數的功能是返回數組中最大值的下標。
通過for循環語句, 每次將最大的數給k, 即k = i。
因此D選項正確。
通過for循環語句, 每次將最大的數給k, 即k = i。
因此D選項正確。
【29】有以下程序
#include <stdio.h>
int fun(char s[]) {
char *p = s;
while (*p != 0)
p++;
return (p - s);
}
void main() {
printf("%d\n", fun("0ABCDEF"));
}
程序運行后的輸出結果是
本題考查字符串作為函數參數以及while語句, 本題中傳入字符串0ABCDEF, 然后執行fun后, 就得到了該字符串中字符的個數, 不包括結尾符, 該字符串有7個字符, 所以答案為C。
【30】若有以下程序段
char str[4][12] = { "aa", "bbb", "ccccc", "d" }, *strp[4];
int i;
for (i = 0; i < 4; i++)
strp[i] = str[i];
不能正確引用字符串的選項是
本題考查對字符串數組的引用。
通過for循環將str數組每個元素的首地址賦給strp指針數組的每個元素。
指針數組strp表示每一個數組元素都存放了一個字符串的首地址。
選項A中, 引用的是字符串數組的第一個字符串; 選項B中, strp是指針的指針, 不能引用數組元素; C選項中str[3], 引用的是str中的第4個字符串; 選項D中, *strp = strp[0]引用的是數組str中的第一個字符串。
故本題答案為B選項。
通過for循環將str數組每個元素的首地址賦給strp指針數組的每個元素。
指針數組strp表示每一個數組元素都存放了一個字符串的首地址。
選項A中, 引用的是字符串數組的第一個字符串; 選項B中, strp是指針的指針, 不能引用數組元素; C選項中str[3], 引用的是str中的第4個字符串; 選項D中, *strp = strp[0]引用的是數組str中的第一個字符串。
故本題答案為B選項。
【31】有以下程序
#include <stdio.h>
#include <string.h>
void fun(char *s) {
char a[10];
strcpy(a, "STRING");
s = a;
}
void main() {
char *p = "PROGRAM";
fun(p);
printf("%s\n", p);
}
程序運行后的輸出結果是(此處□代表空格)
本題考查字符串指針作為函數參數, 本題中p作為字符串指針傳入fun中, p指向的內容並沒有發生變化, 所以選項D正確。
【32】有以下程序
#include <stdio.h>
void fun(int n, int *s) {
int f;
if (n == 1)
*s = n + 1;
else {
fun(n - 1, &f);
*s = f;
}
}
void main() {
int x = 0;
fun(4, &x);
printf("%d\n", x);
}
程序運行后的輸出結果是
本題考查函數的遞歸調用, 將函數參數帶入函數中, 一步步遞歸即可得到結果, 結果為2, 選項C正確。
【33】有以下程序
#include <stdio.h>
void main() {
int a = 1, b = 0;
printf("%d,", b = a + b);
printf("%d\n", a = 2 * b);
}
程序運行后的輸出結果是()。
本題考查復合的賦值運算符, b = a + b 代表將a、b的值相加再賦給b, 此時b的值為1, a = 2 * b代表將b的當前值1乘以2賦給a, 此時a的值為2, 程序輸出1, 2 答案選A。
【34】有以下程序
#include <stdio.h>
void fun(int *s) {
static int j = 0;
do s[j] += s[j + 1];
while (++j < 2);
}
void main() {
int i, a[10] = { 1, 2, 3, 4, 5 };
for (i = 1; i < 3; i++)
fun(a);
for (i = 1; i < 5; i++)
printf("%d", a[i]);
printf("\n");
}
程序運行后的輸出結果是
本題主要考查do…while語句, 執行fun函數后, a數組里面的元素變為35745, 輸出后四個字符, 所以結果為5745, 選項B正確。
【35】有以下程序段
int *p;
p = ___ malloc(sizeof(int));
若要求使p指向一個int 型的動態存儲單元, 在橫線處應填入的是
本題考查malloc函數, 題目中要求p指向一個int型的動態存儲單元, 那么就應該將分配的存儲單元轉化為int, 所以選項A正確。
【36】有以下程序
#include <stdio.h>
#define SUB(X, Y) (X + 1) * Y
void main() {
int a = 3, b = 4;
printf("%d\n", SUB(a++, b++));
}
程序運行后的輸出結果是
本題考查宏定義, 宏定義只是做個簡單的替換, 執行SUB(a++, b++) = (a++ + 1) *b++ = 16, 選項D正確。
【37】有以下程序
#include <stdio.h>
void main() {
char c[2][5] = { "6938", "8254" }, *p[2];
int i, j, s = 0;
for (i = 0; i < 2; i++)
p[i] = c[i];
for (i = 0; i < 2; i++)
for (j = 0; p[i][j] > 0; j += 2)
s = 10 * s + p[i][j] - '0';
printf("%d\n", s);
}
程序運行后的輸出結果是
本題中首先是將二維字符數組c賦值指針數組p, 然后遍歷p找到兩個字符串中的偶數位置的字符並組成一個數值輸出, 根據代碼執行即可得到結果為6385。
【38】若有以下程序段
struct st {
int n;
struct st *next;
};
struct st a[3] = { 5, &a[1], 7, &a[2], 9, '\0' }, *p;
p = &a[0];
則以下選項中值為6的表達式是
本題考查結構體變量的引用, 其中a為定義的結構體數組, D選項中p->n為5, ++(p->n)為6, 所以D選項正確。
【39】有以下程序
#include <stdio.h>
void main() {
int i = 1;
i = i ^ i;
printf("%d\n", i);
}
程序運行后的輸出結果是
本題考查位運算中按位異或運算符, 異或運算只有在兩個比較的位不同時其結果是1, 否則結果為0, i ^ i運算符兩邊相同, 所以結果為0, 選項C正確。
【40】以下程序用來統計文件中字符的個數(函數feof用以檢查文件是否結束, 結束時返回非零)
#include <stdio.h>
void main() {
FILE *fp;
long num = 0;
fp = fopen("fname.dat", "r");
while (__________) {
fgetc(fp);
num++;
}
printf("num=%d\n", num);
fclose(fp);
}
下面選項中, 填入橫線處不能得到正確結果的是
本題考查文件的定位, feof函數的用法是從輸入流讀取數據, 如果到達文件末尾(遇文件結束符), eof函數值為非零值, 否則為0, while判斷條件應是如果沒有到達文件末尾, 所以選項C不能得到正確的結果。
編程題
【41】使用VC++2010打開考生文件夾下blank1中的解決方案。此解決方案的項目中包含一個源程序文件blank1.c。在此程序中, 函數fun的功能是:將a所指4×3矩陣中第k行的元素與第0行元素交換。
例如, 有下列矩陣:
若k為2, 程序執行結果為:
請在程序的下畫線處填入正確的內容並把下畫線刪除, 使程序得出正確的結果。
注意:部分源程序在文件blank1.c中。
不得增行或刪行, 也不得更改程序的結構 !
例如, 有下列矩陣:

若k為2, 程序執行結果為:

請在程序的下畫線處填入正確的內容並把下畫線刪除, 使程序得出正確的結果。
注意:部分源程序在文件blank1.c中。
不得增行或刪行, 也不得更改程序的結構 !
(1) k
(2) N
(3) a[k][i]
填空1:變量k在函數體fun中已經使用, 但在函數體中沒有定義, 肯定是在函數的形參中定義的, 所以應填k。
填空2:數組共N列, 所以應填N。
填空3:這部分語句實現的功能是變量值的交換, 所以應填a[k][i]。
填空2:數組共N列, 所以應填N。
填空3:這部分語句實現的功能是變量值的交換, 所以應填a[k][i]。
【42】使用VC++2010打開考生文件夾下modi1中的解決方案。此解決方案的項目中包含一個源程序文件modi1.c。在此程序中, 函數fun的功能是:讀入一個字符串(長度<20), 將該字符串中的所有字符按ASCII碼值升序排序后輸出。
例如, 若輸入"edcba", 則應輸出"abcde"。
請改正程序中的錯誤, 使它能得出正確的結果。
注意:部分源程序在文件modi1.c中。
不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
例如, 若輸入"edcba", 則應輸出"abcde"。
請改正程序中的錯誤, 使它能得出正確的結果。
注意:部分源程序在文件modi1.c中。
不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
(1) for (i = strlen(t) - 1; i; i--)
或 for (i = strlen(t) - 1; i > 0; i--)
(2) if (t[j] > t[j + 1])
(1) 本題是利用選擇法對數組元素進行比較排序。
所謂選擇法, 是依次用當前取得的元素和其后面的元素進行比較, 在第一個元素和其后面的元素順次比較時, 可以借助中間變量來對兩個數進行交換, 要保證第一個元素始終存放數組中的最大數, 以后依次挑選出次大數, 這樣最終的數組就是有序的。
strlen函數所求得的字符串長度, 數組最大下標為字符長度減1, 所以要減1。
(2) 這里是一個分析邏輯錯誤, 題中要求按升序排序, 所以應改為if(t[j] > t[j + 1])。
所謂選擇法, 是依次用當前取得的元素和其后面的元素進行比較, 在第一個元素和其后面的元素順次比較時, 可以借助中間變量來對兩個數進行交換, 要保證第一個元素始終存放數組中的最大數, 以后依次挑選出次大數, 這樣最終的數組就是有序的。
strlen函數所求得的字符串長度, 數組最大下標為字符長度減1, 所以要減1。
(2) 這里是一個分析邏輯錯誤, 題中要求按升序排序, 所以應改為if(t[j] > t[j + 1])。
【43】使用VC++2010打開考生文件夾下prog1中的解決方案。此解決方案的項目中包含一個源程序文件prog1.c。在此程序中, 編寫一個函數fun, 它的功能是:將ss所指字符串中所有下標為奇數位置的字母轉換為大寫(若該位置上不是字母, 則不轉換)。
例如, 若輸入"abc4Efg", 則應輸出"aBc4EFg"。
注意:部分源程序在文件prog1.c中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入你編寫的若干語句。
例如, 若輸入"abc4Efg", 則應輸出"aBc4EFg"。
注意:部分源程序在文件prog1.c中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入你編寫的若干語句。
void fun(char *ss) {
int i;
for (i = 0; ss[i] != '\0'; i++)
/*將ss所指字符串中所有下標為奇數位置的字母轉換為大寫*/
if (i % 2 == 1 && ss[i] >= 'a' && ss[i] <= 'z')
ss[i] = ss[i] - 32;
}
該題要求將給定字符串中奇數位置的字母轉換為大寫, 需要先判斷奇數位置以及是否是小寫字母, 如果是再通過其轉換方法進行轉換。
從C語言的學習中知道, 只要將小寫字母減去32即轉成大寫字母, 將大寫字母加上32即轉成小寫字母。
本程序用if語句實現轉換功能。
從C語言的學習中知道, 只要將小寫字母減去32即轉成大寫字母, 將大寫字母加上32即轉成小寫字母。
本程序用if語句實現轉換功能。