分享

数组

 running_to_you 2017-05-17

数组

.选择题

1.若有下列说明,则数值为4的表达式是(    

int a[12]{ l23456789101112 }

char c=‘a’,d g   

  a[g-c]                              a[4] 

   a[d-c]       a[d-c] 

 

2.设有定义:“char s[12]={string};” printf(“%d\n”,strlens));的输出是(    

   6                7                  11                    12 

 

3.下列语句中,正确的是(  

    char a[3][]={abc“,’1}    char a[][3]={abc‘,’l} 

   char a[3][]={a’,“1}                  char a[][3]={a”,“1} 

    

 4.合法的数组定义是(  

   int a[]={string}            int a[5]={012345} 

   char a={string}          char a[]={012345} 

     

5.语句“printf(”%d\n“,strlen(”ats\nol2\1\\“));”的输出结果是(  

  11                 10                    9              8 

  

 6.函数调用“strcatstrcpystrlstr2),str3)”的功能是(  

   ①将字符串strl复制到字符串str2中后再连接到字符串str3之后 

   ②将字符串strl连接到字符串str2中后再复制到字符率str3之后 

   ③将字符串str2复制到字符串strl中后再将字符串str3连接到字符串strl之后 

   ④将字符串str2连接到字符串strl之后再将字符串strl复制到字符串str3 

    

7.设有如下定义,则正确的叙述为(    char x[]{abcdefg} 

  char y[]{a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g} 

  数组x和数组y等价                                    数组x和数组y长度相同 

  数组x的长度大于数组y的长度             数组x的长度小于数组y的长度 

 

二.填空题

1.根据变量定义“static int b[5] a[][3]={123456};”,b[4]_____a[1][2]=           

 

2.设有定义语句“static int a[3][4]={{1}{2}{3}};”则a[l][l]值为_,a[2][1]的值为_。 

    

3.若在程序中用到“putchar )”函数时,应在程序开头写上包含命令_____,若在程序中用到“strlen )”函数时,应在程序开头写上包含命令______。 

  

4.下面程序的功能是输出数组s中最大元素的下标,请填空。   

main() 

  {

int  k p  

         int s[]={1,-972-103}   

forp0 kpp<6 p++   

ifs[p]>s[k]____________   

printf(“%d\n k);   

   

5.下面程序的功能是将一个字符串str的内容颠倒过来,请填空。   

main() 

  {

int  i j_____________   

char str[]={1234567} 

          fori0jstrlenstr    i<ji++j--   

kstr[i] str[i]=str[j] str[j]=k 

}   

printf(“%s\n”, str);   

    

6.以下程序可把输入的十进制数以十六进制数的形式输出,请填空。   

main  

  { 

char b[17]={0123456789ABCDEF}   

int c[64]di0base16   

long n 

         printf(“Enter a number\n”);    

scanf(“%ld”, &n): 

         do 

c[i]=________

i++

nn/base

}   whilen!=0); 

         printf(“Transmite new base\n”);   

for--i i>= 0--i 

         {

dc[i] 

printf(“%c”,      );

}  

 printf(“\n”);

 

.程序分析题 

  1.阅读程序,写出程序运行结果。,   

main() 

  { 

static int a[][3]{9753l2468} 

         int ijsl0s20  

 fori0 i<3i++  

 forj0j<3j++ 

                   { 

ifi==j

 s1s1a[i][j]   

 ifi+j== 2 

s2s2a[i][j]   

         printf(“%d\n%d\n”, sls2);  

 } 

 

2.说明下列程序的功能。   

main()   

{

 int ij 

         float a[3][3]b[3][3]x   

fori0i<3i++   

forj0j<3 j++   

scanf(“%f”,&x); 

a[i][j] x   

         fori0i<3i++   

forj0j<3j++   

b[j][i]a[i][j] 

         fori=0i<3i++   

{printf(“\n”); 

         forj0j<3j++   

printf(“%f”,b[i][j]);   } 

         printf(“\n”);   

  

3.写出下列程序的运行结果。   

main() 

  {

static char a[]={‘*’,‘*’,‘*’,‘*’,‘*’,‘*}   

int ijk 

          for i0i<5i++   

printf(“\n”)

                   forj 0j<ij++ 

printf(“%c”,‘ ’);   

fork0k<5 k++

printf(“%c”,a[k]);   

          printf \n”);  

 } 

4.说明下列程序的功能。   

main()   

{

 int i 

         float a[3][3]b[3][3]c[3][3]x   

fori0i<3i++   

forj=0j<3j++   

scanf(“%f”, &x); 

a[i][j]= x  

 } 

         fori0i<3i++   

forj0j<3j++  

         {

scanf(“%f”,&x);

b[i][j]x   

         fori0 i<3 i++  

         forj0j<3j++   

c[i][j]a[i][j] b[i][j]    

fori0 i<3i++   

printf(“\n”); 

                                               forj0j<3j++   

printf(“%f”, c[i][j]);   

          printf(“\n”);   

}

 

.程序设计题 

 1.编程序,输入单精度型一维数组 a[10] ,计算并输出 a数组中所有元素的平均值。 

  

2.编程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。 

  

3.编程序,输入两个字符串(<40个字符) ,连接后输出(不准用系统函数) . 

  

4.编程序按下列公式计算s的值(其中x1x2、…、xn由键盘输入):   s=∑(xi-x0)(xi-x0 (其中x0x1x2、…、xn的平均值) 

  

5.输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。 

  

6.输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。   

 

7.设某班50名学生的三科成绩表如下:   课程一 课程二 课程三   …… …… …… 

  试编一个程序,输入这50个学生的三科成绩,计算并输出每科成绩的平均分。 

  

8.编一个程序,输入一个整型数据,输出每位数字,其间用逗号分隔。例如,输入整数为2345,则输出应为: 2 3 4 5. 

  

9.编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3.然后输出加密后的字符串。 

  

  

 

 

 

答案解析

1.④「解」数组元素的下标自0开始顺序编号,值为4的元素是a[3].所以只有下标表达式的值为3的才是正确的。下标表达式g-c中的的变量gc的值是还未被设定的,其值不确定。a[4]的值为5,下标为4是不对的。‘d-c’的值为1a[l]的值是2,所以也是不对的。变量c的值为‘a ,‘d-c3,所以正确解答是④。

 

2.①「解」在C语言中,字符串是指在有效字符之后有字符列结束标记符的字符列,并约定字符串的长度是指字符列中有效字符个数,不包括字符串的结束标记符。存放于字符数组s中的字符串是“string”,该字符串的长度为6,所以输出该字符串的长度应是6.正确的解答是①。

 

3.④「解」如定义数组时有初始化,其最高维的长度可以省缺,由系统根据初始化时的初值个数确定,而其它维的长度是不可以缺省的。对二维字符数组的初始化,可以按行用字符串对其初始化,也可以按二维数组元素的存储顺序逐一用字符对其元素初始化。在供选择解答①和③中,有不是最高维的长度被缺省,所以是错误的。在供选择解答①和②中,还将字符串常量写作‘abc’,这也是错误的。只有④,用字符列按行给二维字符数组初始化,这才是正确的。正确构解答是④。

 

4.④「解」①错误的原因是整数数组不可以用字符串对其初始化。②错误的原因是,数组初始化时,初始化指定的值的个数多于数组的元素个数。③错误的原因是,能用字符串初始化的只;有字符指针变量,或字符数组。字符率不能对其它类型的变量初始化,包括字符变量。④是正确的,因为字符数组可以用小整数(作为字符的ASCII代码值)对其元素初始化。

 

5.③「解」字符串中的字符可以是一般的普通字符,也可以是由反斜杠字符开头的转义字符。在字符串“abs\no12\1\\ 中,有三个转义字符,它们是\n\1\\,所以该字符串的有效字符个数是9.所以正确的回答是③。

 

6.③「解」函数调用strcats1s2)是将s2字符串复制连接到s1字符串之后,使s1字符串变得更长。函数调用strcpys1s2)是将s2字符串复制到s1,使s1字符串的内容与s2字符串的内容相同。函数调用strcatstrcpystrlstr2 str3 是先执行strcpystrlstr2),然后再执行strcatstrlstr3),所以其功能是将字符串str2复制到字符串strl中,然后再将字符串str3复制连接到字符串strl之后。正确的选择是③。

 

