C语言课后习题答案1_第1页
C语言课后习题答案1_第2页
C语言课后习题答案1_第3页
C语言课后习题答案1_第4页
C语言课后习题答案1_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题1.3

#include<stdio.h>//本程序需要用到标准输入输出函数scanf和printf

voidmain()//主函数。程序的入口

inta,b,min;//定义变量。本程序用到三个整数变量

scanf("%d,%d",&a,&b);//从键盘输入两个整数。

if(a<b)min=a;//这两行是处理

elsemin=b;//将两者较小的存入变量min

printf("%d\n",min);〃输出。输出一•个整数,并换行(\n)

)

习题2.1

习题2.2

习题2.3

习题2.4

习题2.5

习题2.6

习题2.7

习题2.8

习题2.9

习题2.10

习题2.1

把第1个数认为是最大者,放入max

从此以后,每个数都与max比较,较大者放入max

直到比较完最后一个数为止,max一定是所有数中最大者

#include<stdio.h>

voidmain()

inta,b,c,max;

printf("请输入三个整数,数之间用逗号隔开,然后回车

scanf("%d,%d,%d",&a,&b,&c);//输入

max=a;

if(b>max)max=b;

if(c>max)max=c;

printf("这三个数中最大者为:%d\n”,max);〃输出

)

习题2.2

#include<stdio.h>

#include<math,h>〃因为程序中将用到开平方数学函数sqrt

voidmain()

(

doublea,b,c,s,area;

/*定义变量a,b,c保存三角形三边长

s=(a+b+c)/2

area为面积:sqrt(s*(s-a)*(s-b)*(s-c))

*/

printf("请输入三角形三边长度:");

scanf(n%lf,%lf,%lf;&a,&b,&c);〃输入

s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("这个三角形的面积为:area);〃输Hl

)

习题2.3

#include<stdio.h>

#include<math.h>

voidmain()

(

doublex,y;

printf("请输入一个实数:");

scanf("%lf",&x);//输入

y=fabs(x);//处理

printf("%lf的绝对值为%x,y);〃输出

)

习题2.4

转换公式:

F=9C/5+32

#include<stdio.h>

voidmain()

doubleF,C;//变量C存摄氏温度,F存华氏温度

printf("请输入摄氏温度:”);

scanf("%lf",&C);//输入

F=9.0*C/5.0+32;//处理

printf("华氏温度为:%F);〃输出

习题2.5

一个二进制数存于变量b(假设为8位)

若要b的第0位设为0(其它位不变),则b'V111I1H0求"与"(b=b&OxFE)

若要b的第1位设为0(其它位不变),则b与11111101求"与"(b=b&OxFD)

若要b的第0位设为1(其它位不变),则b与00000001求"或"(b=bI0x01)

若要b的第1位设为1(其它位不变),则b与000000第求"或"(b=b10x02)

若要b全部位变为0,则b与b自身求“异或"(b=Mb),或者b=0

若要b全部位变为1,则b=0xFF

若要b每位取反,则求取反(b=~b)

C语言用十六进制数OxFE表示这个二进制11111110常数

用十六进制数OxFD表示这个二进制11111101常数

用十六进制数OxFB表示这个二进制11111011常数

用十六进制数0xF7表示这个二进制11110111常数

用十六进制数OxEF表示这个二进制11101111常数

用十六进制数OxDF表示这个二进制11011111常数

用十六进制数OxBF表示这个二进制10111111常数

用十六进制数0x7F表示这个二进制01111111常数

C语言用十六进制数0x01表示这个二进制00000001常数

用十六进制数0x02表示这个二进制00000010常数

用十六进制数0x04表示这个二进制00000100常数

用十六进制数0x08表示这个二进制00001000常数

用十六进制数0x10表示这个二进制00010000常数

用十六进制数0x20表示这个二进制00100000常数

用十六进制数0x40表示这个二进制01000000常数

用十六进制数0x80表示这个二进制10000000常数

习题2.6

本题测得的键值为以后判断回车键打下了基础

#include<stdio.h>

#include<conio.h>

voidmain()

printf("请按两次回车键:");

printf("函数getchar得到回车键值为%d\n",getchar());

printf("函数getch得到回车键值为%d\n”,getch());

printf("\\n的值为10,\\r的值为13\n");

习题2.7

本题将整数变量相除的商变为实数,用强制转换

另外,要输出一个%,在程序中须用%%

#include<stdio.h>

voidmain()

(

inta,b;

doublex;

printf("请输入两个正整数:");

scanf("%d,%d",&a,&b);

x=I00*(double)a/b;

printf("%d/%d为%lf%%\n”,a,b,x);

习题2.8

需要用到数学函数,因此需要预处理#include<math.h>

整个数学表达式:sqrt(fabs(sin(x)))/exp(x)

习题2.9

假设总金额为x,股价为y

如果能买z股,

则z*y+z/100*0.1(BPz*(y+0.001))为总开销

应该z*(y+0.001)Wx

因此,zWx/(y+0.001)

因为z为100倍的整数

所以用x/(y+0.001)除以100为手,再乘以100为z

#include<stdio.h>

voidmain()

doublex,y;

intz;

printf("请输入金额:");scanf("%lf,&x);

printf("请输入股票scanf("%lf',&y);

z=(int)(x/(y+0.001))/100*100;

printf("最多买%d股\n",z);

printf("总开销%.21f\n",z*(y+0.001));

printf("股票金额%.21f\n”,z*y);

printf(”额外开销%.21f\n",z*0.001);

printf("剩余金额%.21Rn”,x-(z*(y+0.001)));

习题2.10

假设申购金额为x,单位净值为y

如果能买z份基金,

则手续费z*y*0.006

买基金费用z*y

所以x=z*y+z*y*0.006=z*y*1.006

z=x/(1.006*y)

#include<stdio.h>

#defineP0.006〃手续费率

voidmain()

doublex,y,z;

printf("请输入申购金额:");scanf("%lf",&x);

printf("请输入单位净值:");scanf("%lf,&y);

z=x/((l+P)*y);

printf("申购基金份额%.41f\n",z);

printf("手续费%.21f\n",z*y*P);

习题3.1

习题3.2

习题3.3

习题3.4

习题3.5

习题3.6

习题3.7

习题3.8

习题3.9

习题3.10

习题3.11

习题3.12

习题3.13

习题3.14

习题3.15

习题3.16

习题3.17

习题3.18

习题3.19

习题3.20

习题3.21

习题3.22

习题3.23

习题3.1

一个一个得到字符逐个处理,用函数getchar或getch

getchar。在stdio.h中预处理

getch()在conio.h中预处理

由习题2.6知道,函数getchar()得到回车键值为、n'

#include<stdio.h>

voidmain()

charc;

while((c=getchar())!='\n')

if(c>='a'&&c<='z')c-=32;

putchar(c);

I

)

习题3.2

本图上下对称

上半图:

第i行(i=0,l,2,3)

每行前面的空格比上一行少一个

有2i+l个二号

下半图:

行号i取值2,1,0即可与上半图相同处理

#include<stdio.h>

#defineN40〃第0行*号的列号

voidmain()

for(i=0;i<4;i++)//上半图

(

for(j=0;j<N-i;j++)〃每行前面的空格

putchar(f,);

for(j=0;jv2*i+l;j++)〃每行的*号

putchar(,5!e,);

putchar('\n');〃换行

for(i=2;i>=0;i--)〃下半图

(

for(j=0;j<N-i;j++)

putchar('');

for(j=0;jv2*i+1;j++)

putchar('*');

putchar(*\n');

习题3.3

仿习题2.13或2.15处理即可

习题3.4

/*

用int类型和double类型分别求出两个结果

因为15!中有2和5的因子,所以个位数肯定为0

本题目主要理解数据类型的取值范围.

*/

#include<stdio.h>

#defineN15

voidmain()

(

inti,s=l;

doubleS=l;

for(i=2;i<=N;i++)

(

s*=i;

S*=i;

)

printf(M%d!=%d\nH,N,s);

printf(n%d!=%.01ftn",N,S);

)

习题3.5

I*

函数IsNarcissus(intx)返回真⑴或者假(0):

判断整数x是否为水仙花数

*/

#include<stdio.h>

intIsNarcissus(intx)

(

inta,b,c;

a=x%10;//取x的个位

b=x/10%10;〃十位

c=x/100;〃百位

if(a*a*a+b*b*b+c*c*c==x)

return1;

return0;

)

voidmain()

(

inti;

puts("所有水仙花数

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

if(IsNarcissus(i))

printf("%5d\nn,i);

)

习题3.6

/*

写了一个函数IsCompleted(int)判断•个整数是否为完数

在IsCompleted中,可以把for循环条件i<x改成i<=x/2

10000以内在完数:6,28,496,8128;

据测试,1万以外很难有完数了,但需要理论依据.

*/

#include<stdio.h>

intIsCompleted(intx)

(

inti,s=0;

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

if(x%i==0)s+=i;〃把因子累加到s

if(s==x)return1;

return0;

)

voidmain()

(

intx;

for(x=l;x<=100000;x++)

if(IsCompleted(x))printf(',%d\n,',x);

)

习题3.7

#include<stdio.h>

intFactorSum(intx)〃求x的因子之和

inti,s=l;

for(i=2;i<=x/2;i++)

if(x%i==O)

s+=i;

returns;

)

voidmain()

(

intx,y;

for(x=l;x<=10000;x++)

(

y=FactorSum(x);

if(x==FactorSum(y)&&x<=y)

printf(u%dlj%d是一对亲密数\n”,x,y);

)

)

习题3.8

/*

仿例题3-6

*/

#include<stdio.h>

voidmain()

(

charc;

ints=0;

printf("请输入一串二进制数

while((c=getchar())!=、n')

{

if(c!='O'&&c!=T)

{

puts("不是二进制数!”);

return;

)

s=2*s+(c-'O');

)

printf("十进制数为:%d\n",s);

)

习题3.9

角谷猜想

*/

#include<stdio.h>

#include<conio.h>

voidmain()

(

intn;

intcount=0;

do{

printf("请输入一个自然数:");

scanf(u%dn,&n);

}while(nv1);〃保证输入的数•定是自然数

while(n!=1)

(

if(n%2==0)〃偶数

(

printf(n%d/2=%d\t",n,n/2);

n/=2;

)

else〃奇数

(

printf(n3*%d+1=%d\tM,n,3*n+l);

n=3*n+1;

)

++count;

if(count%5==0)printf(”\n");〃每5个表达式换一行

if(count%50==0)getch();//每50个表达式暂停

习题3.10

/*仿例3-16,把函数f改成x+exp(x)*/

习题3.11

数学黑洞

*/

#include<stdio.h>

voidSwap(char*x,char*y)〃交换两个数据

chart;

t=*x;

*x=*y;

)

voidmain()

(

intx,m,M;

chara,b,c,d;

do{

printf(”请输入一个四位整数

scanf("%dn,&x);

}while(x<1000IIx>9999);

do{

a=x%10;//x的个位

b=x/10%10;〃十位

c=x/100%10;〃百位

d=x/1000;〃千位

//从小到大排序a,b,c,d

if(a>b)Swap(&a,&b);

if(a>c)Swap(&a,&c);

if(a>d)Swap(&a,&d);

if(b>c)Swap(&b,&c);

if(b>d)Swap(&b,&d);

if(c>d)Swap(&c,&d);

m=1000*a+100*b+10*c+d;//小数

M=1000*d+100*c+10*b+a;//大数

printf("%4d-%4d=%4d\tM,

if(M-m==x)break;

x=M-m;〃把新结果存入x

}while(1);

习题3.12

除法只用了加减法

*/

#include<stdio.h>

voidmain()

(

intx,y,a,b;

intc,d;

ints=0;

prinlf(”请输入两个整数:");

scanf("%d,%d",&x,&y);

a=x;

b=y;

if((a<0&&b>0)II(a>0&&b<0))〃商是负数

s=l;

if(a<0)a=-a;

if(b<0)b=-b;

c=0;

while(a>=b)〃循环求商c

(

a-=b;

++c;

)

d=a;//余数

if(s==l)c=-c;〃商数

printf(M%d/%d的商二%d,余数=%d\n”,x,y,c,d);

习题3.13

假设在t分钟他们第一次走在同一条边上,此时应满足条件:

⑴甲走过的路程刚好是边长(400)的整数倍,即50*t%400==0

(2)甲乙相距不超过400,即(800+46。-50t<=400

因此,t取值0』,2,3,……,不满足上条件时,t值继续增大(循环)

*/

#include<stdio.h>

voidmain()

(

intt;

for(t=0;!((50*t)%400==0&&(46*t+800)-50*t<=400);++t)

;〃空循环

printf("他们经过%d分钟第一次走在同一条边Kn”,t);

习题3.14

用变量a,b,c表示A,B,C的饭量,

分别取值0』,2(这个数值仅区分他们量的大小)

当a,b,c各取到一个值时,计算他们的真话数Ta,Tb,Tc

他们饭量的大小只有6种情况,分情况判断

本程序使用了got。语句

*/

#include<stdio.h>

voidmain()

(

inta,b,c;

intTa,Tb,Tc;

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

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

for(c=0;c<3;C++)

(

Ta=(b>a)+(c==a);//计算他们的真话数

Tb=(a>b)+(a>c);

Tc=(c>b)+(b>a);

if((a>=b&&b>=c)&&(Ta<Tb&&Tb<Tc))〃分6种情况判断

(

puts(nA>=B>=CH);

gotoend;

)

if((a>=c&&c>=b)&&(Ta<Tc&&Tc<Tb))

(

putsCA>=C>=Bn);

gotoend;

)

if((b>=a&&a>=c)&&(Tb<Ta&&Ta<Tc))

(

puts("B>=A>=Cn);

gotoend;

if((b>=c&&c>=a)&&(Tb<Tc&&Tc<Ta))

puts("B>=C>=A,');

gotoend;

)

if((c>=a&&a>=b)&&(Tc<Ta&&Ta<Tb))

(

puts(nC>=A>=BH);

gotoend;

)

if((c>=b&&b>=a)&&(Tc<Tb&&Tb<Ta))

(

puts(nC>=B>=A");

gotoend;

)

}

end:

»

/*

printf(nA=%d,B=%d,C=%d\n",a,b,c);

printf("TA=%dJB=%d,TC=%d\nH,Ta,Tb,Tc);

*/

}

习题3.15

/*

用a,b,c表示张三,李四,王五说话的真假,它们取值都为0或1

本程序输出0,1,0表示张三,王五说的假话,而李四说的真话.

*/

#include<stdio.h>

voidmain()

(

inta,b,c;

for(a=0;a<2;a++)

for(b=0;b<2;b++)

for(c=0;c<2;C++)

(

if(a==(b==0)&&b==(c==0)&&c=(a==0&&b==0))

printf("%d,%d,%d\nn,a,b,c);

习题3.16

假设男x人,女y人,小孩z人

依题意,他们都不为0

*/

#include<stdio.h>

voidmain()

(

intx,y,z;

for(x=l;x<=30;x++)

for(y=l;y<=30;y++)

for(z=l;z<=30;z++)

if(3*x+2*y+z==50)

printf("男%(1,女%(1,孩%d\n”,x,y,z);

)

习题3.17

#include<stdio.h>

voidmain()

(

intone,two,five;

intcount=0;

for(one=0;one<=100;one++)

for(two=0;two<=50;two++)

for(five=0;five<=20;five++)

if(one+2*two+5*five==100)

(

printf("%d,%d,%d\nn,one,two,five);

++count;

)

printf("共有%(1种兑换方法\n\count);

)

习题3.18

#include<stdio.h>

voidmain()

inisteps=O;

while(1)

(

++steps;

if(steps%2==l&&steps%3==2&&steps%5==4&&steps%6==5&&steps%7==0)

break;

)

printf("%d\n”,steps);

习题3.19

#include<stdio.h>

voidmain()

(

intx,a,b;

for(x=1000;x<=9999;x++)

(

a=x%100;

b=x/100;

if((a+b)*(a+b)=x)

printf(M%d\nM,x);

习题3.20

假设时速不超过150,则两小时行程不超过300

设x是两小时的行程,则里程表上的读数y=95859+x

对x从1到300之间穷举,使y对称的x就是行程

本程序得到输出时速为50,105

*/

#include<stdio.h>

voidmain()

intx,y,a,b,c,d;

for(x=l;x<=300;x++)

(

y=95859+x;

a=y%10;〃个位

b=y/10%10;〃十位

c=y/10000;〃万位

d=y/1000%10;〃千位

if(a==c&&b==d)

printf("汽车时速为%€13",x/2);

)

)

习题3.21

/*

设这个自然数的七进制数为abc,则其九进制数为cba

a,b,c的取值都在0〜6(a和c不能取0)

将这个七进制数和九进制数都转换为十进制数应该相等

程序输出248

#include<stdio.h>

voidmain()

(

chara,b,c;

intseven,nine;

for(a=l;a<7;a++)

for(b=0;b<7;b++)

for(c=l;c<7;C++)

(

seven=49*a+7*b+c;

nine=81*c+9*b+a;

if(seven==nine)

printf(n(%d%d%d)7=%d\nn,a,b,c,seven);

习题3.22

/*输出153846*/

#include<stdio.h>

voidmain()

(

intx=l,y,n;

while(1)

(

if(x%10==6)//须个位数为6

(

y=x;n=l;

while(y>10)//求x的最高位权n

(

y/=10;

n*=10;

}

if((x%10)*n+x/10==4*x)〃如果把个位数移到最高位是原来的4倍

break;

)

++x;

)

printf(M%d\nn,x);

)

习题3.23

一年能翻番

程序输出2199051

#include<stdio.h>

voidmain()

(

inty;

doublex=l;

for(y=0;y<240;y+=3)

x*=1.01*1.01*0.99;

printf(n%lf\n",x);

习题4.1

习题4.2

习题4.3

习题4.4

习题4.5

习题4.6

习题4.7

习题4.8

习题4.9

习题4.10

习题4.11

习题4.12

习题4.13

习题4.14

习题4.15

习题4.16

习题4.17

习题4.18

习题4.1

功能:维数组两块数据交换

方法:下标从il到i2的一块与下标从jl到j2的另一块交换

做3块数据逆序:il到i2、i2+l到jl-1、jl到j2

最后再将il到j2整块逆序

注意:i2-il+l=p,j2-jl+l=q

#include<stdio.h>

voidSwap(char*x,char*y)〃交换两个变量的值

chart;

t=*x;

*x=*y;

*y=t;

)

voidConvert(inti,intj,chara[])//一块数据逆序

while(i<j)

Swap(&a[i++],&a[j-]);

voidSwapBlock(intil,inti2,intjl,intj2,chara[])//两块数据交换

〃下标从il到i2的一块与下标从jl到j2的另一块交换

Convert(i1,i2,a);

Convert(i2+1,jl-1,a);

Convert(jlJ2,a);

Convert(il,j2,a);

)

voidmain()

chara[]={1,3,5,7,9,2,4,6,8,0);

inti;

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

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

printf(M\nn);

SwapBlock(1,4,6,8,a);

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

printf(n%dn,a[i]);

printf(”\n");

习题4.2

肯定有条件:i从。到N-1都有a⑼,凯1],...声口-1]从小到大有序

新输入•个数x,找到合适的插入点j,保证xv=a[j](循环条件为x>a[j])

从j开始到i-1都往后移一个位置,注意:必须从i-1至Ij逐个往后移

最后插入新数据

本题在实际软件开发中非常有用,利用了低速输入的空闲时间排序

#include<stdio.h>

#defineN10

voidmain()

inta[N],x;

inti,j,k;

printf("请输入%d个整数(用空格分隔数据):N);

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

(

scanf(n%dn,&x);

for(j=0;j<i&&x>a[j];j++);〃空循环,找到合适的插入点j

for(k=i;k>j;k-)a[k]=a[k-l];〃从j位置后移,留出j的位置

afj]=x;〃插入新数据

)

printf("排序结果

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

printf(M%d",a|i]);

printfCAn'1);

习题4.3

#include<stdio.h>

#defineN10

函数原型:intBinarySearch(chars[],charx)

功能:在有N个元素的有序数组s中折半(二分)查找x

参数:数组s有N个元素,且从小到大有序;x是待查数据

返回值:如果x在s中,返回在s中的位置(下标),否则返回-1

方法:由左端点L和右端点R求得中点m(下标)

如果中点的值就是x,则查找成功,返回m

如果x的值比中点值小,说明x在左半部分,将右端移到中点偏左

否则说明x在右半部分,将左端移到中点偏右

注意:循环条件不能是L<R,因为有可能x正好在L==R的位置

intBinarySearch(chars[],charx)

intL=0,R=N-l,m;

while(L<=R)

(

m=(L+R)/2;〃求中点位置

if(x==s[m])returnm;

if(x<slm])-R;〃右端点移到中偏左的位置

else++L;〃左端点移到中偏右的位置

return-1;

)

voidmain()

(

chars[N]={,A,;B,,,C,,,D,,,E7F;GVH7r,T);

charx;

intpos;

printf("请输入一个字符x=getchar();

if((pos=BinarySearch(s,x))==-l)

printf(”%c不在数组中,查找失败!\n\x);

elseprintf(n%c在数组中,下标为%d\n",x,pos);

)

习题4.4

/*

・维数组输出杨辉三角

*/

#include<stdio.h>

#defineN15

voidmain()

(

inta[N];

inti,j;

for(i=0;i<N;i++)〃产生N行

(

alO]=aliJ=l;〃第i行两端都是1

for(j=i-l;j>0;j-)〃从右向左求其它元素

a[jJ+=a[j-l];

for(j=0;j<=i;j++)〃输出第i行

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

printf(n\nn);

习题4.5

/*仿例4-6对八个方向生成魔方*/

习题4.6

找鞍点:每行中可能有多个鞍点(有多个最小者)

本程序用随机函数产生数组元素,每次运行数组都不•样

*/

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

#defineM4〃数组行数

#defineN5〃数组列数

voidmain()

(

inta[M][N];

inti,j,k,p,q;

inttag=O;〃是否有鞍点的标志

srand((unsigned)time(NULL));〃初始化随机序列

for(i=0;i<M;i++)〃产生数组

(

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

(

a[i][j]=(int)(2*(double)rand()/RAND_MAX);〃随机产生数组元素

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

)

printf("\n");

)

for(i=0;i<M;i++)//找第i行的鞍点

{

k=0;//k是第i行第一个最小者的列下标

for(j=l;j<N;j++)

if(a[i][j]<aliJlk])k=j;

for(p=k;p<N;p++)〃第i行中,可能有多列都与第k列相等(多个最小值)

(

if(a[i][pl!=a[i][k])continue;

q=0;〃q是第p列中最大者的行下标

for(j=l;j<M;j++)

if(a[j][p]>a[qJlp])q=j;

if(a[i][p]==a[q][p])〃第i行第p列是鞍点

(

printf("鞍点位置(%d,%d)\n”,i,p);

tag-1;

)

if(!tag)puts("没有鞍点!)

)

习题4.7

#include<stdio.h>

voidmain()

(

charsentence[500];

inti,count;

inttag=O;〃单词开始标志

printf("请输入,个句子:");

gets(sentence);

for(count=0,i=0;sentence[i];i++)

if(!tag&&sentence[i]>='A')〃刚进入单词

(

++count;〃单词数量增1

tag=1;〃已经在单词内部

}else

if(sentence[i]<,A')tag=O;〃离开单词

printf("共有%(1个单词\n”,count);

)

习题4.8

#include<stdio.h>

voidmain()

(

chars[100J;

inti;

printf("请输入•个英文句子

gets(s);

for(i=0;s[i];i++)

(

switch(s[i])

case'A':

case'a':

case'E':

case'e':

caseT:

caseT:

case'O":

case'o':

caseU:

case*u':

putchar(s[i]);

)

习题4.9

#include<stdio.h>

#include<string.h>

函数原型:voidReplace(char*text,char*sl,char*s2)

功能:将文本text中的串si替换成串s2

参数:三个字符串

返回值:void,替换后的结果由参数text带回

voidReplace(char*text,char*sl,char*s2)

inti,j,k,len;

len=(strlen(s2)-strlen(sl));〃两个串长度之差

for(i=0;text[ij;i++)

(

for(j=i,k=0;text|j]&&sl[k]&&text[j]==sl[k];j++,k++)

;〃查找text中第i个字符开始是否有si

if(sl[k]==U)〃在text中从第i个字符开始,找到一个si

(

〃下面在text中将si替换为s2

if(len>0)〃空间不够替换,需要后移腾出空间

for(j=strlen(text);j>i;j--)〃后移源来下标strlen(text)处是'\0'

text[j+len]=text|j];

for(j=0;s2[j];j++)text[i+j]=s2[j];〃替换

if(len<0)〃空间太多,需压缩多余空间

for(j=i+strlen(s1);j<=strlen(text);j++)

text[j+len]=text|j];

i+=strlen(s2)・l;〃跳过刚替换的一段

)

voidmain()

(

chartext[l000|=M1234abcdchinachinapeking";

charsl[100],s2[100];

printf("原文本:%s\n",text);

printf("查找gets(sl);

printf("替换为:");gets(s2);

Replace(text,si,s2);

printf(n结果:%s\n”,text);

习题4.10

#include<stdio.h>

#include<string.h>

函数原型:intFind(char*text,char*s)

功能:在串text中找s出现的开始位置

参数:2个字符串

返回值:如果s在text中存在,则返回第诙出现在text的下标

否则返回

intFind(char*text,char*s)

inti,j,k;

for(i=0;text[i];i++)

for(j=i,k=0;textfj]&&s[k]&&text[j]==s[k];j++,k++)

;〃查找text中第i个字符开始是否是s

if(s[k]==、O')〃在text中找到了s

returni;

)

return-1;

)

voidmain()

(

chartext[1000]="01234567chinachinapeking";

chars[1001;

inti;

printf("原文本:%s\n",text);

printfC1查找gets(s);

if((i=Find(text,s))==-l)

printf("\n原串中不存在%s\n”,s);

else

printf("\n%s在原串中第一次出现的下标是%而”时);

习题4.11

仿例3-6

#include<stdio.h>

unsignedlongH2D(char*h)〃十六进制串转换成十进制数

(

inti;

unsignedlongd=0;

for(i=0;h[i];i++)〃把小写字母转成大写字母

if(h[i]>=,a,)h[i]-=32;

for(i=0;h[i];i++)〃十六进制串转成十进制数

d=16*d+(h[i]>=<0,&&h[i]<=,9,?h[i]-'O,:(h[i]」A'+10));

returnd;

)

voidmain()〃主函数

(

chars[9];〃最长8位十六进制数(最多4字节)

printf("请输入一个十六进制数

gets(s);

printf("十进制数为:%lu\n",H2D(s));

)

习题4.12

#include<stdio.h>

#include<string.h>

#defineN4

struct

charstuNoflO];

charstuNamef10];

intscore;

}stu[N]=

(

{"0901001","张三",90},

{“0901005","李四",60},

{"0901003","王五",70},

{"0901002","邱六",80}

};〃N个学生的信息

voidmain()

(

charx[10];

inti;

printf(”请输入学号或姓名gets(x);

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

if(strcmp(x,stu[i].stuNo)==0IIstrcmp(x,stu[i].stuName)==O)

break;

if(i<N)

printf("学号:%s\n",stu[i].stuNo);

printf("姓名:%s\nH,stu[i].stuName);

printf("成绩:%d\n",stu[i].score);

}elseprintf("输入的学号或姓名%§不存在!\n”,x);

习题4.13

来电显示

#include<stdio.h>

#include<string.h>

#defineN4//号码簿的记录数

struct//号码薄

(

charName[20];

charTelNum[13];

}TelTable[N]=

(

{“张三”,”5516277”},

{“李四”,“5516278”},

{”王五”,”08715516278”},

{”邱六”,”08715516279”}

voidDisplay(char*inNum,char*outN)

//由输入号码inNum在电话薄中匹配,由outN返回对应的显示姓名

//匹配:比较的两个号码•个是另一个的尾子串(短者与长者的右边完全一样)

//完全匹配:能匹配而且两个号码的长度也一样

//不完全匹配:•个是另一•个的尾子串,但长度不•样

(

inti,j,k,p;

intmax=0,maxi;

for(i=0;inNum[i];i++);//把i移到待查号码的末尾

for(j=0;j<N;j++)//从号码薄第0号记录开始顺序找

{

for(k=0;TelTable[j].TelNum[k];k++);〃把k移到第j个号码的末尾

for(p=i;k>=0&&p>=0;-k,-p)//从末尾倒过来往左比较

if(inNum[p]!=TelTable[j].TelNum[kJ)break;

if(k>=0&&p>=0)continue;//本记录匹配不成功

if(k<0&&p<0)//完全匹配,查找成功

strcpy(outN,TelTable[j].Name);//取走对应姓名

return;//退出函数

)

if(i-p>max)//不完全匹配,保存匹配字符最多的记录

i

max=i-p;//最大匹配长度

maxi=j;//对应号码薄的记录号

if(max>0)

strcpy(outN,TelTable[maxi].Name);//取号码匹配最多的姓名

else

strcpy(outN,inNum);//不能匹配,用输入号码代替显示姓名

)

voidmain()//主函数

(

charname[20],telnum[l3J;

printf("请输入电话号码gets(telnum);

Display(telnum,name);//由telnum取得姓名name

printf("来电:%s\n\n”,name);〃显示姓名name

)

习题4.14

#include<stdio.h>

函数原型:unsignedcharb2i(char*s)

参数:char*s(数字串,如“192”)

返回值:无符号字符型(1字节无符号整数)

功能:将串转换成整数,如“192”转换成192

unsignedcharb2i(char*s)

unsignedcharc=0;

while(*s)

c=10*c+(*s-'0');

++s;

returnc;

/¥¥¥¥***********¥¥¥¥****************************************

函数原型:unsignedlongIP32(char*IPdot)

参数:char*IPdot(点分十进制IP地址字符串)

返回值:无符号长整数(4字节整数)

功能:将点分十进制IP地址转换成32位整数

例如:将"3"转换成整数(用十六进制表示)C0A80617

unsignedlongIP32(char*IPdot)〃把点分十进制IP地址转换成32位数据

(

unsignedlongs=0;//最后的32位数据

charc[4][4];〃保存4个串,每个串3个数字和一个结束标志、0,

inti,j=O,k=O;

for(i=0;(c|jJ[k]=IPdot[i])!='\0';i++)//把IPdot分成4个串存于c□中

(

if(IPdot[i])

(

c[j]lk]=、(y;〃到?就取完一个串

++j;k=O;〃为下一个串作准备

}elsec|j][k++]=IPdot[i];

)

for(j=0;jv4;j++)〃把4个串合成为一个32位数据

s=(s«8)Ib2i(c|j]);

returns;

)

chargetIpClass(unsignedlongipAddr)〃求网络类别

/*A类:0~127(0~7F)

B类:128-191(80~BF)

C类:192~223(C0~DF)

D类:224~239(E0~EF)

E类:240~255(F0~FF)

*/

if((ipAddr&0x80000000)==0)return'A';

if((ipAddr&OxcOOOOOOO)==0x80000000)return*B';

if((ipAddr&OxeOOOOOOO)==OxcOOOOOOO)returnC;

if((ipAddr&OxfOOOOOOO)==OxeOOOOOOO)return'D';

return'E';

)

unsignedlonggetIpNetId(unsignedlongipAddr)〃求网络号

(

return(ipAddr&OxOFFFFFFF)»8;

)

unsignedlonggetHostId(unsignedlongipAddr)〃求网络主机号

(

returnipAddr&OxOOOOOOFF;

voidmain。〃主函数:测试上面的函数

(

charIPdot[16]=n3";

unsignedlongIpAddr;

IpAddr=IP32(IPdot);

printf("点分IP地址:%s\n”,IPdot);

printf("IP地址十六进制数据:%08X\n”,IpAddr);

printf("网络类别:%c\n",getIpClass(IpAddr));

printf("所属网络号:%05X\n”,getIpNetId(IpAddr));

printf("主机号:%02X\n",getHostId(IpAddr));

习题4.15

#include<stdio.h>

#defineESCOxlb

#defineSOH0x01

#defineEOT0x04

voidInStr20utStr(char*InStr,char*OutStr)〃把输入串转换成发送串

(

inti,j=0;

OutStr|j++]=SOH;〃起始帧标志

for(i=0;InStr[i];i++)

(

switch(InStr[i])〃填充转义字符

(

caseSOH:OutStrfj++]=ESC;OutStr[j++]='x,;

break;

caseEOT:OutStr[j++]=ESC;OutStr[j++]='y';

break;

caseESC:OutStr[j++]=ESC;OutStr[j++]='z';

break;

default:OutStr[j++]=InStr[i];

)

)

OulStr[j++]=EOT;//结束帧标志

OutStrUhAO';〃字符串结束标志

)

voidOutStr2InStr(char*OutStr,char*InStr)〃把发送串转换成接收串(应与输入串相同)

(

inti,j=0;

if(OutStr[0]!=SOH)〃首字符不是SOH,则不是接收到的串

(

InStr[j]='\O';

return;

)

for(i=l;OutStr[i|&&OutStr[i]!=EOT;i++)

(

if(OutStr[i]==ESC)//还原转义字符

(

switch(OutStr[i+ll)

{

case'x':InStr|j++|=SOH;++i;break;

case'y':InStr[j++]=EOT;++i;break;

case'z':InStr[j++]=ESC;++i;break;

)

}elseInStr[j++]=OutStr[i];

)

InStr[j]=、O,;〃字符串结束标志

)

voidDisplayStr(char*str)//显示数据包

(

while(*str)

(

if(*str<32)printf("\\x%02x",*str);

elseputchar(*str);

putcharC');

++str;

putchar('\n');

voidmain()〃主函数:测试转换函数

(

charinStr[100]={'a7b',^01,,T,2,'3?\x1b',,x,;y,;\xO4,;7,;8';9,;\O,};

charoutStr[1000];

printf("输入串:DispIayStr(inStr);

InStr20utStr(inStr,outStr);

printf(“发送串:");DisplayStr(outStr);

OutStr2InStr(outStr,inStr);

printf(”接收串DisplayStr(inStr);

习题416

功能:随机发牌并排序

原理:用三维数组存储数据:固定牌发给随机人

本题方法很多,主要考虑数据存储效率与程序处理的方便

#include<stdio.h>

#include<conio.h>

#include<time.h>

#include<stdlib.h>

charcards[4][4][14];

〃第1维座向,第2维花色,第3维面值(2~14)

〃cards[i][j][0]保存第i个人的第j种花色的长度(张数)

voidGenCards()〃发牌

(

inti,j,k;

srand((unsigned)time(NULL));

for(i=0;i<4;i++)//初始化:第i个人的第j种花色的长度均为0

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

cards[i][j][0]=0;

for(j=0;j<4;j++)//发第j种花色

for(k=2;k<15;k++)II面值k:2~14

(

i=(int)(4*rand()/((double)RAND_MAX+1));//把第j种花色的第k张牌发给第i个人

cards[i][j][++cards[i][j][0]]=k;

voidSortCards()//排序

(

inti,j,p,q;

chart;

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

for0=O;j<4;j++)

for(p=l;p<cards[i]|j][O]-l;p++)//对第i个人的第j种花色用选择排序

for(q=p+1;q<cardsli][j][O];q++)

if(cards[i][j][p]>cards[i][j][q])

{

t=cards[i][j][p];

cards[i][j][p]=cards[i][j][q];

cards[i][j][q]=t;

)

voidOutCards。〃输III

(

inti,j,k;

char*dir[]={"东"南","西","北"};

charsuit[]={'\6',I\3',''5'A4'};

charface[]={2,'3','4','5','6','7','8',9,T,'J',Q,'K','A'};

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

(

printf("\n%s\n",dir[i]);〃坐向

for(j=0;j<4;j++)〃花色

(

printf("%c",suit[j]);

for(k=1;k<=cards[i][j][O];k++)〃面值

putchar(face[cards[i][j][k]-2]);

printf("\n");

)

voidmain()

(

GenCards();〃发牌

SortCards。;〃排序

OutCards();〃输出

getch();

)

习题4.17

/***本题是结构体的应用

其中,分子分母的约分函数Reduction尤其重要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论