数组练习解答
1 定义一个名为a的单精度实型一维数组,长度为4,所有元素的初值均为0的数定义语句是___________
【分析】按照一般数据定义语句的格式,可以直接写出方法一(参看答案);考虑到所有元素均赋初值时可以省略数组长度,可以写出方法二(参看答案);考虑到不省略数组长度,给部分元素赋初值时,所有未赋初值的元素均有空值(对数值型数组来说,初值为0),可以写出方法三(参看答案);考虑到选用静态型,不赋初值所有元素也自动赋予。空值(对数值型数组来说,初值为0),可以写出方法四(参看答案)。
【答案】方法一:float a[4]{00000000}
        方法二:float a[]{ 00000000}
        方法三:float a[4]= {00}
        方法四: static float [4]
2 下列数组定义语句中,错误的是()
char x[1]'a'      auto char x[1]={0}
static char x[l]    char x[l]
【分析】显然答案中给字符型数组赋初值的格式不对(不能直接赋予字符常量,必须用花括号括住),所以备选答案是符合题意的答案。
【答案】
3 "冒泡排序法"n个数据排序,需要进行n1 步。其中第k步的任务是:自下而上,相邻两数比较,小者调上;该操作反复执行nk次。现在假设有4个数据:4l32要排序,假定4为上、2为下,则利用"冒泡排序法"执行第2步后的结果是_________________
【分析】开始排序前的排列执行第1步后的排列执行第2步后的排列
      4      1      1
      1      4      2
      3      2      4
      2      3      3
【答案】 l243
4 "选择排序法"n个数据排序,需要进行n1步。其中第k步的任务是:在第k个数据到第n个数据中寻最小数,和第k个数据交换。现在假设有4个数据:4132要排序,则利用"冒泡排序法"执行第2步后的结果是______________________
【分析】  开始排序前的排列为:    4    1    3    2
        执行第1步后的排列为:  1    4    3    2
        执行第2步后的排列为:  1    2    3    4
【答案】1234
5 下列数组定义语句中,正确的是()
int a[][]={123456}      char a[2]3]'a''b'
int a[][3]= {123456}    static int a[][]{{1,2,3},{4,5,6}}
【分析】C语言规定,二维数组定义时不允许省略第二维的长度,所以备选答案①④是错误的。C语言还规定,定义字符型数组时不允许直接使用"字符常量"的方式赋初值,所以备选答案也是错误的。显然备选答案符合题意。【答案】
6 定义一个名为"s"的字符型数组,并且赋初值为字符串"123"的错误语句是()
char s[]={‘1''2''3''\0 '}    char s「」={"123"}
char s[]={"123\n"};            char s[4]={'1''2''3'}
【分析】备选答案中省略了数组长度,所以每个元素都赋了初值,共计4个元素,初值依次为'l''2''3''0',最后一个元素的值为字符串结束标记,所以数组S中存放的是字符串
"123",该答案不符合题意(即正确的);备选答案中直接赋予字符串作为初值所以数组s的长度为4,其中的初值是字符串"123",不符合题意(即正确的);备选答案中也是给数组s赋予字符串的初值,但是字符串不是"123",而是"123n",所以该答案符合题意(即错误的);显然答案也不符合题意(即正确的)。下面来分析答案为什么是正确的,该答案给出了数组长度为4,赋初值时仅给前3个元素赋予字符'1 ' '2''3',第 4个元素没有赋初值,按照 C语言的规定,也有初值,且初值为空值, 对字符型数组来说,空值就是'0',即字符率结束标记,所以数组S中存放的也是字符串" 123"。【答案】
7 设有下列数据定义语句,则数组元素x[i]的值是__________________
int i 3x[4]={ 123}
【分析】由于i的初值为3,所以x[i]就是x[3]。由于数组的下标是从0开始的,所以x[3]实际上是数组x的第4个元素。从定义语句中可以看出数组x的前3个元素的初值依次为123,第4个元素没有赋初值,其初值自动设为空值,对整型数组来说,空值是0,显然x[3」的值是0.【答案】0
8 设有下列数据定义语句,则 puts(&s[0][0])的输出结果是__________ putss[0]
输出结果是_____________
char s[4][5]={{'l''0'}{"23"}"345""40"}
【分析】首先分析字符型数组s的初值,s的第1行中存放的字符串是"1"、第2行中存放的符串是"23"、第3行中存放的字符串是"345"、第4行中存放的字符串是"4"puts()函数的功能是输出从"参数"处开始存放的字符串中有效字符。按照上的分析,第1个输出的结果是从"S[0][0]"开始的字符串,这个地址对应的就是数s的第1行,所以输出结果为1;第2个输出的结果是从s[]”开始的字符串,这个址对应的也是数组s的第1行,所以输出结果也为1
【答案】  1
        1
9 设有下列数据定义语句:
char a[4][10]={"11""22""33""44"}
putsstrcata[1]a[3]))的输出结果是________________
putSstrcpya[0]a[2]))的输出结果是________________
【分析】字符数组a共有4行,每行存放一个字符串。这4行的首地址依次为:a[0]a[1]a[2]a[3],从这4个地址开始存放的字符串依次为:"11""22""33""44"strcata[1]a[3])函数调用的功能是将s[3]处的字符串连接到a[l]的字符串后面,所以执行该函数调用后
al」处的字符串为"2244",而该函数的返回值就是a[1]的首地址,puts()函数的功能就是输出这个地址存放的字符串,由此,第1个输出的结果就是:2244。同样理由可以分析strcpya[0]a[2])的功能是将a[2]处的字符串("33")复制到a[0]处,返回a[0]的地址,puts()输出的就是a[0]处的字符串,结果为:33
【答案】2244          33
10 设有下列数据定义语句:
      char str[2][10]={"abc""ABC"}
