第七章C语言谭浩强答案Word格式文档下载.docx
- 文档编号:16212511
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:18
- 大小:29.87KB
第七章C语言谭浩强答案Word格式文档下载.docx
《第七章C语言谭浩强答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第七章C语言谭浩强答案Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
{if(a[i]!
=0&
&
a[j]!
=0)
if(a[j]%a[i]==0)
a[j]=0;
}/*非素数,赋值为0,“挖掉”*/
printf(“\n”);
for(i=2,n=0;
{if(a[i]!
{printf(“%5d”,a[i]);
n++;
}
if(n==10)/*此处if语句的作用是在输出10个数后换行*/
{printf(“\n”);
n=0;
}
运行结果:
235711131719232931374143
4753596167717379838997
7.2用选择法对10个整数排序(从小到大)。
选择排序的思路如下:
设有10个元素a[1]~a[10],将a[1]与a[2]~a[10]比较,若a[1]比a[2]~a[10]都小,则不进行交换,即无任何操作。
若a[2]~a[10]中有一个以上比a[1]小,则将其中最小的一个(假设为a[i])与a[1]交换,此时a[1]中存放了10个中最小的数。
第二轮将a[2]与a[3]~a[10]比较,将剩下9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第2小的数。
依此类推,共进行9轮比较,a[1]到a[10]就已按由小到大的顺序存放。
{inti,j,min,a[11];
printf(“Enterdata:
\n”);
for(i=1;
=10;
{printf(“a[%d]=”,i);
scanf(“%d”,&
a[i]);
/*输入10个数*/
printf(“\n”);
pritnf(“%5d”,a[i]);
/*输出这10个数*/
=9;
i++)/*以下8行是对10个数排序*/
{min=i;
for(j=i+1;
if(a[min]>
a[j])min=j;
a[0]=a[i];
/*以下3行将a[i+1]~a[10]中最小者与a[i]对换*/
a[i]=a[min];
a[min]=a[0];
printf(“\nThesortednumbers:
i++)/*输出已牌好序的10个数*/
printf(“%5d”,a[i]);
Enterdata:
a[1]=6↙
a[2]=90↙
a[3]=45↙
a[4]=56↙
a[5]=1↙
a[6]=15↙
a[7]=44↙
a[8]=78↙
a[9]=58↙
a[10]=101↙
6904556115447858101
Thesortednumber:
1615444556587890101
说明:
定义a数组有11个元素:
a[0]~a[10],但实际上只对a[1]~a[10]这10个元素输入值并排序,这样符合人们的习惯。
a[0]用作两数交换时的中间变量。
7.4有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
{inta[11]={1,4,6,9,13,16,19,28,40,100};
/*注意数组a长度应足够大,以便容纳新插入的元素*/
inttemp1,temp2,number,end,i,j;
printf(“arraya:
for(i=0;
10;
printf(“Insertdata:
”);
number);
end=a[9];
if(number>
end)
a[10]=number;
else
{for(i=0;
{if(a[i]>
number)/*找到合适的插入位置为i*/
{temp1=a[i];
a[i]=number;
11;
j++)/*将原来的第i个元素移至第i+1位置,其它顺序后移*/
{temp2=a[j];
a[j]=temp1;
temp1=temp2;
break;
printf(“Now,arraya:
printf(“%6d”,a[i]);
}
运行情况如下:
arraya:
14691316192840100
Insertdata:
5↙
Now,arraya:
145691316192840100
加以改进后,可以采用以下方法。
voidmain()
inta[11]={1,4,6,9,13,16,19,28,40,100};
printf("
\n"
);
%5d"
a[i]);
"
scanf("
%d"
&
for(i=9;
i>
a[i]>
number;
i--)/*从数组中最后一个数开始比较,凡大于number的数向后移动*/
a[i+1]=a[i];
a[i+1]=number;
/*将number插入到合适位置*/
7.6打印出以下的杨辉三角形(要求打印出10行)。
1
11
121
1331
14641
┇┇┇┇
杨辉三角形是(a+b)n展开后各项的系数。
例如:
(a+b)0展开后为1系数为1
(a+b)1展开后为a+b系数为1,1
(a+b)2展开后为a2+2ab+b2系数为1,2,1
(a+b)3展开后为a3+3a2b+3ab2+b3系数为1,3,3,1
(a+b)4展开后为a4+4a3b+6a2b2+4ab3+b4系数为1,4,6,4,1
以上就是杨辉三角形的前5行。
杨辉三角形各行的系数有以下规律:
各行第一个数都是1。
各行最后一个数都是1。
从第3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列2个数之和。
例如第4行第2个数(3)是第3行第2个数
(2)和第3行第1个数
(1)之和。
可以这样表示:
a[i][j]=a[i-1][j]+a[i-1][j-1],其中i为行数,j为列数。
#defineN11
{inti,j,a[N][N];
N;
{a[i][i]=1;
a[i][1]=1;
for(i=3;
for(j=2;
=i-1;
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;
{for(j=1;
=i;
printf(“%6d”,a[i][j]);
printf(“\n”);
15101051
1615201561
172135352171
18285670562881
193684126126843691
7.7输出魔方阵。
所谓魔方阵是指这样的方阵(方阵的阶数应为奇数),它的每一行、每一列和对角线之和均相等。
例如,三阶魔方阵为
要求输出由1~n2之间的自然数构成的魔方阵。
魔方阵中各数的排列规律如下:
将1放在第一行中间一列。
从2开始直到n×
n止各数依次按下列规则存放:
每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)。
如果上一个数的行数为1,则下一个数的行数为n(指最下一行),列数同样加1。
例如,1在第1行第2列,则2应放在最下一行第3列。
当上一个数的列数为n时,下一个数的列数应为1,行数同样减1。
例如2在第3行最后一列,则3应放在第2行第1列。
如果按上面规则确定的位置上已经有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
例如,按上面的规定,4应该放在第1行第2列,但该位置已经被1占据,所以4就放在3的下面。
由于6是第1行第3列(即最后一列),故7放在6的下面。
按此方法可以得到任何的魔方阵。
inta[16][16],i,j,k,p,n;
p=1;
while(p==1)
{
Entern(n=1to15):
n);
if(n!
n<
=15&
n%2!
=0)/*要求阶数为1至15之间的奇数*/
p=0;
}/*初始化,第0行和第0列不用,与魔方阵构造规则一致*/
for(i=1;
=n;
for(j=1;
a[i][j]=0;
j=n/2+1;
a[1][j]=1;
for(k=2;
k<
=n*n;
k++)
i--;
j++;
if(i<
1&
j>
n)
i+=2;
j--;
else
1)i=n;
if(j>
n)j=1;
if(a[i][j]==0)
a[i][j]=k;
}/*输出魔方阵*/
%7d"
a[i][j]);
system("
pause"
7.8找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。
也可能没有鞍点。
一个二维数组最多有一个鞍点,也可能没有。
解题思路是:
先找出一行中值最大的元素,然后检查它是否该列中的最小值,如果是,则是鞍点(不需要再找别的鞍点了),输出该鞍点;
如果不是,则再找下一行的最大数,……。
如果每一行的最大数都不是鞍点,则该数组无鞍点。
#defineN10
#defineM10
{inti,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;
printf(“\n输入行数n:
printf(“\n输入列数m:
m);
n;
{printf(“第%d行?
\n”,i);
for(j=0;
m;
a[i][j]);
{for(j=0;
printf(“%5d”,a[i][j]);
flag2=0;
{max=a[i][0];
if(a[i][j]>
max)
{max=a[i][j];
maxj=j;
for(k=0,flag1=1;
n&
flag1;
if(max>
a[k][maxj])
flag=0;
if(flag1)
{printf(“\n第%d行,第%d列的%d是鞍点\n”,i,maxj,max);
flag2=1;
if(!
flag2)
printf(“\n矩阵中无鞍点!
输入行数n:
3↙
输入列数m:
4↙
第0行?
1234↙
第1行?
4556↙
第2行?
3567↙
1234
4536
3567
第0行,第3列的4是鞍点
24907↙
3458↙
9123↙
24907
3458
9123
矩阵中无鞍点!
7.9有15个数按从小到大的顺序存放在一个数组中。
输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。
如果该数不在数组中,输出“不在表中”。
折半查找是一种效率较高的查找方法,但前提是待查找的序列必须有序。
其思路是:
假定待查找序列按从大到小排列,设变量low指向待查找区间的下限(一开始时指向第一个元素),变量high指向待查找区间的上限(一开始时指向最后一个元素),令变量
,将待查找元素与mid所指元素比较,若相等,则查找成功;
若小于,由于待查找序列按从大到小排列,可以断定待查找元素只可能在mid+1~high区间,令low=mid+1,查找区间缩小一半,然后继续在此区间进行折半查找;
类似的,若大于,则令high=mid-1。
如此反复进行,如果出现low>
high,则表示查找失败,即序列中不存在待查找元素。
下面的程序演示了随机产生N-1个0~99的整数,存放在数组[1]~[N-1]单元中,主要为了与人的习惯一致,即第1个元素存放位置是[1]号单元。
然后进行冒泡法排序,最后根据用户输入的数据进行折半查找(可进行多次)。
#defineN16
intarray[N],i,j,number,low,high,mid;
charch;
Theoriginalarrayis:
array[i]=rand()%100;
/*产生并显示N-1个0~99的随机整数,存放在数组[1]~[N-1]单元中*/
%3d"
array[i]);
/*冒泡法排序*/
N-i;
if(array[j]<
array[j+1])
array[0]=array[j];
array[j]=array[j+1];
array[j+1]=array[0];
/*显示排序后的数列*/
Thesortedarrayis:
/*折半查找,可进行多次*/
while
(1)
\nPleaseinputthenumberwhichyouwanttolookfor:
low=1;
high=N-1;
while(low<
=high)
mid=(low+high)/2;
if(array[mid]==number)
%dhasbeenfoundatposition%d.\n"
number,mid);
elseif(number<
array[mid])
low=mid+1;
high=mid-1;
if(low>
high)
Cannotfind%d.\n"
number);
Doyouwanttofindanothernumber?
(Y/y):
%c"
ch);
/*注意%c前面有一个空格,为了虑除以前的回车符,否则循环只能执行一次*/
if(ch!
='
Y'
&
ch!
y'
)
7.11(byAmy)
#include"
stdio.h"
#include"
math.h"
string.h"
#defines'
*'
chara[5][9];
inti,j;
for(i=0;
5;
for(j=0;
i+5;
if(j<
i)printf("
"
elseprintf("
%c"
s);
);
getch();
7.12有一行电文,已按下面规律译成密码:
A→Za→z
B→Yb→y
C→Xc→x
┇┇
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。
非字母字符不变。
要求编程序将密码译回原文,并打印出密码和原文。
字符ch[j]如果时大写字母,则它是第(ch[j]-64)个大写字母。
若c[j]的值是大写字母’B’,它的ASCII码为66,它应是第(66-64)=2个大写字母。
按密码规定应将它转换为第(26-i+1)个大写字母。
而26-i+1=26-(ch[j]-64)+1=26+64-ch[j]+1,即91-ch[j](如c[j]等于’B’,91-’B’=91-66=25,C[j]应与第25个大写字母对换)。
该字母的ASCII码为91-ch[j]+64,即25+64=89,89是’Y’的ASCII码。
可以表示为155-ch[j]。
小写字母情况与此相似,但由于’a’的ASCII码为97,因此公式应改为26+96-ch[j]+1+96=123-ch[j]+96=219-ch[j]。
若ch[j]的值为’b’,则其交换对象为219-‘b’=219-98=121,它是’y’的ASCII码。
由于此密码的规律是对称交换,即第一个字母与最后一个字母交换,第二个字母与倒数第二个字母交换┅┅因此从原文译为密码和从密码译为原文,都是用同一个公式。
#Include<
stdio.h>
{intj,n;
charch[80],tran[80];
printf(“\nInputciphercode:
gets(ch);
printf(“\n\cipercode:
%s”,ch);
j=0;
while(ch[j]!
=’0’)
{if((ch[j]>
=’A’)&
(ch[j]<
=’Z’))
tran[j]=155-ch[j];
elseif((ch[j]>
=’a’)&
=’z’))
tran[j]=219-ch[j];
tran[j]=ch[j];
n=j;
printf(“\noriginaltext:
for(j=0;
putchar(tran[j]);
Inputciphercode:
RdrooerhrgXsrmzmvcgdvvp.↙
ciphercode:
RdrooerhrgXsrmzmvcgdvvp.
originaltext:
IwillvisitChinanextweek.
7.13编一个程序,将两个字符串连接起来,不要用strcat函数。
{chars1[80],s2[40];
inti=0,j=0;
printf(“\nInputstring1:
scanf(“%s”,s1);
printf(“Inpurstring2:
scanf(“%s”,s2);
while(s1[i]!
=’\0’)
i++;
while(s2[j]!
s1[i++]=s2[j++];
s1[i]=’\0’;
printf(“Thenewstringis:
%s”,s1);
Inputstring1:
country↙
Inputstring2:
side↙
Thenewstringis:
countryside
7.14编一个程序,将两个字符串s1和s2进行比较。
如果s1>
s2,输出一个正数;
s1=s2,输出0;
s1<
s2,输出一个负数。
不要用strcmp函数。
两个字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 语言 谭浩强 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)