程序设计与算法实例.docx
《程序设计与算法实例.docx》由会员分享,可在线阅读,更多相关《程序设计与算法实例.docx(27页珍藏版)》请在冰豆网上搜索。
程序设计与算法实例
第一章程序设计与算法描述
计算机的应用技术越来越普及,许多软件的使用都非常方便,这是因为软件厂商已事先编好了程序。
如果我们懂得了程序设计的原理和方法,那么就能更好地利用计算机。
1.1程序和程序设计
计算机是按程序所规定的内容和步骤进行工作的。
了解计算机,就得建立“程序”的概念,学习程序设计的知识。
1.1.1程序
什么是程序(Program)呢?
比如,开运动会的时候,会有一个“大会程序”,规定了节目安排和比赛的次序,如:
第一项,主持人宣布大会开始;第二项,运动员入场;第三项,嘉宾致辞……。
由此可见,程序包含两方面的内容:
其一,要完成什么工作;其二,按什么顺序进行。
计算机程序就是为使计算机完成某个预定的任务而设计的一系列语句和指令。
要让计算机自动完成一组操作,首先要编写程序,然后让计算机执行这个程序。
程序的规模和内容完全取决于所要解决的问题,可大可小、可多可少。
1.1.2程序设计
设计、书写、检查和调试程序的过程称为程序设计。
程序设计不仅指在纸上书写程序的过程,它还应当包括分析问题、确定解题方法、写出具体步骤、编写程序、上机调试、修改程序、正式运行、整理结果和书写程序文档等全过程。
现在的软件大部分用起来很简单,并不需要自已编程序,那么,为什么还要学习程序设计呢?
首先,任何软件的主要部分都是程序,只不过这些软件是由别人编好了程序,让用户直接使用而已,并不是不需要程序就能使计算机完成各种复杂的任务。
当你看到有些软件的功能极为强大,是不是感到计算机神秘莫测?
通过学习程序设计,了解了计算机是怎样工作的,并且能操纵指挥计算机按照你的意志处理问题,这神秘的面纱还会存在吗?
其次,现成的软件不可能满足所有领域的多方面的需求。
一个有一定经验和水平的计算机应用人员不应只满足于使用现成的软作、利用菜单和鼠标选择有限的方案,还应当具有独立开发软件的能力。
1.1.3程序设计语言
进行程序设计必需使用计算机语言。
计算机语言根据其能否为计算机直接识别,分为机器语言、汇编语言和高级语言。
由于高级语言有简单易学,编制的程序易于测试和修改,且通用性好等优点,所以程序设计首选高级语言。
高级语言(以下简称语言)的种类繁多,如:
BASIC语言、FORTRAN语言、C语言、PROLOG语言等,每一种语言又可能有多个版本。
不同的语言有不同的特点,适用于不同的领域。
在程序设计时,究竟选择哪一种语言好,很难用一句话来定论,通常要考虑以下几个因素,权衡利弊,做出合理的选择。
1.语言的应用范围
每一种语言通常具有某一方面的优势,甚至是专为某一领域设计的。
例如:
在工程计算领域多选用FORTRAN语言,而在商业和管理领域多选COBOL语言和数据库语言。
2.语言提供的数据结构
每种语言都具有与其长于处理的问题相适应的数据结构,要根据任务需求进行选择。
3.语言使用的环境
有的语言是在DOS环境下使用的,有的是在Windows环境下使用的,要根据操作环境来选择语言。
4.程序设计环境
有的语言提供了集成环境,将程序的编辑、编译、运行集中在一个窗口中进行,有的语言提供了软件开发工具的支持,为程序设计提供了高效、方便的环境。
可以根据任务需求和个人喜好进行选择。
5.使用者的背景
由于个人编程经验不同,熟练的开发人员往往喜欢用新的、功能丰富的语言,而初学者通常会选一种简单易学的语言。
1.2算法及算法描述
计算机语言只是一种工具,用来表示处理问题的方法和步骤。
作一名程序员,只学会语言是不够的,掌握解题的方法与步骤是程序设计中更重要的一环。
1.2.1用计算机解题的步骤
通常,用计算机编制程序处理一件任务需要经过如下步骤:
1.首先进行任务分析,根据任务的要求和提供的资源,判断解决问题的可能性。
2.建立完成该任务的数学模型,并做出简化处理。
3.决定用什么方法对该数学模型求解。
4.根据选用的方法写出操作步骤。
5.选取一种计算机语言,按照上一步提出的操作步骤编写程序。
6.上机运行程序。
7.根据运行情况分析是否有错误,如果有误,则返回前面去修改。
8.再运行程序,直到得到正确结果为止。
9.分析整理结果,写出程序文档。
1.2.2什么是算法
所谓算法(Algorithm),广义地说,是指为解决一个问题而采取的方法和步骤。
在计算机领域,算法通常笼统的指上面提到的解题步骤中的2、3、4步。
解决一个问题的算法不是唯一的。
例如,求1到100的和,可以顺序的从1加到100,也可以采用另外的方法:
100+(99+1)+(98+2)+……+(51+49)+50,如果用心算,哪一个算起来更容易是不言而喻的。
人们希望采用好的算法,即方法简单、运算步骤少、能迅速得出正确结果的算法。
因此,选择和设计算法不仅要保证其正确性,也要考虑它的质量。
通常,一个算法应有以下特征:
1.确定性。
算法中的每一步必须是明确的,不可以有“多义性”或“歧义性”。
2.有效性。
算法中的每一步必须是计算机能够有效执行,并且能得到有效结果的。
3.有穷性。
算法中的步骤应是有限的。
4.一个或多个输出。
算法中必须有把结果输出给用户的步骤。
1.2.3算法描述
在算法设计中,如何把算法正确、简明地描述出来是件十分重要的事。
算法描述的方法可以归为两类:
文字描述法和图形描述法。
在文字描述法中最常用的是自然语言描述法;在图形描述法中,常用的有流程图、N-S图和PAD图。
这些算法描述方法各有利弊。
为了便于同学们理解,在本书中采用了自然语言描述法。
自然语言描述法是用日常习惯的语言文字、表达式及一些普遍认识的符号来描述算法。
例如:
求一名运动员三次比赛中的最好成绩,可以这样描述:
1.读入运动员的三次成绩,分别用a、b和c表示;
2.如果a
3.如果c>max,则把c存入max;
4.输出max;
5.程序结束。
自然语言描述法接近日常生活,而且更简明扼要,易于理解,适于初学者使用。
但在描述较复杂的算法时,自然语言就显得过长,容易产生歧义,同学们在使用时应当注意。
第二章程序设计
任务一:
苹果每公斤2元,某顾客购苹果若干,编一程序计算应收款。
分析:
设购苹果x公斤,单价为k,应收款为y,则有:
y=kx。
程序如下:
REM计算应收款y
k=2;
write(‘购苹果斤数:
’);
read(x);
y:
=k*x
write(‘应收款为:
’;y;’元’);
上机操作
1.写出与下列数学式子等价的PASCAL表达式:
A)a+b\2cB)3/4cosxC)8exln2D)[(x+y)(x-y)-98]6
2.把表达式a/(b+c/(d+e/SQR(f)))改写成数学式子。
任务二:
编程计算一个长、宽、高分别为6、4、2的长方体的表面积和体积。
分析:
设长、宽、高分别为a、b、c,表面积为S,体积为V,则有:
S=2(ab+ac+bc)
V=abc
写成程序是:
a:
=6;b:
=4;c:
=2;
S:
=2*(a*b+a*c+b*c)
V:
=a*b*c
WRITE(S,V)
下面我们用对任务二的程序稍加改动,就可以让它成为一个计算长方体表面积和体积的通用程序:
WRITELN(“请输入长方体的长、宽和高:
”);
READ(a,b,c);
S:
=2*(a*b+a*c+b*c);
V:
=a*b*c;
WRITE(S,V);
任务三:
从键盘上读入一个三位正整数,将它按倒序输出。
(例如:
读入123,输出321)
算法描述:
(1)读入三位正整数a;
(2)分离出个位、十位和百位,分别存贮于a1、a2、a3中;
(3)数位乘权值,得到倒序数b;
(4)输出b;
(5)结束。
程序如下:
write(‘输入一个三位正整数:
’);
read(a);
a3:
=adiv100;
a2:
=(aMOD100)div10;
a1:
=aMOD10;
b=a1*100+a2*10+a3
write(a,’的倒序数为:
’,b);
任务四:
设我国人口在1999年为13亿,按年增长率千分之一点五计算,预计五年后的2004年我国人口总数将达到多少?
算法描述:
(1)读取人口基数a,年增长率k和计算年数n;
(2)根据公式x=a*(1+k),计算人口总数;
(3)输出x。
程序如下:
REM计算人口数
READ(a,k);
X:
=a*(1+k)*(1+k)*(1+k)*(1+k)*(1+k);
Write(‘2004年我国人口总数预计为’,x,’亿’);
上机操作:
1.设计程序,把读入的时间数由分钟转化成秒。
例如:
输入:
3.5,输出:
210秒。
2.汽车作直线匀加速运动,已知初速度v0为每秒6cm,加速度α是60cm/s2,求t=10s时的速度,以km/h表示,计算公式为:
v=v0+α·t
任务五:
输入3个整数a,b,c,输出其中绝对值最大的数。
算法描述:
(1)输入a,b,c三个数;
(2)将|a|赋给max;
(3)将|b|与max相比较,如果|b|>max,则将|b|赋给max;
(4)将|c|与max相比较,如果|c|>max,则将|b|赋给max;
(5)输出max;
(6)结束。
程序如下:
REM求三个数中绝对值最大的
INPUT“输入三个整数:
”;a,b,c
max=ABS(a)
IFABS(b)>maxTHENmax=ABS(b)
IFABS(c)>maxTHENmax=ABS(c)
PRINT“绝对值最大的是:
”;max
END
任务六:
输入一个公元年号,判断是否为闰年。
算法描述:
(1)输入公元年号y;
(2)判断yMOD400是否为0,如果是0则输出“闰年”提示,
(3)判断yMOD4=0ANDyMOD100<>0是否为真,如果是,则输出“闰年”提示,;
(4)输出“非闰年”的提示;
(5)结束。
程序如下:
REM判断是否闰年
INPUT“输入公元年号:
”;y;
IFyMOD400=0THEN
PRINT“闰年”
ELSE
IFyMOD4=0ANDyMOD100<>0THEN
PRINT“闰年”
ELSE
PRINT“非闰年”
ENDIF
ENDIF
END
任务七:
编程模拟简单计算器,实现四则运算。
例如:
输入:
2,4,+输出:
2+4=6。
算法描述:
(1)读入运算数据x、y和运算符s$;
(2)根据运算符判断操作类型并计算;
(3)结束。
程序如下:
REM模拟计算器
INPUTx,y,s$
SELECTCASEs$
CASE“+”
PRINTx;”+”;y;”=”;x+y
CASE“-”
PRINTx;”-”;y;”=”;x-y
CASE“*”
PRINTx;”*”;y;”=”;x*y
CASE“/”
PRINTx;”/”;y;”=”;x/y
CASEELSE
PRINT“运算符错误”
ENDSELECT
END
任务八:
已知y的计算公式如下,x是个大于等于0的数,编程计算y值。
4x3+6x+10≤x≤9
y=3x2+49<x≤20
6x-720<x≤70
140x>71
算法描述:
(1)读入x的值;
(2)判断x值的范围;
(3)输出y值;
(4)结束。
程序如下:
INPUTx
IFx>71THEN
PRINT“y=”;140
ELSE
IFx>=0ANDx<=9THEN
PRINT“y=”;4*x^3+6*x+1
ELSE
IFx>9ANDx<=20THEN
PRINT“y=”;3*x^2+4
ELSE
IFx>20ANDx<=70THEN
PRINT“y=”;3*x^2+4
ELSE
PRINT”ERROR”
ENDIF
ENDIF
ENDIF
ENDIF
END
任务九:
商店在节日期间搞促销活动,规定:
购物300-500元(包括300元和500元)可享受8.5折优惠;购物500-1000元(包括1000元)可享受8折优惠;购物1000-3000元(包括3000元)可享受7.8折优惠;购物3000元以上可享受7.5折优惠;编程输入购物款,计算出实际应付金额。
算法描述:
(1)输入购物款p;
(2)根据条件判断进入某个分支,并计算应付金额c;
(3)输出应付金额;
(4)结束。
程序如下:
INPUT“购物款:
”;p
SELECTCASEp
CASEIS<300
c=p
CASEIS<=500
c=p*0.85
CASEIS<1000
c=p*0.8
CASEIS<3000
c=p*0.78
CASEELSE
c=p*0.75
ENDSELECT
PRINT“应付金额为:
”;c
END
上机操作:
1.分别用SELECTCASE语句和IF语句重新编写任务八和任务九的程序。
2.给定一个正整数N,判断它是否能同时被3、5、7整除。
3.对于任意一个三位自然数n,其个位、十位和百位分别为a、b、c,且互不相等。
如果a、b、c呈等差数列,则求其积;如果呈等比数列,则求其和。
任务十:
已知:
n!
=1×2×3……×n,求n!
。
算法描述:
(1)读入数据n;
(2)给累乘积s赋初值1;
(3)从1到n循环累乘;
(4)输出s;
(5)结束。
程序如下:
REM求阶乘
INPUT“请输入一个正整数:
”;n
s=1
FORk=1TOn
s=s*k
NEXTk
PRINTs
END
任务十一:
给出两个正整数,求它们的最大公约数。
(假设输入无须判断)
算法描述:
(1)读入两个正整数m和n;
(2)把m、n中较小的一个存入变量min中;
(3)公约数r取1,可能比r更大的公约数k取2;
(4)判断k能否被m、n整除,能则r=j;
(5)k=k+1;
(6)判断k是否小于等于INT(SQR(min))(约数性质:
一个整数x的约数应在1~INT(SQR(min))之间),是则转向步骤(4);
(7)打印最大公约数r;
(8)结束。
程序如下:
REM求两个数的最大公约数
INPUT“输入两个正整数:
”;m,n
IFm>nTHENmin=nELSEmin=m
k=2
WHILEk<=INT(SQR(min))
IFmMODk=0ANDnMODk=0THENr=k
k=k+1
WEND
PRINTm;“和”;n;”的最大公约数是:
”;r
END
任务十二:
从键盘输入若干整数,找出其中的最大值。
当输入值是0时结束输入。
(假设输入无须判断)
算法描述:
(1)读入第一个整数max;
(2)判断max是否为零,若为零则结束;
(3)读入下一个整数k;
(4)若k>max,将k赋给max;
(5)当k值不为0时,转向步骤(3);
(6)输出最大值max;
(7)结束。
程序如下:
INPUTmax
IFmax=0THENEND
DO
INPUTk
IFk>maxTHENmax=k
IFk=0THENPRINTmax:
END
LOOP
任务十三:
某单位共有四个部门,各部门的人数不同,但都不超过20人。
现进行劳资调查,统计各部门年龄在30~50岁之间的人数(包括30岁和50岁)。
算法描述:
(1)让变量j从1到4做循环,执行以下步骤;
(2)累加量s充0;
(3)读入一个数据x;
(4)判断x是否为0,若为0则打印s;
(5)判断x是否在30~50之间,是则s=s+1,否则转向步骤(3);
(6)结束。
程序如下:
FORj=1TO4
s=0
FORk=1TO20
READx
IFx=0THENPRINT“部门”;j;”年龄在30~50岁之间的人数为”;s;”人”
IFFIX(x)>=30ANDINT(x)<=50THENs=s+1
NEXTk
NEXTj
DATA28,34,26,47,52.5,……,0
DATA19,30.5,27,45,48,……,0
DATA24,24,37,45.5,53,……,0
DATA39,42,48,0
END
任务十四:
找出100~200之间的全部素数。
算法描述:
(1)n=101;
(2)n=n+1,如果n>200则转向步骤(7);
(3)把INT(SQR(n))赋给变量k;(判断素数的条件:
如果数n不能被2~SQR(n)之间的某个整数整除,那么n就是素数)
(4)把内层循环变量j初值设为2,标志位flag设为0;
(5)n与j相除,若能整除,则n不是素数,把标志位flag改为1;否则j=j+1,循环执行步骤(5),直到j的值超出范围并且flag为0时,结束内层循环;
(6)如果flag为0,打印n;
(7)结束。
程序如下:
FORn=101TO200STEP2
k=INT(SQR(n))
j=2
flag=0
WHILEj<=kANDflag=0
IFnMODj=0THENflag=1ELSEj=j+1
WEND
IFflag=0THENPRINTn,
NEXTn
END
上机操作
1.求n!
的值小于50000时的最大n值。
(n!
=1×2×3……×n)
2.有一段台阶,若每步上2阶,最后余1阶;每步上3阶,最后余2阶;每步上5阶,最后余4阶;每步上6阶,最后余5阶;每步上7阶,恰好全上完。
问这段台阶共有多少阶。
3.编写程序,输出所有的“水仙花数”。
所谓“水仙花数”是指一个三位数,其各位数的立方和等于该数。
如:
153=13+53+33。
4.顺序输出斐波那契数列(Fibonacci)的前30项。
Fibonacci数列的变化规律是:
第一项和第二项都是1,从每三项起,每项的值都是前两项的和。
如:
1,1,2,3,5,8,13…。
5.甲、乙、丙三舰同时开始放礼炮,各放21响,甲舰每隔3分钟放一次,乙舰每隔5分钟放一次,丙舰每隔7分钟放一次。
假设发射时刻绝对准确,问能听到多少声礼炮声?
任务十五:
从键盘输入10个数,把它们按反序显示。
算法描述:
1.定义数组a;
2.把数据循环读入,存在a
(1)到a(10)中;
3.输出a(10)到a
(1)的值;
4.结束。
程序如下:
DIMa(10)
FORj=1TO10
INPUTa(j)
NEXTj
PRINT
FORj=10TO1STEP–1
PRINTa(j);
NEXTj
END
任务十六:
利用随机函数产生n个10~99之间的整数存贮在数组中(n从键盘输入),然后读入一个要查找的数k。
若k存在,则输出它在数组中的位置;否则输出没找到的信息。
算法描述:
1.读入n值;
2.定义数组x(n);
3.利用RND函数生成数组元素;
4.读入待查数k;
5.把k与数组中的每一个数相比较;
6.输出结果;
7.结束。
程序如下:
INPUT“请输入一个正整数:
”,n
DIMx(n)
FORj=1TOn
x(j)=FIX(RND*90)+10
NEXTj
INPUT“请输入待查找的数:
”,k
j=1
WHILEx(j)<>kANDjj=j+1
WEND
IFx(j)=kTHENPRINTk;”的位置是:
”;jELSEPRINT“没找到!
”
END
任务十七:
打印以下形式的杨辉三角形的前11行。
1
11
121
1331
14641
15101051
…………
杨辉三角形的特点是:
1.第一列和对角线上的元素值都是1;
2.除以上元素外,其他元素的值均为前一行上的同一列元素和前一列元素值之和。
算法描述:
1.定义二维数组y;
2.把每一行的第一个元素和最后一个元素值置为0放在数组中;
3.从第二行起计算各行中每一列的值;
4.输出二维数组y;
5.结束。
程序如下:
DIMy(10,10)
FORj=0TO10
y(j,j)=1
y(j,0)=1
NEXTj
FORj=2TO10
FORk=1TOj-1
y(j,k)=y(j-1,k-1)+y(j-1,k)
NEXTk
NEXTj
FORj=0TO10
FORk=0TOj
PRINTTAB(k*6);y(j,k);
NEXTk
PRINT
NEXTj
END
任务十八:
从以下五个字符串中找出长度最长的字符串。
“QBASIC”,”Computer”,”VisualC”,”PASCAL”,”FORTRAN”
算法描述:
(1)定义一个字符串数组a$;
(2)把给定串读入a$;
(3)计算并比较每个串的长度;
(4)打印结果;
(5)结束。
程序如下:
DIMa$(5)
FORj=1TO5
READa$(j)
NEXTj
s=LEN(a$
(1))
k=1
FORj=2TO5
IFss=LEN(a$(j))
k=j
ENDIF
NEXTj
PRINT“s=”;s;a$(k)
DATA“QBASIC”,”Computer”,”VisualC”,”PASCAL”,”FORTRAN”
END
任务十九:
判断回文。
“回文”是指正读和反读都是一样的字符串(忽略空格和大小写)。
例如:
“LEVEL”是一个回文字符串。
编程读入一个字符串,判别它是否是回文。
算法描述:
(1)读入字符串s$;
(2)将s$中的字母转换成小写字母,新串存入x$;
(3)设两个指针L、R分别指向x$的左右两侧;
(4)标志位flag设为1;
(5)判断L、R位置上的字符是否相同,相同则L+1、R-1,再判断,遇空格越过,不相同则flag=0;
(6)反复执行步骤(5),直到flag=0,或L、R重合,跳出循环;
(7)根据flag值打印结果;
(8)结束。
程序如下:
INPUT“请输入一个字符串:
”;s$
x$=LCASE(s$)
L=1:
R=LEN(s$)
flag=1
WHILEflag=1ANDLWHILEMID$(x$,L,1)=””
L=L+1
WEND
WHILEMID$(x$,R,1)=””
R=R-1
WEND
IFMID$(x$,L,1)<>MID$(x$,R,1)THEN
flag=0
ELSE
L=L+1
R=R-1
ENDIF
WEND
IFflag=1THEN
PRINTs$;”是回文”
ELSE
PRINTs$;”不是回文”
END
上机操作
1.写出下列程序段的运行结果:
A)DIMa(10)
FORj=1TO10
a(j)=j*10
NEXTj
a=a(4)/a
(2)
PRINTa
END
B)