第8章习题解答.docx

上传人:b****1 文档编号:2705677 上传时间:2023-05-04 格式:DOCX 页数:27 大小:53.89KB
下载 相关 举报
第8章习题解答.docx_第1页
第1页 / 共27页
第8章习题解答.docx_第2页
第2页 / 共27页
第8章习题解答.docx_第3页
第3页 / 共27页
第8章习题解答.docx_第4页
第4页 / 共27页
第8章习题解答.docx_第5页
第5页 / 共27页
第8章习题解答.docx_第6页
第6页 / 共27页
第8章习题解答.docx_第7页
第7页 / 共27页
第8章习题解答.docx_第8页
第8页 / 共27页
第8章习题解答.docx_第9页
第9页 / 共27页
第8章习题解答.docx_第10页
第10页 / 共27页
第8章习题解答.docx_第11页
第11页 / 共27页
第8章习题解答.docx_第12页
第12页 / 共27页
第8章习题解答.docx_第13页
第13页 / 共27页
第8章习题解答.docx_第14页
第14页 / 共27页
第8章习题解答.docx_第15页
第15页 / 共27页
第8章习题解答.docx_第16页
第16页 / 共27页
第8章习题解答.docx_第17页
第17页 / 共27页
第8章习题解答.docx_第18页
第18页 / 共27页
第8章习题解答.docx_第19页
第19页 / 共27页
第8章习题解答.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第8章习题解答.docx

《第8章习题解答.docx》由会员分享,可在线阅读,更多相关《第8章习题解答.docx(27页珍藏版)》请在冰点文库上搜索。

第8章习题解答.docx

第8章习题解答

习题8

1.简答题

1)什么是算法?

算法有什么特性?

如何表示一个算法?

2)什么是结构化程序设计?

它的三种基本结构是什么?

它们有什么特点?

3)分支和循环语句中的条件是什么表达式表示?

4)DoWhile型循环结构的程序构造中,对循环结构的要求是什么?

5)VBA过程有哪四种?

过程与函数的定义、调用有哪些不同,调用的传值与传址有哪些不同?

6)什么是全局变量、私有变量、静态变量,如何使用?

2.求程序运行结果题

1)试写出下列程序运行结果

PublicSubFig1()

DimiAsInteger

Debug.PrintTab(10);"*"

Fori=1To5

Debug.PrintTab(10-i);"*";Spc(i-1);"*";Spc(i-1);"*"

Nexti

Fori=4To1Step-1

Debug.PrintTab(10-i);"*";Spc(i-1);"*";Spc(i-1);"*"

Nexti

Debug.PrintTab(10);"*"

EndSub

2)求下列程序运行结果

PublicSub作业2()

Dimx,y,iAsDouble

x=0:

y=0

Fori=1To8

IfiMod2<>0Then

x=x-i

Else

y=y+i

EndIf

Next

Debug.Print"i=";i

Debug.Print"x=";x

Debug.Print"y=";y

EndSub

i=9

x=-16

y=20

3)求下列程序的运行结果

PublicSub作业3()

Dimm,s,kAsDouble

m=28

s=0

k=1

DoWhilek<=Int(m/2)

IfInt(m/k)=m/kThen

Debug.Printk

s=s+k

EndIf

k=k+1

Loop

Debug.Print"s=";s

EndSub

1

2

4

7

14

s=28

4)当n=10时,求下列程序运行结果

PublicSub作业4()

Dimn,a1,a2,a3,iAsDouble

n=Val(InputBox("请输入n,要求n>=3"))

Ifn<=2Then

ExitSub

EndIf

a1=1

a2=1

Debug.Printa1;a2

Fori=2Ton-1

a3=a1+a2

a1=a2

a2=a3

Debug.Printa3

Next

EndSub

解:

n=10

11

2

3

5

8

13

21

34

55

3.改错题

1)程序改错,下面的每个程序均有两个错误,试调试修改正确。

(1)计算1+2+3+…+N的值。

PublicSubSum()

Dimi,n,s,y,kAsDouble

n=Val(InputBox("请输入n"))

i=1:

s=1‘s=0

DoWhilei

s=s+i

i=i+1

Loop

Debug.Print"S=";s

EndSub

(2)程序的功能是计算公式Y=1-1/3!

+1/5!

-1/7!

