选择题
公共知识
当循环队列满或者为空时:队尾指针=队头指针。
本题中完全二叉树共有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
", a, b, c);
else
printf("%d,%d,%d
", 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] = ' ';
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
", 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
", 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] != ' ')
(2) break;
(3) c[j] = ' ';
循环最后需要对i自增2, 保证a[i]是a的奇数位置字符, b[i + 1]是b的偶数位置字符, 所以第一处需要修改为:if (b[i + 1] != ' ')
(2) 由(1)可知, else 表示b[i + 1] == ' ', 此时按照题意, 程序应该跳出while循环, 所以continue应该修改为break。
(3) while循环中每次将字符存放到c[j]后, 都对j自增1, 所以j始终指向c最后一个有效字符的下一个位置。
循环结束后只需要对c[j]存放空字符即可, 所以c[j + 1] = ' '修改为c[j] = ' '。
请编写函数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。