printf("d"strcmpstr[1]str[0]))的输出结果是__________
printf"d"strcmp(strlwr(str[1],str[0])),str[0]))的输出结果是_______
【分析】字符型数组str中,从str[0]开始存放的字符串是"abc"、从str[l]开始存放的字符串是"ABC"strcmp(str[l]str[0])是比较str[l]str0」处的两个字符串的大小,由于"ABC"是小于"abc"字符串长度函数c语言的,按照srrcmp函数的功能可知,返回值是一个小于0的整数,这是第1个空的答案。再来分析第2个空的答案,strlwrstr[l])函数的功能是将str[l]处的字符串中大写字母改为小写字母,其返回值是修改后字符串的地址。strcmpstlwrsir[1]),str[0]))函数的功能是比较str[l]str[0]处的字符串,由于str[l]处的字符串已经改为小写字母
了,所以和 str[0]处的字符串完全相同,返回值是0,这就是第2个空的答案。
[答案]某个小于0的任意整数      0
11 下列程序的功能是读取10个实数,然后依次输出前l个实数和、前2个实数和、、前9个实数和、前10个实数和。请填写程序中缺少的语句。
  main()
  {float f[10]X00
    int i
    fori=0i10i++
      scanf" f" f[i]);
    fori=1;i=10i++
        {_______________________
        printf"sum of NO 2d----%fn"ix);
        }
    }
【分析】浏览程序清单后,可以发现前一个次数型循环是输入 10个实数存入数组 f中。后一
个次数型循环是计算前i个实数和并存入变量X中,然后再输出这个x的值。程序中所缺少的语句就是实现"计算前i个实数和并存入变量X"的。当i等于1时,x要等于f[0]的值,即f[il]的值;当i等于2时,x要等于f[0] f[l]的值,即f[0]f[i1」的值,此时f[0]的值已经计算并存入变量x中;当i等于3时,x要等于f[0]f[1]f[2]的值,即f[0]+f[1]f[il]的值,此时f[0]f[1]的值已经计算并存入变量x中;由此可以推出:前i个值的计算公式为:xxf[i1],将这个表达式组成语句就是需要填写的内容。
【答案】 x=xf[il];   x+=f[il]
12 运行下列程序的输出结果是()
111ll    llll      lll    222
    main()
    {int a[]={1234 5 }i;
    for i=1;i 5 i++)
    printf" 1d" a[i] a[i1]);
    }
