if(a[i]   i=a[0];a[0]=a[mini],a[mini]=i;  if(maxi==0) maxi=mini;    i=a[9];a[9]=a[maxi],a[maxi]=i;   printf(\  for(i=0;i<10;i++)     printf(\}  (16)有n个人围成一个圈子,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。  解答:将此问题转化为一维数组来处理,先将数组a中的n个元素分别赋初值1到n,然后从a[0]开始,顺序查找第三个值不为0数组元素,若到a[n-1]还没找到,再从a[0]开始,找到后将其值赋为0;再从刚赋0元素的下一个元素开始按上述方法查找第三个值不为0数组元素,并将其值赋为0,依此下去,直到数组a中只有一个不为0的元素为止,其元素值不为0的下标就是所求。  #define N 10 main()  { int a[N],m,i,k;    for(i=0;i<10;i++) a[i]=i;   i=0; m=0;k=0;   while(m<9)    { if(a[i]!=0) k+=1;      if(k==3) { a[i]=0;k=0;m+=1;}     i++;      if(i==10) i=0;   }    for(i=0;i<10;i++)      if(a[i]!=0) printf(\}  (17)给定一个一维数组,任意输入6个数,假设为1、2、3、4、5、6。建立一个具有以下内容的方阵存入二维数组中。   1  2  3  4  5  6   2  3  4  5  6  1  3  4  5  6  1  2  4  5  6  1  2  3  5  6  1  2  3  4  6  1  2  3  4  5  解答:把一维数组元素存入二维数组的第一行,然后将一维数组的所有元素右移一位,移出去的元素存入第一位;再把一维数组元素存入二维数组的第二行,然后将一维数组的所有元素右移一位,移出去的元素存入第一位;依次下去,执行六次为止。  main()  { int a[6],b[6][6],i,j,t;    printf(\  86    for(i=0;i<6;i++)     scanf(\  for(i=0;i<6;i++)    { for(j=0;j<6;j++) b[i][j]=a[j];     t=a[0];      for(j=0;j<5;j++) a[j]=a[j+1];     a[5]=t;    }    for(i=0;i<6;i++)   { for(j=0;j<6;j++)     printf(\    printf(\  } } (18)数组a中存放10个四位十进制整数,统计千位和十位之和与百位和个位之和相等的数据个数,并将满足条件的数据存入数组b中。  解答:依次取出数组a中每一个元素的个位、十位、百位和千位,并判断是否满足条件,若满足,则存入数组b,否则不存。  main()  { int a[]={1221,2234,2343,2323,2112,2224,8987,4567,4455,8877};   int b[10],i,gw,sw,bw,qw,k,num=0;   k=0;    for(i=0;i<10;i++)   { gw=a[i];     sw=a[i]0/10;     bw=a[i]00/100;     qw=a[i]/1000;     if(qw+sw==bw+gw)     { num++;b[k++]=a[i];}    }    printf(\  for(i=0;i (19)将一个英文句子中的前后单词逆置(单词之间用空格隔开)。 如:how old are you  逆置后为:you are old how  解答:先将整个英文句子逆置,然后再将每个单词逆置。 #include \main()  { char str[81],*p1,*p2,*p,ch;    printf(\  gets(str);   p1=str;p2=str;   87    while(*p2) p2++;   p2--;    while(p1   { ch=*p1;*p1++=*p2;*p2--=ch;}   p=str;   while(*p)   { p1=p;      while(*p1==' ') p1++;     p2=p1;      while(*p2&&*p2!=' ') p2++;     p=p2;     p2--;      while(p1  {ch=*p1;*p1++=*p2;*p2--=ch;}    }     printf(\   puts(str); } (20)将一个小写英文字符串重新排列,按字符出现的顺序将所有相同字符存放在一起。 如:acbabca  排列后为:aaaccbb  解答:新开辟一个数组,从字符串的第一个非空格字符开始,把该字符和与该字符相同的字符都存入该数组,同时用空格代替原串中的相应字符;再从字符串的第一个非空格字符开始,把该字符和与该字符相同的字符都存入该数组,同时用空格代替原串中的相应字符,依次下去,直到原字符串变为空格串为止。  #include \#include \main()  { char str1[81],str2[81],*p1,*p2,*p,ch;   printf(\  gets(str1);   p=str1;p2=str2;   while(*p)    { while(*p==' ') p++;      p1=p; ch=*p;     while(*p1)     if(*p1==ch) {*p2=ch;*p1=' ';p1++;p2++;}    else p1++;   }    *p2='\\0';    printf(\  strcpy(str1,str2);   puts(str2); }   88  4.7 自测试题参考答案  1. 单项选择题  (1) D  (2) B  (3) C  (4) B  (5) A  (6) C  (7) B  (8)B  (9) B   (10) D 2. 程序分析题  (1) 1 1 1 0        (2) 1 3 7 15        (3) 4    (4) 5              (5) 8 3. 程序填空题  (1)① j+=2或j=j+2 或j++,j++    ② a[i]>a[j] (2)③  *r==*p                    ④ *r=='\\0' (3)⑤ y<3或y<=2                 ⑥ z==3 (4)⑦ s[0][0]                    ⑧ s[0][2] (5)⑨ a[i-l]+a[i-2]              ⑩ i%4==0 4. 程序设计题 (1)    #define N  10 main()  { int a[N],i,s=0;    for(i=0;i #define N 11 main()  { int a[N],i,j,t;    for(i=0;i     if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}   for(i=N/2;i