7.③「解」不指定数组长度的字符数组定义,其所需要的字节数可由初始化中给出的值的个数确定。字符数组可以用字符串初始化,也可用字符逐个给字符数组的元素初始化。但用字符初始化时,尽管给出了字符串中的全部字符,还是不会自动有字符率结束字符。但字符串初始化自动会含有字符串的结束标记符,字符串初始化所需要的字节个数会比用同样多的字符初始化多1个字节。所以只有③才是正确的。

 

二.程序填空题

1.「解」系统规定,静态变量定义时,若末初始化,系统自动给定二进制代码全0的值。所以静态数组b的元素全为0,当然包括b[4]也为0 静态数组a是二维数组,每行有三个元素,在初始化中结出了六个初值,所以数组a2行。由于数组的元素按行顺序存储,并按行顺序初始化。前三个值是第一行,后三个值是第二行。a[1][2]是第二行的第三列元素,也是 a的最后一个元素,所以其值是6. 

 

2.「解」给二维数组初始化时,可按行给出初值,并且每行可以只给前面部分的元素给出初值。系统规定,对那些未给出初值的部分元素,系统自动置二进制代码全0的值。由于定义语句只给a[0][0]给定初值la[l][0]给定初值2a[2][0]给定初值3.这样,其它元素都为0值。所以,a[1][1] 0a[2][1] 0. 

 