【分析】首先分析数组a各元素的值,由于是赋初值,很容易看出:a[0] 1a[1]2…、a[
4]5。再分析次数型循环共计执行4次(i1i2i3i4),每次输出1位整数;[i]a[i1],当i1时,输出的是211;当i2时,输出的是32l;当i=3时,输出的是43l;当i4时,输出的是541。整个程序的输出结果是1111
【答案】
13 下列程序的功能是输入一个55列的实数矩阵,然后求出其中的最大数和最小数,并且对调这两个数后,再输出,请填写程序中缺少的语句。
 main()
 { float f[ 5][5]max x
 int ijmax_lmax_Jmin_imin_J
 fori0i5i++)
    forj0j5j++)
      {scanf"f",&x);
        f[i][j]x
      }
maxminf[0][0]
max_imax_imin_imin_j 0;
fori= 0i5i++)
    forj0j5j++)
      {ifmaxf[i][j]
          maxf[i][j]max_iimax_jj
        ifminf[i][j]
        ___________________
        }
f[max_i][max_j]min;
f[min_i[min_j]=max
      for(i0i5i++)
          {printf("n");
          forj0j5j++)
              printf"82f"f[i][j]);
          }
  }
【分析】首先宏观上阅读程序,可以看出程序的基本结构是:用双重次数型循环读取55列矩阵的元素值存入二维数组f中;寻矩阵中的最大数和最小数;交换最大数和最小数;输出交换后的矩阵元素值。需要填写的语句属于第2个部分。现在来仔细分析这个部分的程序。通常寻最大数(或最小数)的算法是首先假定最前面的数是最大数(或最小数),并记录该数及其在数组中的下标,然后依次处理所有元素,若当前处理的元素大于(小于)最大数(最小数),则重新记录新的最大数(最小数)及其下标。从本程序清单来看,的确是采用了这个算法,由于是同时求最大数和最小数,所以用maxmax_imax_j分别记录当前的最大数及其行列下标,用minmin_imin_j分别记录当前的最小数及其行列下标。在二重循环的循环体中有两条单分支语句,前一个单分支语句的功能很清楚,判断当前的数组元素是否大于最大数,是则重新记录最大数及其行列下标(注意,这里是用一个逗号表达式完成三项赋值工作的)。循环体中的第2条单分支语句当然是求当前最小数的,由此分析,当条件成立(当前数组元素小于当前最小数)时,需要重新记录当前的最小数及其行列下标,所缺少的语句正是完成这项工作的,由于只能用一条语句完成三项赋值工作,所以必须使用远号表达式。对照该循环体的前一个单分支语句,很容易写出所缺少的语句。接下来阅读以后的程
序,来验证所填写的语句。接下来的两条赋值语句正好完成了最大数和最小数的交换工作。前一个语句f[max_i][max_j] min是将到的最小数存入对应最大数的位置(max_i是最大数的行下标,max_i是最大数的列下标,f[max_i][max_j]就是最大数),类似的,后一个语句f[min_i][min_j〕=max 是将到的最大数存入对应最小数的位置。
【答案】minf[i][j]min_iimin_j=j
14 阅读下列 程序,写出程序运行后的输出结果。
  main()
 int al[]={1367100}a2[]={2458100}a[10]ijk
  ij0
  fork0k8k++)
      ifa1[i]<a2[j]
        a[k]a1[i++];
      else
        a[k]=a2[j++]
  for k 0 k 8 k++
      printf"1d"a[k]);
  }
