




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C程序設(shè)計(jì)(第三版)課后習(xí)題參考解答
第1章C語言概述
1.5參照本章例題,編寫一個(gè)C程序,輸出以下信息:
VeryGood!
Jvrv.
main()
{printf(''******************************\n')
printf("VeryGood!\n’');
printf(“\n”);
printf("******************************\n")?
)
1.6寫一個(gè)程序,輸入a,b,c三個(gè)值,輸出其中最大者。
解:
main()
{inta,b,c,max;
printf(“請(qǐng)輸入三個(gè)數(shù)a,b,c:\n,5);
scanf("%d,%d,%d”成a,&b,&c);
max=a;
if(max<b)
max=b;
if(max<c)
max=c;
printf(u最大數(shù)為:%dM,max);
第2章程序的靈魂一一算法
2.1什么叫結(jié)構(gòu)化的算法?為什么要提倡結(jié)構(gòu)化的算法?
解:由一些基本結(jié)構(gòu)順序組成的算法稱為結(jié)構(gòu)化的算法。由于在基本結(jié)構(gòu)之間不存在非順序
的跳轉(zhuǎn),流程的轉(zhuǎn)移只存在于一個(gè)基本結(jié)構(gòu)范圍之內(nèi),因而提高了算法的質(zhì)量。
2.7什么叫結(jié)構(gòu)化程序設(shè)計(jì)?它的主要內(nèi)容是什么?
解:結(jié)構(gòu)化程序就是用高級(jí)語言表示的結(jié)構(gòu)化算法。它的主要內(nèi)容包括“自頂向下,逐步細(xì)
化”的分析方法和“模塊化設(shè)計(jì)”的解決方法,以及“結(jié)構(gòu)化編碼”的實(shí)現(xiàn)方法。
第3章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式
3.3請(qǐng)將下面各數(shù)用八進(jìn)制和十六進(jìn)制數(shù)表示:
(1)10(2)32(3)75(4)-617
(5)-111(6)2483(7)-28654(8)21003
解:⑴(10)10=(12)8=(A)]6
(2)(32)IO=(4O)8=(2O)%
(3)(75)10=(113)8=(4B)16
(4)(―617)IO=(176627)8=(FD97)|6
此題可以這樣考慮:帶符號(hào)數(shù)在計(jì)算機(jī)中采用補(bǔ)碼表示,正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)
的補(bǔ)碼=模+真值。若使用16位存儲(chǔ),模為2母=65536。-617的補(bǔ)碼為65536+(-
167)=64919=(176627)8=(FD97),6
(5)(-11I)1O=(177621)8=(FF91)16
(6)(2483)I0=(4663)8=(9B3)16
(7)(-28654),0=(110022X9012)I6
(8)(21OO3)IO=(51O13)8=(52OB)I6
3.4將以下三各整數(shù)分別賦給不同類型的變量,請(qǐng)畫出賦值后數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式。
變量的類型25-232769
int型
long型
sort型
signedchar(8位)
unsignedint型
unsignedlong型
unsignedshort型
unsignedchar型
注:如果沒有學(xué)過二進(jìn)制和補(bǔ)碼,此題可以不做。
解:各數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式如下表所示:
變量的類型25-232769
int型00-0000110011111111111111110100…001(溢出)
8位1514
long型00-00001100111—111000—0100???001
24311614
short型100^0000110011111111111111110100…001(溢出)
81514
signedchar(8位)1000110011111111000000001(溢出)
unsignedint型00-00001100111-110100-001
81514
unsignedlong型00-00001100111-11000-0100-001
24311614
unsignedshort型00-00001100111-110100-001
8158
unsignedchar型000110011111111000000001
其中int和short類型,其取值范圍是一32768?32767。32769在這兩種類型中實(shí)際表示負(fù)數(shù),
它是一個(gè)負(fù)數(shù)的補(bǔ)碼,對(duì)其再求一次補(bǔ)碼可得其真值,即一(65536-32769)=—32767。
char和unsignedchar為8位,若將int或long類型數(shù)據(jù)賦給這種類型,則截取數(shù)據(jù)低8位。
同理,若將long賦給int,則截取低16位。
3.5字符常量和字符串常量有什么區(qū)別?
解:字符常量是個(gè)字符,用單引號(hào)括起來。字符串常量是由0個(gè)或若干個(gè)字符組合而成,
用雙引號(hào)括起來,存儲(chǔ)時(shí)自動(dòng)在字符串最后加一個(gè)結(jié)束符號(hào)'\0'。
3.6寫出以下程序運(yùn)行的結(jié)果:
main()
{charcl='a',c2='b',c3='c',c4='\101c5='\l16';
printf("a%cb%c\tc%c\tabc\n",cl,c2,c3);
printf("\t\b%c%c”,c4,c5);
(
解:程序運(yùn)行的結(jié)果為:
aabbccabc
AN
3.7要將“China”譯成密碼,密碼規(guī)律是:用原來的字母后面第4個(gè)字母代替原來的字母。
例如,字母“A”后面第4個(gè)字母是“E",用“E”代替“A”。因此,“China”應(yīng)譯為“G個(gè)re”。
請(qǐng)編一程序,用賦初值的方法使c1,c2,c3,c4,c5這5個(gè)變量的值分別為量',’h',T,h,'a',
經(jīng)過運(yùn)算,使c1,c2,c3,c4,c5的值分別變?yōu)?G',T,'m',T,6,并輸出。
解:
main()
{charcl=9C\c2='h',c3=i\c4=>n\c5='a';
cl+=4;
c2+=4;
c3+=4;
c4+=4;
c5+=4;
printf(“密碼是%c%c%c%c%c\n,cl,c2,c3,c4,c5);
)
運(yùn)行結(jié)果:
密碼是Glmre
3.8例2.6能否改成如下:
main()
{intcl,c2;(原為charcl,c2)
cl=97;
c2=98;
printf(44%c%c\n,\cI,c2);
printf(4t%d%d\n\cl,c2);
)
解:可以。因?yàn)樵诳奢敵龅淖址秶鷥?nèi),用整型和用字符型作用相同。
3.9求下面算術(shù)表達(dá)式的值。
(1)x+a%3*(int)(x+y)%2/4
設(shè)x=2.5,a=7,y=4..7
(2)(float)(a+b)/2+(int)x%(int)y
設(shè)a=2,b=3,x=3.5,y=2.5
解:
(1)2.5
(2)3.5
3.10寫出程序運(yùn)行的結(jié)果。
main()
{inti,j,m,n;
i=8;
j=10;
m=++i;
n=j++;
printf("%d,%d,%d,%d",i,j,m,n);
)
解:運(yùn)行結(jié)果為:
9,11,9,10
3.11寫出下面賦值的結(jié)果。格中寫了數(shù)值的是要將它賦給其他類型的變量,將所有空格填
上賦值后的數(shù)值。
int9942
chardX
unsignedint7665535
float53.65
longint68
解:
int9910076536842-1
,,
char七’d5'D'*X
unsignedint991007653684265535
float99.00100.000076.0000053.6568.00000042.00000065535.0000
000000000
longint991007653684265535
3.12出下面表達(dá)式運(yùn)算后a的值,設(shè)原來a=12。設(shè)a和n都已定義為整型變量。
(1)a+=a(2)a-=2
(3)a*=2+3(4)a/=a+a
(5)a%=(n%=2),n的值等于5(6)a+=a-=a*=a
解:
(1)24(2)10
(3)60(4)0
(5)0(6)0
第4章最簡(jiǎn)單的C程序設(shè)計(jì)——順序程序
設(shè)計(jì)
4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1='a',c2='b',
想得到以下的輸出格式和結(jié)果,請(qǐng)寫出程序(包括定義變量類型和設(shè)計(jì)輸出)。
要求輸出的結(jié)果如下:
a=D3Dnb=n4nDc=n5
x=1.200000,y=2.400000,z=-3.600000
x+y=口3.60□□y+z=-1.20口口z+x=-2.40
u=口51247口口!!=□□□128765
cl='aPorD97(ASCn)
c2='bPoiO98(ASCH)
解:
main()
(
inta,b,c;
longintu,n;
floatx,y,z;
charcl,c2;
a=3;b=4;c=5;
x=1.2;y=2.4;z=-3.6;
u=51247;n=128765;
cl=,a,;c2=,b,;
printf("\n");
printf(44a=%2dn□b=%2dD□c=%2d\n,,,a,b,c);
printf(44x=%.6f,y=%.6f,z=%.6f\nM,x,y,z);
printf("4x+y=□%.2f□□y+z=%.2fD□z+x=%.2f\nM,x+y,y+z,z+x);
printf(<4u=%61dD□n=%91d\n,,,u,n);
printf(<*cl=,%c,or%d(ASCII)\n,,,c1,c1);
printf(uc2=,%c,or%d(ASCII)\n,,,c2,c2);
4.5請(qǐng)寫出下面程序的輸出結(jié)果:
main()
{inta=5,b=7;
floatx=67.8564,y=-789,124;
charc='A';
longn=1234567;
unsignedu=65535;
printf(4t%d%d\n,\a,b);
printfC<%3d%3d\n,,,a,b);
printfC%f,%f\n,\x,y);
printf("%?1Of,%-1Of\n”,x,y);
printf(4<%8.2f,%8.2f,%4f,%4f,%3f,%3f\n”,x,y,x,y,x,y);
printf("%e,%10.2e\n”,x,y);
printf("4%c,%d,%o,%x\n,,,c,c,c,c);
printf("%ld,%lo,%x\n”,n,n,n);
printf("%u,%o,%x,%d\rT,u,u,u,u);
printf("%s,%5.3s\n''JCOMPUTER","COMPUTER");
)
運(yùn)行結(jié)果:
5Q7
□□5口口7
67.856400,-789.124023
67.856400D,-789.124023
□□□67.86,口口-789.12,67.8564,-789.1240,67.856400,-789.124023
6.785640e+01,n□-7.9e+02
A,65,101,41
1234567,4553207,d687
65535,177777,ffffrl
COMPUTER,nncoM
可以發(fā)現(xiàn),輸出數(shù)據(jù)中若有負(fù)號(hào)、e和小數(shù)點(diǎn),這些字符也占位。
4.6用下面的scanf函數(shù)輸入數(shù)據(jù),使a=3,b=7,x=8.5,y=71.82,c1=A5,c2='a'。問在
鍵盤上如何輸入?
#include<stdio.h>
voidmain()
(
inta,b;
floatx,y;
charc1,c2;
scanf(t4a=%db=%d,\&a,&b);
scanf("%f%e”,&x,&y);
scanf(u%c%c,,,&c1,&c2);
解:
a=3□b=7
□8.5D71.82
□Ada
4.7下面的scanf函數(shù)輸入數(shù)據(jù),使a下0,b=20,c1='A',c2='a',x=1.5,y=-3.75,z=67.8,
請(qǐng)問在鍵盤上如何輸入數(shù)據(jù)?
scanf(“%5d%5d%c%c%f%f%*f,%f',&a,&b,&cI,&c2,&x,&y,&z);
解:
main()
(
inta,b;floatx,y,z;
charcl,c2;
scanf(“%5d%5d%c%c%f%f%*f,%F',&a,&b,&cI,&c2,&x,&y,&z);
printf("a=%d,b=%d,cl=5c,c2=%c,x=%6.2f,y=6.2f,z=6.2f\n,,),a,b,c1,c2,x,y,z);
)
運(yùn)行情況如下:
□□□ionna20Aai.5-3.75a1.5,67.8(此行為輸入的數(shù)據(jù),其中口為空格)
a=10,b=20,cl=A,c2=a,x=1.50,y=-3.75,z=67.80(此行為輸出)
說明:按%5d格式的要求輸入a和b時(shí),要先鍵入三個(gè)空格,然后再鍵入10與20。%*f是
用來禁止賦值的。在輸入時(shí),對(duì)應(yīng)于%*f的地方,隨意打入了一個(gè)數(shù)1.5,該值不會(huì)賦給任
何變量。
4.8圓半徑r=1.5,圓柱高h(yuǎn)=3,求圓周長,圓面積,圓球表面積,圓球體積,圓柱體積。
用scanf輸入數(shù)據(jù),輸出計(jì)算結(jié)果,輸出時(shí)要求有文字說明,取小數(shù)點(diǎn)后2位數(shù)字。請(qǐng)編程
序。
解:
main()
(
floatpi,h,r,l,s,sq,vq,vz;
pi=3.1415926;
printf(“請(qǐng)輸入圓半徑r,圓柱高h(yuǎn):\n");
scanf(t4%f,%f\&r,&h);
l=2*pi*r;
s=r*r*pi;
sq=4*pi*r*r;
vq=3.0/4.0*pi*r*r*r;
vz=pi*r*r*h;
printf(“圓周長為:I=%6.2Rn”,l);
printf(“圓面積為:s=%6.2f\n,,,s);
printf(“圓球表面積為:sq=%6.2f\n",sq);
printf(“圓球體積為:sv=%6.2f\nM,vq);
printf(“圓柱體積為:sz=%6.2f\n,\vz);
運(yùn)行結(jié)果:
請(qǐng)輸入圓半徑r,圓柱高h(yuǎn):
1.5,3/
圓周長為:1=9.42
圓面積為:s=7.07
圓球表面積為:sq=28.27
圓球體積為:sv=7.95
圓柱體積為:sz=21.21
4.9輸入一個(gè)華氏溫度,要求輸出攝氏溫度,公式為C=(5/9)(F-32)
輸出要有文字說明,取2位小數(shù)。
解:
main()
{floatc,f;
printf(“請(qǐng)輸入一個(gè)華氏溫度:\n");
scanf("%F',&f);
c=(5.0/9.0)*(f-32);/*注意5和9要用實(shí)型表示,否則5/9的值為0*/
printf(“攝氏溫度為:%5.2f\n,,,c);
);
運(yùn)行結(jié)果:
請(qǐng)輸入?個(gè)華氏溫度:
78/
攝氏溫度為:25.56
第5章選擇結(jié)構(gòu)程序設(shè)計(jì)
5.2語言中如何表示“真”和“假”?系統(tǒng)如何判斷一個(gè)量的“真”和“假”?
解:設(shè)有一個(gè)邏輯表達(dá)式,若其結(jié)果為“真。則以1表示;若其結(jié)果為“假”,則以0表示。
但是判斷個(gè)邏輯量的值時(shí),以0代表“真”,以非。代表“假二例如3&&5的值為“真”,
系統(tǒng)會(huì)給出3&&5的值為Io
5.3寫出下面各邏輯表達(dá)式的值。設(shè)a=3,b=4,c=5。
(1)a+b>c&&b==c
(2)allb+c&&b-c
(3)!(a>b)&&!clll
(4)!(x=a)&&(y=b)&&0
(5)!(a+b)+c-l&&b+c/2
解:
(1)0
(2)1
(3)1
(4)0
(5)1
5.4有3個(gè)整數(shù)a,b,C,由鍵盤輸入,輸出其中最大的數(shù)。
解:方法一:
程序如下:
main()
{inta,b,c;
printf(“請(qǐng)輸入3個(gè)整數(shù):”);
scanf("%d,%d,%d”,&a,&b,&c);
if(a<b)
if(b<c)
printfCtmax=%d\n,,?c);
else
printfCtmax=%d\n,,,b);
elseif(a<c)
printf(""max=%d\n,,,c);
else
printfCtmax=%d\n,,,a);
運(yùn)行結(jié)果:
請(qǐng)輸入3個(gè)整數(shù):12,34,9/
max=34
方法二:使用條件表達(dá)式,可以使程序更簡(jiǎn)明,清晰。
main()
{inta,b,c,temp,max;
printf(“請(qǐng)輸入3個(gè)整數(shù):”);
scanf(<<%d,%d,%d,,,&a,&b,&c);
temp=(a>b)?a:b;/*將a和b中的大者存入temp中*/
max=(temp>c)?temp:c;/*將a和b中的大者與c比較,取最大者*/
printf(443個(gè)整數(shù)中最大數(shù)是%d\n”,max);
}
方法三:a>b?(a>c?a:c):(b>c?b:c)
運(yùn)行結(jié)果:
請(qǐng)輸入3個(gè)整數(shù):12,34,9/
3個(gè)整數(shù)的最大數(shù)是34o
5.5有一函數(shù):
XX<1
y=<2x—l1<x<10
3x-llx>10
寫一程序,輸入x值,輸出y值。
解:程序如下
main()
{intx,y;
printf(“輸入x:”);
scanf(<<%d,,,&x);
if(x<l)/*x<l*/
{y=x;
printf(4<x=%d3d,y=x=%d\n,,,x,y);
)
elseif(x<10)/*l^x<10*/
{y=2*x-l;
printf(<<x=%3d,y=2*x-1=%d\n,,,x,y);
)
else/*x210*/
{y=3*x-ll;
printf(44x=%3d,y=3*x-11=%d\n”,x,y);
)
)
運(yùn)行結(jié)果:
①輸入x:4/
x=4,y=2*x-l=7
②輸入X:-1/
x=-l,y=x=-l
③輸入x:20/
x=20,y=3*x-l1=49
5.6給出一百分制成績,要求輸出成績等級(jí)'A'、B、‘C'、‘D'、E'。90分以上為A,80?89
分為B,70?79分為C',60?69分為'D',60分以下為‘E'。
解:程序如下
#include"stdio.h"
voidmain()
(
floatscore;
chargrade;
printf(”請(qǐng)輸入學(xué)生成績:”);
scanf(,,%f,,&score);
while(score>100IIscore<0)
(
printf(”\n輸入有誤,請(qǐng)重輸”);
scanf("%f”,&score);
)
switch((int)(score/l0))
(
case10:
case9:grade=,A,;break;
case8:grade=,B';break;
case7:grade='C,;break;
case6:grade=,D,;break;
case5:
case4:
case3:
case2:
case1:
case0:grade='E*;
printf("\n成績是%5.1f,相應(yīng)的等級(jí)是%c。\n",score,grade);
5.7給定一個(gè)不多于5位的正整數(shù),要求:①求它是幾位數(shù);②分別打印出每一位數(shù)字;③
按逆序打印出各位數(shù)字。例如原數(shù)為321,應(yīng)輸出123。
解:
main()
(
longintnum;
intindiv,ten,hundred,thousand,ten_thousand,place;
/*分別代表個(gè)位,十位,百位,千位,萬位和位數(shù)*/
printf(“請(qǐng)輸入一個(gè)整數(shù)(0?99999):”);
scanf("%kf',&num);
if(num>9999)
place=5;
elseif(num>999)
place=4;
elseif(num>99)
place=3;
elseif(num>9)
place=2;
elseplace=l;
printf(t4place=%d\n,\place);
printf(“每位數(shù)字為:”);
ten_thousand=num/10000;
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
switch(place)
{case5:printf("%d,%d,%d,%d,%cT,ten_thousand,thousand,hundred,ten,indiv);
printf(“\n反序數(shù)字為:”);
printfC4%d%d%d%d%d\n,\indiv,ten,hundred,thousand,ten_thousand);
break;
case4:printfCt%d,%d,%d,%d^^,thousand,hundred,ten,indiv);
printfr\n反序數(shù)字為:”);
printf(4t%d%d%d%d\0^,indiv,ten,hundred,thousand);
break;
case3:printf(u%d,%d,%d,,,hundred,ten,indiv);
printf("\n反序數(shù)字為:”);
printf(4t%d%d%dindiv,ten,hundred);
break;
case2:printf("%d,%d",ten,indiv);
printf(“\n反序數(shù)字為:”);
printf("%d%d\n",indiv,ten);
break;
case1:printf("%d'',indiv);
printf(“\n反序數(shù)字為:”);
printf("%d\n",indiv);
break;
)
)
運(yùn)行結(jié)果:
請(qǐng)輸入一個(gè)整數(shù)(0-99999):98765/
位數(shù)=5
每位數(shù)字為:9,8,7,6,5
反序數(shù)字為:56789
5.8企業(yè)發(fā)放的獎(jiǎng)金根據(jù)利潤提成。利潤I低于或等于10萬元時(shí),獎(jiǎng)金可提10%;利潤高
于10萬元,低于20萬元(100000<1^200000)時(shí),其中10萬元按10%提成,高于10
萬元的部分,可提成7.5%;200000〈IW400000時(shí),其中20萬元仍按上述辦法提成(下
同),高于20萬元的部分按5%提成;400000<區(qū)600000時(shí),高于40萬元的部分按3%
提成;600000<IW1000000時(shí),高于60萬的部分按1.5%提成;1>1000000時(shí),超過100
萬的部分按1%提成。從鍵盤輸入當(dāng)月利潤I,求應(yīng)發(fā)放獎(jiǎng)金總數(shù)。
要求:(1)用if語句編程序;(2)用switch語句編程序。
解:計(jì)算利潤時(shí),要特別注意不同利潤的不同提成比例。例如,利潤為15萬元,其中由10
萬元按10%的比例提成,另外5萬元?jiǎng)t按7.5%提成。
(1)用if語句編程序,
main()
{longi;
floatbonus,bon1,bon2,bon4,bon6,bon10;
bonl=100000*0.1;/*利潤為io萬元時(shí)的獎(jiǎng)金*/
bon2=bon1+100000*0.075/*利潤為20萬元時(shí)的獎(jiǎng)金*/
bon4=bon2+100000*0.05/*利潤為40萬元時(shí)的獎(jiǎng)金*/
bon6=bon4+100000*0.03/*利澗為60萬元時(shí)的獎(jiǎng)金*/
bon10=bon6+400000*0.015;/*利潤為100萬元時(shí)的獎(jiǎng)金*/
printf(“請(qǐng)輸入利潤i:”);
scanf("%ki”,&i);
if(i<=100000)
bonus=i*0.1;/*利潤在10萬元以內(nèi)按0』提成獎(jiǎng)金*/
elseif(i<=200000)
bonus=bon1+(i-l00000)*0.075/*利潤在10萬至20萬元時(shí)的獎(jiǎng)金*/
elseif(i<=400000)
bonus=bon2+(i-200000)*0.05/*利潤在20萬至40萬元時(shí)的獎(jiǎng)金*/
elseif(i<=600000)
bonus=bon4+(i-400000)*0.03/*利潤在40萬元至60萬元時(shí)的獎(jiǎng)金*/
elseif(i<=1000000)
bonus=bon6+(i-600000)*0.015/*利潤在60萬元至100萬元時(shí)的獎(jiǎng)金*/
elsebonus=bon10+(i-l000000)*0.01/*利潤在100萬元以上時(shí)的獎(jiǎng)金*/
printf("獎(jiǎng)金是%10.2f\bonus);
運(yùn)行結(jié)果:
請(qǐng)輸入利潤i:234000/
獎(jiǎng)金是:19200.00
(2)用switch語句編程序,
main()
{longi;
floatbonus,bon1,bon2,bon4,bon6,bon10;
intc;
bon1=100000*0.1
bon2=bon1+100000*0.075
bon4=bon2+200000*0.05
bon6=bon4+200000*0.03
bonl0=bon6+400000*0.015
printf(“請(qǐng)輸入利潤i:”);
scanf("%d",&i);
c=i/100000;
if(c>10)thenc=10;
switch(c)
{case0:bonus=i*0.1;break;
case1:bonus=bon1+(i-100000)*0.075;break;
case2:
case3:bonus=bon2+(i-200000)*0.05;break;
case4:
case5:bonus=bon4+(i-400000)*0.03;break;
case6:
case7:
case8:
case9:bonus=bon6+(i-600000)*0.015;break;
case10:bonus=bon10+(i-1000000)*0.01;
printf("獎(jiǎng)金是%10.2F',bonus);
運(yùn)行結(jié)果:
請(qǐng)輸入利潤i:234000/
獎(jiǎng)金是:19200.00
5.9輸入4個(gè)整數(shù),要求按由小到大的順序輸出。
解:程序如下
#include"stdio.h"
voidmain()
(
intt,a,b,c,d;
printf(”請(qǐng)輸入4個(gè)整數(shù):”);
scanf(n%d,%d,%d,%dn,&a,&b,&c,&d);
printf(ua=%d,b=%d,c=%d,d=%d'\a,b,c,d);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(a>d)
{t=a;a=d;d=t;}
if(b>c)
{t=b;b=c;c=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)
{t=c;c=d;d=t;}
printf("排序結(jié)果如下:\n'r);
printf(M%d%d%d%d\n'\a,b,c,d);
5.10有4個(gè)圓塔,圓心分別為(2,2),(—2,2),(2,—2),(—2,—2),圓半徑為1。
見圖4.4。這4個(gè)塔的高度分別為10m。塔以外無建筑物。今輸入任一點(diǎn)的坐標(biāo),求該點(diǎn)的
建筑高度(塔外的高度為0)。
解:程序如下
main()
{inth=10;
floatx1=2,yI=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,dI,d2,d3,d4;
printf(“請(qǐng)輸入一個(gè)點(diǎn)(x,y):");
scanfC%f,%f;&x,&y);/*求該點(diǎn)到各中心點(diǎn)的距離可
dl=(x-xl)*(x-x1)+(y-y1)*(y-y1);
d2=(x-x2)*(x-x2)+(y+y2)*(y+y2;
d3=(x+x3)*(x+x3)+(y-y3)*(y-y3);
d4=(x+x4)*(x+x4)+(y+y4)*(y+y4);
if(dl>l&&d2>l&&d3>l&&d4>l)h=0;/*判斷該點(diǎn)是否在塔外*/
printf(“該點(diǎn)高度為%(1'',11);
運(yùn)行情況:
請(qǐng)輸入一個(gè)點(diǎn)(x,y):0.5,0.7/
該點(diǎn)高度為0
請(qǐng)輸入一個(gè)點(diǎn)(x,y):2.1,2.3/
該點(diǎn)高度為10
第6章循環(huán)控制
6.1輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。
解:用輾轉(zhuǎn)相除法求最大公約數(shù)
main()
{intp,r,n,m,temp;
printf(“請(qǐng)輸入兩個(gè)正整數(shù)n,m:");
scanf("%d,%d”,&n,&m);
if(n<m)
{temp=n;
n=m;
m=temp;/*把大數(shù)放在n中,小數(shù)放在m中*/
)
p=n*m;/*先將m和n的乘積保存在p中,以便求最小公倍數(shù)時(shí)用*/
while(m!=0)/*求m和n的最大公約數(shù)*/
{r=n%m;
n=m;
m=r;
)
printf(“它們的最大公約數(shù)為:%d\n”,n);
printf(“它們的最小公倍數(shù)為:%d\n,,,p/n);/*p是原來兩個(gè)整數(shù)的乘積*/
運(yùn)行情況:
請(qǐng)輸入兩個(gè)正整數(shù):12,8/
它們的最大公約數(shù)為:4
它們的最小公倍數(shù)為:24
6.2輸入一行字符,分別統(tǒng)計(jì)出其中英文字母,空格,數(shù)字和其它字符的個(gè)數(shù)。
解:
#include<stdio.h>
main()
{charc;
intIettei*=0,space=0,digit=0,other=0;
printf(“請(qǐng)輸入一行字符:\n");
while((c=getchar())!=,\n,)
{if(c>='a'&&cv='z'IIc>='A'&&cv='Z')
letter++;
elseif(c==')
space++;
elseif(c>='0'&&c<=,9,)
digit++;
else
other++;
)
printf("字母數(shù)=%d,空格數(shù)=%d,數(shù)字?jǐn)?shù)=%d,其它字符數(shù)二%d\n”,letter,space,digit,other);
)
運(yùn)行情況:
請(qǐng)輸入一行字符:
Myteacher'saddressis“#123BeijingRoad,Shanghai”.
字母數(shù):38,空格數(shù):6,數(shù)字?jǐn)?shù):3,其它字符數(shù):6
6.3
求Sn=a+aa+aaa+…+aa…a之值,其中a是一個(gè)數(shù)字。例如:2+22+222+2222+22222
n個(gè)a
(此時(shí)n=5),n由鍵盤輸入。
解:
main()
{inta,n,i=l,sn=0,tn=0;
printf('4a,n=:");
scanf("%d,%d'',&a,&n);
while(i<=n)
{tn=tn+a;/*賦值后的tn為i個(gè)a組成數(shù)的值*/
sn=sn+tn;/*賦值后的sn為多項(xiàng)式前I項(xiàng)之和*/
a=a*10;
++i;
)
printf("a+aa+aaa+?"=%d\n”,sn);
)
運(yùn)行情況:
a,n:2,5/
a+aa+aaa+?,,=24690
6.4求En!(即求1+2!+-??+20!)。
解:
main()
{floats=0,t=l;
intn;
for(n=l;n<=20;n++)
(
t=t*n;/*求n!*/
s=s+t;/*將各項(xiàng)累加*/
)
printf("l!+2!+…+20!=%e\n”,s);
)
運(yùn)行結(jié)果:
l!+2!+…+20!=2.56l33e+l8
注意:s不能定義為int型,因?yàn)閕nt型數(shù)據(jù)的范圍是-32768~32767;也不能定義為long型,
因?yàn)閘ong型數(shù)據(jù)的范圍為一21億?21億,無法容納求得的結(jié)果。
6.5求
10050101
k=\k=lk=lK
解:
#includeHstdio.h"
#includeuconio.h"
main()
intn1=100,n2=50,n3=10,k;
floatsl=0,s2=0,s3=0;
for(k=1;k<=n1;k++)
sl+=k;
for(k=l;k<=n2;k++)
s2+=k*k;
for(k=l;k<=n3;k++)
s3+=1.0/k;
printf(,,sum=%8.2f\n,,,s1+s2+s3);
getch();
6.6打印出所有的“水仙花數(shù)二
所謂“水仙花數(shù)”是指一個(gè)3位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如,153是一個(gè)
“水仙花數(shù)”,因?yàn)?53=13+53+3\
解:
main()
{inti,j,k,n;
printf(““水仙花數(shù)”是:");
for(n=100;n<1000;n++)
{i=n/100;
j=n/10-i*10;
k=n%10;
if(n==i*i*i+j*j*j+k*k*k)
printf("%4d”,n);
)
printf(4t\nv);
)
運(yùn)行結(jié)果:
“水仙花數(shù)”是:153370371407
6.7一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為“完數(shù)例如,6的因子為1,2,
3,而6=1+2+3,因此6是“完數(shù)”。編程序找出1000以內(nèi)的所有“完數(shù)”,并按下面的格
式輸出其因子:6Itsfactorsare1,2,3
解:方法一:
#defineM1000/*定義尋找范圍*/
main()
{intkl,k2,k3,k4,k5,k6,k7,k8,k9,kl0;
inti,a,n,s;
for(a=2;a<=M;a++)/*a是2?100()之間的整數(shù),檢查它是否完數(shù)*/
{n=0;/*n用來累計(jì)a的因子的個(gè)數(shù)
s=a;/*s用來存放尚未求出的因子之和,開始時(shí)等于a*/
for(i=l;i<a;i++)/*檢查i是否a的因子*/
if(a%i==0)/*如果i是a的因子*/
{n++;/*n加1,表示新找到?個(gè)因子*/
s=s-I;Z*s減去已找到的因子,s的新值是尚未求出的因子之和*/
switch(n)/*將找到的因子賦給kl…klO*/
{case1:
kl=i;break;/*找出的第1個(gè)因子賦給kl*/
case2:
k2=i;break;/*找出的第2個(gè)因子賦給k2*/
case3:
k3=i;break;/*找出的第3個(gè)因子賦給k3*/
case4:
k4=i;break;/*找出的第4個(gè)因子賦給k4*/
case5:
k5=i;break;/*找出的第5個(gè)因子賦給k5*/
case6:
k6=i;break;/*找出的第6個(gè)因子賦給k6*/
case7:
k7=i;break;/*找出的第7個(gè)因子賦給k7*/
case8:
k8=i;break;/*找出的第8個(gè)因子賦給k8*/
case9:
k9=i;break;/*找出的第9個(gè)因子賦給k9*/
case10:
klO=i;break;/*找出的第10個(gè)因子賦給klO*/
)
if(s==0)*s=0表示全部因子都已找到*/
{printf("%dItsfactorsare”,a);
if(n>l)printf("%d,%d”,kl,k2);/*n>l表示a至少有2個(gè)因子*/
if(n>2)printf(",%d”,k3);/*n>2表示至少有3個(gè)因子,故應(yīng)再輸入一個(gè)因子*/
if(n>3)printf(<<,%d,,,k4);/*以下類似*/
if(n>4)printf(",%d”,k5);
if(n>5)printf(",%d”,k6);
if(n>6)printf(",%d”,k7);
if(n>7)printfC\%dM,k8);
if(n>8)printf(",%d”,k9);
if(n>9)printf(",%d”,klO);
printf("\n”);
運(yùn)行結(jié)果:
6Itsfactorsare1,2,3
28Itsfactorsare1,2,4,7,14
496Itsfactorsare1,2,4,8,16,31,62,124,248
方法二:
main()
{intm,s,i;
for(m=2;m<1000;m++)
{s=0;
for(i=l;i<m;i++)
if((m%i)==0)s=s+i;
if(s==m)
{printf("%d是一個(gè)“完數(shù)”。它的因子是“,m);
for(i=l;i<m;i++)
if(m%I==0)printfC<%d,,,I);
printf("\n”);
)
)
)
方法三:此題用數(shù)組方法更簡(jiǎn)單。
main()
{intk[llJ;
inti,a,n,s;
for(a=2;a<=1000;a++)
{n=0;
s=a;
for(i=l;i<a;i++)
if((a%i)==0)
{n++;
s=s-i;
k[n]=i;/*將找到的因子賦給k[l],…,k[10]*/
)
if(s==0)
{primf("\n%d是一個(gè)“完數(shù)”,它的因子是:?\a);
for(i=l;i<n;i++)
printf(44%d;;k[i]);
printf("%d\n”,k[n]);
運(yùn)行結(jié)果:
6是一個(gè)“完數(shù)”,它的因子是:1,2,3
28是一個(gè)“完數(shù)”,它的因子是:1,2,4,7,14
496是一個(gè)“完數(shù)”,它的因子是:1,2,4,8,16,31,62,124,248
6.8有一分?jǐn)?shù)序列:
2/1,3/2,5/3,8/5,13/8,21/13,…求出這個(gè)數(shù)列的前20項(xiàng)之和。
解:
main()
{inti,t,n=20;
floata=2,b=l,s=0;
for(i=l;iv=n;i++)
{s=s+a/b;
t=a;
a=a+b;/*將前一項(xiàng)分子與分母之和作為下一項(xiàng)的分子*/
b=t;/*將前一項(xiàng)分子作為下一項(xiàng)的分母*/
}
printf("sum=%9.6f\n",s);
)
運(yùn)行結(jié)果:
sum=32.660259
6.9一球從100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10
次落地時(shí),共經(jīng)過多少m?第10次反彈多高?
#include"stdio.h',
voidmain()
(
floatsn=100,hn=sn/2;
intn;
for(n=2;n<=10;n++)
(
sn=sn+2*hn;/*第n次落地時(shí)共經(jīng)過的米數(shù)*/
hn=hn/2;/*第n次反彈高度*/
)
printf("第10次落地時(shí)共經(jīng)過%f米。\n",sn);
printf("第10次反彈%f米。\n",hn);
6.10猴子吃桃問題。猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不過癮,又多吃了一
個(gè)。第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩下
的一半零一個(gè)。到第10天早上再想吃時(shí),見只剩一個(gè)桃子了。求第一天共摘多少桃子。
解:
main()
{intday,xl,x2;
day=9;
x2=l;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子數(shù)是第二天桃子數(shù)加1后的2倍*/
x2=xl;
day—;
)
printfCttotal=%d\n,,,x1);
)
運(yùn)行結(jié)果:
total=1534
6.11用迭代法求
X=日。求平方根的迭代公式為X用=1(Xn)+q
2xn
要求前后兩次求出的X的差的絕對(duì)值小于10一5。
解:用迭代法求平方根的算法如下:
(1)設(shè)定一個(gè)X的初值Xo;
(2)用上述公式求出x的下一個(gè)值X1;
(3)再將XI代入上述公式,求出X的下一個(gè)值X2;
(4)如此繼續(xù)下去,直到前后兩次求出的X值(X0和Xn+1)滿足以下關(guān)系:
5
IXn+|—Xnl<10
為了便于程序處理,今只用變量Xo和X”先令x的初值Xo=a/2(也可以是另外的值),
求出XI;如果此時(shí)IXn+1—X/2l(r5,則使X1-XO,然后用這個(gè)新的XO求出下一個(gè)XI;如此
反復(fù),直到IXn+1—Xnl<l(F5為止。程序如下:
#include<math.h>
main()
{floata,xO,xl;
printf(44Enterapositivenumber:");
scanf("%f;&a);/*輸入a的值*/
x0=a/2;
xl=(x0+a/x0)/2;
do
{xO=x1;
x1=(x0+a/x0)/2;
)
while(fabs(xO-x1)>=le-5);
printf("Thesquarerootof%5.2fis%8.5f\n,,,a,xl);
)
運(yùn)行結(jié)果:
Enterapositivenumber:2/
Thesquarerootof2.00is1.41421
6.12用牛頓迭代法求方程2X3-4X2+3X-6=0在1.5附近的根。
解:牛頓迭代法又稱牛頓切線法,它采用以下方法求根:先任意設(shè)定一個(gè)與真實(shí)的根接近的
值Xo作為第一一個(gè)近似根,由Xo求出f(Xo),過(Xo,f(Xo))點(diǎn)做f(x)的切線,交X軸于X1,把它作
為第二次近似根,再由X|求出f(X1),再過(Xi,f(X1))點(diǎn)做f(x)的切線,交X軸于X2,再求出f(x2),
再作切線……如此繼續(xù)下去,直到足夠接近真正的X*為止。
因止匕,X1=X。一伊
fUo)
這就是牛頓迭代公式。
本題中,f(x)=2X3-4X2+3X-6=((2X-4)X+3)X-6
f(x)=6X2-8X+3=(6X-8)+3
#include"stdio.h"
#include"math.h"
voidmain()
(
floatxl,x0,f,fl;
xl=1.5;
do
(
x0=x1;
f=((2*x0-4)*x0+3)*x0-6;
fl=(6*xO-8)*xO+3;
xl=xO-f/fl;
}while(fabs(x1-xO)>=le-5);
printf(MTHerootofequationis%5.2f\n",xl);
)
6.13用二分法求方程2x3-4x2+3x-6=0在(-10,10)之間的根。
解:二分法的思路如下:先指定一個(gè)區(qū)間[X],X2],如果函數(shù)f(X)在此區(qū)間是單調(diào)變化,可以
根據(jù)f(X|)和f(X2)是否同符號(hào)來確定方程f(X)=0在[X|,X2]區(qū)間是否有一個(gè)實(shí)根。若
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 木聚糖酶產(chǎn)業(yè)分析報(bào)告
- 《藥事管理與法規(guī)》課程標(biāo)準(zhǔn)
- 剪發(fā)屬于合同范本
- 勞務(wù)合同范本定制
- 個(gè)人原因離職的辭職報(bào)告
- 各類模具加工合同范本
- 業(yè)務(wù)印章自查報(bào)告
- 接觸網(wǎng)中級(jí)工考試模擬題(附答案)
- 二手房房買賣合同范本
- 單位用工合同范本6
- 生物-湖北省鄂東新領(lǐng)先協(xié)作體2025屆高三下學(xué)期2月調(diào)考(二模)試題和答案
- 6 千人糕 教學(xué)設(shè)計(jì)-2023-2024學(xué)年語文二年級(jí)下冊(cè)統(tǒng)編版
- 社會(huì)問題(第三版)課件匯 向德平 第1-7章 社會(huì)問題概述 - 人口問題
- 深圳2025年廣東深圳市公辦中小學(xué)招聘事業(yè)單位工作人員178人筆試歷年參考題庫附帶答案詳解
- 7 鹿角和鹿腿 第二課時(shí) 公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
- 2025屆高考化學(xué)二輪復(fù)習(xí):晶胞的相關(guān)性質(zhì)及計(jì)算(含解析)
- GB/T 44994-2024聲學(xué)助聽器驗(yàn)配管理
- 2024年沙洲職業(yè)工學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫含答案解析
- 2024年山東鋁業(yè)職業(yè)學(xué)院高職單招數(shù)學(xué)歷年參考題庫含答案解析
- 2024年山東勞動(dòng)職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 融合智慧數(shù)據(jù)的圖書館數(shù)智服務(wù)平臺(tái)研究
評(píng)論
0/150
提交評(píng)論