for(i=0;i<10;i++) 
   printf(\} (4) 
#define N  5 main() 
{ int a[N][N],i,j,t;   for(i=0;i     scanf(\  for(i=0;i  { t=a[i][i];a[i][i]=a[i][N-i-1]; a[i][N-1-i]=t;}   for(i=0;i     printf(\    printf(\  } } (5) 
#define M 3 #define N 4 main() 
{ int a[M][N],i,j,k=0,b[M*N];   for(i=0;i    scanf(\  for(i=0;i4.8 实验题目参考答案 
(1)  
#define N  10 main() 
{ int a[N],i,j,t; 
  for(i=0;i  { while(i0) i++;     while(i 
90 
    if (i  for(i=0;i#define N 10 
#include \main() 
{ int a[N],i,j,t,m;   scanf(\  m=m%N; 
  for(i=0;i    for(j=N-1;j>0;j--) a[j]=a[j-1];     a[0]=t;   } 
  for(i=0;i   printf(\} (3) main() 
{ float a[7][6]={0};   int i,j; 
  for(i=0;i<5;i++)   { for(j=0;j<4;j++) 
    { scanf(\      a[i][4]+=a[i][j];       a[5][j]+=a[i][j];     } 
    a[i][5]=a[i][4]/4;   } 
  for(i=0;i<4;i++)    a[6][i]=a[5][i]/5;   for(i=0;i<7;i++)   { for(j=0;j<6;j++) 
     printf(\    printf(\  } } (4) 
#define N 4 main() 
{ int a[N][N],i,j,t; 
 91 
  for(i=0;i    scanf(\  for(i=0;ia[j][j]) 
    { t=a[i][i];a[i][i]=a[j][j];a[j][j]=t;}   for(i=0;i     printf(\    printf(\  } } (5) main() 
{ int a[4][4],i,j,k,t,maxi,maxj;   for(i=0;i<4;i++)    for(j=0;j<4;j++) 
    scanf(\  for(i=0;i<4;i++)   { maxi=i;maxj=i;     for(j=0;j<4;j++)      for(k=0;k<4;k++) 
     { if(j==k&&j
       if(a[maxi][maxj]>a[j][k]) {maxi=j;maxj=k;}      } 
    t=a[i][i];a[i][i]=a[maxi][maxj]; a[maxi][maxj]=t;   } 
  for(i=0;i<4;i++)   { for(j=0;j<4;j++) 
     printf(\    printf(\  } } (6) 
#define N 4 main() 
{ int a[N][N],i,j,s=0,max;   for(i=0;i    scanf(\   for(i=0;i 92 
      if(max  for(i=0;i<4;i++)   { for(j=0;j<4;j++) 
     printf(\    printf(\  } 
  printf(\} (7) 
#include \#include \main() 
{ char str[81];int i,j,t,l,k;   gets(str);   l=strlen(str);   for(i=0;i  { for(j=i+1,k=i;j     if(str[i]==str[j])  str[j]='\\0'; 
     else if (str[j]!='\\0'&&str[k]>str[j]) k=j;     if (k!=i) { t=str[k];str[k]=str[i];str[i]=t;}   } 
  for(j=0,i=0;i  if(str[i]!='\\0')  str[j++]=str[i];   str[j]='\\0';   puts(str); } (8) 
#include \#include \main() 
{ char str[81];   int t,i,j,cc;   gets(str); 
  for(i=0,j=0;str[i];i++) 
  { t=str[i]>='a'&& str[i]<='f'|| str[i]>='A'&& str[i]<='F';     if(str[i]>='0'&& str[i]<='9'||t) str[j++]=str[i];   } 
  str[j]='\\0';   t=0; 
  for(i=0;str[i]!=0;i++) 
  { if(str[i]>='0'&& str[i]<='9') cc=48; 
    else if(str[i]>='a'&& str[i]<='f') cc=87; 
 93 
  else cc=55; 
    t=t*16+str[i]-cc;   } 
  printf(\} 
4.9思考题参考答案 
(1)答:若对数组初始化,则定义二维数组时第一维的长度可以省略,但第二维的长度不能省略。因为系统无法通过所提供的初始值确定其每列元素个数。而省略第一维长度时,系统可根据初始列表中值的个数和第二维的长度计算出所省略的第一维长度,具体计算方法为:第一维长度=?列表中值的个数/第二维的长度?。 
(2)答:一维数组定义时,[]内的数据是规定数组的元素总个数,要求必须为常量表达式;引用数组元素时,[]内数据的为使用元素在数组内的序号,可以为各种表达式,要求表达式值的范围为0至元素总个数-1之间。 (3)答:利用q引用数组元素a[i][j]的方式有三种:q[i][j]、(q[i]+j)*和*(*(q+i)+j)。 (4)答:利用p引用数组元素a[i][j]的方式有三种:p[i][j]、(p[i]+j)*和*(*(p+i)+j)。 (5)答:第一种定义方式是用字符数组处理字符串,第二种定义方式是用字符指针处理字符串,其存储方式如图4.2所示。由此可知,第一种定义方式定义了一个等长的二维字符数组,第二种定义方式相当于定义了一个不等长的二维字符数组,每行宽度取决于具体字符串的长度。另外,系统为第一种定义方式分配的存储空间是连续的,但第二种定义方式的字符串之间则不一定连续。因此,相比于二维字符数组,指针数组有明显的优点,一是指针数组中不同元素所指的字符串不必限制长度,二是对字符串的处理是通过指针进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却不容易实现。   a[0]  g a i n \\0 \\0 \\0 \\0 a[0]  g a i n \\0    a[1] m u c h \\0 \\0 \\0 \\0 a[1]  m u c h \\0    a[2]  s t r o n g \\0 \\0 a[2]  s t r o n g \\0     字符数组a的空间分配情况               (b)字符指针数组      (a) a的空间分配情况             图4.2  两种定义的空间分配情况示意图 
 
 
 94