您的位置:首页 > 编程语言

谭浩强《C程序设计》(第三版)部分习题答案—第七章

2012-05-24 16:39 651 查看
7.1用筛选法求100之内的素数。
代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
int i,j;
for(i=1;i<=100;i++)
{
for(j=2;j<=sqrt((float)i);j++)
{
if(0==i%j)
break;
}
if(j>sqrt((float)i))
printf("%d ",i);
}
}PS:由于VS2010中的math.h文件给出了sqrt()函数的重载,故这里调用sqrt()时,参数需要强制转换以说明调用哪一个sqrt()函数。

7.2 用选择法对10个整数排序。
代码如下:#include<stdio.h>
void main()
{
int a[10],i,j,k;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=9;i>0;i--)
{
for(j=0;j<i;j++)
{
if(a[j]<a[j+1])
{
k=a[j+1];
a[j+1]=a[j];
a[j]=k;
}
}
}
for(i=0;i<10;i++)
printf("%d ",a[i]);
}

7.4 已有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
代码如下:#include<stdio.h>
void main()
{
int a[10],i,j,t;
for(i=0;i<9;i++)
scanf("%d",&a[i]);
scanf("%d",&t);
for(i=0;i<9;i++)
{
if(a[i]>t)
{
j=a[i];
a[i]=t;
t=j;
}
}
a[9]=t;
for(i=0;i<10;i++)
printf("%d",a[i]);
}
7.5 将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
代码如下:
#include<stdio.h>
void main()
{
int a[5],i,j;
for(i=0;i<5;i++)
scanf("%d",&a[i]);
for(i=0;i<=(5-1)/2;i++)
{
j=a[i];
a[i]=a[4-i];
a[4-i]=j;
}
for(i=0;i<5;i++)
printf("%d ",a[i]);
}

7.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 a[10][10]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}},i,j;
printf("%d",a[0][0]);
for(i=1;i<10;i++)
{
printf("\n%-8d",a[i][0]);
for(j=1;j<=i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("%-8d",a[i][j]);
}
}
}
7.7 输出“魔方阵”。所谓魔方阵是指这样的矩阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为:
8   1   6
3   5   7
4   9   2
要求输出1~n²的自然数构成的魔方阵。
代码如下:
#include<stdio.h>
void main()
{
int a[15][15]={0},i,j,k,n,p=1,m,q;
while(1==p)
{
scanf("%d",&n);
if(n>0&&n<=15&&0!=n%2)
p=0;
}
i=0;
j=n/2;
a[i][j]=1;
for(k=2;k<=n*n;k++)
{
m=i;
q=j;
i--;
j++;
if(i<0)
i=n-1;
if(j>n-1)
j=0;
if(0==a[i][j])
a[i][j]=k;
else
{
i=m+1;
j=q;
a[i][j]=k;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
}
7.8 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。
代码如下:
#include<stdio.h>
void main()
{
int a[5][5],i,j,k,max,min,index_column,index_row,flag=0;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
for(i=0;i<5;i++)
{
max=a[i][0];
index_column=0;
for(j=0;j<4;j++)
{
if(max<a[i][j+1])
{
max=a[i][j+1];
index_column=j+1;
}
}
min=a[0][index_column];
index_row=0;
for(k=0;k<4;k++)
{
if(min>a[k+1][index_column])
{
min=a[k+1][index_column];
index_row=k+1;
}
}
if(i==index_row)
{
flag++;
printf("鞍点为:a[%d][%d]=%d ",index_row,index_column,max);
}
}
if(0==flag)
printf("数组内无鞍点\n");
}

7.9 有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
代码如下:
#include<stdio.h>
void main()
{
int a[15],first=0,last=14,i,s;
for(i=0;i<15;i++)
scanf("%d",&a[i]);
scanf("%d",&s);
while(first<=last)
{
i=(first+last)/2;
if(a[i]==s)
{ printf("该数是数组中第%d个元素:%d\n",i+1,a[i]);
break;
}
else
if(a[i]>s)
first=i+1;
else
last=i-1;
}
if(first>last)
printf("无此数\n");
}

7.10 有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
代码如下:
#include<stdio.h>
void main()
{
char str[3][80];int i,j,k=0,l=0,m=0,n=0,p=0;
for(i=0;i<3;i++)
gets(str[i]);
for(i=0;i<3;i++)
{
for(j=0;'\0'!=str[i][j];j++)
{
if(str[i][j]>='A'&&str[i][j]<='Z')k++;
else if(str[i][j]>='a'&&str[i][j]<='z')l++;
else if(str[i][j]>='0'&&str[i][j]<='9')m++;
else if(' '==str[i][j])n++;
else p++;
}
}
printf("大写字母个数为%d,小写字母个数为%d,数字个数为%d,空格个数为%d,其它字符个数为%d。\n",k,l,m,n,p);
}
7.12 有一行电文,已按下面规律译成密码:
A→Z     a→z
B→Y     b→y
C→X     c→x
   …     …

即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。要求编程将密码译回原文,并输出密码和原文。
代码如下:
#include<stdio.h>
void main()
{
char a[100],b[100];int i;
gets(a);
for(i=0;'\0'!=a[i];i++)
{
if(a[i]>='A'&&a[i]<='Z')
b[i]=155-a[i];
else if(a[i]>='a'&&a[i]<='z')
b[i]=219-a[i];
else b[i]=a[i];
}
b[i]='\0';
printf("%s\n%s\n",a,b);
}

7.13 编一程序,将两个字符串连接起来,不要用strcat函数。代码如下:
#include<stdio.h>
void main()
{
char a[100],b[100],c[100];
int i,j;
gets(a),gets(b);
for(i=0;'\0'!=a[i];i++)
{
c[i]=a[i];
}
for(j=0;'\0'!=b[j];j++)
{
c[i]=b[j];
i++;
}
c[i]='\0';
printf("%s\n",c);
}

7.14 编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读取。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,“A”与“C”相比,由于“A”<“C”,应输出负数,同时由于‘A’与‘C’的ASCII码差值为2,应此应输出“-2”。同理:“And”和“Aid”比较,根据第2个字符比较结果,“n”比“i”大5,应此应输出“5”。
代码如下:
#include<stdio.h>
void main()
{
char str1[100],str2[100];
int i,j;
gets(str1),gets(str2);
for(i=0;'\0'!=str1[i]&&'\0'!=str2[i];i++)
{
if(str1[i]>str2[i]||str1[i]<str2[i])
{
j=str1[i]-str2[i];
break;
}
else
{
j=0;
}
}
if(0==j)
printf("str1=str2\n");
else if(j>0)
printf("str1>str2,差值为%d\n",j);
else
printf("str1<str2,差值为%d\n",j);
}
7.15 编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,‘\0’也要复制过去。‘\0’后面的字符不复制。
代码如下:
#include<stdio.h>
#include<string.h>
void main()
{
char s1[100],s2[100];
int i,j;
gets(s2);
j=strlen(s2);
for(i=0;i<j;i++)
s1[i]=s2[i];
s1[i]='\0';
printf("s1:%s",s1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c math.h float mina 编程 ini