数组_习题参考答案
4
word[i][0]=toupper(word[i][0]); for(j=1;j<strlen(word[i]);j++) } for(i=0;i<M;i++) for(j=0;j<M-1;j++)
/*将每个单词的第一个字母转换为大写*/ /*将每个单词的剩余字母转换为小写*/
word[i][j]=tolower(word[i][j]); /*用冒泡法对单词排序*/
#include “stdio.h” #include “string.h” void main() { char s[100]; int length; printf("输入一个字符串:"); gets(s); for(length=0;s[length]!='\0';length++) ; printf("字符串的长度为:%d\n",length); }
数组 习题参考答案
一、选择题。 1. D 。在 C 语言中,若一维数组有 n 个元素,则其元素的下标从 0 到 n-1。 2. B。选项 A 和 C 在定义二维数组时,省略了第一维下标,但却没有给出初始值,D 选项所 定义的数组的第一维下标为 2,即该二维数组有两行,但后面却给了三行的初始值。 3. D。从定义可知,数据 a 有三行四列元素,但只给了 5 个初始值,分别赋给数组前 5 个元 素,其它元素的初值为 0。而 a[2][3]是数组的最后一个元素,所以其值为 0。 4. B。这里要注意区分字符数组与字符串。Ch1 的初值是用一个一个的字符进行初始华的, 它有多少个元素,长度就是多少,而 ch2 是用字符串来初始化的,除了要存储指定的字符之 外,还要存储字符串结束标志’\0’,所以其长度为字符个数再加 1。 5.B。在 C 语言中定义数组,数组名也为变量名,所以不能和已有的变量同名;定义数组时, 下标表达式只能是常量表达式,当然也包括符号常量;数组定义好后,C 语言在编译时会为 其分配存储空间。 6.A。 7.C。字符串一定要有结束标志’\0’,而字符数组不一定有,所以二都不能等同。 8.D。由于 C 语言中字符型数据可以当成整型数据来处理,所以在赋值时与整型数据的处理 一样。 9.C。 10.D。数组下标只能为整数。 二、读程序。 1. A 2. B 3. B 4.A 5. B 6.C 7.C 8.D 9.A 10.C 11.B 12.C 13.A 14.C 三、填空题。 1.①&b[k]。该题要求掌握如何向数组元素输入数据以及如何正确表示数组元素的地址。 2.① s[i] (或 s[i]!= '\0 ' 或 i<strlen(s) ) ② '0' ( 或 48 ) 该题的基本思路中对字符串中的每个字符进行判断,如果是数字字符,就将其加到 sum 中。由此可知①处为循环终止条件,有多种表示方法;②处是要将数字的值加到 sum 中, 但数组元素中存放的是该数字字符的 ASCII 值,要将得到该数字字符数值的大小,需要用 其 ASCII 值减去字符’0’的 ASCII 值,即 48。 3.①4 ② i-1 ③ a[j][i] ④a[j][i] 外循环用来表示二维数组的行数,内循环用来表示每行需要处理的元素个数。二维数组 行列互换,只需要将对角线以下的元素与对角线以上的元素进行互换就可以了,所以第 i 行 只需处理 i-1 个元素就可以了,因为对角线上的元素不用交换。 循环体是典型的两个元素互换 的操作。 4.①i%j==0 (或 !(i%j) ) ② N ①处的条件语句表示:如果在[2,i/2]中有 i 的因子,则表明 i 不是素数,则将标志 f 赋 值为 0;后面的 if 语句即对 f 的值进行判断,如果 f 为 0,表示该数 i 不是素数,否则,i 就 是素数,此时应该将 i 的值存入数组元素 prime[n]中,同时 n 加 1。 5.①strlen(str1) ② i++ ③i 6.①a[i][i] ② a[i][10-i-1] 7.①a[i]%2!=0 (或 !a[i]%2) 8。①25 (或 ‘z’-‘a’ 或 ‘Z’-‘A’)
#include.h” void main() { char s[200]; int word=0,i; printf("输入一个英文句子:\n"); gets(s); for(i=0;s[i]!='\0';i++) if(s[i]==' ') word++; word++; } /*判断该字符是否是空格符*/ /*如果是则单词数加 1*/ /*计算最后一个单词*/
#include "stdio.h" #define N 10 void main() { int a[N],t,i; printf("请输入%d 个数:",N); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<=N/2;i++) { t=a[i]; a[i]=a[N-1-i]; a[N-1-i]=t; } printf("逆序输出数组为:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); } /*下标为 i 的元素与下标为 N-1-i 的元素互换*/
3
s3[d3]='\0'; }
/*给新字符串 s3 末尾添加结束标志*/
printf("合并后的字符串是:%s\n",s3);
4.分析:这里假设输入的英文句子开始和结束的地方均不含空格符号,在程序中安排一个 计数器变量,初始值为0,然后用一循环扫描整个句子,对每个字符进行判断,如果遇到空 格字符,则计数器加 1,直到句子结束。但这样处理,句子最后一个单词则没有计算在计数 器中,所以在退出循环后计数器还要加 1 将最后一个单词计算进去。
#include “stdio.h” #include “string.h” void main() { char s1[100],s2[100],s3[100]; int d1,d2,d3; printf("输入二个字符串:\n"); gets(s1); gets(s2); d1=d2=d3=0; while(s1[d1]!='\0' && s2[d2]!='\0') { s3[d3]=s1[d1]; s3[d3+1]=s2[d2]; d1++; d2++; d3+=2; } while(s1[d1]!='\0') { s3[d3]=s1[d1]; d1++; d3++; } while(s2[d2]!='\0') { s3[d3]=s2[d2]; d2++; d3++; } /*处理源字符串 s2 中剩余字符*/ /*处理源字符串 s1 中剩余字符*/ /*两个字符串都没结束时进行交替合并*/
6.分析:本题可定义一个二维字符数组 word 来存放单词;定义一个有 26 个元素的一维数 组 charcnt 来存放每个字母在这些单词中出现的次数,字母 a 出现的次数存放在 charcnt[0] 中,字母 b 出现的次数存放在 charcnt[1]中,字母 c 出现的次数存放在 charcnt[2]中,……, 字母 z 出现的次数存放在 charcnt[25]中; 定义一个变量 totalchar 来统计这些单词共有多少个 字母。 在程序中,用一个一重循环来输入M个单词,一个一重循环来将数组 charcnt 各元素赋 初值 0,用一个二重循环来对所有单词中的每个字母进行扫描,在二重循环中,一是要统计 所输入的单词中一共有多少个字母,二是要统计每个字母(不分大小写)出现的次数。在统 计各个字母不分大小写出现的次数的时候, 使用了语句 charcnt[tolower(word[i][j])-97]++; 这 里 charcnt 的下标 tolower(word[i][j])-97 表示将数组元素 word[i][j]的小写字母的 ASCII 再减 速去 97,即是数组 charcnt 中存放该字母出现次数的元素对应的下标。
2.分析:本小题可定义一个整型变量 length 来存放字符串中字符的个数,即为字符串的长 度,让该变量从初始值 0 开始以 1 为单位递增,每取一个值,就判断字符字符数组的元素 s[length]是否是字符串结束标志’\0’:如果不是结束标志,则继续让 length 递增;如果是结束 标志,则退出循环。此时 length 的值即为字符串的长度。由于循环体中不对字符串做任何操 作,所以循体为空,字符的计数操作在 for 循环的括号中就可完成。程序如下:
#include “stdio.h” #include “string.h” #include “ctype.h” #define M 10 void main() { char word[M][20],tmp[20]; int i,j; printf("输入%d 个单词,每行一个:\n",M); for(i=0;i<M;i++) gets(word[i]); for(i=0;i<M;i++) { /*对 M 个单词*/ /*输入 M 个单词*/
3.分析:假设两个源字符串存放在字符数组 s1 和 s2 中,合并的结果放在字符数组 s3 中,
2
这里可定义三个下标变量 d1、d2 和 d3 分别用来表示上面三个字符数组的某个元素的下标, 取值均从 0 开始变化。在合并字符串的时候有两种情况: (1)两个字符串中的字符个数相等。这种情况下,只需要一个循环结构就可以完成字 符串的交替合并,循环条件为 s1[d1]!='\0' && s2[d2]!='\0',即二个字符串均未结束。这里先 把 s1[d1]复制到 s3[d3]中, 再把 s2[d2]复制到 s3[d3+1]中, 然后 d1、 d2 分别移到下一个字符, 而 d3 此时则要增加 2, 因为 d3+1 的元素中已经放了 s2[d2]的值。 这样直到字符串结束为止。 (2)两个字符串中的字符个数不等。这里可以先按(1)所说的方法处理两个字符串 都未结束的字符, 然后再用一个循环来处理另一个较长字符串中剩下来的字符。 由于事先不 知道哪个字符串长,哪个字符串短,所以字符串 s1 比 s2 长或 s2 比 s1 长都有可能,所以两 种情况都要考虑, 所以后面还要用二个循环来处理较长的字符串中剩余字符的复制。 虽然处 理较长字符串中剩余字符的复制需要书写二个循环结构, 但在执行的时候, 由于其中一个字 符串已经到了末尾处, 所以实际执行时只一个循环会被执行, 另一个由于一开始就不满足循 环条件而退出。这二个循环结构形式一样,只是针对不同的源字符串进行处理,只不过这时 候只有一个源串了,所以下标变量的增量均为 1。