【计算机二级C语言】卷016
选择题
公共知识
【1】在长度为n的顺序表中查找一个元素, 假设需要查找的元素有一半的机会在表中, 并且如果元素在表中, 则出现在表中每个位置上的可能性是相同的。则在平均情况下需要比较的次数大约为()。
因为查找的元素有一半机会在表中, 所以二分之一的情况下平均比较次数为n / 2, 二分之一情况下平均比较次数为n。
总的平均比较次数为(n / 2 + n) / 2 = 3n / 4。
故本题答案为A选项。
总的平均比较次数为(n / 2 + n) / 2 = 3n / 4。
故本题答案为A选项。
【2】设一棵树的度为3, 其中度为3, 2, 1的结点个数分别为4, 1, 3。则该棵树中的叶子结点数为()。
根据题意, 树的结点数为3×4 + 2×1 + 1×3 = 17, 再加1个根结点, 17 + 1 = 18, 即总结点数为18, 总结点减去度不为0的结点数即是叶子结点。
18 - (4 + 1 + 3) = 10。
故本题答案为A选项。
18 - (4 + 1 + 3) = 10。
故本题答案为A选项。
【3】设栈的存储空间为 S(1 : 50), 初始状态为 top = 0。现经过一系列正常的入栈与退栈操作后, top = 51, 则栈中的元素个数为()。
栈是一种特殊的线性表, 它所有的插入与删除都限定在表的同一端进行。
入栈运算即在栈顶位置插入一个新元素, 退栈运算即取出栈顶元素赋予指定变量。
栈为空时, 栈顶指针top = 0, 经过入栈和退栈运算, 指针始终指向栈顶元素。
初始状态为top = 0, 当栈满时top = 50, 无法继续入栈, top值不可能为51。
故本题答案为A选项。
入栈运算即在栈顶位置插入一个新元素, 退栈运算即取出栈顶元素赋予指定变量。
栈为空时, 栈顶指针top = 0, 经过入栈和退栈运算, 指针始终指向栈顶元素。
初始状态为top = 0, 当栈满时top = 50, 无法继续入栈, top值不可能为51。
故本题答案为A选项。
【4】设顺序表的长度为n。下列算法中, 最坏情况下比较次数等于n(n - 1) / 2的是()。
快速排序在最坏情况下, 是整个序列都已经有序且完全倒序, 此时, 快速排序退化为冒泡排序, 要比较n(n - 1) / 2次才能完成。
堆排序最坏情况和平均情况下比较次数都是nlog2n。
顺序查找和寻找最大项在最坏情况下比较次数为n。
故本题答案为B选项。
堆排序最坏情况和平均情况下比较次数都是nlog2n。
顺序查找和寻找最大项在最坏情况下比较次数为n。
故本题答案为B选项。
【5】下面是面向对象主要特征之一的是()。
面向对象方法的基本概念有对象、类和实例、消息、继承与多态性。
对象的特点有标识唯一性、分类性、多态性、封装性、模块独立性。
数据和操作(方法)等可以封装成一个对象。
类是关于对象性质的描述, 而对象是对应类的一个实例。
多态性指同样的消息被不同的对象接收时可导致完全不同的行为。
故本题答案为A选项。
对象的特点有标识唯一性、分类性、多态性、封装性、模块独立性。
数据和操作(方法)等可以封装成一个对象。
类是关于对象性质的描述, 而对象是对应类的一个实例。
多态性指同样的消息被不同的对象接收时可导致完全不同的行为。
故本题答案为A选项。
【6】软件测试的实施步骤是()。
软件测试过程一般按4个步骤进行, 即单元测试、集成测试、确认测试和系统测试。
通过这些步骤的实施来验证软件是否合格, 能否交付用户使用。
故本题答案为A选项。
通过这些步骤的实施来验证软件是否合格, 能否交付用户使用。
故本题答案为A选项。
【7】软件生存周期中, 解决软件"做什么"的阶段是()。
软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。
需求分析的任务是发现需求、求精、建模和定义需求的过程。
故本题答案为A选项。
需求分析的任务是发现需求、求精、建模和定义需求的过程。
故本题答案为A选项。
【8】数据库三级模式体系结构的划分有利于保持数据库的()。
数据库领域公认的标准结构是三级模式结构, 它包括外模式、概念模式、内模式, 有效地组织、管理数据, 提高了数据库的逻辑独立性和物理独立性。
用户级对应外模式, 概念级对应概念模式, 物理级对应内模式, 使不同级别的用户对数据库形成不同的视图。
所谓视图, 就是指观察、认识和理解数据的范围、角度和方法, 是数据库在用户"眼中"的反映, 很显然, 不同层次(级别)用户所"看到"的数据库是不相同的。
故本题答案为A选项。
用户级对应外模式, 概念级对应概念模式, 物理级对应内模式, 使不同级别的用户对数据库形成不同的视图。
所谓视图, 就是指观察、认识和理解数据的范围、角度和方法, 是数据库在用户"眼中"的反映, 很显然, 不同层次(级别)用户所"看到"的数据库是不相同的。
故本题答案为A选项。
【9】数据库概念设计阶段得到的结果是()。
数据库设计有需求分析设计、概念设计、逻辑设计、物理设计、编码、测试、运行、进一步修改等几个阶段。
在需求分析设计阶段形成需求说明书, 概念设计阶段形成概念数据模型(作为进一步设计数据库的依据, 概念设计通常采用E - R模型), 逻辑设计阶段形成逻辑数据模型(从ER图向关系模式转换、关系视图设计、模式规范化), 物理设计阶段形成数据库内部模型(此时涉及具体软件硬件环境)。
故本题答案为A选项。
在需求分析设计阶段形成需求说明书, 概念设计阶段形成概念数据模型(作为进一步设计数据库的依据, 概念设计通常采用E - R模型), 逻辑设计阶段形成逻辑数据模型(从ER图向关系模式转换、关系视图设计、模式规范化), 物理设计阶段形成数据库内部模型(此时涉及具体软件硬件环境)。
故本题答案为A选项。
【10】由关系R1和R2得到关系R3的操作是()。
在连接运算中, 如果连接条件为"=", 就称次连接为等值连接, 否则称为不等值连接。
观察关系R1的B列和关系R2的D列可以发现, 两列中有相等的值, 而关系R3中的B列为等值连接的结果。
故本题答案为A选项。
观察关系R1的B列和关系R2的D列可以发现, 两列中有相等的值, 而关系R3中的B列为等值连接的结果。
故本题答案为A选项。
专业知识
【11】C语言程序的模块化通过以下哪个选项来实现
C语言程序的模块化通过函数来体现, 所以选择B。
【12】以下选项中不属于C语言标识符的是
常量是指在程序运行过程中其值不能被改变的量, 如5、1.0、字符'a'等。
C语言的标识符分为3类:关键字、预定义标识符和用户标识符。
常量不属于标识符, 所以选择A。
C语言的标识符分为3类:关键字、预定义标识符和用户标识符。
常量不属于标识符, 所以选择A。
【13】以下选项中不属于C语言程序运算符的是
C语言中的不等于符号用"!="表示, 没有符号"< >", 所以选择B。
【14】若变量已正确定义并赋值, 以下不能构成C语句的选项是
C语言规定, C语句必须以分号";"结束。
C选项中没有结束符号, 所以错误。
C选项中没有结束符号, 所以错误。
【15】若有以下程序段
double x = 5.16894;
printf("%f\n", (int) (x * 1000 + 0.5) / (double) 1000);
则程序段的输出结果是
%f的输出格式是以带小数点的数学形式输出浮点数。
首先计算x * 1000, 结果为5168.94然后+0.5, 结果为5169.44, 然后进行强制类型转换, 转换成整型为5169, 然后除以双精度数据1000, 结果也为双精度数据5.169, 输出时按照%f的格式输出, 所以输出结果为5.169000。
首先计算x * 1000, 结果为5168.94然后+0.5, 结果为5169.44, 然后进行强制类型转换, 转换成整型为5169, 然后除以双精度数据1000, 结果也为双精度数据5.169, 输出时按照%f的格式输出, 所以输出结果为5.169000。
【16】设有定义:
double a, b, c;
若要求通过输入分别给a、b、c输入1、2、3, 输入形式如下(注:此处□代表一个空格)
□□1.0□□2.0□□3.0<回车>
则能进行正确输入的语句是
□□1.0□□2.0□□3.0<回车>
则能进行正确输入的语句是
scanf函数的一般形式为scanf(格式控制, 变量1地址, 变量2地址, …), 其中, 格式字符串要与数据类型保持一致, 所以格式字符串中应为%lf, 后面应该为变量地址, 所以需要加上符号"&", 所以选择B。
【17】若有定义语句:char c = '\101';
则变量c在内存中占
则变量c在内存中占
本题考查字符变量的存储空间, 每个字符变量被分配一个字节的内存空间。
因此A选项正确。
因此A选项正确。
【18】若有以下程序
#include <stdio.h>
void main() {
char c1, c2;
c1 = 'C' + '8' - '3';
c2 = '9' - '0';
printf("%c %d\n", c1, c2);
}
则程序的输出结果是
本题考查字符变量以及printf()函数相关知识, 字符变量c1被赋值为'C' + '8' - '3', 即ASSCII码的运算, 67 + 54 - 49 = 72, 即H;
字符变量c2被赋值为'9' - '0', 但输出时, 需要注意的是c1以字符变量输出, 而c2是以十进制整型变量输出。
因此B选项正确。
因此B选项正确。
【19】表示关系式x≤y≤z的C语言表达式的是
本题考查关系表达式和逻辑表达式, y大于等于x同时y小于等于z, 因此x <= y和y <= z是逻辑与的关系。
因此A选项正确。
因此A选项正确。
【20】有以下程序
#include <stdio.h>
void main() {
int x = 1, y = 0, a = 0, b = 0;
switch (x) {
case 1:
switch (y) {
case 0:
a++;
break;
case 1:
b++;
break;
}
case 2:
a++;
b++;
break;
}
printf("a=%d,b=%d\n", a, b);
}
程序运行后的输出结果是
本题重点考查switch语句, switch语句中case分支后面如果没有break, 那么就会顺序执行下面的case, 直到遇到break跳出。
由于变量a和变量b均赋初值为0, 当程序执行完语句case 0 : a++; break; 后, a的值为1, 继续执行语句case 2 : a++; b++; break; a的值为2, b的值为1。
因此C选项正确。
由于变量a和变量b均赋初值为0, 当程序执行完语句case 0 : a++; break; 后, a的值为1, 继续执行语句case 2 : a++; b++; break; a的值为2, b的值为1。
因此C选项正确。
【21】有以下程序
#include <stdio.h>
void main() {
int k, j, s;
for (k = 2; k < 6; k++, k++) {
s = 1;
for (j = k; j < 6; j++)
s += j;
}
printf("%d\n", s);
}
程序运行后的输出结果是
本题重点考查for语句循环嵌套, 首先k = 2, 进行一次循环后, k自增两次, 变成4, 这时s为1。
即当k = 4的时候, s = 1, j = 4, 执行内层循环, s = 1 + 4, j自增1后等于5, s = 5 + 5, j再自增1后即为6, 跳出内层循环。
k自增两次后等于6, 不成立, 跳出外层循环。
最后输出s的值, 即为10。
因此B选项正确。
即当k = 4的时候, s = 1, j = 4, 执行内层循环, s = 1 + 4, j自增1后等于5, s = 5 + 5, j再自增1后即为6, 跳出内层循环。
k自增两次后等于6, 不成立, 跳出外层循环。
最后输出s的值, 即为10。
因此B选项正确。
【22】由以下while构成的循环, 循环体执行的次数是
int k = 0;
while (k = 1) k++;
int k = 0;
while (k = 1) k++;
本题考查while语句, while语句的语义是:计算表达式的值, 当值为真(非0)时, 执行循环体语句。
k = 1为赋值语句, 即k 的值等于1。
while (k = 1) = while (1) , 是死循环, 执行无限次。
k = 1为赋值语句, 即k 的值等于1。
while (k = 1) = while (1) , 是死循环, 执行无限次。
【23】有以下程序
#include <stdio.h>
int fun(int a, intB) {
return a + b;
}
void main() {
int x = 6, y = 7, z = 8, r;
r = fun(fun(x, y), z--);
printf(" %d\n", r);
}
程序运行后的输出结果是
函数fun的功能是返回两个形参的和。
调用函数fun(x, y)时, 将变量x = 6和y = 7 的值分别传送变量a和b, 并且通过语句return a + b; 将13返回给主函数。
继续调用函数fun(13, z--), 这里z--指将z的值参与运算后, 再将z的值减1操作; 将13和8分别传送变量a和b, 且通过语句return a + b; 将21返回给主函数。
因此A选项正确。
调用函数fun(x, y)时, 将变量x = 6和y = 7 的值分别传送变量a和b, 并且通过语句return a + b; 将13返回给主函数。
继续调用函数fun(13, z--), 这里z--指将z的值参与运算后, 再将z的值减1操作; 将13和8分别传送变量a和b, 且通过语句return a + b; 将21返回给主函数。
因此A选项正确。
【24】以下选项中函数形参不是指针的是
B选项和D选项是将数组作为函数参数;
A选项是将指针作为函数参数;
因此C选项正确。
【25】有以下程序
#include <stdio.h>
void main() {
int y = 1, x, a[] = { 2, 4, 6, 8, 10 }, *p;
p = &a[1];
for (x = 0; x < 3; x++)
y = y + *(p + x);
printf("%d\n", y);
}
程序运行后的输出结果是
本题通过语句"p = &a[1]将指针变量p指向了存储单元a[1], 即使得p[0]的值为4。
然后通过3次for循环, x = 0时, *(p + x) = *p = a[1] = 4所以y = 1 + 4 = 5; x = 1时, *(p + x) = *(p + 1) = a[2] = 6, 所以y = 5 + 6 = 11; x = 2时, *(p + x) = *(p + 2) = a[3] = 8, 所以y = 11 + 8 = 19。
因此B选项正确。
然后通过3次for循环, x = 0时, *(p + x) = *p = a[1] = 4所以y = 1 + 4 = 5; x = 1时, *(p + x) = *(p + 1) = a[2] = 6, 所以y = 5 + 6 = 11; x = 2时, *(p + x) = *(p + 2) = a[3] = 8, 所以y = 11 + 8 = 19。
因此B选项正确。
【26】以下程序调用fun函数求数组中最大值所在元素的下标。
#include <stdio.h>
void fun(int *s, int n, int *k) {
int i;
for (i = 0, *k = i; i < n; i++)
if (s[i] > s[*k])
__________;
}
void main() {
int a[5] = { 1, 6, 2, 8, 0 }, k;
fun(a, 5, &k);
printf("%d %d\n", k, a[k]);
}
在横线处应填入的内容是
fun函数的功能是求数组中最大值所在元素的下标。
通过for循环语句, 每次将最大的数给*k, 即*k = i。
因此A选项正确。
通过for循环语句, 每次将最大的数给*k, 即*k = i。
因此A选项正确。
【27】有以下程序
#include <stdio.h>
void main() {
int a[3][4] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23 }, (*p)[4] = a, i, j, k = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
k = k + *(*(p + i) + j);
printf("%d\n", k);
}
程序运行后的输出结果是
该题首先给二维数组赋值a[3][4] = { { 1, 3, 5, 7
} {
9, 11, 13, 15
} {
17, 19, 21, 23 } };
(*p)[4] = a指针p指向二维数组a的首地址, 接下来执行for循环, 首先 i = 0, j = 0时k = k + *(*(p + 0) + 0) = 1(a[0][0]);
然后 i = 0, j = 1时k = k + *(*(p + 0) + 1) = 4(a[0][1]);
然后j = 2时, 跳出j的循环, 执行i的循环i = 1, j = 0 时k = k + *(*(p + 1) + 0) = 13(a[1][0]);
依次类推一直到i = 3时跳出全部循环。
循环语句在这里的功能是累加二维数组第1列和第2列的元素, 累加结果为60。
循环语句在这里的功能是累加二维数组第1列和第2列的元素, 累加结果为60。
【28】有以下程序
#include <stdio.h>
int funa(int a, intB) {
return a + b;
}
int funb(int a, intB) {
return a - b;
}
int sss(int(*t)(), int x, int y) {
return ((*t)(x, y));
}
void main() {
int x;
x = sss(funa, 9, 3);
x += sss(funb, 8, 3);
printf("%d\n", x);
}
程序运行后的输出结果是
由x = sss(funa, 9, 3);
可得到x = 9 + 3 = 12, 而后直接传入函数funb, x = x + 8 - 3 = 12 + 5 = 17。
因此C选项正确。
因此C选项正确。
【29】有以下程序
#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(9));
}
程序运行后的输出结果是
本题考查函数的递归调用, 执行f(9)后, f(9) = 9 - (7 - (5 - (3 - f(1)))) = 7, 所以答案为D选项。
【30】以下选项中, 能正确进行字符串赋值的是
本题考查字符数组的初始化, B选项中赋值号右侧是赋值给一个字符数组, 而字符串需要'\0'作为结束标记, 所以错误。
C选项中字符串包含6个字符, 所以不能赋值在左边只能放5个字符的字符串数组中。
D选项gets函数, 指针s需要初始化。
所以选项A正确。
C选项中字符串包含6个字符, 所以不能赋值在左边只能放5个字符的字符串数组中。
D选项gets函数, 指针s需要初始化。
所以选项A正确。
【31】有以下程序
#include <stdio.h>
void fun(char **p) {
int i;
for (i = 0; i < 4; i++)
printf("%s", p[i]);
}
void main() {
char *s[6] = { "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" };
fun(s);
printf("\n");
}
程序运行后的输出结果是
本题考查字符串数组, s表示指向字符数组的指针, s指向了第一个字符串, s++指向了第二个字符串, 所以最后输出结果为D选项。
【32】以下fun函数的功能是将形参s所指字符串内容颠倒过来
void fun(char *s) {
int i, j, k;
for (i = 0, j = strlen(s)__________; i < j; i++, j--) {
k = s[i];
s[i] = s[j];
s[j] = k;
}
}
在横线处应填入的内容是
本题考查字符串处理函数strlen, strlen计算一个字符串的长度, 不包含结尾符, 所以本题中j的初始化应该是从最后一个字符开始, 因为数组下标从0开始, 所以应该将得到的字符串长度减1, 选项B正确。
【33】有以下程序
#include <stdio.h>
void fun(char *p, int n) {
char b[6] = "abcde";
int i;
for (i = 0, p = b; i < n; i++)
p[i] = b[i];
}
void main() {
char a[6] = "ABCDE";
fun(a, 5);
printf("%s\n", a);
}
程序运行后的输出结果是
本题考查数组名作为函数参数, 执行f函数时, 传进去的a指针被重新指向了b, 所以原本a数组的地址内容不变, 所以输出结果为ABCDE, 答案为B选项。
【34】有以下程序
#include <stdio.h>
fun(int a, int b) {
int static m = 0, i = 2;
i = i + m + 1;
m = i + a + b;
return m;
}
void main() {
int k = 4, m = 1, p;
p = fun(k, m);
printf("%d,", p);
p = fun(k, m);
printf("%d\n", p);
}
程序运行后的输出结果是
本题考查静态局部变量, 本题中先执行fun(4, 1)得到返回值为8, 此时静态局部变量m为8, i为3, 那么再次执行fun(4, 1)得到的值为17, 所以选项A正确。
【35】为了建立如图所示的存储结构(即每个结点含两个域, data是数据域, next是指向结点的指针域), 则在【 】 处应填入的选项是
Struct link { char data; 【 】 } node;
Struct link { char data; 【 】 } node;
本题主要考查链表中节点的概念, 属于基础知识, 其中指针域应该是指向下个节点, 所以答案为B。
【36】以下结构体说明和变量定义中, 正确的是
本题考查typedef的使用方法, typedef对已存在的类型使用一个新的名字, 选项A中ABC为新的类型别名, 定义正确。
【37】有以下程序
#include <stdio.h>
#include <stdlib.h>
void fun(int *p1, int *p2, int *s) {
s = (int *) malloc(sizeof(int));
*s = *p1 + *(p2++);
}
void main() {
int a[2] = { 1, 2 }, b[2] = { 10, 20 }, *s = a;
fun(a, b, s);
printf("%d\n", *s);
}
程序运行后的输出结果是
本题考查把数组名作为函数参数, 执行fun函数后, s的值并没有发生变化, 仍然是指向a, 所以输出结果为1, 选项C正确。
【38】以下程序依次把从终端输入的字符存放到f文件中, 用#作为结束输入的标志, 则在横线处应填入的选项是
#include <stdio.h>
void main() {
FILE *fp;
char ch;
fp = fopen("fname", "w");
while ((ch = getchar()) != '#')
fputc(__________);
fclose(fp);
}
本题考查fputc函数, 该函数将字符ch写到文件指针fp所指向的文件的当前写指针的位置。
函数格式:int fputc(int n, File *fp)。
答案为D选项。
函数格式:int fputc(int n, File *fp)。
答案为D选项。
【39】有以下程序
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM(M + 1) * M / 2
void main() {
printf("%d\n", NUM);
}
程序运行后的输出结果是
本题考查宏定义, 宏定义只是做个简单的替换, 执行NUM = (N + 1 + 1) * N + 1 / 2 = 8, 选项B正确。
【40】有以下程序
#include <stdio.h>
void main() {
int i = 0;
i = ~i;
printf("%d\n", i);
}
程序运行后的输出结果是
本题考查位运算中按位取反, 0按位取反就是-1, 所以选项D正确。
编程题
【41】使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中, 函数fun的功能是:将形参s所指字符串中的所有数字字符顺序前移, 其他字符顺序后移, 处理后新字符串的首地址作为函数值返回。
例如, s所指字符串为:asd123fgh543df, 处理后新字符串为:123543asdfghdf。请在程序的下画线处填入正确的内容并把下画线删除, 使程序得出正确的结果。
注意:部分源程序在文件blank1.c中。
不得增行或删行, 也不得更改程序的结构 !
例如, s所指字符串为:asd123fgh543df, 处理后新字符串为:123543asdfghdf。请在程序的下画线处填入正确的内容并把下画线删除, 使程序得出正确的结果。
注意:部分源程序在文件blank1.c中。
不得增行或删行, 也不得更改程序的结构 !
(1) j
(2) k
(3) p或(p)
填空1:函数中申请了两个内存空间, 其中p存放数字字符串, t存放非数字字符串, 根据条件可知, p依次存放数字字符串, 其位置由j来控制, 所以应填j。
填空2:利用for循环再把t中的内容依次追加到p中, 其中t的长度为k, 所以应填k。
填空3:处理之后的字符串存放到p中, 最后返回p的首地址即可, 所以应填p。
填空2:利用for循环再把t中的内容依次追加到p中, 其中t的长度为k, 所以应填k。
填空3:处理之后的字符串存放到p中, 最后返回p的首地址即可, 所以应填p。
【42】使用VC++2010打开考生文件夹下modi1中的解决方案。此解决方案的项目中包含一个源程序文件modi1.c。在此程序中, 函数fun的功能是:首先把b所指字符串中的字符按逆序存放, 然后将a所指字符串中的字符和b所指字符串中的字符, 按排列的顺序交叉合并到c所指数组中, 过长的剩余字符接在c所指的数组的尾部。
例如, 当a所指字符串中的内容为"abcdefg", b所指字符串中的内容为"1234"时, c所指数组中的内容应为"a4b3c2d1efg"; 而当a所指字符串中的内容为"1234", b所指字符串的内容为"abcdefg"时, c所指数组中的内容应该为"1g2f3e4dcba"。
请改正程序中的错误, 使它能得出正确的结果。
注意:部分源程序在文件modi1.c中。
不要改动main函数, 不得增行或删行, 也不得更改程序的结构 !
例如, 当a所指字符串中的内容为"abcdefg", b所指字符串中的内容为"1234"时, c所指数组中的内容应为"a4b3c2d1efg"; 而当a所指字符串中的内容为"1234", b所指字符串的内容为"abcdefg"时, c所指数组中的内容应该为"1g2f3e4dcba"。
请改正程序中的错误, 使它能得出正确的结果。
注意:部分源程序在文件modi1.c中。
不要改动main函数, 不得增行或删行, 也不得更改程序的结构 !
(1) while (i < j)
(2) if (*a)
(1) 由i和j定义的初始值可知, 此处应该判断i是否小于j, 所以应改为while(i < j)。
(2) 此处将if错写成If, 这个错误比较简单, 但往往不容易发现。
(2) 此处将if错写成If, 这个错误比较简单, 但往往不容易发现。
【43】使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中, 函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除, s所指串中剩余的字符形成的新串放在t所指的数组中。
例如, 若s所指字符串中的内容为"ABCDEFG12345", 其中字符C的ASCII码值为奇数, 在数组中的下标为偶数, 因此必须删除; 而字符1的ASCII码值为奇数, 在数组中的下标为奇数, 因此不应当删除, 其他依此类推。最后t所指的数组中的内容应是"BDF12345"。
注意:部分源程序在文件prog1.c中。
请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。
例如, 若s所指字符串中的内容为"ABCDEFG12345", 其中字符C的ASCII码值为奇数, 在数组中的下标为偶数, 因此必须删除; 而字符1的ASCII码值为奇数, 在数组中的下标为奇数, 因此不应当删除, 其他依此类推。最后t所指的数组中的内容应是"BDF12345"。
注意:部分源程序在文件prog1.c中。
请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。
void fun(char *s, char t[]) {
int i, j = 0;
for (i = 0; i < strlen(s); i++)
if ( !((i % 2) == 0 && (s[i] % 2)))
t[j++] = s[i];
t[j] = 0;
}
本题是从一个字符串按要求生成另一个新的字符串。
我们使用for循环语句来解决这个问题。
在赋值新的字符串之前, 先对数组元素的下标和ASCII码的值进行判断, 将满足要求的元素赋给新的字符串。
我们使用for循环语句来解决这个问题。
在赋值新的字符串之前, 先对数组元素的下标和ASCII码的值进行判断, 将满足要求的元素赋给新的字符串。