admin 管理员组

文章数量: 887032


2023年12月24日发(作者:单片机switch语句用法)

C语言程序设计第四版第六章答案_谭浩强

1、用筛选法求100之内的素数。解:

#include

#include

int main()

{int i,j,n,a[101];

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

a[i]=i;

a[1]=0;

for (i=2;i

p="">

for (j=i+1;j<=100;j++)

{if(a[i]!=0 && a[j]!=0)

if (a[j]%a[i]==0)

a[j]=0;

}

printf("");

for (i=2,n=0;i<=100;i++)

{ if(a[i]!=0)

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

n++;

}

if(n==10)

{printf("");

n=0;

}

}

printf("");

return 0;

bdsfid="73"

}

2、用选择法对10整数排序。解:

#include

int main()

{int i,j,min,temp,a[11];

printf("enter data:");

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

{printf("a[%d]=",i);

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

}

printf("");

printf("The orginal numbers:");

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

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

printf("");

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

{min=i;

for (j=i+1;j<=10;j++)

if (a[min]>a[j]) min=j;

temp=a[i];

a[i]=a[min];

a[min]=temp;

}

printf("The sorted numbers:");

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

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

printf("");

return 0;

}

3、求一个3×3的整型矩阵对角线元素之和。解:

#include

int main()

{

int a[3][3],sum=0;

int i,j;

printf("enter data:");

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

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

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

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

sum=sum+a[i][i];

printf("sum=%6d",sum);

}

4、有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。

解:

#include

int main()

{ int a[11]={1,4,6,9,13,16,19,28,40,100};

int temp1,temp2,number,end,i,j;

printf("array a:");

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

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

printf("");

printf("insert data:");

scanf("%d",&number);

end=a[9];

if (number>end)

a[10]=number;

else

{for (i=0;i<10;i++)

{if (a[i]>number)

{temp1=a[i];

a[i]=number;

for (j=i+1;j<11;j++)

{temp2=a[j];

a[j]=temp1;

temp1=temp2;

}

break;

}

}

}

printf("Now array a:");

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

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

printf("");

}

5、将一个数组中的值按逆序重新存放。例如,原来顺序为8、

6、5、4、1。要求改为1、4、5、6、8。

解:

#include "stdio.h"

#define N 5

void main()