【分析】程序开始用赋初值方式给数组ala2的所有元素赋值。接下来是给变量 ij0,从后面的for循环中可以看出,变量ij是作为一维数组的下标的,所以它们的初值是从0下标开始的。重点分析其后的次数型循环,共计循环8次,控制变量k的值依次为0l7,这个控制循环的变量k也是作为下标使用的。再分析循环体,这是一条双分支语句,控制条件是a1[i]a[j]”,即a1数组的第叶元素值小于a2数组的第j个元素值。这个条件成立时,执行的操作包括: al数组的第i个元素存入 a数组的第 k个元素中、同时 i1,使得 a1[i]成为其后的元素;如果这个条件不成立(即a2数组的第 j个元素值小于或等于 al数组的第 i个元素值),执行的操作包括: a2数组的第j个元素在入a数组的第k个地素中、同时j1,使得a2[j]成为其后的元素。综合上述的分析,可以看出,循环体的工作是将数组ala2的当前元素中值小的元素复制到数组 a中,如果数组 al的元素被复制,则其下标后移一个位置,指向 al的新元素;如果数组a2的元素被复制,则其下标后移一个位置,指向a2的新元素。该循环执行8次,恰好把数组a1和数组a2中的各4个元素按照从小到大的顺序复制到数组a中。最后看看输出,是一个次数型循环语句,输出的结果是数组a中的8个元素值,而且输出格式为一位整数,
结果当然是: 12345678
    请读者注意,由于原来的两个数组ala2中的元素是从小到大的顺序排列的,所以合并后的数组a的元素也必然是从小到大的。这是一种排序的算法,称为"两路归并排序法"。但是,真正的两路归并排序法要考虑到某个数组的元素全部复制后,另一个数组中的剩余元素要全部复制。本程序中没有考虑这个"临界问题",而是采用了在两个数组的有效数据之后,放一个最大数的方法,并且知道归并后的数据总个数。【答案】 12345678
15 阅读下列程序,写出程序运行后的输出结果。
    include "string.h"
    main()
    {char s[3][20]={"2345""123456""2347"}
    int i k
    for k 0 i1 i 3 i++)
        if((strcmps[k]s[i]))<0 k i
    putssk」);
    }
【分析】该程序很简单,开始给二维字符型数组赋初值为3个字符串,通过一个次数型循环求得变量k的值,然后输出s[k]对应的字符串。从上面的分析可知,关键是循环语句执行后变量k的值等于多少?我们呵以用记录的方法来记录在循环中变量k的值。
  执行循环语句,记录如下:
  k0i1,控制循环的条件"i 3'成立,执行循环体的单分支语句,条件"strcmp
  s[k]s[i]))<0"相当于"strcmp"2345""123456"))<0",条件不成立,变量k值不变,i1后继续循环;
    k0i 2,控制循环的条件"i 3"成立,执行循环体的单分支语句,条件"strcmp
s[k]s[i]))<0"相当于"strcmp"2345""2345"))<0",条件成立,执行kik值为2i1后继续循环;
    k2i=3,控制循环的条件"i3"不成立,退出循环。
    此时变量k值为2.
    执行"putss[k]);"语句,输出的是s[2]处存放的 字符串:2347
    显然该程序的主要功能是在3个字符串中。寻最大字符串的
【答案】 2347
16 阅读下列程序,写出程序的主要功能。
    main()
    { int i a[10] x flag 0
      fori=0; i<10i十十)
          scanf"d",& a i】);
      scanf"d",& X);
      fori=0;i10;i十十)
        if x== a[i]
            { flag i1;
              break
            }
      if(flag== 0
        printf"no found!n");
      else
        printf"dn"flag);
    }
【分析】该程序属于比较简单的,开始定义整型数组a以及整型变量xflagi。下面的次数型循环是输入10个整数到数组a中,此时可以看出变量i是作为循环的控制变量使用的。接着输入一个整数到变量x中。接下来的次数型循环执行10次,这是标准的用单重次数型循环来依次处理一维数组元素的程序段,处理的内容是循环体中的单分支语句,即判断当前的数组元素是否等于变量x,是,则在变量师中记录 i1后退出循环;否,则继续循环。由此可以分析出,这个流环足在数组a中寻x的,不到,则变社flag的值不会改变(注意动值为0);如果到,则lleq变量的值将等于il,其中的i是循环控制变量,也就是到的数组元素的下标,将其加 1后存入变量flag,所以此时的flag是对应数组元素的下标加 1的。我们再仔细分析一下,当i0时,到的是数组元素a[0],此时flag1,表示是数组的第1个元素,即在10个待查整数中的序号为 1;当 i l时,到的是数组元素 a[1],此时 flag2,表示是数组的第 2个元素,即在 10个待查整数中的序号为 2. i9时,到的是数组元素a[9],此时 flag10,表示是数组的第1O个元素,即在10个待查整数中的序号为10.所以,到则flag的值为1210;不到则为0。循环后面的输出恰好是按照flag的值分别处理到和不到的两种情况。综上所述,可以总结出本程序的主要功能。
【答案】输入10个整数存入数组a,再输入一个整数x,在数组a中查x。到输出x10个整数中的序号(从1开始),不到则输出"no found"
17 阅读下列程序,写出程序的主要功能。
  main()
  { int isum 0a[ 10];
    fori0i10i++)
        scanf" d",&a[i]);
    fori9i>=0i--)
        if a[i] 7== 0
          {sum+=a[i]
          printf"d"a[i]);
          }
    printf"\"nsum=%dn"sum);
    }
