C語(yǔ)言課后習(xí)題答案1_第1頁(yè)
C語(yǔ)言課后習(xí)題答案1_第2頁(yè)
C語(yǔ)言課后習(xí)題答案1_第3頁(yè)
C語(yǔ)言課后習(xí)題答案1_第4頁(yè)
C語(yǔ)言課后習(xí)題答案1_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

習(xí)題1.3

#include<stdio.h>//本程序需要用到標(biāo)準(zhǔn)輸入輸出函數(shù)scanf和printf

voidmain()//主函數(shù)。程序的入口

inta,b,min;//定義變量。本程序用到三個(gè)整數(shù)變量

scanf("%d,%d",&a,&b);//從鍵盤輸入兩個(gè)整數(shù)。

if(a<b)min=a;//這兩行是處理

elsemin=b;//將兩者較小的存入變量min

printf("%d\n",min);〃輸出。輸出一?個(gè)整數(shù),并換行(\n)

)

習(xí)題2.1

習(xí)題2.2

習(xí)題2.3

習(xí)題2.4

習(xí)題2.5

習(xí)題2.6

習(xí)題2.7

習(xí)題2.8

習(xí)題2.9

習(xí)題2.10

習(xí)題2.1

把第1個(gè)數(shù)認(rèn)為是最大者,放入max

從此以后,每個(gè)數(shù)都與max比較,較大者放入max

直到比較完最后一個(gè)數(shù)為止,max一定是所有數(shù)中最大者

#include<stdio.h>

voidmain()

inta,b,c,max;

