c程序设计第四版谭浩强第八章答案.docx
《c程序设计第四版谭浩强第八章答案.docx》由会员分享,可在线阅读,更多相关《c程序设计第四版谭浩强第八章答案.docx(28页珍藏版)》请在冰点文库上搜索。
c程序设计第四版谭浩强第八章答案
#include
#include
#include
#include
/*
intmain()
{
int*p1,*p2,*p3,*t,a,b,c;
printf("enterthreenumber:
");
scanf("%d%d%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
if(a>b)
{t=p1;p1=p2;p2=t;}
if(a>c)
{t=p1;p1=p3;p3=t;}
if(b>c)
{t=p2;p2=p3;p3=t;}
printf("sortnumber:
%d%d%d\n",*p1,*p2,*p3);
}
*/
/*
#defineN20
intmain()
{
char*p1,*p2,*p3,*t,a[N],b[N],c[N];
printf("enterthreestrings:
");
scanf("%s%s%s",a,b,c);
p1=a;p2=b;p3=c;
if(strcmp(a,b)>0)
{t=p1;p1=p2;p2=t;}
if(strcmp(a,c)>0)
{t=p1;p1=p3;p3=t;}
if(strcmp(b,c)>0)
{t=p2;p2=p3;p3=t;}
printf("sortstring:
%s%s%s\n",p1,p2,p3);
}
*/
/*
voidinput(int*p)
{
inti;
printf("enter10number:
");
for(i=0;i<10;i++)
scanf("%d",p+i);
}
voidoutput(int*p)
{
inti;
printf("new10number:
");
for(i=0;i<10;i++)
printf("%-2d",*(p+i));
}
voidsort(int*p,intn)
{
inti,t;
for(i=0;i{
if(*(p+i)>*(p+i+1))
{t=*(p+i);*(p+i)=*(p+i+1);*(p+i+1)=t;}
}
for(i=n-2;i>0;i--)
{
if(*(p+i-1)>*(p+i))
{t=*(p+i);*(p+i)=*(p+i-1);*(p+i-1)=t;}
}
}
intmain()
{
inta[10],*p=a;
input(p);
sort(p,10);
output(p);
putchar('\n');
}
*/
/*
#defineN10
voidhouyi(int*p,intm)
{
inti,b[N]={0};
for(i=0;ib[i+m]=*(p+i);
for(;ib[i-N+m]=*(p+i);
for(i=0;iprintf("%3d",b[i]);
}
intmain()
{
inta[N],i,m,*p=a;
printf("enternumber:
");
for(i=0;iscanf("%d",&a[i]);
printf("enterm:
");
scanf("%d",&m);
printf("newnumber:
");
houyi(p,m);
putchar('\n');
}
*/
/*
intmain()
{
intcount(int*p,intn);
intn,*p,i;
printf("enternumber:
");
scanf("%d",&n);
p=(int*)calloc(n,sizeof(int));
for(i=0;i*(p+i)=0;
printf("thelastnumberis%d\n",count(p,n)+1);
free(p);
}
intcount(int*p,intn)
{
inti,j=1,k=0;
for(i=0;i{
if(*(p+i)!
=3)
{
*(p+i)=j;
if(*(p+i)==3)
j=1;//数到3时将下一个重置为1
else
j+=1;
if(i==(n-1))
i=-1;//轮到到最后一个人报数时,将i重置为-1,执行完for语句后自动加一变为0,从头开始
k+=1;//报完一个数后加一
}
else
{
if(i==(n-1))
i=-1;//检查到最后一个人是3时,将i重置为-1,执行完for语句后自动加一变为0,从头开始
continue;//检查到这个人是3时,跳过报数
}
if(k==3*(n-1))//报数的总个数达到3*(n-1)时,就只剩一个人了
break;
else
continue;
}
for(i=0;iif(*(p+i)==3)
continue;
elsereturni;
}
*/
/*
#defineN20
intlength(char*p)
{
intn=0;
while(*p!
=0)
{
p++;
n+=1;
}
returnn;
}
intmain()
{
chara[N],*p=a;
printf("enterstring:
");
gets(a);
printf("字符串长度为:
%d\n",length(p));
}
*/
/*
#defineN10
intmain()
{
voidcopyn(char*p,intm);
char*p="abcdefghij";
intm;
printf("%s\nenterm:
",p);
scanf("%d",&m);
copyn(p,m);
}
voidcopyn(char*p,intm)
{
charb[N],i;
for(i=m-1;*(p+i);i++)
b[i-m+1]=*(p+i);
b[i-m+1]='\0';
printf("%s\n",b);
}
*/
/*
#defineN50
voidcount(char*p)
{
intd=0,x=0,k=0,s=0,o=0;
while(*p)//不能写*(p++),否则计算出错,无法计算第一个字符
{
if(*p>='a'&&*p<='z')
x+=1;
elseif(*p>='A'&&*p<='Z')
d+=1;
elseif(*p>='0'&&*p<='9')
s+=1;
elseif(*p=='')
k+=1;
elseo+=1;
p++;
}
printf("大写字母:
%d\n小写字母:
%d\n空格:
%d\n数字:
%d\n其他:
%d\n",d,x,k,s,o);
}
intmain()
{
chara[N],*p=a;
printf("enterstring:
");
gets(a);
count(p);
}
*/
/*
voidzhuangzhi(int(*p)[3])
{
inti,j,t;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i{
t=*(*(p+i)+j);//*(*(p+i)+j)代表a[i][j]
*(*(p+i)+j)=*(*(p+j)+i);
*(*(p+j)+i)=t;
}
}
intmain()
{
int(*p)[3],a[3][3],i,j;
p=a;
printf("enterarray:
\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
zhuangzhi(p);
printf("newarray:
\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
printf("%-2d",a[i][j]);
if(j==2)
putchar('\n');
}
}*/
/*
voidcentral(int(*p)[5])
{
inti,j,l=0,r=0,t;//r代表行,l代表列
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(*(*(p+i)+j)>*(*(p+r)+l))
{
r=i;l=j;
}
t=*(*(p+2)+2);*(*(p+2)+2)=*(*(p+r)+l);*(*(p+r)+l)=t;//最大元素放在中心
l=0;r=0;
for(i=0;i<5;i++)//四个角放最小元素,每次从第二个元素开始对比
for(j=1;j<5;j++)
if(*(*(p+i)+j)<*(*(p+r)+l))
{
r=i;l=j;//找出最小元素
}
t=*(*p);*(*p)=*(*(p+r)+l);*(*(p+r)+l)=t;//将最小元素与左上角元素交换,下同
l=4;r=0;//换完重置r和l,下同
for(i=0;i<5;i++)
for(j=1;j<5;j++)
if(*(*(p+r)+l)>*(*(p+i)+j))
{
r=i;l=j;
}
t=*(*p+4);*(*p+4)=*(*(p+r)+l);*(*(p+r)+l)=t;
r=4;l=0;
for(i=0;i<5;i++)
for(j=1;j<5;j++)
if(i==0&&j==4)//遇到右上角,跳过对比
continue;
elseif(*(*(p+r)+l)>*(*(p+i)+j))
{
r=i;l=j;
}
t=*(*(p+4));*(*(p+4))=*(*(p+r)+l);*(*(p+r)+l)=t;
r=4;l=4;
for(i=0;i<5;i++)
for(j=1;j<5;j++)
if(i==0&&j==4||i==4&&j==0)//遇到右上角和左下角,跳过对比
continue;
elseif(*(*(p+r)+l)>*(*(p+i)+j))
{
r=i;l=j;
}
t=*(*(p+4)+4);*(*(p+4)+4)=*(*(p+r)+l);*(*(p+r)+l)=t;
}
intmain()
{
inta[5][5],(*p)[5]=a,i,j;
printf("enterarray:
\n");
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",*(p+i)+j);
central(p);
printf("newarray:
\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%-3d",*(*(p+i)+j));
putchar('\n');
}
}
*/
/*
voidsort(char*p[],intn)//指针数组处理
{
inti,j;
char*k;
for(i=1;ifor(j=i;jif(strcmp(p[i-1],p[j])>0)
{
k=p[i-1];p[i-1]=p[j];p[j]=k;
}
}
intmain()
{
char*p[10]={"gutsy","glory","gonad","girth","gaudy","gypsy","gusto","guppy","group","grope"};//测试数据gutsyglorygonadgirthgaudygypsygustoguppygroupgrope
inti;
printf("enterstrings:
");
for(i=0;i<10;i++)
printf("%s",p[i]);
sort(p,10);
printf("\nnewstrings:
");
for(i=0;i<10;i++)
printf("%s",p[i]);
putchar('\n');
}
*/
/*
#defineN20
voidsort(char*p,intn)//指针处理
{
inti,j;
chark[N];
for(i=1;ifor(j=i;jif(strcmp(p+20*(i-1),p+20*j)>0)//不能写为p+i-1,否则出错
{
strcpy(k,p+20*(i-1));strcpy(p+20*(i-1),p+20*j);strcpy(p+20*j,k);
}
}
intmain()
{
chara[10][N];
char*p=a[0];//不能写为*p=a,这等价于是把行向量赋值给列向量
inti;
printf("enterstrings:
\n");
for(i=0;i<10;i++)
scanf("%s",&a[i]);//可写为gets(a[i]),这样写的话,每次输入字符串后按enter,或写为scanf("%s",&a[i]),每输一个字符后按空格即可;
sort(p,10);
printf("newstrings:
\n");
for(i=0;i<10;i++)
printf("%s",a[i]);
putchar('\n');
}
*/
/*
#definen1000//矩形法求定积分,n为区间分割数目
doubleding(doublea,doubleb,double(*fun)(double))
{
doubles=0;
inti;
for(i=1;is+=(*fun)(i*(b-a)/n);
returns*=(b-a)/n;
}
intmain()
{
doublea,b,s1,s2,s3;//定义积分下限,上限,用double精度较高
printf("输入积分下限,上限,分割区间数目:
");
scanf("%lf%lf",&a,&b);
s1=ding(a,b,sin);
s2=ding(a,b,cos);
s3=ding(a,b,exp);
printf("sin(x)从%f到%f的积分为%f\n",a,b,s1);
printf("cos(x)从%f到%f的积分为%f\n",a,b,s2);
printf("exp(x)从%f到%f的积分为%f\n",a,b,s3);
}
*/
/*
#defineN10
voidnixu(int*p)
{
inti,m=N/2,t;
for(i=0;i{
t=*(p+i);
*(p+i)=*(p+N-1-i);
*(p+N-1-i)=t;
}
}
intmain()
{
inta[N],*p=a,i;
printf("enter%dnumbers:
\n",N);
for(i=0;iscanf("%d",&a[i]);
nixu(p);
printf("newnumbers:
\n");
for(i=0;iprintf("%d",a[i]);
putchar('\n');
}
*/
/*
voidaverage1(float(*p)[6],intn)
{
inti;
floatave=0;
for(i=0;iave+=*(*(p+i)+1)/4;
printf("第一门课程的平均分为:
%4.2f\n",ave);
}
floataverage(float(*p)[6])
{
inti;
floatave=0;
for(i=1;i<6;i++)
ave+=*(*p+i)/5;
returnave;
}
voidout(float(*p)[6],intn)
{
inti,j,k,l,s=0;
printf("两门课以上不及格的学生:
\n");
for(i=0;i{
k=0;
for(j=1;j<6;j++)
{
if(*(*(p+i)+j)<60)
k+=1;
elsecontinue;
}
if(k>=2)
{
s=1;
printf("%4.0f",*(*(p+i)));
for(l=1;l<6;l++)
printf("%4.0f",*(*(p+i)+l));
printf("平均分为:
%4.2f\n",average(p+i));
}
}
if(s==0)//没有符合条件的学生时输出“无”
printf("无!
\n");
}
voidin(float(*p)[6],intn)
{
inti,j,l;
for(i=0;i{
for(j=0;j<6;j++)
{
if(average(p+i)>=90)
{
printf("平均分在90分以上的学生:
%4.0f",*(*(p+i)));
for(l=1;l<6;l++)
printf("%4.0f",*(*(p+i)+l));
putchar('\n');
break;
}
if(*(*(p+i)+j)>=85)
continue;
else
break;
}
if(j==6)
{
printf("全部课程成绩在85分以上的学生:
%4.0f",*(*(p+i)));
for(l=1;l<6;l++)
printf("%4.0f",*(*(p+i)+l));
putchar('\n');
}
}
}
intmain()
{
inti,j;
floata[4][6]={{1001,65,67,55,60,45},{1002,80,87,90,81,85},{1003,90,99,100,98,95},{1004,86,89,90,91,85}};
float(*p)[6]=a;
for(i=0;i<4;i++)
{
for(j=0;j<6;j++)
printf("%4.0f",a[i][j]);
putchar('\n');
}
average1(p,4);
out(p,4);
in(p,4);
}
*/
/*
#defineN10//方法一
intnum1(char*p)//将数字字符串转为整形数字的函数
{
intn=strlen(p),i,a=0;
for(i=0;ia+=(int)((*(p+i)-48)*pow(10,n-1-i));
returna;
}
voidnumber(char*p)
{
inti,num=0,j=1,k=-1,n=strlen(p);//j用于计算数字长度,k用于计算数字个数
inta[N];//最多容纳N个整数
for(i=0;i<=n;i++)
{
if(*p<'0'||*p>'9')
{
if(num==1)
{
*p='\0';
a[k]=num1(p-j);
}
num=0;
}
elseif(num==0)
{
num=1;
j=1;//找到新数字时重置j
k+=1;
}
else
j+=1;
p++;
}
for(i=0;iprintf("%d",a[i]);
putchar('\n');
}
*/
/*
#defineN10
voidnumber(char*p)//方法二
{
inti,num=0,j=1,k=-1,n=strlen(p);//j用于计算数字长度,k用于计算数字个数
chara[N][10];//最多容纳N个整数,每个整数最多十位数
for(i=0;i<=n;i++)
{
if(*p<'0'||*p>'9')
{
if(num==1)
{
*p='\0';
strcpy(a[k],p-j);
}
num=0;
}
elseif(num==0)
{
num=1;
j=1;//找到新数字时重置j
k+=1;
}
else
j+=1;
p++;
}
for(i=0;iprintf("%s",a[i]);
putchar('\n');
}
intmain()
{
chara[100],*p=a;//最多可输入100个字符
printf("enterstrings:
\n");
gets(p);
number(p);
}
*/
/*
#defineN20//字符串比较函数
intstr_cmp(char*p1,char*p2)
{
inti,n=strlen(p1);
for(i=0;i<=n;i++)
if(*(p1+i)==*(p2+i))
continue;
elseif(*(p1+i)>*(p2+i))
{
return*(p1+i)-*(p2+i);
break;
}
else
{
return*(p1+i