3.「解」putchar()是系统提供的头文件stdio.h中定义的宏,所以程序要使用它,必须写上包含命令:#include<stdio.h>. 函数strlen()是系统提供的字符串处理函数之一,字符串处理函数的函数原型说明和它们用到的有关常量、数据结构等,在系统提供的头文件string.h中定义,所以使用该函数的程序应在程序开头写上包含命令#include<string.h>. 

 

4.「解」为要寻找数组中的最大元素的下标,需先预设1个临时最大元素的下标,并顺序逐一考察数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考察了数组的全部元素后,这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考察是从首元素开始顺序向后继元素考察。程序中,存储临时最大元素下标的变量是k,变量p控制顺序考察的循环控制变量。当发现当前元素s[p]比临时最大元素s[k]更大时,应该用p更新k.所以在空框处应填入代码“kp;”。 

 

5.「解」颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量ij i是前端元素的下标, j是后端元素的下标, 交换以这两个变量值为下标的元素str[i] str[j].开始时,i的值为 0j的值为字符串末元素的下标(字符串长度减1)。每次交换后,i 1j1.继续交换的条件是str[i]还位于str[j]的前面,即i<j.字符串末元素的下标是它的长度减1,所以在第二个空框处应填入-1.程序为了交换str[i]str[j],使用了变量k,该变量应在程序的变量定义部分中一起定义,所以在第一个空框处应填入k. 

 

6.「解」程序中,字符数组b存储十六进制的 16个数字符,整型数组c存储译出的十六进制数的各位数值。从整数n译出它的各位十六进制数值,需采用除16取余的方法,即求n16 的余。得到它的十六进制的个位数,接着将n除以16.n不等于0的情况下循环,能顺序求出n的十六进制的个位数、十位数、百位数等等。程序中变量base已预置16,所以在第一个空框处可填代码n%base。当n的十六进制数的个位、十位、百位等数字依次存放于数组c中后,就从最高位至最低位,参照数组c的内容d(以其内容为下标),取十六进制数字符表中的字符b[d]输出。所以在第二个空框处可填入代码b[d]. 

 

.程序分析题 

  1.「解」已知数组共有33列,第一行依次是975;第二行是312;第三行是468.程序引用数组元素的游标变量是ij,外循环控制变量i是数组的行下标,内循环控制变量j是数组

的列下标。循环体的工作是将数组的某些元素累计到sl,某些元素累计到s2.将行下标i和列下标j相同的元素累计到slsla[0][0]a[l][1]a[2][2].将行下标i与列下标j的和为 2的元素累计到 s2s2a[0][2]a[l][l]a[2][0].所以sl18s210.程序输出:   18   10 

 

2.「解」程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循环是将数组a转置复制到数组b. 程序第三段两重循环实现按行输出数组b的全部元素。所以程序的功能是按行顺序输入3*3二维数组的全部元素,然后按列顺序输出。 

  

