【计算机二级C语言】卷017
选择题
公共知识
【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语句实现转换功能。