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

1.用筛选法求100以内的素数。

#include <stdio.h>
#include <math.h>
void main()
{
int i,j,a[100],b[100];
for (i=1;i<=100;i++)
{
a[i]=i+1;
for (j=1;j<sqrt(a[i]);j++)
{
b[j]=j+1;
if(a[i]%b[j]==0) break;
}
if(a[j]>sqrt(a[i]))
printf("%3d",a[i]);
}
}

C语言程序设计第五版 谭浩强 答案
2.用选择法队10个整数排序。

#include<stdio.h>
void main()
{
int i,j,a[10],t;
printf("please erter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(j=1;j<10;j++)
{
for(i=0;i<(9-j);i++)
if(a[i]>a[i+1])
{
a[i+1]=t;
a[i+1]=a[i];
a[i]=t;
}
}
printf("from small to large:");
for(i=0;i<10;i++)
printf("%3d",a[i]);
}

3.求一个3*3的整型矩阵对角线元素之和。谭浩强C语言程序设计第五版答案

#include<stdio.h>
void main()
{
int a[3][3]={{1,2,3},{2,4,6},{3,6,9}};
int m,n,sum;
for(m=0;m<3;m++)
{
for(n=0;n<3;n++)
sum=a[0][0]+a[0][2]+a[1][1]+a[2][0]+a[2][2];
}
printf("%d",sum);
}

谭浩强C语言程序设计第五版答案
4.有一个已排好序的数组,要求输入一个数后,按原来的规律将它插入数组中。

#include<stdio.h>
void main()
{
int a[5]={2,4,5,7,9};
int b,i,t;
printf("please erter an integer number:\n");
scanf("%d",&b);
for(i=0;i<5;i++)
{
if(b<a[i])
{
t=a[i];
a[i]=b;
b=t;
}
printf("%3d",a[i]);

}
printf("%3d",b);
}

谭浩强C语言程序设计第五版
5.讲一个数组的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8.

  #include<stdio.h>
void main()
{
int a[5]={8,6,5,4,1};
int i;
for(i=4;i>=0;i--)
printf("%d\t",a[i]);
}

谭浩强答案
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>
int main()
{
int a[11][11];
int i, j;
for (i=1; i<=10; i++){
for (j=1; j<=10; j++){
if (j==1)
a[i][j]= 1;
else if (j>i){
a[i][j]=0;
break;
}
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
if (a[i][j]!=0)
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}

要求输出1-n*n的魔方阵
既输出的方阵的每一行,每一列,对角线的和都相等 例如:
8 1 6
3 5 7
4 9 2

#include<stdio.h>
#define MAX 15
int main() {
int n;
int m = 1;
int i, j;
int a[MAX][MAX];
scanf("%d", &n);

i = 0;
j = (n + 1) / 2 - 1; //(1)
while (m <= n * n) { //(2)
a[i][j] = m;
m++;
i--;
j++;
if ((m - 1) % n == 0 && m > 1) {
i = i + 2; //(3)
j = j - 1;
}

if (i < 0) //超出上界
i = i + n; //(4)
if (j > (n - 1)) //超出右边界
j = j - n; //(5)
}

for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%d\t", a[i][j]);
printf("\n");
}
return 0;
}

谭浩强答案C语言程序设计第五版
8.找出一个二维数组中的鞍点,即该位置上的元素在该行最大、该列最小、也可能无鞍点。

#include <stdio.h>
#define N 4
#define M 5 /* 数组为4行5列 */
int main()
{
int i,j,k,a[N][M],max,maxj,flag;
printf("please input matrix:\n");
for (i=0;i<N;i++) /* 输入数组 */
for (j=0;j<M;j++)
scanf("%d",&a[i][j]);
for (i=0;i<N;i++)
{max=a[i][0]; /* 开始时假设a[i][0]最大 */
maxj=0; /* 将列号0赋给maxj保存 */
for (j=0;j<M;j++) /* 找出第i行中的最大数 */
if (a[i][j]>max)
{max=a[i][j]; /* 将本行的最大数存放在max中 */
maxj=j; /* 将最大数所在的列号存放在maxj中 */
}
flag=1; /* 先假设是鞍点,以flag为1代表 */
for (k=0;k<N;k++)
if (max>a[k][maxj]) /* 将最大数和其同列元素相比 */
{flag=0; /* 如果max不是同列最小,表示不是鞍点令flag1为0 */
continue;}
if(flag) /* 如果flag1为1表示是鞍点 */
{printf("a[%d][%d]=%d\n",i,maxj,max); /* 输出鞍点的值和所在行列号 */
break;
}
}
if(!flag) /* 如果flag为0表示鞍点不存在 */
printf("It is not exist!\n");
return 0;
}

9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。谭浩强答案C语言程序设计第五版

#include <stdio.h>
int main()
{
int a[15]={98,64,58,53,51,46,43,38,31,29,25,10,5,-8,-12};
int i,n;
printf("数组中数据如下: \n");
for(i=0;i<15;i++)
printf("%5d",a[i]);
printf("\n");
printf("你想要查找的数字为: ");
scanf("%d",&n);
if(a[14]<=n<=a[0])
{
if (n==a[7])
i=8;
else if(n<a[7])
{
if(n==a[11])
i=12;
else if(n<a[11])
{
if(n==a[13])
i=14;
else if(n<a[13])
i=15;
else i=13;
}
else
{
if(n==a[9])
i=10;
else if(n<a[9])
i=11;
else i=9;
}
}
else
{
if(n==a[3])
i=4;
else if(n<a[3])
{
if(n==a[5])
i=6;
else if(n<a[5])
i=7;
else i=5;
}
else
{
if(n==a[1])
i=2;
else if(n<a[1])
i=3;
else i=1;
}
}
printf("\n");
printf("%d是此数组中第%d个元素的值",n,i);
printf("\n");
}
else printf("data error!");
return 0;
}

谭浩强答案C语言程序设计第五版10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母,小写字母,数字,空格以及其他字符的个数。

#include<stdio.h>
#include<string.h>
main()
{
char word[3][80];
int i,j,a,b,c,d,e;
a=b=c=d=e=0;
printf("输入3行文字:\n");
for(i=0;i<3;i++)
{
gets(word[i]);
for(j=0;j<80&&word[i][j]!='\0';j++)
{
if(word[i][j]>='A'&&word[i][j]<='Z') a++;
else if(word[i][j]>='a'&&word[i][j]<='z') b++;
else if(word[i][j]>='0'&&word[i][j]<='9') c++;
else if(word[i][j]==' ') d++;
else e++;
}
}
printf("大写字母%d个\n小写字母%d个\n数字%d个\n空格%d个\n其他字符%d个\n",a,b,c,d,e);
return 0;
}

11.输出以下图案:

   *  *  *  *  *  *
* * * * *
* * * *
*



#include<stdio.h>
void main()
{
char str[]={"*****"};
int i,k;
for(i=1;i<=5;i++)
{
printf("%s\n",str);
for(k=1;k<=i;k++)
{
char c=32;
printf("%c",c);
}
}
}

12.有一行电文,已按下面规律译成密码:
A->Z a->z
B->Y b->y
C->X c->x
…… …………
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母不变。要求编程序将密码译回原文,并输出密码和原文。

#include<stdio.h>
#include<string.h>
void main()
{
char a[10],b[10];
int i;
printf("输入一行电文:\n");
gets(a);
for(i=0;a[i]!='\0';i++)
{
if('A'<=a[i]&&a[i]<='Z') b[i]=155-a[i];//'A'+'Z'=155
else if('a'<=a[i]&&a[i]<='z') b[i]=219-a[i];//'a'+'z'=219
else b[i]=a[i];
}
b[i]=0;
printf("原密码为:\n");
puts(a);
printf("密码翻译成原文为:\n");
puts(b);
}

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

#include<stdio.h>
void main()
{
char a[10],b[10],c[20];
int i,j;
printf("输入两个字符串:\n");
gets(a);
gets(b);
for(i=0;a[i]!='\0';i++)
c[i]=a[i];
for(j=0;b[j]!='\0';j++)
c[i+j]=b[j];
c[i+j+1]='\0';
printf("两字符串连接后的字符串为:%s\n",c);
}

14.编一个程序,将两个字符串s1和s2进行比较。如果s1>s2,输出一个正数;s1=s2输出0;s1

include<stdio.h>
int main()
{
char s1[100],s2[100];
printf("请输入s1:");
gets(s1);
printf("请输入s2:");
gets(s2);
int i,num=0;
for(i=0;s1[i]!='\0'||s2[i]!='\0';i++)
{
printf("s1[%d]=%d\n",i,s1[i]);
printf("s2[%d]=%d\n",i,s2[i]);
num=num+s1[i]-s2[i];
printf("\n");
}
printf("结果是:%d\n\n",num);
return 0;
}

15.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数,复制时,’\0’也要复制过去,’\0’后的字符不复制。

#include<stdio.h>
main()
{
char s1[10],s2[10];
int i;
printf("输入s2字符串:\n");
gets(s2);
for(i=0;s1[i]=s2[i];i++);
printf("s2字符串输出:\n");
printf("%s",s1);
}

更多相关文章

​C语言程序设计第五版 谭浩强 第五章 答案​