3.「解」程序的外循环控制循环五次,每次开始先输出一个换行符,共输出5行信息。对于i(自0开始计算)行,先输出i个空白符,接着输出字符数组a中的五个字符,由于a中的五个字符都是字符。,所以输出五个*字符。这样程序是输出以下形式的图案:   

* * * * *    

 * * * * *     

  * * * * *     

    * * * * *       

    * * * * * 

 

4.解」程序第一段的功能是按行顺序输入数组的元素。程序第二段的功能是按行顺序输入数组b的元素。程序第三段的功能是顺序累加数组a和数组b的对应元素,并将和存于数组c的对应元素中。最后,按行顺序输出数组c的全部元素。

 

.程序设计题 

  1.编程序,输入单精度型一维数组 a[10] ,计算并输出 a数组中所有元素的平均值。 

  「解」为了计算数组元素的平均值,首先要累计它的全部元素的和,然后除以数组元素的个数,即得数组元素的平均值。写成C程序如下:  

 # include<stdio.h>   

main() 

  { 

int i n10   

float sa[10]  

         printf(“Enter %d numbers \n”, n);   

for i=0i< n i++   

scanf(“%f”,&s); 

a[i]= s  

 } 

         fors=0.0i=0i<NI++   

s+= a    

s /n 

         printf(“平均值是%.2f\n”, s); 

 } 

 

2.编程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。 

  「解」将数组的元素逆序重新存放,就是将数组的首尾对应元素两两交换。简单地可用两个游标变量iji是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的数组元素。开始时,i的值为0j的值为末元素的下标。每次交换后,i1j1.继续交换的   条件是i<J.程序如下:   

# include<stdio.h>   