【分析】这是标准的次数型循环结构。第1个循环是输入10个整数存入数组a中;第 2个循环
是从后向前的顺序依次处理一维数组的元素。具体的处理是体现在其循环体中,它是判断当前数是否满足条件a[i]7==0,满足条件的元素则参加累加的计算,并输出满足条件的数组元素。退出循环后,再输出这些满足条件的数组元素之和。
    程序功能的关键是搞清楚条件"a[i]7== 0"的含义,其实很简单,这个条件就是"数组元素能被7整除"。综上所述,可以总结出该程序的主要功能。
【答案】输入10个整数,按从后向前的顺序依次寻并输出其中能被7整除的所有整数以及能被7整除的这些整数的和。
18 编一个程序,计算并输出下列数列的前24项,每行输出4项。
        数列第1项的值1
        数列第2项的值2
        数列第k项的值=kl项的值十第k2项的值,当k为奇数时,
        数列第k项的值=kl项的值一第k2项的值,当k为偶数时。
【分析】求数列的前 24项可使用次数型循环结构,只要按照给出的公式计算并保存即可。按每行4个数据的格式输出一维数组中的数据是一个标准的次数型循环。
【答案】
void main()
      {long int a[25]={012}
        int i
        fori3i25i++)
          if i 2 == 0
            a[i]a[il]a[i2];
          else
            a[i]a[i1]-a[i2];
        for i 1 i 25 i++
            printf"8ld"a[i]);
              ifi4==0
                printf"n");
            }
        }
19 编一个程序,输入一个3X3的实数矩阵,求两个对角线元素中各自的最大值。
【分析】用二重次数型循环解决矩阵的输入。用一重次数型循环求主对角线元素的最大数,用单分支结构求次主对角线元素中的最大数。
【答案】 main()
        { float s[3[3],max1max2x
          int ij
          fori0i3 i++)
              forj=0j3j++
                  { scanf"f" x);
                    s[i][j]x
                  }
          max1s[0[0];
          fori=1i3i十十)
            if(max1s[i[i])  max1=s[i[i];
          max2=s[0][2]
          ifmax2s[1][1]      max2=s[1][1]
          ifmax2s[2[0])    max2s[2[0];
          printf"max1=%fn"max1);
          printf"max2= f n",max2);
        }
20 编一个程序,输入3个字符串(长度均不超过30)存入一个二维的字符型数组中,将第3个字符串连接到第2个字符率之后,然后再连接到第1个字符串之后,组成新的字符串存入一维的字符型数组中,然后输出该新的字符串(说明:本题不允许使用字符串连接函数)。
【分析】两个字符率的连接算法如下,第 1个字符串复制到某个字符数组中(注意不包括字符串结束标记),然后再将第2个字符串复制到字符数组中(注意包括字符率结束标记)。本题要求连接3个字符串,可以用次数为3的次数型循环来实现。
【答案】
void main()
      { char s[9l]a[3][31]
        int i j k
for(i=0;i<=2;i++)
          gets(a[i]);
        k0
        fori0i=2i++)
          forj0j=30j++)
            ifa[i][j]=='0'  break
            else{
s[k]a[i][j]
                  k++;
                  }
              s[k]'0'
              printf" s" s

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。