第五章 程序设计初步
概述
本章前三节将通过一些具体的Pascal程序实例来帮助学生了解Pascal程序的基本结构,掌握程序的三种基本结构:顺序结构、选择结构、循环结构,了解使用用户自定义数据类型:枚举类型、子界类型及数组类型进行数据定义的方法。第四节,介绍了函数和过程的有关知识,包括函数和过程的递归调用以及其它一些基本算法,通过阅读程序和尝试编写简单程序让学生能够掌握定义、编写和调用函数和过程的方法。最后,在本章第五节中介绍了面向对象的程序设计,要求学生在前几节的内容上,进一步体会编写大型程序或复杂程序的困难性,从中领会面向对象设计思想的精髓所在。
本章的主要内容
节名 教学内容
顺序结构程序设计 通过一些具体的Pascal程序来介绍顺序结构程序设计的编程思想,其中着重介绍了赋值语句、输入语句、输出语句、复合语句的使用方法。
选择结构程序设计 通过一些具体的Pascal程序来介绍选择(分支)结构程序设计的编程思想,其中还针对IF语句、Case语句作了较为深入详细的介绍和比较。
循环结构程序设计 通过一些具体的Pascal程序来介绍循环(重复)结构程序设计的编程思想,其中详细介绍了三种循环语句:For语句、While语句、Repeat语句,本节后半部分还详细介绍了有关循环嵌套的知识及三种用户自定义数据类型:枚举类型、子界类型和数组类型。
函数和过程 通过一些具体的Pascal程序来对函数和过程作了较为详细深入的介绍,其中包括函数或过程调用时的形式参数、实际参数、和标示符的作用域等相关知识,最后,介绍了函数或过程的递归调用的使用方法。
面向对象程序设计 能够熟悉与面向对象方法有关的六个重要概念,能够了解当今比较流行的几种面向对象语言;学习程序示例是如何编写面向对象程序的。
第二节 选择结构程序设计
一、教材分析
教学目标
目标 实现
知识 掌握选择结构程序设计的思想方法。 贯穿于整个教学活动过程中
掌握两种语句:IF语句(单分支结构、双分支结构、IF语句的嵌套——多分支结构)、Case语句(多分支结构),嵌套IF语句改称为Case语句。 上机实践:学生练习为主,教师辅导为辅,结合上机实践。
技能 进一步了解并掌握编写pascal程序的全过程,并能独立运行pascal程序,得出运行结果。 贯穿于整个上机实践的过程之中
独立分析、灵活运用所学知识解决实际问题的能力 贯穿于整个教学活动过程中
情感态度价值观 培养严谨的程序编写的风格的习惯,体验编写pascal程序的过程,激发学生学习编写程序的兴趣和学习热情 贯穿于上机实践的整个过程之中
养成独立分析、善于归纳总结的习惯 贯穿于整个教学活动过程中。
教学重点与难点
本节主要是学习选择结构程序设计的编程思想以及IF语句和Case语句。本节的重点在于IF语句,IF语句形式较多,有单分支形式,有双分支形式,IF语句嵌套的形式,且嵌套也有多种形式,比较复杂,这也是本节的难点所在。但学生只要能够理解选择结构的编程思想,对于如何在具体的编程中灵活运用IF语句也不是难事,相较而言,Case输出语句格式要稍微较为简单一些,变化也少一些。
二、教学建议
课时安排建议
本节内容建议用1课时完成。
教学准备
1.机房准备
编写pascal程序对机房的软硬件配置要求不高,操作系统选择Windows 98、Windows 2000或Windows XP均可,CPU为Pentium以上即可,内存为32M(Windows 98)以上,每位学生一台计算机。
2.教师准备
熟练掌握Turbo Pascal 7.0和一些基本的常用算法。搜集整理一些常用的算法分析题例放在教师机上;提供一些专业的算法分析和pascal程序设计网站的索引供学生学习使用。
3.学生准备
具备基本的信息技术操作技能,包括鼠标、键盘使用,文字输入等。
教学过程安排建议
1.导入新课,提出问题
教师可以将一个程序按语句进行分割,然后让学生对这些语句的名称、功能、格式等知识进行分析,然后让学生将这些语句拼接成一个完整的程序,通过这个活动复习上一节的内容,巩固顺序结构和四种基本的语句。然后,要求学生根据程序画出流程图。对比流程图和程序了解两者之间的关系。最后,教师提出判断的要求,让学生思考如何修改流程图和程序。
(参考:问题描述,初始:求两个整数的差,引入判断要求:求两个整数的差的绝对值)
2.教师介绍IF语句
教师将问题进行简化,帮助学生思考,提出问题(教材例1):编写一个程序,要求输入一个数,输出这个数的绝对值。由此问题引出选择结构程序设计的思想方法,要求学生画出流程图。然后,开始介绍与判断结构流程图相对应的IF语句。教师将具体程序代码展示给学生看,让学生了解IF语句是如何来实现选择结构的,具体代码编写时的语法格式是怎样的,此处亦可将流程图和程序代码相对应,让学生更容易了解IF语句的语法格式。
注意:对于此处的学习,教师应强调让学生掌握IF语句的语法书写格式。
3.上机实践
(1)回到引入新课时的问题,要求编制程序解决问题:输入两个整数,求两数的差的绝对值。让学生通过画流程图和编制程序来描述解题方法。
(2)上机实践:
在上机调试程序的过程中,要求学生根据题目先设计出测试数据,思考,如何尽可能地提高测试的全面性。同时,要求学生详细记录测试过程,培养学生进行上机试验的规范。
(3)单分支结构、复合语句在选择结构中的应用:
教师给出上机练习的程序代码(教材例2),让学生对比自己所编写的代码,寻找异同点,发现自己编写代码过程中存在的问题,重点关注IF语句的格式有何不同,引出IF语句的单分支结构的代码编写格式。此外,注意:在Turbo Pascal语言中,IF语句里面被构造的语句只能是一条语句,当某个分支的计算要用到多个语句时,就必须使用复合语句来描述。
(4)多分支结构——IF语句的嵌套
教师给出具体题目(教材例3):
根据学生的成绩给予相应的等低,对应关系如下:
90——100 A
80——89 B
60——79 C
60以下 D
对于此题,分支情况已超出2个,而IF语句只能表示两种情况,要表示多种情况时,则需用到IF语句的嵌套,即将IF语句放在另一个IF语句的then分支或else分支中,教师给出具体的IF语句的嵌套的语法格式,让学生自己尝试参照IF语句嵌套的语法格式来编写程序代码。
(5)Case语句
除了IF语句之外,Turbo Pascal中还提供了另一种语句:Case语句来实现选择结构的程序设计,对于此处的教学,教师只需让学生掌握Case语句的语法书写格式,教师可给出具体的case语句的语法书写格式,让学会将上题中的IF语句改写成case语句。
4.总结
本节课的重点在于让学生用IF语句和case语句来实现选择结构的程序代码编写。通过上机实践让学生掌握IF语句的语法格式及多分支的嵌套的语法格式,case语句的语法格式,并进行程序代码的改写。
5.作业:
结合上机练习题让学生自己动手编写完整的Turbo Pascal程序。
靶向练习
思考题:
1.if 语句和case语句之间有什么相同和不同的地方?
解答:if 语句和case语句之间相同的地方:都可以用来表示选择结构。它们的不同之处在于:一句if语句只能用来表示两种情况,要用if语句表示多种分支情况时,必须要用if语句的嵌套才能实现;而一句case语句可以用来表示多种分支的情况。
2.case语句能不能和if语句一样进行嵌套?
解答:case语句不能和if语句一样进行嵌套
3.if语句描述的程序能不能用case语句来改写?举个例子说明之。
解答:if语句描述的程序能用case语句来改写。
例:根据学生的成绩给予相应的等低,对应关系如下:
90——100 A
80——89 B
60——79 C
60以下 D
program scores;
var s:Real;ch:Char;
begin
write('input the score: ');
readln(s);
IF (s>=0) And (s<=100)
then if s>=90
then ch:='A'
else if s>=80
then ch:='B'
else if s>=60
then ch='C'
else ch:='D';
writeln(s,'-->',ch);
end.
程序代码可改写为:
program scores;
var
s:Real;
ch:Char;
begin
write('input the score: ');
readln(s);
IF(s>=0)And(s<=100)then
case s Div 10 of
10,9:ch:='A';
8:ch:='B';
7,6:ch='C';
else ch:='D';
end;
writeln(s,'-->',ch);
end.
上机练习:
1.输入三个数,输出最大数。
参考程序:
program ex5201;
var
a,b,c:real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('c=');
readln(c);
if a>b
then if a>c
then writeln('the max number is :',a:8:2)
else writeln('the max number is :',c:8:2)
else if b>c
then writeln('the max number is :',b:8:2)
else writeln('the max number is :',c:8:2);
end.
2.输入年份,判断并输出该年份是否闰年。
参考程序:
program ex5202;
var
year:integer;
begin
write('please input year:');
readln(year);
if (year mod 400=0) or (year mod 4=0) and (year mod 100<>0)
then writeln('Yes!')
else writeln('No!')
end.
3.解方程:,(a,b,c由键盘输入)
参考程序:
program ex5203;
var
a,b,c,d:integer;
x1,x2:real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('c=');
readln(c);
if a=0
then if (b=0)
then if c=0
then writeln('there are unlimitedless answer!')
else writeln('No answer')
else writeln('the answer is :',-c/b:8:2)
else begin
d:=b*b-4*a*c;
if d>0
then begin
x1:=(-b+sqrt(d))/2/a;
x2:=(-b-sqrt(d))/2/a;
writeln('there are two different answer :',x1:8:2,x2:8:2);
end
else if d=0
then begin
x1:=-b/2/a;
writeln('there are two same answer :',x1:8:2);
end
else writeln('No answer');
end;
end.
4.分段函数:
参考程序:
program ex5204;
var
x,y:real;
begin
write('x=');
readln(x);
if x<0
then begin
y:=3*x*x*x+5*x-1;
writeln('y= ',y:8:2);
end
else if x=0
then begin
y:=0;
writeln('y= ',y:8:2);
end
else begin
y:=sqr(x)-4;
writeln('y= ',y:8:2);
end;
end.
5.输入年、月,输出该月有多少天?
参考程序:
program ex5205;
var
year,month,day:integer;
begin
write('input year: ');
readln(year);
write('input month: ');
readln(month);
case month of
1,3,5,7,8,10,12:day:=31;
4,6,9,11:day:=30;
2:if (year mod 400=0) or (year mod 100<>0) and (year mod 4=0)
then day:=29
else day:=28;
end;
writeln(day,' days');
end.
6.输入三角形的三个边,判断它是何类型的三角形(等边三角形?等腰三角形?一般三角形?)
参考程序:
program ex5206;
var
a,b,c:integer;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('c=');
readln(c);
if (a+b>c) and (a+c>b) and (b+c>a)
then if (a=b) and (a=c)
then writeln('deng bian san jiao xing')
else if (a=b) or (a=c) or (b=c)
then writeln('deng yao san jiao xing')
else writeln('bu deng bian san jiao xing')
else writeln('bu shi san jiao xing');
end.
7.计算1901年2099年之间的某月某日是星期几。
参考程序:
program ex5207;
var
y,m,d,i:integer;
con:array[1..12]of integer;
dis:longint;
procedure error(s:string);
begin
writeln(s);
halt;
end;
function run(y:integer):boolean;
begin
if (y mod 4 =0)and(y mod 100 <>0)or (y mod 400=0)
then run:=true
else run:=false;
end;
begin
repeat
writeln('Input Year,Month,Day');
readln(y,m,d);
until (y >= 1901)and(y<=2099)and(m in [1..12])and(d in [1..31]);
if (m=2) and run(y)and (d>29)then error('error');
if (m=2) and (not run(y))and(d>28)then error('error');
if (m in [4,6,9,11])and (d>30) then error('error');
con[1]:=(31);con[2]:=(28);con[3]:=(31);con[4]:=(30);
con[5]:=(31);con[6]:=(30);con[7]:=(31);con[8]:=(31);
con[9]:=(30);con[10]:=(31);con[11]:=(30);con[12]:=(31);
if run(y)then con[2]:=29;
dis:=0;
for i:=y+1 to 2099 do
if run(i)then inc(dis,366) else inc(dis,365);
for i:=12 downto m+1 do inc(dis,con[i]);
inc(dis,con[m]-d);
case dis mod 7 of
0:writeln('Thursday');
1:writeln('Wednesday');
2:writeln('Tuesday');
3:writeln('Monday');
4:writeln('Sunday');
5:writeln('Saturday');
6:writeln('Friday');
end;
end.
8.输入三个数,按由大到小顺序打印出来。
参考程序:
program ex5208;
var
a,b,c,temp:real;
begin
writeln('Input a,b,c');
readln(a,b,c);
if athen begin
temp:=a;
a:=b;
b:=temp;
end;
if bthen begin
temp:=b;
b:=c;
c:=temp;
end;
if athen begin
temp:=a;
a:=b;
b:=temp;
end;
writeln(a:8:2,'>',b:8:2,'>',c:8:2);
end.