main() 

  { 

int a[10] ijtn10 

         printf(“Enter %d numbers \n”, n);   

fori0i<ni++   

scanf(“%d”,&a[i]); 

         fori=0jn-1i<ji++j-- 

{   

t a[i] 

a[i]a[j] 

a[j] t   

         fori0 i<n i++   

printf(“%d\t”, a[i]);   

printf(“\n”);   

  

3.编程序,输入两个字符串(<40个字符) ,连接后输出(不准用系统函数) . 

  「解」将字符串s2连接到字符串s1的计算过程可分两个步骤完成。首先找到字符串s1的末尾,然后参照字符串s2,将字符串s2的全部有效字符逐一复制到字符串s1,最后在字符串s1的末尾接上字符串结束标记符。完整程序如下:   

# include<stdio.h>   

# define N 40  

 main() 

  {

char s1[N] s2[N]   

int ij 

         printf(“Enter stringl\n”);   

scanf(“%s”,s1); 

         printf(“Enter string2 \n”);

scanf(“%s”, s2); 

         fori0 sl[i]!=‘\0  i++ 

forj0s2[j]!=‘\0 i++j++    

s1[i]s2[j]    

s1[i]=‘\0 

         printf(“sl%s\n sl);   

 

4.编程序按下列公式计算s的值(其中x1x2、…、xn由键盘输入):   s=∑(xi-x0)(xi-x0 (其中x0x1x2、…、xn的平均值) 

  「解」输入数组xn个元素的值,按公式计算。程序首先输入n,设n<100,然后输入n个数据,接着求它们的平均值,最后按计算公式求出s,并输出。程序如下:   

# include<stdio.h>   

# define N 100   

main() 

  { 

double x[N+1] s   

int in   

do 

                   printf(“Enter n<100)”);  

scanf(“%d”, &n); 

         } whilen<=0||n>=100);   

fori=1 i<=ni++

{    

scanf(“%lf”, &s); 

x[i]s 

         } 

         fors0.0i1i<=n i++    

s+=x    

x[0]  s/n 

         fors0.0i=1i<= ni++    

s+=x[i]-x[0]*x[i]x[0]);   

printf(“s=%f\n”, s);   

  

5.输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。 

  「解」输入一个二维数组,寻找二维数组的最大值和最小值。其中寻找最大值和最小值的工作可用两重循环实现,即按行按列考察二维数组的元素。程序如下: 

  # include<stdio.h>   

main() 

  { 

int a[3][5] ijtn3 m5minmax minrow mincol maxrow maxcol   

printf(“Enter %d*%d numbers \n  nm); 

         fori0 i<ni++ 

                    for j0j<mj++

{    

scanf(“%d”, &t);  

a[i][j] t 

                    } 

minmax=a[0][0]  

minrowmincolmaxrow=maxcol=0   

fori0i<nI++   

forj0j<m J++

{   

 if a[i][j]> max 

{     

max= a[i][j] 

maxrow= i

maxcol=j     

                             if a[i][j]<min 

{     

mina[i][j]; 

minrow= i;

 mincolj;   

 }   

         printf(“MAXa[%d][%d] %d MIN a[%d][%d] %d \n”,maxrowmaxcolmax   minrowmincolmin    

 

6.输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。   

「解」程序先输入字符串,然后顺序考察输入字符串中的字符,当发现是大写字母时,将它改写成对应的小写字母,而当它是小写字母时,就将它改写成对应的大写字母。若变量ch中的字符是大写字母,则与它对应的小写字母的表达式可以写成ch- A’+‘a ;类似地,若变量ch中的字符是小写字母,则与它对应的大写字母的表达式可以写成ch-‘a’+‘A .完整程序如下: 

# include<stdio.h>

 #include<string.h>   

# define N 200  

 main()   

char s[N]    

int i 

         printf(“ Enter string \n”);  

 gets(s); 

         fori0 s!=‘\0’;i++    

ifs [i]>=A&&s[i] <=Z      

s[i]s[i] -A’+‘a     

else ifs [i]>=a&& s [i]<=z’)    

 s s-‘a +‘A    

printf(“s%s\n”,s);  

 }

 

7.设某班50名学生的三科成绩表如下:   课程一 课程二 课程三   …… …… …… 

  试编一个程序,输入这50个学生的三科成绩,计算并输出每科成绩的平均分。 

  「解」程序定义一个503列的二维数组,用于存储全班学生的成绩。程序顺序输入各个学生的三科成绩,然后按列的顺序,累计各科总分,并计算平均分。完整程序如下:   

# include<stdio.h>   

# define N 50   

# define M 3   

main() 

  {

int score[N][M] ijt   

double a[M] 

         printf(“Enter scores\n”);   

fori0i< N i++ 

                   forj0j<Mj++ 

{     

scanf(“%d”,&t); 

score[i][j]t 

                   } 

         forj0j<Mj++

a[j]0.0   

forj0j< Mj++

{   

 fori0i< N i++     

a[j]+= score[i][j]   

 a[j]/ N   

         forj0j<Mj++    

printf(“课程%d的平均分是%.2f\n”, j+1a[j]);  

 } 

  

8.编一个程序,输入一个整型数据,输出每位数字,其间用逗号分隔。例如,输入整数为2345,则输出应为: 2 3 4 5. 

  「解」程序的主要工作是从输入整数分拆出它的十进制整数的各位数字,将分拆出来的各位数字存于数组中,然后将这些数字自高位到低位的顺序逐位输出。要将一个整数按十进制数的要求分拆,需用一个循环,每次循环求出被分拆数除以10的余数的办法来求出它的个位,每分拆出一位就将被分拆的数除以10.循环过程直至被分拆的数为0结束。完整程序如下:   

# include<stdio.h>   

main() 

  {

int a[20]ibase10   

int n 

         printf(“Enter a number \n”);   

scanf(“%d”, &n);/*整数输入*/ 

         i0/*n进行分拆,各位数字自低位到高位存于数组 a*/   

do

                   a[i++]n% base   

n/ base   

} whilen  

         fori--i>=0i--/*自高位到低位输出*/    

printf(“%d%c”,a[i] i>0?,:\n’); 

  } 

  

9.编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3.然后输出加密后的字符串。 

  「解」程序的主要工作是输入字符串,并顺序考察输入字符串中的字符,分别对其中大小写英文字母完成问题要求的更改,而跳过不是英文字母的字符。完整程序如下: 

# include<stdio.h> 

#include<string.h>   

# define N 200   main() 

{

char s[N]  int i 

         printf(“Enter string \n”);   

gets(s) 

         fori0s[i]!=‘\0’; i++    

ifs[i]>=A && s[i]<=‘Z’)     

s[i]+3    

else ifs[i]>=‘a&& s[i]<=‘z      

s[i]+3   

printf(“s%s\n”,s);  

 }

 

 

 

 

   

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多