{ int a[N],i,temp;

printf("enter arry a:");

for(i=0;i

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

printf("arry a:");

for(i=0;i

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

for(i=0;i<="" bdsfid="188" p="">

{ temp=a[i];

a[i]=a[N-i-1];

a[N-i-1]=temp;

}

printf("Now,arry a:");

for(i=0;i

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

printf("");

}

6、输出以下的杨辉三角形(要求输出10行)。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

解:

#include "stdio.h"

void main()

{ int i,j,n=0,a[31][31]={0};

while(n<1||n>30) /*最多可输出30行*/

{printf("请输入杨辉三角形的行数:");

scanf("%d",&n);

}

for(i=0;i

a[i][0]=1; /*第一列全置为一*/

for(i=1;i

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

a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/

for(i=0;i<="" bdsfid="221" p="">

{ for(j=0;j<=i;j++)

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

printf("");

}

}

7、输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

解:

#include

int main()

{ int a[15][15],i,j,k,p,n;

p=1;

while(p==1)

{printf("enter n(n=1--15):");

scanf("%d",&n);

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

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("");

}

return 0;

}

8、找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。

解:

#include

#define N 4

#define M 5 /* 数组为4行5列*/

int main()

{

int i,j,k,a[N][M],max,maxj,flag;

printf("please input matrix:");

for (i=0;i<="" bdsfid="285" p="" 输入数组*="">

for (j=0;j

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

for (i=0;i

{max=a[i][0]; /* 开始时假设a[i][0]最大*/

maxj=0; /* 将列号0赋给maxj保存*/

for (j=0;j<="" bdsfid="294" p="" 找出第i行中的最大数*="">

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

{max=a[i][j]; /* 将本行的最大数存放在max中*/

maxj=j; /* 将最大数所在的列号存放在maxj中*/

}

flag=1; /* 先假设是鞍点,以flag为1代表*/

for (k=0;k

if (max>a[k][maxj]) /* 将最大数和其同列元素相比*/

{flag=0; /* 如果max不是同列最小,表示不是鞍点令flag1为0

*/

continue;}

if(flag) /* 如果flag1为1表示是鞍点*/

{printf("a[%d][%d]=%d",i,maxj,max); /* 输出鞍点的值和所在行列号*/

break;

}

}

if(!flag) /* 如果flag为0表示鞍点不存在*/

printf("It is not exist!");

return 0;

}

9、有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。

解:

#include

#define N 15

int main()

{ int i,number,top,bott,mid,loca,a[N],flag=1,sign;

char c;

printf("enter data:");

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

i=1;

while(i

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

if (a[i]>=a[i-1])

i++;

else

printf("enter this data again:");

}

printf("");

for (i=0;i

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

printf("");

while(flag)

{printf("input number to look for:");

scanf("%d",&number);

sign=0;

top=0; //top是查找区间的起始位置

bott=N-1; //bott是查找区间的最末位置

if ((numbera[N-1])) //要查的数不在查找区间内

loca=-1; // 表示找不到

while ((!sign) && (top<=bott))

{mid=(bott+top)/2;

if (number==a[mid])

{loca=mid;

printf("Has found %d, its position is %d",number,loca+1);

sign=1;

}

else if (number

bott=mid-1;

else

top=mid+1;

}

if(!sign||loca==-1)

printf("cannot find %d.",number);;

printf("continu or not(Y/N)?");

scanf(" %c",&c);

if (c=='N'||c=='n')

flag=0;

}

return 0;

}

10、有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。解:

#include "stdio.h"

void main()

{ int i,j,upp,low,dig,spa,oth;

char text[3][80];

upp=low=dig=spa=oth=0;

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

{ printf("please input line %d:",i+1);

gets(text[i]);

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

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

upp++;

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

low++;

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

dig++;

else if (text[i][j]==' ')

spa++;

else

oth++;

}

}

printf("upper case:%d",upp);

printf("lower case:%d",low);

printf("digit :%d",dig);

printf("space :%d",spa);

printf("other :%d",oth);

}

11、输出以下图案:

* * * * *

* * * * *

* * * * *

* * * * *

* * * * * 解:

#include

int main()

{ char a[5]={'*','*','*','*','*'};

int i,j,k;

char space=' ';

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

{ printf("");

printf(" ");

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

printf("%c",space);

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

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

}

printf("");

return 0;

}

12、有一行电文,已按下面规律译成密码:

A →Z a →z

B →Y b →y

C →X c →x

. .

. .

. .

即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。

解:

(1)

#include

int main()

{ int j,n;

char ch[80],tran[80];

printf("input cipher code:");

gets(ch);

printf("cipher code :%s",ch);

j=0;

while (ch[j]!='0')

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

tran[j]=155-ch[j];

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

tran[j]=219-ch[j];

else

tran[j]=ch[j];

j++;

}

n=j;

printf("original text:");

for (j=0;j

putchar(tran[j]);

printf("");

return 0;

}

(2)

#include

int main()

{int j,n;

char ch[80];

printf("input cipher code:");

gets(ch);

printf("cipher code:%s",ch);

j=0;

while (ch[j]!='0')

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

ch[j]=155-ch[j];

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

ch[j]=219-ch[j];

else

ch[j]=ch[j];

j++;

}

n=j;

printf("original text:");

for (j=0;j

putchar(ch[j]);

printf("");

return 0;

}

13、编一程序,将两个字符串连接起来,不要用strcat函数。

解:

#include

int main()

{ char s1[80],s2[40];

int i=0,j=0;

printf("input string1:");

scanf("%s",s1);

printf("input string2:");

scanf("%s",s2);

while (s1[i]!='0')

i++;

while(s2[j]!='0')

s1[i++]=s2[j++];

s1[i]='0';

printf("The new string is:%s",s1);

return 0;

}

14、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<="">

解:

#include

int main()

{ int i,resu;

char s1[100],s2[100];

printf("input string1:");

gets(s1);

printf("input string2:");

gets(s2);

i=0;

while ((s1[i]==s2[i]) && (s1[i]!='0'))i++;

if (s1[i]=='0' && s2[i]=='0')

resu=0;

else

resu=s1[i]-s2[i];

printf("esult:%d.",resu);

return 0;

}

15、编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,‘/0’后面的字符不复制。

解:

#include

#include

main()

{

int i;

char str1[100],str2[100];

printf("input string 2:");

scanf("%s",str2);

for(i=0;i<=strlen(str2);i++)

str1[i]=str2[i];

printf("str1:%s",str1);

}


本文标签: 数组 字符 要求 鞍点