浩強(qiáng)c程序設(shè)計(jì)第三版習(xí)題參考解答_第1頁
浩強(qiáng)c程序設(shè)計(jì)第三版習(xí)題參考解答_第2頁
浩強(qiáng)c程序設(shè)計(jì)第三版習(xí)題參考解答_第3頁
浩強(qiáng)c程序設(shè)計(jì)第三版習(xí)題參考解答_第4頁
浩強(qiáng)c程序設(shè)計(jì)第三版習(xí)題參考解答_第5頁
已閱讀5頁,還剩124頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論