admin 管理员组

文章数量: 1086019


2024年3月21日发(作者:jquery选择器大于号)

C程序设计(第三版)谭浩强 著 课后习题答案第7章

2009-05-16 10:56

7.7 打印“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之

和均相等。例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

要求打印出由1 到n2 的自然数构成的魔方阵。

/********************************************************************

**算法思路:魔方阵中各数的排列规律如下:

**(1)将1放在第一行中间一列

**(2)从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数

的** 行数减1,列数加1

**(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行)

**(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1

**(5)如果按上面的规则确定的位置数已有数,或者上一个数是第1行第n列时,则把

** 下一个数放在上一个数的下面

********************************************************************/

#include

void main(){

int a[16][16],i,j,k,p,m,n;

/*初始化*/

p=1;

while(p==1){

printf("input n.(0

scanf("%d",&n);

if((n != 0) && (n<=15) && (n%2 != 0))

{

printf("矩阵阶数是%dn",n);

p=0;

}

}

for(i=1;i<=n;i++)

for(j=1;j<=n;j++) a[i][j]=0;

/*建立魔方*/

j=n/2+1;

a[1][j]=1;

for(k=2;k<=n*n;k++)

{

i=i-1;

j=j+1;

if((i<1)&&(j>n)){

i=i+2;

j=j-1;

}

else{

if(i<1) i=n;

if(j>n) j=1;

}

if(a[i][j]==0) a[i][j]=k;

else{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

/*输出*/

for(i=1;i<=n;i++){

for(j=1;j<=n;j++)

printf("%5d",a[i][j]);

printf("n");

}

}

7.8 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。

也可能没有鞍点。

#include

#define N 10

#define M 10

void main(){

int i,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;

printf("ninput row n:");

scanf("%d",&n);

printf("ninput column m:");

scanf("%d",&m);

for(i=0;i

printf("第%d行?n",i);

for(j=0;j

scanf("%d",&a[i][j]);

}

for(i=0;i

for(j=0;j

printf("%5d",a[i][j]);

printf("n");

}

flag2=0;

for(i=0;i

max=a[i][0];

for(j=0;j

if(a[i][j]>max)

{

max=a[i][j];

maxj=j;

}

for(k=0,flag1=1;k

if(max>a[k][maxj]) flag1=0;

if(flag1){

printf("n第%d行,第%d列的%d是鞍点n",i,maxj,max);

flag2=1;

}

}

if(!flag2)

printf("n矩阵中无鞍点!n");

}

7.9 有15 个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找

法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。

#include

#define N 15

void main()

{

int x,top,bot,middle,succ;

int a[N]={1,3,5,7,9,11,12,35,46,57,68,79,80,91,102};

printf("Enter x:");

scanf("%d",&x);

succ=0;

top=0;bot=N-1;

if((xa[N-1])) succ=-1;

while((succ==0)&&(top<=bot))

{

middle=(bot+top)/2;

if(x==a[middle])

{

succ=middle;

printf("%d location:%dn",x,succ+1);

}

else if(x

else top=middle+1;

}

if(succ==0||succ==-1)

printf("%d not in array.n",x);

}

7.10 有一篇文章,共有3 行文字,每行有80 个字符。要求分别统计出其中英文

大写字母、小写字母、数字、空格以及其他字符的个数。

#include

void main()

{ int i,j,upper,lower,digit,space,other;

char article[3][80];

i=j=upper=lower=digit=space=other=0;

for(i=0;i<3;i++)

{ printf("Input %d row:n",i);

gets(article[i]);

for(j=0;j<80&&article[i][j]!='0';j++)

{ if(article[i][j]>='A'&&article[i][j]<='Z')

upper++;

else if(article[i][j]>='a'&&article[i][j]<='z')

lower++;

else if(article[i][j]>='0'&&article[i][j]<='9')

digit++;

else if(article[i][j]==' ') space++;

else other++;

}

}

for(i=0;i<3;i++) puts(article[i]);

printf("upper=%dn",upper);

printf("lower=%dn",lower);

printf("digit=%dn",digit);

printf("space=%dn",space);

printf("other=%dn",other);

}

7.11 打印以下图案:

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

#include (可不写)

void main()

{

char a[6]="*****";

char space=' ';

int i,j,k;

for(i=0;i<5;i++)

{

for(j=0;j

printf("%c",space);

for(k=0;k<5;k++)

printf("%c",a[k]);

printf("n");

}

}


本文标签: 方阵 数组 要求 鞍点 存放