…,式中除第1项外,其余各项可用1/(2N+1)表示。

PublicSub作业5()

Dimmm,n,p,y,kAsDouble

mm=Val(InputBox("请输入计算公式中1后面的项目个数"))

n=1:

p=1:

y=1

DoWhilen<=mm

k=2*n+1

p=p*(k-1)*k

y=y+(-1)/p

n=n+1

Loop

Debug.Print"Y=";y

EndSub

4.编程题

1)已知

试编成求Z的值,请分别使用SelectCase和If…ElseIf…EndIf编写程序。

解1:

PublicSubP172_4_1if1()

Dimx,y,zAsInteger

x=Val(InputBox("请输入一个整数给X:

"))

y=Val(InputBox("请输入一个整数给Y"))

ifx

z=x+y

endif

ifx=ythen

z=x*y*sgn(y)

endif

ifx>yandy<>0then

z=x/y

endif

msgbox(“z=”&str(z))

endsub

解2:

PublicSubP172_4_1if2()

Dimx,y,zAsInteger

x=Val(InputBox("请输入一个整数给X:

"))

y=Val(InputBox("请输入一个整数给Y"))

Ifx

z=x+y

ElseIfx=yThen

z=x*y*Sgn(y)

ElseIfx>yAndy<>0Then

z=x/y

EndIf

MsgBox("z="&Str(z))

EndSub

解3:

PublicSubP172_4_1SelectCase()

Dimx,y,zAsInteger

x=Val(InputBox("请输入一个整数给X:

"))

y=Val(InputBox("请输入一个整数给Y"))

SelectCaseXYANDY<>0

CaseX

Z=X+Y

CaseX=Y

Z=X*Y*SGN(Y)

CaseX>YANDY<>0

Z=X/Y

ENDSELECT

MSGBOX(“Z=”&STR(Z))

ENDSUB

2)编写程序,求一元二次方程Ax2+Bx+C=0的解,输入为系数A,B和C。

PublicSubP172_4_2()

'求方根

Dima,b,cAsInteger

a=Val(InputBox("输入系数a:

"))

b=Val(InputBox("输入系数b:

"))

c=Val(InputBox("输入系数c:

"))

d=b^2-4*a*c

Ifd>0Then

x1=(-b+Sqr(d))/(2*a)

x2=(-b-Sqr(d))/(2*a)

MsgBox("x1="&Str(x1))

MsgBox("x2="&Str(x2))

ElseIfd=0Then

x1=-b/(2*a)

x2=-b/(2*a)

MsgBox("x1="&Str(x1))

MsgBox("x2="&Str(x2))

Else

MsgBox("x1=x2=无解")

EndIf

EndSub

3)用整数0-6依次表示星期日、星期一、……、星期六,编程实现下列功能:

用键盘输入一个整数,在显示器上输出对应的中文表示星期几,如果键入的整数范围不在-1到6之内,则显示“输入数据错误”,返回要求再次键入正确数字。

当键入-1时,程序终止。

解1:

PublicSubSelectCaseP172_4_3()

DimaAsInteger

a=Val(InputBox("请输入一个整数"))

SelectCasea

Case0

MsgBox("星期日")

Case1

MsgBox("星期一")

Case2

MsgBox("星期二")

Case3

MsgBox("星期三")

Case4

MsgBox("星期四")

Case5

MsgBox("星期五")

Case6

MsgBox("星期六")

Case-1

End

CaseElse

MsgBox("输入数据错误")

EndSelect

EndSub

解2:

PublicSubSelectCaseP172_4_3()

DimaAsInteger

DoWhileTrue

a=Val(InputBox("请输入一个整数"))

SelectCasea

Case0

Debug.PrintMsgBox("今天是星期天",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case1

Debug.PrintMsgBox("今天是星期一",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case2

Debug.PrintMsgBox("今天是星期二",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case3

Debug.PrintMsgBox("今天是星期三",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case4

Debug.PrintMsgBox("今天是星期四",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case5

Debug.PrintMsgBox("今天是星期五",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case6

Debug.PrintMsgBox("今天是星期六",vbYesNoCancel+vbExclamation+vbDefaultButton1,"今日提示")

Case-1

ExitDo

CaseElse

MsgBox("你输入的数据错误!

")

EndSelect

Loop

EndSub

4)乘火车旅行的行李收费标准如下:

成年人可免费携带重量20公斤的行李,未成年人可免费携带10公斤的行李,超出这个重量,火车站将加收费用,收费标准是每公斤每百公里收费为0.20元,不足百公里按百公里记。

试编程按不同类型的人和行李重量来记收费用。

PublicSubP172_4_4行李收费()

Dima,w,m,s,yAsInteger

a=Val(InputBox("请输入乘客年龄"))

w=Val(InputBox("请输入乘客行李重量"))

m=Val(InputBox("请输入行驶公里数"))

y=Int(m/100)

Ifa>=18Then‘成年人

Ifw<=20Then‘行李小于等于20公斤免费

s=0

ElseIf(mMod100)=0Then

s=0.2*(w-20)*y‘行李大于20公斤每公斤每百公里收费为0.20元

Else

s=0.2*(w-20)*(y+1)‘不足百公里按百公里记

EndIf

EndIf

Else

Ifw<=10Then‘未成年人行李小于等于10公斤免费

s=0

else

If(mMod100)=0Then

s=0.2*(w-10)*y‘行李大于20公斤每公斤每百公里收费为0.20元

Else

s=0.2*(w-10)*(y+1)‘不足百公里按百公里记

EndIf

EndIf

EndIf

Debug.Print"应付费用:

"&Str(s)

EndSub

5)编写程序完成求和S=1+(1+2)+(1+2+3)+…+(1+2+…+10)。

如果求S=1!

+2!

+3!

+…+10!

,试编写程序并比较其同异。

方法1:

PublicSubP172_4_5累加累加和()

Dimx,s,t,iAsInteger

s=0

t=0

Fori=1To10

s=s+i

t=t+s

Next

Debug.Prints

Debug.Printt

EndSub

 

5_2、S=1!

+2!

+3!

+…+10!

PublicSub求阶乘和()

Dimi,j,p,sAsDouble

s=0

Fori=1To10

p=1

Forj=1Toi

p=p*j'循环不变式,完成累乘。

Nextj

Debug.PrintStr(i)&"的阶乘是:

"&Str(p)

s=s+p

Nexti

Debug.PrintStr(i)&"的阶乘和是:

"&Str(s)

EndSub

6)编程求100到200之间即能被3整除又能被5整除的正整数的个数,并显示这些数。

Publicsub整除()

n=0

fori=100to200

ifimod3=0andimod5=0then‘或imod15=0

n=n+1

Debug.printi

endif

Next

Debug.printn

Endsub

7)编程完成下列图形的打印。

其中第一个*所在列为第10行,第20列。

*

***

*****

*******

PublicSub三角形1()

Fori=10To14

Debug.PrintTab(20);"*";

Forj=1To2*(i-9)-2

Debug.Print"*";

Nextj

Debug.Print

Nexti

EndSub

 

*

***

****

*****

******

PublicSub三角形2()

Dimi,jAsInteger

Fori=1To9

Debug.Print

Next

Debug.PrintSpc(19);"*"

Fori=1To4

Debug.PrintSpc(18-i);"*";

Forj=1Toi+1

Debug.Print"*";

Next

Debug.Print

Next

EndSub

 

******

******

******

******

******

PublicSub平行四边形输出()

Dimi,jAsInteger

Fori=10To14

Debug.PrintTab(30-i);"*";

Forj=1To5

Debug.Print"*";

Nextj

Debug.Print

Nexti

EndSub

 

8)使用数组输入十个评委的评分,要求去除最高分、最低分,求应试者的最后得分。

解:

PublicSubP172_4_8()

Dimmark!

aver!

i%,max1!

min1!

aver=0

Fori=1To10

mark=Val(InputBox("请输入第"&i&"位评委的打分"))

Ifi=1Then

max1=mark:

min1=mark

Else

Ifmark

min1=mark

ElseIfmark>max1Then

Maxl=mark

EndIf

EndIf

aver=aver+mark

Nexti

aver=(aver-max1-min1)/8

MsgBoxaver

EndSub

9)编程求2到100间的所有素数,并求它们的和。

PublicSub求素数个数()

Dimw,n,j,sAsDouble

s=0

j=0

Forw=3To99Step2

Forn=2ToInt(Sqr(w))'判断W是否为素数

IfwModn=0Then

ExitFor'能整除时说明不是素数结束内循环

EndIf

Next

Ifn>Int(Sqr(w))Then'说明是素数

Debug.Printw

s=s+w'累加素数

j=j+1'统计素数的个数

EndIf

Next

Debug.Print"S=";s,"素数的个数";j

EndSub

10)使用循环嵌套语句编程求:

在0至999的范围内,找出所有这样的数,其值等于该数中各位数字的立方和。

如:

153=13+53+33

求0~999之间水仙花数。

(水仙花数:

指一个三位数,其各位数字立方之和等于该数本身。

如:

153=13+53+33)

算法思路:

解此题的关键是要知道如何分离出一个三位数中的各位数字。

本题采取将指定的数除10求余,所得余数就是数值最右边得一个数码。

接着将除10后的数截尾取整,得到的就是去掉最右边一个数码后的数值,以此类推,每次都可以截得一个最右边的数码,将该三位数的各位数码分别截取出来并进行立方求和,如等于原数,则原数为水仙花数;否则原数不是水仙花数。

PublicSubsxh()

ForN=0To999

DimA(3)

I=1

M=N

DoWhileI<=3

A(I)=MMod10

M=Int(M/10)

I=I+1

Loop

IfN=A

(1)^3+A

(2)^3+A(3)^3Then

Debug.PrintN

EndIf

Next

EndSub

11)有一个分数数列:

求出这个数列前20项之和。

扩充题11_2)求数列:

1,1/2,2/3,3/5,5/8......前1000项的数据和

 

11_1)

前20项之和

PublicSubfsl()

i=1:

k=2:

m=1

s=0

Fori=1To5

s=s+k/m

t=k

k=m+t

m=t

Next

Debug.Print"前20项的数据和s="+Str(s)

EndSub

11_2)求数列:

1,1/2,2/3,3/5,5/8......前1000项的数据和

PublicSubsl()

i=1:

k=1:

m=1

ss=0

Fori=1To1000

ss=ss+k/m

t=m

m=m+k

k=t

Next

Debug.Print"前1000项的数据和ss="+Str(ss)

EndSub

 

12)已知二年期人民币整存整取年利率为2.25%,王大妈选择二年期整存整取,存款金额10000元,她希望有1000元以上的净利息。

由于银行对最后的利息征20%所得税,故至少要税前为1250元利息,才有1000元的净利息。

请你编程帮王大妈算一算,要存几年才能达到她的目标。

13)编写一个过程Swap,实现两个数据交换功能。

调用该过程求随机生成的60-100间30个数中最大数和最小数。

PublicSubP172_4_13()

'产生60_100的随机数并找出最大和最小数

DimxAsInteger,iAsInteger

Do

x=Int(Rnd

(2)*1000)

LoopUntilx>=60Andx<=100

Debug.Printx;"";

max=x

min=x

Fori=1To30

Do

x=Int(Rnd

(2)*1000)

LoopUntilx>=60Andx<=100

Debug.Printx;"";

Ifx>maxThen

max=x

EndIf

Ifx

min=x

EndIf

Nexti

Debug.Print

Debug.Print"max=";max

Debug.Print"min="&Str(min)

EndSub

PublicSubP172_4_13_2()

'产生30个200-300的随机数,并求累加和均值

DimxAsInteger,iAsInteger

DimsumAsInteger,cntAsInteger

DimavgAsSingle

sum=0

cnt=0

Fori=1To30

Do

x=Int(Rnd

(2)*1000)

LoopUntilx>=200Andx<=300

Debug.Printx;"";

cnt=cnt+1

sum=sum+x

Nexti

Debug.Print

Ifcnt>0Then

avg=sum/cnt

Else

avg=0

EndIf

Debug.Print"sum=";sum

Debug.Print"avg=";avg

Debug.Print"count=";cnt

EndSub

14)输入两个正整数m和n,求其最大公约数和最小公倍数。

解题思路:

最大公约数采用辗转相除法可以获得,

最小公倍数就是x*y/最大公约数了....

用辗转相除法求两个数的最大公约数的步骤如下:

先用小的一个数除大的一个数,得第一个余数;

再用第一个余数除小的一个数,得第二个余数;

又用第二个余数除第一个余数,得第三个余数;

这样逐次用后一个数去除前一个余数,直到余数是0为止。

那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2