《C語言程序設計》課后習題參考答案_第1頁
《C語言程序設計》課后習題參考答案_第2頁
《C語言程序設計》課后習題參考答案_第3頁
《C語言程序設計》課后習題參考答案_第4頁
《C語言程序設計》課后習題參考答案_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三部分《C語言程序設計》習題參考答案

習題一習題答案

一、單項選擇題

1、C2、C3、C4、D5、C6、D7、D8、B、D10、C

二、程序題

1、請參照本章例題,編寫一個C程序,輸出以下信息:

************

VeryGood!

審本不安小木市審本審審次

#include<stdio.h>

main()

Prinlf("************\n");

printf("VeryGood!\n");

prinlf("************\n");

2、編寫一個程序,輸入abc三個值,輸出其中最大者。

#include<stdio.h>

voidmain()

(

inia,b,c;

printf("inputa,b,c\n");

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

if(a>b)

if(a>c)printf("max=%dM,a);

else

printf("max=%d'\c);

elseif(b<c)printf("max=%d",c);

elseprintf("max=%d'\b);

習題二習題答案

一、簡答題(略)

二、選擇題

1.D2.B3.D4.B5.B6.A7.D8.C9.B

10.D11.B12.B13.D14.B15.D16.C17.D

習題三習題答案

3-1輸入兩個正整數m和n,求它們的最大公約數和最小公倍數。

#include<stdio.h>

main()

intm,n,c,a,b;

printf("pleaseinputtwonumbles:H);

scanf("%d,%d",&m,&n);

a=m;

b=n;

c=a%b;

while(c!=0)

a=b;

b=c;

c=a%b;

}

printf("thcmaxis%d\n",b);

printf("theminis%d\n",m*n/b);

)

選擇題

1.B2.D3.A4,A5.B6.C7.A8.C9.B10.B

二、填空題

I.inti%3==0||i%5==0||i%8==0

2.b=0;count++;

3.fl=l;i=3;i<=30;i=i+2

4.for(k=i;k<=35;k++)

5.count=count+l;或count++;

三、編程題

1、請編寫代碼求500以內的所有的素數之和。

#include<stdio.h>

#includc<math.h>

main()

{

intsum=0,i,j,yes;

fbr(i=2;i<=500;i++)

(

yes=1;

for(j=2;j<=sqrt(i);j++)

if(i%j=0)

(

ycs=0;

break;

}

if(yes)sum+=i;

)

printf("%d\n'\sum);

}

運行結果:21536

2.求四位的奇數中,每位數字之和是30的倍數的數的累加和。

#include<stdio.h>

main()

{

intgc,shi,bai,qian;

longintresult=0;

fbr(ge=0;ge<=9;ge++)

for(shi=0;shi<=9;shi++)

for(bai=0;bai<=9;bai++)

fbr(qian=1;qian<=9;qian++)

if((ge+shi+bai+qian)%30==0&&

(qian*10(X)+bai*1OO+shi*10+ge)%2!=0)

result+=(qian*1000+bai*1OO+shi*10+ge);

printf("%ld\n",result);

運行結果:411090

3.用一元紙幣兌換一分、兩分和五分的硬幣,要求兌換硬幣的總數為50枚,問共有多少

種換法?(注:在兌換中一分、兩分或五分的硬幣數可以為0枚)。

#include<s(dio.h>

main()

(

intone,two,five,cout=0;

fbr(five=O;five<=20;fivc++)

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

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

if(five*5+two*2+one==1(X)&&five+two+one==50)

cout++;

printf("%d\n'\cout);

)

運行結果:13

4.?球從100米高度自由落下,每次落地后反跳回原高度的?半;再落下,求它在第12

次落地時,第12次反彈多高?按四舍五入的方法精確到小數點后面四位。

#includc"stdio.h1'

main()

{

floathn,sn=l(X).O;

inti;

hn=sn/2;

fbr(i=2;i<=12;i++)

hn/=2;

printf("%.4f',hn);

}

運行結果:0.0244

5.所謂回文數是從左至右與從右至左讀起來都是一樣的數字,如:121。編一個程序,求出

在300-900的范圍內回文數的個數。

#include<stdio.h>

main()

(

inti,count=0,low,high;

fbr(i=300;i<=900;i++)

(

low=i%10;

high=i/IOO;

if(Iow==high)

count++;

)

printf("%d\n,',count);

運行結果:60

6.已知S=2+(2+4)+(2+4+6)+(2+4+6+8)+…,求Sv=10000的最大值S。

#includc<stdio.h>

main()

{

intij,k,s=0,sum=0;

for(k=2;;k+=2)

(

s=s+k;

sum=sum+s;

if(sum>1000())break;

I

sum=sum-s;

prinlf("%d\n",sum);

)

運行結果:9920

第四章習題答案

一、選擇題

(1)B(2)C(3)C(4)A(5)C(6)C(7)B(8)B(9)D(10)B

(11)D(12)B(13)B(14)A(15)A(16)D(17)C(18)A(19)D(20)A

二、填空題

(I)main函數

(2)函數首部,函數體

(3)

I=7;j=6;x=7

I=2y=7;x=5

(4)111

(5)maxis2

(6)1010

(7)

<l.>x=2y=3z=0

<2.>X=4y=9z=5

<3>X=2y=3z=0

第五章習題答案

一、選擇題

(1)A(2)A(3)D(4)A(5)C(6)C(7)C(8)B(9)B(10)B

(11)D(12)A(13)B(14)C(15)A(16)C(17)B(18)D(19)D(20)B

二、填空題

1\

/!4

z2\

x(/!8

3\

/—6

/4X

XI/Istrcat

/5X

\</Ipulchar

z6

\i

7strcmp

依次連接str2和str3構成一個新的字符串

8\

z>

924

IX

1/20

c

(2

-1

)5

(12)97

(13)n

(14)abed

(15)4

(16)5

三、編程題

(1)已知5個整數3,-5,8,2,9,求出最大值,最小值和平均值并輸出。

源代碼

#include<stdio.h>

voidmain()

{

inta[5]={3,-5,8,2,9};

intsum=0;

floataverage=0;

intmax=a[0];

intmin=a[0];

inti;

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

sum+=a[i];

average=(float)sum/5;

for(i=l;i<5;i++)

if(a[i]>max)max=a[i];

for(i=l;i<5;i++)

if(a[i]<min)min=a[i];

printf("最大值為:%d\n*?max);

printf("最小值為:%d\n*?min);

printf(“平均值為:average):

)

(2)從鍵盤輸入10個實數,按從小到大的順序排列起來。

源代碼

ttinclude<stdio.h>

voidsort_bubble(inta[],intn)

{

inti,j,temp;

for(i=0;i<n-l;i++)

for(j=i+l;j<n;j++)/*注意循環(huán)的上下限*/

if(a[i]>a[j])

(

temp=a[i];

a[i]=a[j];

a[j]=temp;

)

}

voidmain()

{

inti,a[10];

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

scanf("/d”,&a[i]);

sort_bubble(a,10);

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

{

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

)

printf('\n");

第六章習題答案

一、選擇題

I.B2.B3.D4.D5.C6.D7.A8.A9.C

10.C11.A12.C13.D14.B15.A16.D17.C

18.B19.D20.A

二、填空題

1.整型變量的地址(指針)2.a[0](數組首地址),a⑶3.24.&a[l][0]5.eXAMPLE

6.2,27.58.s[m]!=M)'(*(s+m)==*\0,&&*(t+m)==,\0')9.3510.s+m-lt2-

編程題

1.編寫一個函數,將字符串s轉換為整型數返回并在主函數中調用該函數輸出轉換后的結

果,注意負數處理方法。

解:用指針處理字符串非常方便。使用符號位來處理負數。

#include<stdio.h>

intatoi(chars[])

(

inttemp=0.f=l,i=0;

while(s[i]!='\0'&&s[i]!='->&&is[i]<,0,||s[i]>,9,))i++;〃去除事前部無效字符

if(s[i]=?j)〃讀負號

{

f=-I;

i++;

)

if(s[i]vO|[s[i]>9)cout?"error!"?endl;〃串非法時,輸出提示,返回0

while(s[i]>='0'&&s[i]<='9')〃轉換數字串

(

temp=temp*10+s[i]-48;

i++;

I

returnf*temp;

I

voidmain()

{

charnum[20];

gets(num);

printf("%d\n",atoi(num);

)

2.編程定義一個整型、一個雙精度型、一個字符型的指針,并賦初值,然后顯示各指針所

指目標的值與地址,各指針的值與指針本身的地址及各指針所占字節(jié)數(長度).(其中地

址用十六進制顯示。)

解:

#include<stdio.h>

voidmain()

(

int*ip,ival=100;

double*dp,dval=99.9;

char*cp,cval='A';

ip=&ival;

dp=&dval;

cp=&cval;

printf("%d\t%x\t%d\n,',*ip,&*ip,sizeof(*ip));

printf("%d\t%x\t%d\n",*dp,&*dp,sizeof(*dp));

printf("%d\t%x\t%d\n",*cp,(void*)&*cp,sizeof(*cp));

〃字符指針輸出是字符串,必須強制轉換為無類型指針

printf(M%x\t%x\t%d\n",ip,&ip,sizeof(ip));

printf("%x\t%x\t%d\n",dp,&dp,sizeof(dp));

printf("%x\t%x\t%d\n",(void*)cp,&cp,sizeof(cp));

)

3.利用指向行的指針變量求5X3數組各行元素之和。

解:

#include<stdio.h>

voidmain()

(

inta[5][3]={{1,2,3},{4,5,6},{7,8,9},{11,22,33},{44,55,66}};

int(*p)[3];

intij,s;

for(i=0;i<5;i++){

p=&a[i];〃指向第i行

s=0;

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

s+=*(*p+j);

printfC'sumoflineis:%d=%d\n",i,s);

4.編寫一個求字符串的函數(參數用指針),在主函數中輸入字符串,并輸出其長度。

解:

#include<stdio.h>

intfun(char*s)

(

intk=0;

while(*s!='\0')

k++;

s++;

returnk;

)

voidmain()

(

charstr[l(X)J;

printf("Stringis:\n");

gets(str);

printf("lengthis:%d",fun(str));

)

5.輸入10個整數,將其中最小的數與第一個數對換,把最大的數與最后一個數對換。

解:

#include<stdio.h>

voidmain()

{

voiddcal(int*);

inii,a[10],*p;

p=a;

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

scanf(M%d",p+i);

deal(a);

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

printf("%4d",*(p+i));

)

voiddeal(int*p)

(

inti,j,k,t;

k=i=0;

for(j=i+l;j<10;j++)

if(*(p+k)>*(p+j))k=j;

t=*(p+i);*(p+i)=*(p4-k);*(p+k)=t;

k=i=9;

for(j=i-1;j>=O;j--)

if(*(p+k)<*(p+j))k=j;

t=*(p+i);*(p+i)=*(p+k);*(p+k)=t;

)

6.有若干個學生成績(每個學生有4門課),要求在用戶輸入學號后,能輸出學生的全部成

績。

解:

#include<stdio.h>

voidmain()

floatscore[J[4]={{66,76,86,96},{66,77,88,99),{48,78,89,90}};

float*serach(float(*pointer)[4],intn);

float*p;

inti,m;

printf("Enterthenumberofstudent:");

scanf("%d'\&m);〃輸入要查找的學生序號

printf("ThescoresofNo.%dare:\n",m);

p=search(score,m);

for(i=0,i<4;i++)〃輸出第n個學生的全部成績

printf("%6.2f',*(p+i));

float*search(float(*pointer)[4],intn)〃函數的返回值為指向實型數據的指針

float*pt;pt=*(pointer+n);

〃把指針定位在第把指針定位在第把指針定位在第把指針定位在第n個學生的第一個學

生的第個學生的第?個學生的第?個數據上個數據上個數據上個數據上

return(pt);〃函數的返回值第n個學生成績的首地址

)

7.將一個5X5的矩陣中最大的元素放在中心,4個角分別放4個最小的元素,順序為從左

到右,從上到下順序依次從小到大存放。

解:

#includc<stdio.h>

voidmain()

(

voidchange(int*);

inta[5][5],*p,ij;

printf("inputmartix:\nu);

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

(

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

scanf("%dM,&a[i][j]);

I

p=&a[0][0];

change(p);

printf("Now,martix:\n");

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

(

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

prinlf("%d';&a[i]|j]);

printf("\n");

voidchange(int*p)〃交換函數的實現

iniijjemp;

int*pmax,*pmin;

pmax=p;

pmin=p;

for(i=0;i<5;i++)〃尋找最大值和最小值

{

for(j=i;j<5;j++)

{

if(*pmax<*(p+5*i+j))

pmax=p+5*i+j;

if(*pmin>*(p+5*i+j))

pmin=p+5*i+j;

)

}

tenip-+(p+12);〃最大值換給中心元素

*(p+12)=*pmax;

*pmax=tcmp;

lemp=*p;

*p=*pmin;

*pmin=temp;

pmin=p+l;

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

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

if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))

pmin=p+5*i-Fj;

)

temp=*pmin;

*pmin=*(p+4);

*(p+4)=temp;

pmin=p+1;

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

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

(

if(((p+5*i4-j)!=(p+4)&&(p+5*i4j)!=p)&&(*pmin>*(p+5*i+j)))

pmin=p+5*i+j;

)

temp=*pmin;

*pmin=*(p+20);

*(p+20)=temp;

pmin=p+1;

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

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

{

if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=(p+20))&&(*pmin>*(p+5*itj)))

pmin=p+5*i4j;

)

lemp=*pmin;

*pmin=*(p+24);

*(p+24)=temp;

)

8.有一字符串,包含n個字符。編寫一個函數,將此字符串中從第m個字符開始的全部字

符復:制成為另一個字符串。

解:

#include<stdio.h>

#include<string.h>;

voidmain()

(

voidcopystring(char*,char*,int);

intm;

charstringI[20],string2[20];

printf("inputstring:");

gets(stringl);

printf("whichcharacterthatbegintocopy?");

scanf("%d",&m);

if(strlen(stringl)<m)

{printf(ninputerror!'1);}

else

(

copystring(stringI,string2,m);

printf("result:%s\n",string2);

)

1

voidcopystring(char*p1,char*p2,intm)〃字符串復制函數

{

intn=0;

while(n<m-l)

(

n++;

pl++;

)

while(*pl!=W)

(

*p2=*pl;

pl++;

p2++;

)

*p2='\0,;

第七章習題答案

一、選擇題

1.B2.D3.C4.C5.A6.C7.B8.A9.B

10.A11.C12.C

二、填空題

1.整型變量的地址(指針)2.a[0](數組首地址),a⑶3.24.&a[l][0]5.eXAMPLE

6.2,27.58.s[m]!=Y)'(*($+m)=='\0'&&*(t+m)==,\0,)9.3510.s+m-lt2-

編程題

1.在學生數據中,找出各門課平均分在85以上的同學,并輸出這些同學的信息。

解:#include<malloc.h>

#defineM5〃學生數

#defineN3〃課程數

structstudent

{

longnum;

charname[20];

floatscore[N];

structstudent*next;

);

〃創(chuàng)建鏈表子函數

structstudent*create(intn)

{

structstudent*head=NULL,*p1,*p2;

intij;

for(i=l;iv=n;i++)〃逐個創(chuàng)建結點并輸入相關數據

(

pl=(structstudent*)malloc(sizeof(structstudent));

printf("請輸入第%d個學生的學號、姓名及各門課考試成績:

scanf("%ld%s",&pI->num,pI->name);

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

scanf("%f',&pl->score[j]);

pl->next=NULL;

if(i==l)

head=p1;

else

p2->next=p1;

p2=pl;

)

return(hcad);

)

voidmain()

{

structstudent*head=NULL,*p;

inti;

floatsum,aver;

head=create(M);

p=head;

while(p!=NULL)〃用指針p遍歷鏈表各個結點

(

sum=0;

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

sum+=p->score[i];

aver=sum/N;

if(aver-85>-le-6)

(

printf("學號:%ld姓名:%s",p->num,p->name);

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

printf("%f",p->scorelij);

printf("\n");

)

p=p->next;

)

)

2.假設N個同學己按學號大小順序排成一圈,現要從中選一人參加比賽。規(guī)則是;從第一

個人開始報數,報到M的同學就退出圈子,再從他的下一個同學重新開始從1到M的報數,

如此進行下去,最后留下一個同學去參加比賽,問這位同學是幾號。

解:

#include<stdio.h>

#include<malloc.h>

#defineN8

#defineM3

structstudent

(

longnum;

structstudent*next;

);

//創(chuàng)建單向循環(huán)鏈表子函數

structstudent*create(intn)

structstudent*head=NULL,*pl,*p2;

inti;

for(i=1;i<=n;i++)〃逐個創(chuàng)建結點并輸入相關數據

(

p1=(structstudent*)malloc(sizeof(structstudent));

prinif("請輸入第%d個學生的學號:

scanf("%ld",&p1->num);

pl->next=NULL;

if(i==l)

head=pl;

else

p2->next=p1;

p2=pl;

)

p-next=head;

retum(head);

I

voidmain()

{

structstudent*head=NULL,*p;

intlen,order;

hcad=create(N);

for(len=N;len>l;Ien—)

(

p=head;

for(order=1;order〈M-1;order++)〃定位到序號為M-l的結點上

p=p->next;

p->next=p->next->next;

hcad=p->ncxt;

)

printf("最后剩下的同學學號為:%ld\n",head->num);

)

3.設學生信息包括學號和姓名,按姓名字典序輸出學生信息。

解:

#include<stdio.h>

#include<malloc.h>

#include<string.h>

#defineN6

structstudent

longnum;

charname[20];

structstudent*next;

);

〃創(chuàng)建單向鏈表子函數

structstudent*create(intn)

{

structstudent*head=NULL,*p1,*p2;

inti;

fbr(i=l;i<=n;i++)

(

pl=(structstudent*)malloc(sizeof(structstudent));

printf("請輸入第%d個學生的學號和姓名:\n”,i);

scanf(',%ld%s",&p1->num,pl->name);

pl->next=NULL;

if(i==l)

head=pl;

else

p2->next=pl;

p2=pl;

)

retum(head);

)

voidmain()

(

structstudent*head,*p,*prep;

intij;

head=create(N);

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

(

p=head;

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

{if(strcmp(p->name,p->next->name)>O)

(

〃相鄰兩結點交換位置,之后仍令p指向前邊的一個結點

if(p==head)

{

head=p->next;

p->next=p->next->next;

head->next=p;

p=hcad;

else

prep->next=p->next;

p->next=p->next->next;

prep->next->next=p;

p=prep->nexi;

)

)

//p指向下一個結點,prep指向p的前一個結點

prep二p;

p=p->next;

)

)

for(p=head;p!=NULL;p=p->next)

printf("%ld%s\n",p->num,p->name);

)

4.定義一個結構體變量(包括年、月、日),輸入一個日期,計算該日在本年中是第幾天。

要求:考慮閏年問題;輸入的信息為數字以外時要提示錯誤信息;輸入的信息超過相應位數

時,只取前面相應位數的信息;輸入的年月口不正確的時候需要提示錯誤信息。

解:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

structdate_time

{

intyear;

intmonth;

intday;

}DATE;

voidmain()

(

inti,len,flag,day_cnt;

charstr[50],buf[10];

structdate_timedate;

intmon[12];

while(l)

(

〃初始化月份數組

for(i=0;i<12;i++)mon[i]=31;

mon[l]=28;

mon[3]=30;

mon[5]=30;

mon[8]=30;

mon[10]=30;

printf("pleaseinputdateeg(20010203):");

memset(str,0,50);

scanf("%s",str);

len=strlen(sir);//2012l212

if(len!=8)//長度不對直接報錯0000-9999

{

printf("inputerror!\n");

continue;

I

flag=1;

whileQen--)//不是數字報錯

(

if(str[len]<'01|str[len]>'9')

{

printf("inputerror!\n");

flag=0;

break;

}

}

if(flag)〃如果上面檢測有錯

溫馨提示

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

評論

0/150

提交評論