程序设计提高班培训讲义胡苗坤(2007寒假)第一讲顺序结构程序设计主要内容:1、熟练掌握赋值语句、输入输出语句的用法2、掌握顺序结构程序设计常用方法3、基本运算符的使用4、常用函数和过程一、赋值语句(:=)格式:变量名:=表达式功能:将表达式的值计算出来赋给相应的变量。不管什么计算机语言,赋值语句都是最基本最常用的语句,通过它给变量赋值来进行各种运算、处理。如a:=10*5;{a的值为50}a:=a+1;{将a的值增加1,常用此语句来进行计数}s:=s+a;{将s的值增加a,常用类似的累加语句来进行求和}t:=t*a;{将t的值变为原来的a后倍,常用类似的语句来进行累乘}例题1:交换两个数值型变量a和b的值[分析与算法选择]:要交换两个变量的值,可以联想起现实世界中交换两个容器A和B中所装的东西,一般要先引进一个空的容器C,先将一个容器(如A)里的倒入C,再将另一个容器B的倒入A,最后将C的倒入B,从而实现A、B容器内容的互换。[方法1]:引进第三个变量c:=a;a:=b;b:=c;[方法2]:先合并后分开a:=a+b;{如原来a=3,b=5,执行此语句后a=8,b=5}b:=a-b;{执行此语句后a=8,b=3}a:=a-b;{执行此语句后a=5,b=3}还有其它一些办法,但都没有上面的两种方法通用。如可先乘再除,这种方法对于有一个变量为0的情况就不正确了。也可能会出现除数为0的情况。例题2:计算四个变量的乘积[分析与算法选择]:一般的计算,可以直接用一个表达式将运算结果给一个变量就行了。如果变量的个数不确定,或者说变量的个数很多,此时用一个表达式就不方便了,可行的方法是来一个就算一个,直到全部的都算好结束。在后面的循环中常用这种方法。[参考程序]:programexample5_2;vart:longint;a,b,c,d:integer;beginwrite(‘Enterintegera,b,c,d:’);readln(a,b,c,d);t:=1;t:=t*a;t:=t*b;t:=t*c;t:=t*d;writeln(‘a*b*c*c=’,t);end.[补充说明]:累加时,存放累加值的变量初值一般为0;而累乘时必须将相应变量的初值赋为1。如上述程序中t的初值为1,如果没有这句,系统默认的初值为0,那么乘下来结果也是0。二、read/readln读取数据格式:read(变量)或read(变量1,变量2,……)readln(变量)或readln(变量1,变量2,……)功能:在运行程序时读入相应数据给指定变量,直到读入的数据满足为止,这里所说的满足有两个方面的含义,一是类型的一致,二是数据的满足。Readln跟read不同的地方就是它执行完后将到下一行。例:read(a,b,c);根据事先定义的类型由用户在运行程序时输入相应的数据给a,b,c,也可分开写成三个read语句:read(a);read(b);read(c)。readln(a,b,c);与read(a,b,c)不同是读完数据后另起一行,如果将它分为三个语句readln(a);readln(b);readln(c)执行时可能读入的数据跟原来不一样,自己上机去试试吧!readln;空读语句,一般起到让程序运行时停止由用户回车后继续或跨过一行中其余的数据,保证下一个读语句从下一行头一个数据开始读取。三、write/writeln输出语句语句功能:输出指定表达式的值。如wirte(a),write(‘Jiangshu’);分别输出a的值和Jiangshu(1)场宽在输出项后用“:数字”指明输出的宽度。如write(5:6),则输出:5{5的前面有5个空格,整个输出项占6个字符的位置}对于实数类型的还可以通过“:数字1:数字2”指明输出数字的宽度和小数点后的位数。如:write(1.2:10:5)将输出:1.50000{整个输出项占10个字符位置,整数部分占4位,小数点1位,小数部分5位,其中整数部分不足的在高位补空,小数部分不足在后面补0}如果指定的宽度比原输出项应有的宽度小呢?对于整数或字符等类型的,将自动调整到最小所要的宽度,如write(‘ABCD’:2)仍将输出ABCD。对于实数,小数部分会取自定的位数,将尾部去除(四舍五入),并自动适应到最少的宽度。[思考]:如何对小数点后指定位进行四舍五入?[解答]:一种方法是直接指定输出小数点后指定的位数,如对于变量a要保留到小数点后第三位并考虑四舍五入,可以直接写为write(a:0:3)。这种方法跟系统的设置有关,也就是说这样不能保证任何时候都正确。可以对指定位加5后从这位始截尾。如要求对实型变量a要求精确到小数点后两位,对小数点后第三位进行四舍五入,可以用这样的输出语句write(a+0.005:0:2)。一般来说对于变量的处理,可以先按这种方法(即相应位加5后再去尾)通过赋值语句进行处理,输出时不进行处理,只是直接输出就行了。四、writeln跟wirte的区别writeln语句在输出完指定内容后另起一行,write只管输出除非真满一行后才另起一行。空的wirteln起到一个输出空行的作用,如果它前面有write语句,则在其它输出空行(可能不满一行),保证下一个输出另起一行。在程序中经常用一个空的writeln语句起换行的作用。五、一个语句多个输出项一个write或writeln中可以有多个输出项,各项之间用逗号间隔。如write(1,2,3);它与三个write语句作用一样:write(1);write(2);write(3);再如writeln(1,2,3);输出123后换行。与它等同的分开写的形式为:write(1);write(2);writeln(3);练习及作业:(1)输入三角形的三边,输出三角形的面积(假设这三边一定能构成三角形)。计算三角形面积的公式:p:=(a+b+c)/2s:=sqrt(p*(p-a)*(p-b)*(p-c))(2)输入一个三位整数,逆向输出,如输入123,输出为321,如果个位数是零,则输出二位数,如:320,输出为23。(3)输入一个10000以内的整数,输出它的位数(4)分钱游戏:甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。求原先各人的钱数分别为多少?第二讲分支结构程序设计主要内容:1、掌握复合语句、基本IF语句及CASE语句语法格式和执行过程;2、能够根据实际情灵活运用IF语句和CASE语句3、掌握IF语句的嵌套原则一.复合语句1.为什么要用复合语句在程序中有时候要将多个语句结合起来作为一个整体,象一个语句一样来使用。这时就要用到复合语句,用begin和end将多个语句结合在一起。2.格式:begin语句1;语句2;……语句N;end;{说明:end前的最后一个分号可以不写,也可以写,相当于其后是一个空语句。}其效果跟普通的语句一样,也就是将多个语句合并成一个语句来使用,特别是在后面的条件语句或循环语句里执行的是多个语句要像一个语句一样时就必须要使用复合语句。二.条件语句(if---then---else)格式1:一个分支if条件then语句;格式2:两个分支if条件then语句1else语句2;注意else前没有分号,否则会出错。(思考这是为什么?)1.条件的描述在使用条件语句时主要的难点就是条件的描述和满足条件或不满足条件时要执行的语句的描述。条件通过布尔表达式来描述。例:条件语句与自然语言描述的对比(1)ifa1thena:=a-1elsea:=a+1;如果a大于1那么将a的值减少1,否则将a的值增加1(2)if(ab)and(bc)thens:=(a-b)*(b-c);如果a大于b并且b大于c,那么s的值为(a-b)乘以(b-c)(3)if(a0)or(b0)thens:=a+b;如果a0或者b0,那么s的值等于a+b(4)iffthent:=t+1;{这里f为布尔型的变量}如果f成立即等于true,那么t的值增加12.语句的选择满足条件时执行什么、不满足条件时执行什么要先搞清楚。当满足条件时或不满足条件时执行的是多个语句时要使用复合语句的格式。当然单个语句也使用复合语句的格式也不会错,只不过多此一举而已,并不影响程序的执行,有时先这样写是为了后来的扩充。例:条件语句与自然语言描述ifa0thenbegina:=a+1;s:=s+1;end;如果a小于0,那么执行两部分:(1)a的值增加1;(2)s的值增加1。三、多分支语句case{有时也叫多路分支}1.格式:case表达式of值1:语句1;值2:语句2;……[else语句]end;2.示例(1)两个分支的情况,还不如直接用条件语句caserandom(Maxint)mod2of0:writeln(‘Evendigit’);1:writeln(‘Odddigit.’);end;{等同于ifrandom(maxint)mod2=0thenwriteln(‘Evendigit.’)elsewriteln(‘Odddigit.’);}根据随机产生的非负整数情况来确定偶数时:输出‘Evendigit’;奇数时:输出‘Odddigit.’(2)根据字符型变量ch的值来确定不同的执行casechof‘A’..’Z’,’a’..’z’:writeln(ch,’isanidentifiercharacter.’);‘0’..’9’:writeln(ch,’isadecimaldigit.’);elsewriteln(ch,’isaspecialcharacter.’);end;{等同于:if((ch=’A’)and(ch=’Z’))or((ch=’a’)and(ch=’z’))thenwriteln(ch,’isanidentifiercharacter.’)elseif(ch=’0’)and(ch=’9’)thenwriteln(ch,’isadecimaldigit.’)elsewriteln(ch,’isaspecialcharacter.’);}3.使用注意点当有else部分时它上面的语句的最后一行可以有分号也可以没有分号,这点跟if-then-else不一样;case语句结构中最后要有一个end作为结尾;其中的语句可以是单语句也可以是复合语句。[练习及作业]:1、输入三个整数,按由大到小的顺序输出。设三个数为a,b,c,一种方法可以用条件的并列,列举出可能有的6种情况。另一种方法是用条件的嵌套,从而输出结果。2.编写程序输入年份和月份,输出这个月的天数。3.编一个随机产生一个100以内的四则运算题,要求先输出这个四则运算的式子,这个四则运算的式子要能确保第一个数不小于第二个数,如果是除法的话要能确保能够整除,然后让用户输入结果,如果输入的结果正确则输出“Right!”否则输出“Error!”。[分析与提示]:用随机函数来产生四则运算的操作数和操作符,其中操作数都是100以内的整数,所以可以直接用random(100)就行了,如果第一个数比第二个数小则交换两个数。而操作符(运算符)只有四种可能,因此先用随机函数产生出0-3间的数,再根据产生的是什么数来确定是“+、-、*、/”。其中对于除法运算要考虑除数不能为0,再要考虑能整除,所以先进行整除运算,得到一个结果,再将第一个数变为除数乘以商。4.编程输入三角形的三条边长,输出三角形的面积,如果不能构成三角形输出错误信息。5.期末来临了,班长小Q决定将剩余班会费,用于购买若干支钢笔奖励给一引起学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请你编写一程序,帮小Q制订出一种买笔的方案。6.编写一个评分程序,接受用户输入10位选手的得分(0—10分),然后去掉一个最高分和一个最低分,求出某选手的最后得分(平均分