printf("請(qǐng)輸入三個(gè)整數(shù),數(shù)之間用逗號(hào)隔開,然后回車

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

max=a;

if(b>max)max=b;

if(c>max)max=c;

printf("這三個(gè)數(shù)中最大者為:%d\n”,max);〃輸出

)

習(xí)題2.2

#include<stdio.h>

#include<math,h>〃因?yàn)槌绦蛑袑⒂玫介_平方數(shù)學(xué)函數(shù)sqrt

voidmain()

(

doublea,b,c,s,area;

/*定義變量a,b,c保存三角形三邊長(zhǎng)

s=(a+b+c)/2

area為面積:sqrt(s*(s-a)*(s-b)*(s-c))

*/

printf("請(qǐng)輸入三角形三邊長(zhǎng)度:");

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

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

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

printf("這個(gè)三角形的面積為:area);〃輸Hl

)

習(xí)題2.3

#include<stdio.h>

#include<math.h>

voidmain()

(

doublex,y;

printf("請(qǐng)輸入一個(gè)實(shí)數(shù):");

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

y=fabs(x);//處理

printf("%lf的絕對(duì)值為%x,y);〃輸出

)

習(xí)題2.4

轉(zhuǎn)換公式:

F=9C/5+32

#include<stdio.h>

voidmain()

doubleF,C;//變量C存攝氏溫度,F存華氏溫度

printf("請(qǐng)輸入攝氏溫度:”);

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

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

printf("華氏溫度為:%F);〃輸出

習(xí)題2.5

一個(gè)二進(jìn)制數(shù)存于變量b(假設(shè)為8位)

若要b的第0位設(shè)為0(其它位不變),則b'V111I1H0求"與"(b=b&OxFE)

若要b的第1位設(shè)為0(其它位不變),則b與11111101求"與"(b=b&OxFD)

若要b的第0位設(shè)為1(其它位不變),則b與00000001求"或"(b=bI0x01)

若要b的第1位設(shè)為1(其它位不變),則b與000000第求"或"(b=b10x02)

若要b全部位變?yōu)?,則b與b自身求“異或"(b=Mb),或者b=0

若要b全部位變?yōu)?,則b=0xFF

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

C語(yǔ)言用十六進(jìn)制數(shù)OxFE表示這個(gè)二進(jìn)制11111110常數(shù)

用十六進(jìn)制數(shù)OxFD表示這個(gè)二進(jìn)制11111101常數(shù)

用十六進(jìn)制數(shù)OxFB表示這個(gè)二進(jìn)制11111011常數(shù)

用十六進(jìn)制數(shù)0xF7表示這個(gè)二進(jìn)制11110111常數(shù)

用十六進(jìn)制數(shù)OxEF表示這個(gè)二進(jìn)制11101111常數(shù)

用十六進(jìn)制數(shù)OxDF表示這個(gè)二進(jìn)制11011111常數(shù)

用十六進(jìn)制數(shù)OxBF表示這個(gè)二進(jìn)制10111111常數(shù)

用十六進(jìn)制數(shù)0x7F表示這個(gè)二進(jìn)制01111111常數(shù)

C語(yǔ)言用十六進(jìn)制數(shù)0x01表示這個(gè)二進(jìn)制00000001常數(shù)

用十六進(jìn)制數(shù)0x02表示這個(gè)二進(jìn)制00000010常數(shù)

用十六進(jìn)制數(shù)0x04表示這個(gè)二進(jìn)制00000100常數(shù)

用十六進(jìn)制數(shù)0x08表示這個(gè)二進(jìn)制00001000常數(shù)

用十六進(jìn)制數(shù)0x10表示這個(gè)二進(jìn)制00010000常數(shù)

用十六進(jìn)制數(shù)0x20表示這個(gè)二進(jìn)制00100000常數(shù)

用十六進(jìn)制數(shù)0x40表示這個(gè)二進(jìn)制01000000常數(shù)

用十六進(jìn)制數(shù)0x80表示這個(gè)二進(jìn)制10000000常數(shù)

習(xí)題2.6

本題測(cè)得的鍵值為以后判斷回車鍵打下了基礎(chǔ)

#include<stdio.h>

#include<conio.h>

voidmain()

printf("請(qǐng)按兩次回車鍵:");

printf("函數(shù)getchar得到回車鍵值為%d\n",getchar());

printf("函數(shù)getch得到回車鍵值為%d\n”,getch());

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

習(xí)題2.7

本題將整數(shù)變量相除的商變?yōu)閷?shí)數(shù),用強(qiáng)制轉(zhuǎn)換

另外,要輸出一個(gè)%,在程序中須用%%

#include<stdio.h>

voidmain()

(

inta,b;

doublex;

printf("請(qǐng)輸入兩個(gè)正整數(shù):");

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

x=I00*(double)a/b;

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

習(xí)題2.8

需要用到數(shù)學(xué)函數(shù),因此需要預(yù)處理#include<math.h>

整個(gè)數(shù)學(xué)表達(dá)式:sqrt(fabs(sin(x)))/exp(x)

習(xí)題2.9

假設(shè)總金額為x,股價(jià)為y

如果能買z股,

則z*y+z/100*0.1(BPz*(y+0.001))為總開銷

應(yīng)該z*(y+0.001)Wx

因此,zWx/(y+0.001)

因?yàn)閦為100倍的整數(shù)

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

#include<stdio.h>

voidmain()

doublex,y;

intz;

printf("請(qǐng)輸入金額:");scanf("%lf,&x);

printf("請(qǐng)輸入股票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)));

習(xí)題2.10

假設(shè)申購(gòu)金額為x,單位凈值為y

如果能買z份基金,

則手續(xù)費(fèi)z*y*0.006

買基金費(fèi)用z*y

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

z=x/(1.006*y)

#include<stdio.h>

#defineP0.006〃手續(xù)費(fèi)率

voidmain()

doublex,y,z;

printf("請(qǐng)輸入申購(gòu)金額:");scanf("%lf",&x);

printf("請(qǐng)輸入單位凈值:");scanf("%lf,&y);

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

printf("申購(gòu)基金份額%.41f\n",z);

printf("手續(xù)費(fèi)%.21f\n",z*y*P);

習(xí)題3.1

習(xí)題3.2

習(xí)題3.3

習(xí)題3.4

習(xí)題3.5

習(xí)題3.6

習(xí)題3.7

習(xí)題3.8

習(xí)題3.9

習(xí)題3.10

習(xí)題3.11

習(xí)題3.12

習(xí)題3.13

習(xí)題3.14

習(xí)題3.15

習(xí)題3.16

習(xí)題3.17

習(xí)題3.18

習(xí)題3.19

習(xí)題3.20

習(xí)題3.21

習(xí)題3.22

習(xí)題3.23

習(xí)題3.1

一個(gè)一個(gè)得到字符逐個(gè)處理,用函數(shù)getchar或getch

getchar。在stdio.h中預(yù)處理

getch()在conio.h中預(yù)處理

由習(xí)題2.6知道,函數(shù)getchar()得到回車鍵值為、n'

#include<stdio.h>

voidmain()

charc;

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

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

putchar(c);

I

)

習(xí)題3.2

本圖上下對(duì)稱

上半圖:

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

每行前面的空格比上一行少一個(gè)

有2i+l個(gè)二號(hào)

下半圖:

行號(hào)i取值2,1,0即可與上半圖相同處理

#include<stdio.h>

#defineN40〃第0行*號(hào)的列號(hào)

voidmain()

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

(

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

putchar(f,);

for(j=0;jv2*i+l;j++)〃每行的*號(hào)

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');

習(xí)題3.3

仿習(xí)題2.13或2.15處理即可

習(xí)題3.4

/*

用int類型和double類型分別求出兩個(gè)結(jié)果

因?yàn)?5!中有2和5的因子,所以個(gè)位數(shù)肯定為0

本題目主要理解數(shù)據(jù)類型的取值范圍.

*/

#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);

)

習(xí)題3.5

I*

函數(shù)IsNarcissus(intx)返回真⑴或者假(0):

判斷整數(shù)x是否為水仙花數(shù)

*/

#include<stdio.h>

intIsNarcissus(intx)

(

inta,b,c;

a=x%10;//取x的個(gè)位

b=x/10%10;〃十位

c=x/100;〃百位

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

return1;

return0;

)

voidmain()

(

inti;

puts("所有水仙花數(shù)

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

if(IsNarcissus(i))

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

)

習(xí)題3.6

/*

寫了一個(gè)函數(shù)IsCompleted(int)判斷?個(gè)整數(shù)是否為完數(shù)

在IsCompleted中,可以把for循環(huán)條件i<x改成i<=x/2

10000以內(nèi)在完數(shù):6,28,496,8128;

據(jù)測(cè)試,1萬(wàn)以外很難有完數(shù)了,但需要理論依據(jù).

*/

#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);

)

習(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是一對(duì)親密數(shù)\n”,x,y);

)

)

習(xí)題3.8

/*

仿例題3-6

*/

#include<stdio.h>

voidmain()

(

charc;

ints=0;

printf("請(qǐng)輸入一串二進(jìn)制數(shù)

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

{

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

{

puts("不是二進(jìn)制數(shù)!”);

return;

)

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

)

printf("十進(jìn)制數(shù)為:%d\n",s);

)

習(xí)題3.9

角谷猜想

*/

#include<stdio.h>

#include<conio.h>

voidmain()

(

intn;

intcount=0;

do{

printf("請(qǐng)輸入一個(gè)自然數(shù):");

scanf(u%dn,&n);

}while(nv1);〃保證輸入的數(shù)?定是自然數(shù)

while(n!=1)

(

if(n%2==0)〃偶數(shù)

(

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

n/=2;

)

else〃奇數(shù)

(

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

n=3*n+1;

)

++count;

if(count%5==0)printf(”\n");〃每5個(gè)表達(dá)式換一行

if(count%50==0)getch();//每50個(gè)表達(dá)式暫停

習(xí)題3.10

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

習(xí)題3.11

數(shù)學(xué)黑洞

*/

#include<stdio.h>

voidSwap(char*x,char*y)〃交換兩個(gè)數(shù)據(jù)

chart;

t=*x;

*x=*y;

)

voidmain()

(

intx,m,M;

chara,b,c,d;

do{

printf(”請(qǐng)輸入一個(gè)四位整數(shù)

scanf("%dn,&x);

}while(x<1000IIx>9999);

do{

a=x%10;//x的個(gè)位

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;//小數(shù)

M=1000*d+100*c+10*b+a;//大數(shù)

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

if(M-m==x)break;

x=M-m;〃把新結(jié)果存入x

}while(1);

習(xí)題3.12

除法只用了加減法

*/

#include<stdio.h>

voidmain()

(

intx,y,a,b;

intc,d;

ints=0;

prinlf(”請(qǐng)輸入兩個(gè)整數(shù):");

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

a=x;

b=y;

if((a<0&&b>0)II(a>0&&b<0))〃商是負(fù)數(shù)

s=l;

if(a<0)a=-a;

if(b<0)b=-b;

c=0;

while(a>=b)〃循環(huán)求商c

(

a-=b;

++c;

)

d=a;//余數(shù)

if(s==l)c=-c;〃商數(shù)

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

習(xí)題3.13

假設(shè)在t分鐘他們第一次走在同一條邊上,此時(shí)應(yīng)滿足條件:

⑴甲走過的路程剛好是邊長(zhǎng)(400)的整數(shù)倍,即50*t%400==0

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

因此,t取值0』,2,3,……,不滿足上條件時(shí),t值繼續(xù)增大(循環(huán))

*/

#include<stdio.h>

voidmain()

(

intt;

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

;〃空循環(huán)

printf("他們經(jīng)過%d分鐘第一次走在同一條邊Kn”,t);

習(xí)題3.14

用變量a,b,c表示A,B,C的飯量,

分別取值0』,2(這個(gè)數(shù)值僅區(qū)分他們量的大小)

當(dāng)a,b,c各取到一個(gè)值時(shí),計(jì)算他們的真話數(shù)Ta,Tb,Tc

他們飯量的大小只有6種情況,分情況判斷

本程序使用了got。語(yǔ)句

*/

#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);//計(jì)算他們的真話數(shù)

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);

*/

}

習(xí)題3.15

/*

用a,b,c表示張三,李四,王五說(shuō)話的真假,它們?nèi)≈刀紴?或1

本程序輸出0,1,0表示張三,王五說(shuō)的假話,而李四說(shuō)的真話.

*/

#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);

習(xí)題3.16

假設(shè)男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);

)

習(xí)題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);

)

習(xí)題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);

習(xí)題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);

習(xí)題3.20

假設(shè)時(shí)速不超過150,則兩小時(shí)行程不超過300

設(shè)x是兩小時(shí)的行程,則里程表上的讀數(shù)y=95859+x

對(duì)x從1到300之間窮舉,使y對(duì)稱的x就是行程

本程序得到輸出時(shí)速為50,105

*/

#include<stdio.h>

voidmain()

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

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

(

y=95859+x;

a=y%10;〃個(gè)位

b=y/10%10;〃十位

c=y/10000;〃萬(wàn)位

d=y/1000%10;〃千位

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

printf("汽車時(shí)速為%€13",x/2);

)

)

習(xí)題3.21

/*

設(shè)這個(gè)自然數(shù)的七進(jìn)制數(shù)為abc,則其九進(jìn)制數(shù)為cba

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

將這個(gè)七進(jìn)制數(shù)和九進(jìn)制數(shù)都轉(zhuǎn)換為十進(jìn)制數(shù)應(yīng)該相等

程序輸出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);

習(xí)題3.22

/*輸出153846*/

#include<stdio.h>

voidmain()

(

intx=l,y,n;

while(1)

(

if(x%10==6)//須個(gè)位數(shù)為6

(

y=x;n=l;

while(y>10)//求x的最高位權(quán)n

(

y/=10;

n*=10;

}

if((x%10)*n+x/10==4*x)〃如果把個(gè)位數(shù)移到最高位是原來(lái)的4倍

break;

)

++x;

)

printf(M%d\nn,x);

)

習(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);

習(xí)題4.1

習(xí)題4.2

習(xí)題4.3

習(xí)題4.4

習(xí)題4.5

習(xí)題4.6

習(xí)題4.7

習(xí)題4.8

習(xí)題4.9

習(xí)題4.10

習(xí)題4.11

習(xí)題4.12

習(xí)題4.13

習(xí)題4.14

習(xí)題4.15

習(xí)題4.16

習(xí)題4.17

習(xí)題4.18

習(xí)題4.1

功能:維數(shù)組兩塊數(shù)據(jù)交換

方法:下標(biāo)從il到i2的一塊與下標(biāo)從jl到j(luò)2的另一塊交換

做3塊數(shù)據(jù)逆序:il到i2、i2+l到j(luò)l-1、jl到j(luò)2

最后再將il到j(luò)2整塊逆序

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

#include<stdio.h>

voidSwap(char*x,char*y)〃交換兩個(gè)變量的值

chart;

t=*x;

*x=*y;

*y=t;

)

voidConvert(inti,intj,chara[])//一塊數(shù)據(jù)逆序

while(i<j)

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

voidSwapBlock(intil,inti2,intjl,intj2,chara[])//兩塊數(shù)據(jù)交換

〃下標(biāo)從il到i2的一塊與下標(biāo)從jl到j(luò)2的另一塊交換

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");

習(xí)題4.2

肯定有條件:i從。到N-1都有a⑼,凱1],...聲口-1]從小到大有序

新輸入?個(gè)數(shù)x,找到合適的插入點(diǎn)j,保證xv=a[j](循環(huán)條件為x>a[j])

從j開始到i-1都往后移一個(gè)位置,注意:必須從i-1至Ij逐個(gè)往后移

最后插入新數(shù)據(jù)

本題在實(shí)際軟件開發(fā)中非常有用,利用了低速輸入的空閑時(shí)間排序

#include<stdio.h>

#defineN10

voidmain()

inta[N],x;

inti,j,k;

printf("請(qǐng)輸入%d個(gè)整數(shù)(用空格分隔數(shù)據(jù)):N);

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

(

scanf(n%dn,&x);

for(j=0;j<i&&x>a[j];j++);〃空循環(huán),找到合適的插入點(diǎn)j

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

afj]=x;〃插入新數(shù)據(jù)

)

printf("排序結(jié)果

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

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

printfCAn'1);

習(xí)題4.3

#include<stdio.h>

#defineN10

函數(shù)原型:intBinarySearch(chars[],charx)

功能:在有N個(gè)元素的有序數(shù)組s中折半(二分)查找x

參數(shù):數(shù)組s有N個(gè)元素,且從小到大有序;x是待查數(shù)據(jù)

返回值:如果x在s中,返回在s中的位置(下標(biāo)),否則返回-1

方法:由左端點(diǎn)L和右端點(diǎn)R求得中點(diǎn)m(下標(biāo))

如果中點(diǎn)的值就是x,則查找成功,返回m

如果x的值比中點(diǎn)值小,說(shuō)明x在左半部分,將右端移到中點(diǎn)偏左

否則說(shuō)明x在右半部分,將左端移到中點(diǎn)偏右

注意:循環(huán)條件不能是L<R,因?yàn)橛锌赡躼正好在L==R的位置

intBinarySearch(chars[],charx)

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

while(L<=R)

(

m=(L+R)/2;〃求中點(diǎn)位置

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

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

else++L;〃左端點(diǎn)移到中偏右的位置

return-1;

)

voidmain()

(

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

charx;

intpos;

printf("請(qǐng)輸入一個(gè)字符x=getchar();

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

printf(”%c不在數(shù)組中,查找失敗!\n\x);

elseprintf(n%c在數(shù)組中,下標(biāo)為%d\n",x,pos);

)

習(xí)題4.4

/*

?維數(shù)組輸出楊輝三角

*/

#include<stdio.h>

#defineN15

voidmain()

(

inta[N];

inti,j;

for(i=0;i<N;i++)〃產(chǎn)生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);

習(xí)題4.5

/*仿例4-6對(duì)八個(gè)方向生成魔方*/

習(xí)題4.6

找鞍點(diǎn):每行中可能有多個(gè)鞍點(diǎn)(有多個(gè)最小者)

本程序用隨機(jī)函數(shù)產(chǎn)生數(shù)組元素,每次運(yùn)行數(shù)組都不?樣

*/

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

#defineM4〃數(shù)組行數(shù)

#defineN5〃數(shù)組列數(shù)

voidmain()

(

inta[M][N];

inti,j,k,p,q;

inttag=O;〃是否有鞍點(diǎn)的標(biāo)志

srand((unsigned)time(NULL));〃初始化隨機(jī)序列

for(i=0;i<M;i++)〃產(chǎn)生數(shù)組

(

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

(

a[i][j]=(int)(2*(double)rand()/RAND_MAX);〃隨機(jī)產(chǎn)生數(shù)組元素

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

)

printf("\n");

)

for(i=0;i<M;i++)//找第i行的鞍點(diǎn)

{

k=0;//k是第i行第一個(gè)最小者的列下標(biāo)

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

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

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

(

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

q=0;〃q是第p列中最大者的行下標(biāo)

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

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

if(a[i][p]==a[q][p])〃第i行第p列是鞍點(diǎn)

(

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

tag-1;

)

if(!tag)puts("沒有鞍點(diǎn)!)

)

習(xí)題4.7

#include<stdio.h>

voidmain()

(

charsentence[500];

inti,count;

inttag=O;〃單詞開始標(biāo)志

printf("請(qǐng)輸入,個(gè)句子:");

gets(sentence);

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

if(!tag&&sentence[i]>='A')〃剛進(jìn)入單詞

(

++count;〃單詞數(shù)量增1

tag=1;〃已經(jīng)在單詞內(nèi)部

}else

if(sentence[i]<,A')tag=O;〃離開單詞

printf("共有%(1個(gè)單詞\n”,count);

)

習(xí)題4.8

#include<stdio.h>

voidmain()

(

chars[100J;

inti;

printf("請(qǐng)輸入?個(gè)英文句子

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]);

)

習(xí)題4.9

#include<stdio.h>

#include<string.h>

函數(shù)原型:voidReplace(char*text,char*sl,char*s2)

功能:將文本text中的串si替換成串s2

參數(shù):三個(gè)字符串

返回值:void,替換后的結(jié)果由參數(shù)text帶回

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

inti,j,k,len;

len=(strlen(s2)-strlen(sl));〃兩個(gè)串長(zhǎng)度之差

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

(

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

;〃查找text中第i個(gè)字符開始是否有si

if(sl[k]==U)〃在text中從第i個(gè)字符開始,找到一個(gè)si

(

〃下面在text中將si替換為s2

if(len>0)〃空間不夠替換,需要后移騰出空間

for(j=strlen(text);j>i;j--)〃后移源來(lái)下標(biāo)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結(jié)果:%s\n”,text);

習(xí)題4.10

#include<stdio.h>

#include<string.h>

函數(shù)原型:intFind(char*text,char*s)

功能:在串text中找s出現(xiàn)的開始位置

參數(shù):2個(gè)字符串

返回值:如果s在text中存在,則返回第詼出現(xiàn)在text的下標(biāo)

否則返回

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個(gè)字符開始是否是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在原串中第一次出現(xiàn)的下標(biāo)是%而”時(shí));

習(xí)題4.11

仿例3-6

#include<stdio.h>

unsignedlongH2D(char*h)〃十六進(jìn)制串轉(zhuǎn)換成十進(jìn)制數(shù)

(

inti;

unsignedlongd=0;

for(i=0;h[i];i++)〃把小寫字母轉(zhuǎn)成大寫字母

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

for(i=0;h[i];i++)〃十六進(jìn)制串轉(zhuǎn)成十進(jìn)制數(shù)

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

returnd;

)

voidmain()〃主函數(shù)

(

chars[9];〃最長(zhǎng)8位十六進(jìn)制數(shù)(最多4字節(jié))

printf("請(qǐng)輸入一個(gè)十六進(jìn)制數(shù)

gets(s);

printf("十進(jìn)制數(shù)為:%lu\n",H2D(s));

)

習(xí)題4.12

#include<stdio.h>

#include<string.h>

#defineN4

struct

charstuNoflO];

charstuNamef10];

intscore;

}stu[N]=

(

{"0901001","張三",90},

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

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

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

};〃N個(gè)學(xué)生的信息

voidmain()

(

charx[10];

inti;

printf(”請(qǐng)輸入學(xué)號(hào)或姓名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("學(xué)號(hào):%s\n",stu[i].stuNo);

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

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

}elseprintf("輸入的學(xué)號(hào)或姓名%§不存在!\n”,x);

習(xí)題4.13

來(lái)電顯示

#include<stdio.h>

#include<string.h>

#defineN4//號(hào)碼簿的記錄數(shù)

struct//號(hào)碼薄

(

charName[20];

charTelNum[13];

}TelTable[N]=

(

{“張三”,”5516277”},

{“李四”,“5516278”},

{”王五”,”08715516278”},

{”邱六”,”08715516279”}

voidDisplay(char*inNum,char*outN)

//由輸入號(hào)碼inNum在電話薄中匹配,由outN返回對(duì)應(yīng)的顯示姓名

//匹配:比較的兩個(gè)號(hào)碼?個(gè)是另一個(gè)的尾子串(短者與長(zhǎng)者的右邊完全一樣)

//完全匹配:能匹配而且兩個(gè)號(hào)碼的長(zhǎng)度也一樣

//不完全匹配:?個(gè)是另一?個(gè)的尾子串,但長(zhǎng)度不?樣

(

inti,j,k,p;

intmax=0,maxi;

for(i=0;inNum[i];i++);//把i移到待查號(hào)碼的末尾

for(j=0;j<N;j++)//從號(hào)碼薄第0號(hào)記錄開始順序找

{

for(k=0;TelTable[j].TelNum[k];k++);〃把k移到第j個(gè)號(hào)碼的末尾

for(p=i;k>=0&&p>=0;-k,-p)//從末尾倒過來(lái)往左比較

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

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

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

strcpy(outN,TelTable[j].Name);//取走對(duì)應(yīng)姓名

return;//退出函數(shù)

)

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

i

max=i-p;//最大匹配長(zhǎng)度

maxi=j;//對(duì)應(yīng)號(hào)碼薄的記錄號(hào)

if(max>0)

strcpy(outN,TelTable[maxi].Name);//取號(hào)碼匹配最多的姓名

else

strcpy(outN,inNum);//不能匹配,用輸入號(hào)碼代替顯示姓名

)

voidmain()//主函數(shù)

(

charname[20],telnum[l3J;

printf("請(qǐng)輸入電話號(hào)碼gets(telnum);

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

printf("來(lái)電:%s\n\n”,name);〃顯示姓名name

)

習(xí)題4.14

#include<stdio.h>

函數(shù)原型:unsignedcharb2i(char*s)

參數(shù):char*s(數(shù)字串,如“192”)

返回值:無(wú)符號(hào)字符型(1字節(jié)無(wú)符號(hào)整數(shù))

功能:將串轉(zhuǎn)換成整數(shù),如“192”轉(zhuǎn)換成192

unsignedcharb2i(char*s)

unsignedcharc=0;

while(*s)

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

++s;

returnc;

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

函數(shù)原型:unsignedlongIP32(char*IPdot)

參數(shù):char*IPdot(點(diǎn)分十進(jìn)制IP地址字符串)

返回值:無(wú)符號(hào)長(zhǎng)整數(shù)(4字節(jié)整數(shù))

功能:將點(diǎn)分十進(jìn)制IP地址轉(zhuǎn)換成32位整數(shù)

例如:將"3"轉(zhuǎn)換成整數(shù)(用十六進(jìn)制表示)C0A80617

unsignedlongIP32(char*IPdot)〃把點(diǎn)分十進(jìn)制IP地址轉(zhuǎn)換成32位數(shù)據(jù)

(

unsignedlongs=0;//最后的32位數(shù)據(jù)

charc[4][4];〃保存4個(gè)串,每個(gè)串3個(gè)數(shù)字和一個(gè)結(jié)束標(biāo)志、0,

inti,j=O,k=O;

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

(

if(IPdot[i])

(

c[j]lk]=、(y;〃到?就取完一個(gè)串

++j;k=O;〃為下一個(gè)串作準(zhǔn)備

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

)

for(j=0;jv4;j++)〃把4個(gè)串合成為一個(gè)32位數(shù)據(jù)

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

returns;

)

chargetIpClass(unsignedlongipAddr)〃求網(wǎng)絡(luò)類別

/*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)〃求網(wǎng)絡(luò)號(hào)

(

return(ipAddr&OxOFFFFFFF)?8;

)

unsignedlonggetHostId(unsignedlongipAddr)〃求網(wǎng)絡(luò)主機(jī)號(hào)

(

returnipAddr&OxOOOOOOFF;

voidmain?!ㄖ骱瘮?shù):測(cè)試上面的函數(shù)

(

charIPdot[16]=n3";

unsignedlongIpAddr;

IpAddr=IP32(IPdot);

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

printf("IP地址十六進(jìn)制數(shù)據(jù):%08X\n”,IpAddr);

printf("網(wǎng)絡(luò)類別:%c\n",getIpClass(IpAddr));

printf("所屬網(wǎng)絡(luò)號(hào):%05X\n”,getIpNetId(IpAddr));

printf("主機(jī)號(hào):%02X\n",getHostId(IpAddr));

習(xí)題4.15

#include<stdio.h>

#defineESCOxlb

#defineSOH0x01

#defineEOT0x04

voidInStr20utStr(char*InStr,char*OutStr)〃把輸入串轉(zhuǎn)換成發(fā)送串

(

inti,j=0;

OutStr|j++]=SOH;〃起始幀標(biāo)志

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

(

switch(InStr[i])〃填充轉(zhuǎn)義字符

(

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;//結(jié)束幀標(biāo)志

OutStrUhAO';〃字符串結(jié)束標(biāo)志

)

voidOutStr2InStr(char*OutStr,char*InStr)〃把發(fā)送串轉(zhuǎn)換成接收串(應(yīng)與輸入串相同)

(

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)//還原轉(zhuǎn)義字符

(

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,;〃字符串結(jié)束標(biāo)志

)

voidDisplayStr(char*str)//顯示數(shù)據(jù)包

(

while(*str)

(

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

elseputchar(*str);

putcharC');

++str;

putchar('\n');

voidmain()〃主函數(shù):測(cè)試轉(zhuǎn)換函數(shù)

(

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

charoutStr[1000];

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

InStr20utStr(inStr,outStr);

printf(“發(fā)送串:");DisplayStr(outStr);

OutStr2InStr(outStr,inStr);

printf(”接收串DisplayStr(inStr);

習(xí)題416

功能:隨機(jī)發(fā)牌并排序

原理:用三維數(shù)組存儲(chǔ)數(shù)據(jù):固定牌發(fā)給隨機(jī)人

本題方法很多,主要考慮數(shù)據(jù)存儲(chǔ)效率與程序處理的方便

#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個(gè)人的第j種花色的長(zhǎng)度(張數(shù))

voidGenCards()〃發(fā)牌

(

inti,j,k;

srand((unsigned)time(NULL));

for(i=0;i<4;i++)//初始化:第i個(gè)人的第j種花色的長(zhǎng)度均為0

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

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

for(j=0;j<4;j++)//發(fā)第j種花色

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

(

i=(int)(4*rand()/((double)RAND_MAX+1));//把第j種花色的第k張牌發(fā)給第i個(gè)人

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++)//對(duì)第i個(gè)人的第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?!ㄝ擨II

(

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();〃發(fā)牌

SortCards。;〃排序

OutCards();〃輸出

getch();

)

習(xí)題4.17

/***本題是結(jié)構(gòu)體的應(yīng)用

其中,分子分母的約分函數(shù)Reduction尤其重要

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論