選擇題
公共知識
當循環隊列滿或者為空時:隊尾指針=隊頭指針。
本題中完全二叉樹共有256個結點, 則深度為[log 2 256] + 1 = 8 + 1 = 9。
需求是指用戶對目標軟件系統在功能、行為、性能、設計約束等方面的期望。
故需求分析的主要任務是確定軟件系統的功能。
扇出數是指由一個模塊直接調用的其他模塊數, 即一個模塊直接調用的下層模塊的數目。
即封裝實現了將數據和操作置於對象統一體中。
所以實體供應商和實體零件之間的聯系是多對多。
班級(班級號, 總人數, 所屬學院, 班級學生)
則使它不滿足第一范式的屬性是()。
題目中"班級"關系的"班級學生"屬性, 還可以進行再分, 如學號、姓名、性別、出生日期等, 因此不滿足第一范式。
專業知識
選項D錯誤, 本題答案D
若想把1.2輸入給變量a, 3.4輸入給變量b, 5678輸入給變量c, 程序運行時鍵盤輸入:
1.2 3.4 5678<回車>
則以下正確的讀入語句是()。
#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);
}
#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++);
}
}
}
#include <stdio.h>
void main() {
int a = 1, b = -2;
for (; a-- && b++; )
printf("%d,%d,", a, b);
printf("%d,%d", 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
#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);
}
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
#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]);
}
}
int fun(int a[4][5], int *p[10], int n) {
……
}
#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]);
}
#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);
}
#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);
}
#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]);
}
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。
#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);
}
#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]);
}
#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);
}
#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);
}
}
下標i = 1輸出:acd
下標i = 2輸出:mopq
下標i = 3輸出:hjkl
下標i = 4輸出:rvwxyz
程序輸出:efgacdmopqhjklrvwxyz, 本題答案C
#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);
}
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
#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_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
#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));
}
本題答案:B
#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);
}
#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);
}
本題答案D
typedef int *T[10];
T *a;
#include <stdio.h>
void main() {
int x = 4, y = 2, z1, z2;
z1 = x && y;
z2 = x & y;
printf("%d,%d\n", z1, z2);
}
#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]);
}
本題答案:D
編程題
請在程序的下划線處填入正確的內容並把下划線刪除, 使程序得出正確的結果。
注意:源程序存放在文件BLANK1.C中, 不得增行或刪行, 也不得更改程序的結構 !
(1) x[i].s
(2) > ave
(3) n++
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中的學生學號的個數, 最后會作為函數返回值返回。
例如, a串為:asderty b串為:zxcvb 則c串為:axdvr
請改正程序中的錯誤, 使它能得出正確的結果。
注意:不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
(1) if (b[i + 1] != '\0')
(2) break;
(3) c[j] = '\0';
循環最后需要對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'。
請編寫函數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;
}
}
接下來編寫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。