5.1 顺序结构程序设计 教学设计 -2025-2026学年《高中信息技术》(沪科版)(重庆地区版)

资源下载
  1. 二一教育资源

5.1 顺序结构程序设计 教学设计 -2025-2026学年《高中信息技术》(沪科版)(重庆地区版)

资源简介

第五章 程序设计初步
概述
本章前三节将通过一些具体的Pascal程序实例来帮助学生了解Pascal程序的基本结构,掌握程序的三种基本结构:顺序结构、选择结构、循环结构,了解使用用户自定义数据类型:枚举类型、子界类型及数组类型进行数据定义的方法。第四节,介绍了函数和过程的有关知识,包括函数和过程的递归调用以及其它一些基本算法,通过阅读程序和尝试编写简单程序让学生能够掌握定义、编写和调用函数和过程的方法。最后,在本章第五节中介绍了面向对象的程序设计,要求学生在前几节的内容上,进一步体会编写大型程序或复杂程序的困难性,从中领会面向对象设计思想的精髓所在。
本章的主要内容
节名 教学内容
顺序结构程序设计 通过一些具体的Pascal程序来介绍顺序结构程序设计的编程思想,其中着重介绍了赋值语句、输入语句、输出语句、复合语句的使用方法。
选择结构程序设计 通过一些具体的Pascal程序来介绍选择(分支)结构程序设计的编程思想,其中还针对IF语句、Case语句作了较为深入详细的介绍和比较。
循环结构程序设计 通过一些具体的Pascal程序来介绍循环(重复)结构程序设计的编程思想,其中详细介绍了三种循环语句:For语句、While语句、Repeat语句,本节后半部分还详细介绍了有关循环嵌套的知识及三种用户自定义数据类型:枚举类型、子界类型和数组类型。
函数和过程 通过一些具体的Pascal程序来对函数和过程作了较为详细深入的介绍,其中包括函数或过程调用时的形式参数、实际参数、和标示符的作用域等相关知识,最后,介绍了函数或过程的递归调用的使用方法。
面向对象程序设计 能够熟悉与面向对象方法有关的六个重要概念,能够了解当今比较流行的几种面向对象语言;学习程序示例是如何编写面向对象程序的。
第一节 顺序结构程序设计
一、教材分析
教学目标
目标 实现
知识 掌握顺序结构程序设计的思想方法。 贯穿于整个教学活动过程中
掌握四种语句:赋值语句、输入语句、输出语句、复合语句。 上机实践:学生练习为主,教师辅导为辅,结合上机实践。
技能 进一步了解并掌握编写Pascal程序的全过程,并能独立运行Pascal程序,得出运行结果。 贯穿于整个上机实践的过程之中
独立分析、灵活运用所学知识解决实际问题的能力 贯穿于整个教学活动过程中
情感态度价值观 培养严谨的程序编写的风格的习惯,体验编写Pascal程序的过程,激发学生学习编写程序的兴趣和学习热情 贯穿于上机实践的整个过程之中
养成独立分析、善于归纳总结的习惯 贯穿于整个教学活动过程中。
教学重点与难点
本节主要是学习顺序结构程序设计的编程思想以及四种最基本的语句:赋值语句、输入语句、输出语句和复合语句。本节的重点在于输入和输出语句的学习,输入语句和输出语句不仅各有两种形式,而且有多种组合,比较复杂,学生要能灵活运用这两种语句需要一定的理解能力并要多加练习才能体会,相较而言,输出语句更为复杂一些,变化更多一些,这也是本节的难点。除了输入输出语句之外,学生还要掌握赋值语句的作用和使用方法及相关的一些注意事项,比如赋值号两边应赋值相容的概念,此外,通过本节的学习,学生还应能了解复合语句的作用及如何在程序中使用复合语句。
二、教学建议
课时安排建议
本节内容建议用1课时完成。
教学准备
1.机房准备
编写Pascal程序对机房的软硬件配置要求不高,操作系统选择Windows 98、Windows 2000或Windows XP均可,CPU为Pentium以上即可,内存为32M(Windows 98)以上,每位学生一台计算机。
2.教师准备
熟练掌握Turbo Pascal 7.0和一些基本的常用算法。搜集整理一些常用的算法分析题例放在教师机上;提供一些专业的算法分析和Pascal程序设计网站的索引供学生学习使用。
3.学生准备
具备基本的信息技术操作技能,包括鼠标、键盘使用,文字输入等。
教学过程安排建议
1.导入新课,提出问题
通过设计一些练习帮助学生复习前面一个章节中的相关知识,尤其是关于算法和Pascal编程环境的内容,然后演示其中一个算法的程序,激发学生的学习兴趣,导入新课——如何编写一个Pascal程序。而程序是由语句组成的,解剖刚才那个程序,可以找到Pascal程序的最基本的语句:赋值语句、输入语句、输出语句和复合语句。
2.教师介绍赋值语句
赋值语句是Pascal中较为简单的语句,在讲解赋值语句时,教师可以从以下几方面来讲解:赋值语句的格式、赋值语句的作用、赋值号左边的变量应与赋值号右边表达式的结果值赋值相容。
教师可在介绍过程中辅以相应的具体语句,让学生来判断语句的正确性(重点可从赋值相容性作考虑),也可让学生写出最终结果,以此让学生掌握赋值语句,提高学生的学习兴趣。
3.上机实践
(1)教师简要介绍输入语句
在讲授这部分知识时,教师可简要介绍输入语句的格式、作用,重点是让学生通过上机实践真正掌握输入语句是如何在程序中使用的。
(2)上机实践使用输入语句
教师提供程序代码(亦可用课后练习)让学生上机实践体会输入语句的使用方法,read语句和readln语句的异同点。
此过程是学生将知识从理论转化为实践的过程,教师在此过程中应关注每一位学生知识的具体掌握情况,要有针对性地加以个别辅导,务必使每一位学生能真正掌握输入语句的使用方法,在程序中做到灵活使用输入语句。同时可以发挥出个别优秀学生充当小老师的角色,发扬学生之间互帮互助的精神,达到共同进步的目的。
(3)学习使用输出语句
在学生完全掌握输入语句的基础上,教师可让学生自学输出语句的使用方法和作用,同时教师提供一些程序代码,让学生结合输入语句来学习输出语句的使用方法,包括write语句和writeln语句的异同、输出域宽的作用和设置方法等。通过表格列举对比等各种方式,将输入输出语句进行并列对比的学习,加深理解。
(4)学习使用复合语句
对于复合语句,此处教师只需作简要介绍,主要强调复合语句的格式、作用(类似于把多句语句作为一句语句来使用)。
4.总结
本节课的重点在于让学生在编写程序的过程的学会使用赋值语句、输入和输出语句,了解复合语句的格式和作用。
5.作业:
结合上机练习题让学生自己动手编写完整的Turbo Pascal程序。
靶向练习
练习题:
1.写出下列语句的输出结果:
(1)Writeln(’a=’,12:5);
Writeln(’b=’,20:5);
Writeln(’a*b=’,12*20:5);
Writeln(’a/b=’,12/20:5:1);
输出:
a=□□□12
b=□□□20
a*b=□□240
a/b=□□0.6
(2)x:=10;
i:=1;
Writeln(’x=’,x:4);
Writeln(’i=’,i:4);
x:=-x;
i:=i+1;
Writeln(’x=’,x:4);
Writeln(’i=’,i:4);
输出:
x=□□10
i=□□□1
x=□-10
i=□□□2
2.写出执行结果:
(1)输入数据为:
1 2 3 4
  5 6 7 8
9 10 11 12
13 14 15 16
若执行语句为:
Read(a,b,c)
Read(d,e,f,g,h)
Read(i,j,k)
执行结果 a= 1 b= 2 c= 3 d= 4 e= 5
f= 6 g= 7 h= 8 i= 9 j= 10
k= 11
(2)输入数据为:
1 2 3 4
  5 6 7 8
9 10 11 12
13 14 15 16
若执行语句为:
Readln(a,b,c)
Readln(d,e,f,g,h)
Readln(i,j,k)
执行结果 a= 1 b= 2 c= 3 d= 5 e= 6
f= 7 g= 8 h= 9 i= 13 j= 14
k= 15
思考题:
1. Read与Readln,这两句语句有何区别?
解答:Readln语句和Read语句不同之处在于读取数据并赋值给各个变量之后,Readln会自动换行,从下一行开始再读取数据,而Read语句执行完后,不会自动换行,原数据行中多余的未读数据可以被下一个输入语句读取。此外,Readln语句中也可以不包含变量名表。
2. Write与Writeln,这两句语句有何区别?
解答:Write和Writeln的区别在于:Write语句在输出<输出项表>后不换行,光标停留在最后一项的后一列,而Writeln语句按项输出后会自动换行,光标停留在下一行的第一列。此外,Writeln语句还允许不含有输出项,即Writeln; 表示不输出任何内容直接换行。
上机练习题:
1.输入两个数,输出它们的和、差、积、商。
参考程序:
program ex5101;
var
a,b:real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
writeln('a+b=',a+b:8:2);
writeln('a-b=',a-b:8:2);
writeln('a*b=',a*b:8:2);
if b<>0
then writeln('a/b=',a/b:8:2)
else writeln(b:8:2,' can not be devided by ',a:8:2);
end.
2.输入梯形的高、上底、下底的长,输出梯形的面积。
参考程序:
program ex5102;
var
a,b,h,s:real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('h=');
readln(h);
s:=(a+b)*h/2;
writeln('s=',s:8:2);
end.
3.输入三角形的三条边的长,输出三角形的面积。
参考程序:
program ex5103;
var
a,b,c,p,s:real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('c=');
readln(c);
if (a+b>c) and (a+c>b) and (b+c>a0
then begin
p:=(a+b+c)/2;
s:=sqrt(p*(p-a)*(p-b)*(p-c);
writeln('s=',s:8:2);
end
else writeln('input error!');
end.
4.输入球的半径,输出球的表面积及球的体积。
参考程序:
program ex5104;
const
pi=3.14;
var
r,s,v:real;
begin
write('r=');
readln(r);
s:=4*pi*r*r;
v:=4*pi*r*r*r/3;
writeln('s=',s:8:2);
writeln('v=',v:8:2);
end.
第二节 选择结构程序设计
一、教材分析
教学目标
目标 实现
知识 掌握选择结构程序设计的思想方法。 贯穿于整个教学活动过程中
掌握两种语句: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.
第三节 循环结构程序设计
一、教材分析
教学目标
目标 实现
知识 掌握循环结构程序设计的思想方法。 贯穿于整个教学活动过程中
掌握并能灵活运用三种循环语句:For语句、While语句和Repeat语句。 上机实践:学生练习为主,教师辅导为辅,结合上机实践。
了解Goto语句的使用方法
掌握运用循环语句编写多重循环的方法
掌握枚举类型、字界类型和数组,并能运用这些类型编写程序代码
技能 能够运用循环语句编写pascal程序。 贯穿于整个上机实践的过程之中
独立分析、灵活运用循环结构解决实际问题的能力 贯穿于整个教学活动过程中
情感态度价值观 培养严谨的程序编写的风格的习惯,体验编写pascal程序的过程,激发学生学习编写程序的兴趣和学习热情 贯穿于上机实践的整个过程之中
养成独立分析、善于归纳总结的习惯 贯穿于整个教学活动过程中。
教学重点与难点
循环结构程序设计的思想方法是程序设计的三种结构中最为复杂最难掌握的一种编程思想,在Turbo Pascal中,共提供了四种循环语句来实现循环结构,分别是:For语句、While语句、Repeat语句和Goto语句。在这四种语句中,前三种语句在具体的编程中运用得较为广泛,也是学生必须掌握并能灵活运用的,所以这部分内容是本节的教学重点。而Goto语句则破坏了程序的整体结构,使程序看上去显得比较混乱,造成程序阅读和差错不易,在具体的编程中一般很少使用,因而在本节的学习中不把它作为教学的重点。难点则是循环变量和循环条件的配合使用对控制循环的作用。
二、教学建议
课时安排建议
本节内容建议用3课时完成。第1课时学习循环结构的基础知识和语句;第2课时用循环结构解决实际问题(程序实例的分析和调试);第3课时学习GoTo语句、枚举类型、字界类型和数组。
教学准备
1.机房准备
编写pascal程序对机房的软硬件配置要求不高,操作系统选择Windows 98、Windows 2000或Windows XP均可,CPU为Pentium以上即可,内存为32M(Windows 98)以上,每位学生一台计算机。
2.教师准备
熟练掌握Turbo Pascal 7.0和一些基本的常用算法。搜集整理一些常用的算法分析题例放在教师机上;提供一些专业的算法分析和pascal程序设计网站的索引供学生学习使用。
3.学生准备
具备基本的信息技术操作技能,包括鼠标、键盘使用,文字输入等。
教学过程安排建议
1.导入新课,提出问题
提出问题:编写程序计算1+2+3+…+99+100的和。
教师可以要求学生使用先前学过的顺序结构和选择结构来解决这个问题,通过尝试,学生会发现以上两种结构是不能很好地解决这个问题的。如果用顺序结构的话,虽然可以解决问题,但在程序代码中会有一个很长的表达式,表达式过长编写时容易遗漏或出错,人工检查时非常麻烦,不易检查出错误,不是一个好的解决之道。而选择结构更不能解决问题了。那么,既然用现有的算法不能解题,就不妨先用数学方法来尝试解题,尽量将此表达式进行简化,让学生进行充分的讨论,寻找到数学方法(可以一题多解)。
在学生解题的过程中,教师可以有意识地要求学生寻找表达式里的规律(即重复相加)。从而引出循环结构,并对循环结构使用的条件、基本概念进行讲解。
2.介绍循环语句——For语句
教师对For语句的格式,循环变量、初值、终值、For语句的功能作介绍,并使用for语句编写解决上面问题的程序。循环变量指的就是每一项的值,初值就是第一项的值,即1,终值就是最后一项的值,即100,而do后面的语句中要做的就是将和加上后一项(即循环变量)得到一个新的和。For语句中每执行一次循环,循环变量的值自动加一,正好符合表达式中相邻两项中,后一项的值等于前一项的值加1这个规律。因此可以用For语句来计算这个表达式的值。最终,只要循环结束后输出和的值即可。
教师将具体程序代码展示给学生:
program qiuhe;
  var i,sum:integer;
 begin
  sum:=0;
  For i:=1 to 100 do
   sum:=sum+i;
  writeln(sum);
 end.
同时可结合程序代码进行提问:在程序代码中,i表示什么,sum又表示什么,为什么在循环计算前要将sum的值变为0(引出求和累加前首先要将和置位0)。
3.上机实践
(1)学生模仿教师所展示的代码编写程序,计算1+2+3+…+99+100的和。
(2)上机实践:
在学生已能模仿教师的代码编写程序的基础上,教师可以给出如下的题目,以达到使学生完全掌握For语句的目的。计算1+2+3+…+300的和,计算100+101+…+200的和。
此过程的目的就是通过练习让学生能灵活应用循环初值、循环终值进行程序的编写,也是学生将知识从理论转化为实践的过程,教师在此过程中应关注每一位学生知识的具体掌握情况,要有针对性地加以个别辅导,务必使每一位学生读能真正掌握For语句的语法格式,循环变量、初值和终值的作用和具体使用的方法,在具体的编程过程中做到灵活使用For语句。
(3)要求编程逆序输出26个大写英文字母。
For语句的另一种格式:
For 循环变量:=初值 downto 终值 do 语句;
教师分析讲解这个For语句的作用,与另一种格式作比较,列表分析异同点。学生自己试着编写程序代码,教师可提示学生也可用字符作为循环的初值和终值。
(4)上机实践:学生上机编写程序代码
(5)小结:For语句一般用于循环次数已知的情况,循环次数由初值、终值决定。
4.学习While语句
(1)要求编程求正整数m和n的最大公约数。
分析:求两个正整数的最大公约数可采用辗转相除法进行求解。教师给出辗转相除的算法:
用变量m,n,temp分别表示被除数、除数、余数。
①求m除以n的余数temp。
②若temp=0,则n就是最大公约数;若temp<>0,则执行第③步。
③将n的值放在m中,将temp的值放在n中。
④返回重新执行第①步。
在这个算法中,循环次数是无法事先计算的,因此显然不能用For语句来编写程序。在Turbo Pascal中提供了另外一种语句来实现循环结构的程序设计——While语句。
While语句的语法格式是:
  While 布尔表达式 do 语句;
其功能是:执行While语句时,首先要计算作为循环条件的布尔表达式的值,若值为真,则执行循环体(循环体可以是一个单独的语句,也可以是一个复合语句),在通常情况下,循环体中都包含有改变布尔表达式值的语句,每执行完一次循环体,都会再次计算布尔表达式的值,若值仍然为真,则再次执行循环体,否则,循环结束,执行While语句后的下一句语句。
教师将具体程序代码展示给学生:
Program gcd;
Var
m,n,temp:Integer;
begin
read(m,n);
writeln('m=',m,'n=',n);
while n<>0 do
begin
temp:=m mod n;
m:=n;
n:=temp;
end;
writeln('gcd=',m);
end.
(2)上机实践:
学生上机实践体会While语句在具体程序中的使用,并尝试将计算1+2+3+…+99+100的和由For语句循环改为用While语句编写程序。
(3)小结:
对于While语句,循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循环就是一个死循环。
5.学习Repeat语句
(1)教师讲解Repeat语句的格式、功能。
除了While语句外,Turbo Pascal还提供Repeat 语句来实现循环次数未知的循环。其语法格式是:
Repeat
   语句1;
语句2;
   ……;
   语句n;
until 布尔表达式;
其功能是:执行Repeat语句时,先执行循环体,后判断布尔表达式的值是否前为真,若值为真,则退出循环,执行Repeat语句后面的语句。若值为假,则再次执行循环体,然后再判断布尔表达式的值。
(2)上机实践:
通常情况下,While语句和Repeat语句可以相互转化,让学生试着将求正整数m和n的最大公约数由While语句改为Repeat语句来实现。
(3)小结:
While语句与Repeat语句的不同:
1.和While语句一样,repeat语句中的循环体必须包含有改变布尔表达式值的语句,否则将不能退出循环。
2.和While语句不同的是,当布尔表达式的值为真的时候While语句继续执行循环,而Repeat语句是当布尔表达式的值为真的时候就退出循环。
3.和While语句不同的是,在Repeat语句的结构中,先执行循环体,后判断布尔表达式的值;而While语句中,先判断布尔表达式的值,后执行循环体,也就是说使用Repeat语句至少要执行一次循环体,而使用While语句可能一次循环也不执行。
6.学习多重循环解决实际问题的方法
(1)教师提出问题:求100-300之间的所有素数。
分析:对于任意正整数n,根据素数定义,从2开始,到寻找n的约数。若能找到约数,则n必然不是素数,否则n为素数。在这里,素数的判断需要做的循环次数为2到次,而对于n,n的范围从100到300。因而,需要有两重循环来实现,判断数n是否为素数为内循环,n从100到300为外循环。
教师给出参考程序代码:
Program prime;
 var
  i,x:integer;
 begin
  for i:=100 to 300 do
   begin
    x:=2;
    while (x<=trunc(sqrt(i)))and(i mod x<>0)do
     x:=x+1;
    if x>trunc(sqrt(i)) then write(i:8);
   end;
 end.
提问:在这里,内外循环分别使用的是什么循环语句?它们的循环变量分别是什么?循环变量名可以互换吗?循环变量名可以相同吗?
(2)上机实践:
要求:将上述程序代码用另外的循环语句进行改写并进行优化。
注:此过程是学生将所学知识能否真正进行内化为自己知识的过程,教师在此过程中应不断巡视,当学生有问题应及时进行个别的辅导,给与及时的帮助。
(3)上机实践:
教师结合课后的上机练习题让学生进行编程,以达到强化和巩固学生知识的目的。
7.学习Goto语句
教师简要介绍一下第四种循环语句:无条件转向语句——Goto语句。对于Goto语句的学习,学生应能掌握其语法格式,及如何在具体的程序中使用Goto语句,但不提倡多用,在具体的编程中,应尽量不用Goto语句,因为Goto语句会使程序出现一种比较混乱的局面,而且,在调试运行时,会对程序代码的纠错带来不便。
8.学习枚举类型和子界类型
(1)教师讲解:
Turbo Pascal语言,除了提供Integer、Real、char、Boolean这四种标准数据类型之外,还可以让用户自定义新的数据类型。其中,用得比较多的就是枚举类型和子界类型。两者的语法格式都是一样的:
Type
 <标识符1>=<类型1>;
 <标识符1>=<类型1>;
 ……;
 <标识符n>=<类型n>;
(2)上机实践:
教师演示具体程序代码中如何定义和使用枚举块类型和子界类型的变量。学生上机调试体会具体这两个类型在具体编程中的用法。
(3)小结:
每一个枚举元素都是标识符,但不能将作为枚举元素的标识符视作为变量名,枚举元素不能被赋值。枚举类型中的第一个元素没有前趋,最后一个元素没有后继。Turbo Pascal不允许直接读写枚举值,枚举值的输出常用case语句间接输出。枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。若是才能赋给枚举变量,否则就会出错。对于子界类型,常量1和常量2必须是同一种顺序类型(整型、字符型、布尔类型、枚举类型)且常量1小于常量2。
9.学习数组
(1)教师讲解数组的定义:
数组是程序中最为常用的数据类型,通常用来描述由固定数目的相同类型的元素组成的数据结构。数组的每个元素和数组下标相关联,通过数组下标可以找到数组的任意一个数组元素。
数组定义的一般形式:
Type
数组类型标识符:array[<下标类型1>,<下标类型2>,……<下标类型n>] of 元素类型;
Var
数组变量表:数组类型标识符;
其中n称为数组的维数,每维的下标类型必须是一个顺序类型,其作用是指定数组下标的取值范围。
(2)教师介绍数组的操作
当数组的元素类型为简单类型时,其下标变量和简单类型变量一样使用。
相同类型的数组可以对数组进行整体赋值。
(3)上机实践:
输入一串字符,以“?”结束,分别统计其中每个数字的0,1,2,……,9出现的次数。
分析:可定义一个有10个元素的一位数组,分别用来记录0,1,2,……,9出现的次数。
10.课后上机练习
结合课后的上机练习题多加练习,巩固所学。
教学参考
上机练习:
1.算下列式子的值:
(1)1+3+……+99
(2)1-2+3-4+…+99-100
(3)1+2+4+8+……+1024+2048
参考程序:
program ex530101;
var
i,s:integer;
begin
s:=0;
i:=1;
while i<=99 do begin
s:=s+i;
i:=i+2;
end;
writeln('1+3+...+99= ',s);
end.
program ex530102;
var
i,s:integer;
begin
s:=0;
i:=1;
while i<=100 do begin
s:=s+i;
i:=abs(i)+1;
if i mod 2 =0 then i:=-i;
end;
writeln('1-2+3+...+99-100= ',s);
end.
program ex530103;
var
i:integer;
s:longint;
begin
s:=0;
i:=1;
while i<=2048 do begin
s:=s+i;
i:=i*2;
end;
writeln('1+2+4+...+1024+2048= ',s);
end.
2.输入一个三位数,求它各位上数字的和。
参考程序:
program ex5302;
var
n,s,a,b,c:integer;
begin
repeat
write('input a number: ');
readln(n);
until(n>=100) and (n<=999);
a:=n mod 10;
b:=(n div 10) mod 10;
c:=n div 100;
s:=a+b+c;
writeln(s);
end.
3.输入10个数,输出它们的最大值,最小值,平均值。
参考程序:
program ex5302;
var
i:integer;
n,s,aver,max,min:real;
begin
s:=0;
max:=-1000000;
min:=1000000;
for i:=1 to 10 do begin
write('ipnut the number: ');
readln(n);
s:=s+n;
if maxif min>n then min:=n;
end;
writeln('the largest number is: ',max:8:2);
writeln('the smallest number is: ',min:8:2);
aver:=s/i;
writeln('the average is: ',aver:8:2);
end.
4.输出1000以内所有能被3整除,且至少有一个数字是7的所有正整数。
参考程序:
program ex5304;
var
i,n:integer;
begin
n:=0;
i:=1;
while i<=999 do begin
if (i mod 10=7) or (i div 100=7) or (i div 10 mod 10=7) then
if i mod 3=0 then begin
n:=n+1;
write(i:5);
if (n mod 5=0) then writeln;
end;
i:=i+1;
end;
end.
5.输入一串字符,以“?”结束。统计并输出字母、数字、其它符号的个数。
参考程序:
program ex5305;
var
a,b,c:integer;
ch:char;
begin
write('input chars: ');
read(ch);
a:=0;
b:=0;
c:=0;
while ch<>' ' do begin
if ((ord(ch)>=65) and (ord(ch)<=90)) or ((ord(ch)>=97) and (ord(ch)<=122))
then a:=a+1
else if (ord(ch)>=48) and (ord(ch)<=57)
then b:=b+1
else c:=c+1;
read(ch);
end;
writeln('you input letters :',a);
writeln('you input numbers :',b);
writeln('you input other chars :',c);
end.
6.输出100以内的所有素数。
参考程序:
program ex5306;
var
i,j,n:integer;
flag:boolean;
begin
n:=0;
for i:=2 to 100 do begin
flag:=true;
for j:=2 to trunc(sqrt(i)) do
if (i mod j =0) then flag:=false;
if flag then begin
write(i:3);
n:=n+1;
if (n mod 5=0) then writeln;
end;
end;
end.
7.求两个数的最小公倍数(提示:两个数的最小公倍数等于这两个数的乘积除以这两个数的最大公约数的商)
参考程序:
program ex5307;
var
m,n,gcd,lcm:integer;
begin
write('m= ');
readln(m);
write('n= ');
readln(n);
if melse gcd:=n;
while (m mod gcd<>0) or (n mod gcd<>0) do
gcd:=gcd-1;
lcm:=m*n div gcd;
writeln('lcm= ',lcm);
end.
8.编写一个译码程序,把一个英语句子译成数字代码。译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号‘*’,英文句子以‘.‘结束。
参考程序:
program ex5308;
var
s :array[1..1000]of integer;
i,j:integer;
t:char;
begin
i:=1;
read(t);
while t<>'.'do
begin
case t of
'a'..'z':s[i]:=ord(t)-96;
'A'..'Z':s[i]:=ord(t)-64;
' ':s[i]:=0;
end;
inc(i);
read(t);
end;
for j:=1 to i-1 do
if s[j]>0 then write(s[j],' ')else write('* ');
end.
9.求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。
参考程序:
program ex5309;
var
i,a,b,c:integer;
begin
for i:=100 to 999 do begin
a:=i mod 10;
b:=i div 100;
c:=i div 10 mod 10;
if (a*a*a+b*b*b+c*c*c=i) then writeln(i);
end;
end.
10.“百钱买百鸡”是我国古代的著名数学题。题目这样描述:3文钱可以买1只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡。用100文钱买100只鸡,那么各有公鸡、母鸡、小鸡多少只?与之相似,有"鸡兔同笼"问题。
参考程序:
program ex5310;
var
i,j,k:integer;
begin
for i:=1 to 33 do
for j:=1 to 50 do begin
k:=100-i-j;
if (i*3+j*2+k/3)=100 then writeln(i:3,j:3,k:3);
end;
end.
11.将例5(钱币兑换)改用二重循环实现。
参考程序:
program ex5311;
var
x,y,n:integer;
z:real;
begin
for x:=1 to 85 do
for y:=1 to 17 do begin
z:=(100-x-5*y)/10;
if (trunc(z)=z) and (z>=1) and (z<=9)
then begin
write('x=',x:3,'y=',y:3,'z=',(100-x-5*y)/10:3:0);
n:=n+1;
if n mod 4=0 then writeln;
end;
end;
end.
12.宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。”国王一想,这还不容易,刚想答应,如果你这时在国王旁边站着,你会不会劝国王别答应,为什么?
解答:会,因为这将是一个天文数字,无法兑现。
参考程序:
program ex5312;
var
j:integer;
s,i:real;
begin
s:=0;
i:=1;
j:=1;
while j<=63 do begin
s:=s+i;
i:=i*2;
j:=j+1;
end;
writeln(s:10:0);
end.
13.输入一个正整数N,把它分解成质因子相乘的形式。
如:36=1 X 2 X 2 X 3 X 3; 19=1 X 19
(提示:设因子为i,从2开始到N,让N重复被i除,如果能整除,则用商取代N,i为一个因子;如果不能整除,再将i增大,继续以上操作,直到i等于N。)
参考程序:
program ex5313;
var
i,x,y,n,m:longint;
begin
m:=0;
write('input a number: ');
readln(i);
write(i,'=');
x:=i;
y:=2;
n:=1;
while x<>1 do
begin
if x mod y=0 then
begin
x:=x div y;
if n<>1 then write('*');
n:=2;
write(y);
end
else
y:=y+1;
end;
write(' ');
end.
14.找出2-1000中的完数(若数的因子和等于这个数的本身,这样的数成为完数。例如28的因子1、2、4、7、14,且1+2+4+7+14=28,则28是完数)
参考程序:
program ex5314;
var
i,j,k:integer;
begin
for i:=2 to 1000 do
begin
k:=1;
for j:=2 to i-1 do
if i mod j=0 then
k:=k+j;
if i=k then writeln(k);
end;
end.
15.找出2-1000以内的亲密数对(如果a的因子和等于b,b的因子和等于a,且a<>b,则称a与b为亲密数对)。
参考程序:
program ex5315;
var
i,j,k,l:integer;
begin
for i:=2 to 1000 do
begin
k:=1;
l:=1;
for j:=2 to i-1 do
if i mod j=0 then
k:=k+j;
for j:=2 to k-1 do
if k mod j=0 then
l:=l+j;
if (i=l) and (i<>k) then writeln(i:8,k:8);
end;
end.
第四节 函数和过程
一、教材分析
教学目标
目标 实现
知识 掌握在编程过程中自定义函数和过程的方法。 贯穿于整个教学活动过程中
掌握函数和过程在程序中的调用方法、理解形式参数和实际参数、标识符的作用域。 上机实践:学生练习为主,教师辅导为辅,结合上机实践。
掌握函数和过程的递归调用
技能 能够使用函数和过程编写pascal程序。 贯穿于整个上机实践的过程之中
能够运用函数和过程的递归调用解决实际问题 贯穿于整个教学活动过程中
情感态度价值观 培养严谨的程序编写的风格的习惯,体验编写pascal程序的过程,激发学生学习编写程序的兴趣和学习热情 贯穿于上机实践的整个过程之中
养成独立分析、善于归纳总结的习惯 贯穿于整个教学活动过程中。
教学重点与难点
在编写大型的程序时,需要将程序分解为几个小模块,这样,不仅有利于程序代码的编写、也会使程序代码显得清晰易于查错。在Turbo Pascal中,可以通过自定义函数和过程的方法来实现程序的模块化。通过本节的学习,就是要让学生学会运用自定义函数和过程的方法来编写程序代码,以及函数和过程调用的相关知识。本节的难点是如何运用函数和过程的递归调用来编写程序代码解决生活中的实际问题。
二、教学建议
课时安排建议
本节内容建议用2课时完成。第1课时学习自定义函数和过程的定义、调用方法;第2课时则通过实际操作和上机调试体会自定义函数、过程在程序中的作用和形式参数、实际参数、标识符的作用和区别。
教学准备
1.机房准备
编写pascal程序对机房的软硬件配置要求不高,操作系统选择Windows 98、Windows 2000或Windows XP均可,CPU为Pentium以上即可,内存为32M(Windows 98)以上,每位学生一台计算机。
2.教师准备
熟练掌握Turbo Pascal 7.0和一些基本的常用算法。搜集整理一些常用的算法分析题例放在教师机上;提供一些专业的算法分析和pascal程序设计网站的索引供学生学习使用。
3.学生准备
具备基本的信息技术操作技能,包括鼠标、键盘使用,文字输入等。
教学过程安排建议
1.导入新课,提出问题
在编写程序代码时,将程序分解为几个模块,这样,不仅有利于程序代码的编写、也会使程序代码显得清晰易于查错。在Turbo Pascal中,可以通过自定义函数和过程的方法来实现程序的模块化。教师可以展示几个使用自定义函数和过程的程序,让学生寻找其中的自定义函数和过程,发掘一下自定义函数和过程与常用的语句之间有什么差别和共通点。
2.学习自定义函数
(1)函数的定义:
Turbo Pascal语言除了提供标准函数供用户使用之外,还允许用户自定义函数。在Turbo Pascal语言中,函数说明形式具体如下
Function 函数名(形式参数表):函数类型;
说明部分;
Begin
语句1;
语句2;
……;
语句n;
End;
说明:函数分为两部分:函数首部和函数体。
函数首部由保留字Function、函数名(参数列表):函数类型组成,以分号表示结束。
Function 函数名(形式参数表):函数类型;
函数首部中包含了函数名、函数形式参数的信息及函数返回值的数据类型。
函数体由函数说明和函数执行两个部分组成。函数说明部分用于定义和说明函数中用到的数据,包括单元说明、标号说明、常量说明、类型说明、变量说明。
函数执行部分描述了函数要执行的操作,以保留字“Begin”作为函数开始的标识,以保留字“End;”表示函数结束。其间是一些执行具体操作的语句,并且以分号作为语句之间的分隔符。
和Turbo Pascal语言提供的标准函数一样,用户自定义函数也有一个函数的返回值。用户自定义函数的调用方式同标准函数一样,都是通过表达式的形式来调用函数。
(2)上机实践:
学生上机编写程序:用自定义函数的方法来定义n!。其中n!=1*2*3*…*n。
此过程的目的就是通过上机实践让学生能灵活自定义函数的方法进行程序的编写,也是学生将知识从理论转化为实践的过程,教师在此过程中应关注每一位学生知识的具体掌握情况,要有针对性地加以个别辅导,务必使每一位学生读能真正掌握自定义函数的语法格式,如何在函数中设置函数返回值的语句,在具体的编程过程中做到灵活自定义函数来简化程序,实现模块编程。
(3)小结:
在函数体中至少要有一条语句对函数名赋值。
3.学习过程
(1)定义
和函数一样,Turbo Pascal语言除了提供标准过程供用户使用之外,也允许用户自定义过程。在Turbo Pascal语言中,过程说明形式具体如下:
Procedure 过程名(形式参数表);
说明部分;
Begin
语句1;
语句2;
……;
语句n;
End;
说明:过程分为两部分:过程首部和过程体。
过程首部由保留字procedure、过程名(参数列表)组成,以分号表示结束。
Procedure 过程名(形式参数表);
过程首部中包含了过程名、过程形式参数信息。
过程体由过程说明和过程执行两个部分组成。过程说明部分用于定义和说明过程中用到的数据,包括单元说明、标号说明、常量说明、类型说明、变量说明。
过程执行部分描述了过程要执行的操作,以保留字“Begin”作为过程开始的标识,以保留字“End;”表示过程结束。其间是一些执行具体操作的语句,并且以分号作为语句之间的分隔符。
(2)上机实践:
学生上机编写程序:用自定义过程的方法来定义n!。其中n!=1*2*3*…*n。
此过程的目的就是通过上机实践让学生能灵活自定义过程的方法进行程序的编写,也是学生将知识从理论转化为实践的过程,教师在此过程中应关注每一位学生知识的具体掌握情况,要有针对性地加以个别辅导,务必使每一位学生读能真正掌握自定义过程的语法格式,在具体的编程过程中做到灵活自定义过程来简化程序,实现模块编程。
4.学习形式参数和实际参数、标识符的作用域
教师介绍函数和过程调用时的实行参数和实际参数的知识,学生主要应掌握值参数和变量参数,知道两者的区别,教师了借助表格的形式进行归纳,让学生易于理解和掌握。
学生应掌握如何在程序中定义和使用全局变量、局部变量,知道两者的区别,知道何时该使用全局变量、何时该使用局部变量。
5.学习递归
(1)概念
递归就是函数或过程调用其本身。递归分为两类:直接递归和间接递归。直接递归就是函数或过程直接调用自己。而间接递归就是函数或过程a调用函数或过程b,而b又调用a。
直接递归的调用过程可参考下图:
图 直接递归过程的执行流程
(2)上机实践:
楼梯有N阶,上楼可以一步上一阶,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。
分析:
每次上楼可以一步上一阶,也可以一次上二阶。要到达第N阶楼梯,有以下两种走法:一种走法是从第N-1阶走一阶到达第N阶,还有一种走法就是从第N-2阶走二阶到达第N阶。若用s(N)表示到达第N阶的走法,s(N-1)表示到达第N-1阶的走法,s(N-2)表示到达第N-2阶的走法,则有如下等式:s(N)=s(N-1)+s(N-2),从这个等式中可以看出,计算到达第N阶的所有走法s(N)可归结为计算到达第N-1阶的所有走法s(N-1)和第N-2阶的所有走法s(N-2)的问题,然后只需将s(N-1)与s(N-2)相加就能计算出s(N),而计算第N-1阶的所有走法s(N-1)又可以归结为计算第N-2阶的所有走法s(N-2)和第N-3阶的所有走法s(N-3)就可以了,如此推理,就可以一直倒推到到达2阶的所有走法s(2)和到达1阶的所有走法s(1),根据题中所给的条件,到达第1阶的走法只有一种可能,,所以可以得出:s(1)=1,而到达第2阶有两种走法,一是先到第一阶,然后再走到第2阶,二是直接走到第2阶,所以,可以得出:s(2)=2,然后再反过来一次计算出到达第3阶的所有走法s(3),到达第4阶的所有走法s(4),……,直到最后求出到达第N阶的所有走法s(N)。
教师提供参考程序如下:
program upstairs;
 var n:Integer;
 function s(n:Integer):Longint;
  begin
   if (n=1)Or(n=2) then s:=n
     else s:=s(n-1)+s(n-2);
  end;
 begin
  repeat
   write('N=');readln(n);
  until n>0;
  writeln('s=',s(n));
  readln;
 end.
学生上机模拟跟踪程序(n=5时)的整个运行过程,记录下各变量在程序运行过程中具体的数值。并尝试画出递归调用示意图。
递归调用示意图参考如下:
(3)上机练习:
在学生了解递归原理的基础上编写程序汉诺塔。教师在此过程中应关注每一位学生知识的具体掌握情况,要有针对性地加以个别辅导,务必使每一位学生读能真正掌握递归的原理和编程方法。
(4)小结:
递归算法是计算机程序设计中的一种非常重要的算法。用递归算法编写的程序一般较为简短,但运行时会占用比较多的资源,速度较慢。
在考虑使用递归算法编写程序时,应满足两点:1)该问题能够被递归形式描述;2)存在递归结束的边界条件。
6.课后上机练习
结合课后的上机练习题多加练习,巩固所学。
教学参考
上机练习题:
1.编写一计算三角形面积的函数,利用这个计算五边形的面积。如图5-4-3所示:
参考程序:
program ex5401;
var
a,b,c,d,e,f,g,s:real;
function ts(a1,b1,c1:real):real;
var
p:real;
begin
p:=(a1+b1+c1)/2;
ts:=sqrt(p*(p-a1)*(p-b1)*(p-c1));
end;
begin
readln(a,b,c,d,e,f,g);
s:=ts(a,b,f)+ts(f,c,g)+ts(d,e,g);
writeln('area=',s:8:3);
end.
2.计算s。已知s=1!+2!+3!+…+10!
参考程序:
program ex5402;
var
i:integer;
s:longint;
function f(m:integer):longint;
begin
if m=0
then f:=1
else f:=f(m-1)*m;
end;
begin
s:=0;
for i:=1 to 10 do
s:=s+f(i);
writeln('1!+2!+...+10!=',s);
end.
3.用函数和过程两种方法来定义n!。 其中n!=1*2*3*…*n。
参考程序:
用函数来定义n!:
program ex540301;
var
n:integer;
function jiec(n:integer):longint;
var
i:integer;
s:longint;
begin
s:=1;
for i:=2 to n do
s:=s * i;
jiec:=s;
end;
begin
read(n);
writeln(jiec(n));
end.
用过程来定义n!:
program ex540302;
var
n:integer;
ans:longint;
procedure jiec(n:integer;var ans:longint);
var
i:integer;
begin
ans:=1 ;
for i:=1 to n do
ans:=ans*i;
end;
begin
writeln('N= ');
readln(n);
jiec(n,ans);
writeln(ans);
end.
4.利用递归调用手段编程计算N!。
参考程序:
program ex5404;
var
n:integer;
function f(m:integer):real;
begin
if m=0
then f:=1
else f:=f(m-1)*m;
end;
begin
write('n= ');
readln(n);
write(f(n):1:0);
end.
5.利用递归调用技术求菲波纳契数列的第N项。
参考程序:
program ex5405;
var
n:integer;
function f(m:integer):real;
begin
if m=0
then f:=0
else if m=1
then f:=1
else f:=f(m-1)+f(m-2);
end;
begin
write('n= ');
readln(n);
write(f(n):1:0);
end.
6.汉诺塔游戏:相传在古印度的布拉玛婆罗门圣庙的僧侣在进行一种被称为汉诺塔的游戏,其装置是一块铜板,上面有三根杆(编号A、B、C),A杆上自下而上、由大到小按顺序串上64个金盘(如图5-4-4所示)。游戏的目标是把A杆上的金盘全部移到C杆上,并保持原有顺序叠好。条件是每次只能移动一个盘,并且每次移动都不允许大盘移到小盘之上。现要求利用递归调用技术推导出N个盘从A杆移到C杆的移动过程。
图5-4-4 N阶汉诺塔
参考程序:
program ex5406;
var
total:integer;
procedure move(n,a,b,c:integer);
begin
if n=1
then writeln(a,'-->',c)
else
begin
move(n-1,a,c,b);
writeln(a,'-->',c);
move(n-1,b,a,c);
end;
end;
begin
readln(total);
move(total,1,2,3);
end.
7.某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况。
参考程序:
program ex5407;
var
a:array[1..100]of integer;
ok:array[1..100]of boolean;
tot:longint;
n:integer;
procedure sub(s:integer);
var i:integer;
begin
if s>n then inc(tot)
else
for i:=1 to n do
if (i<>s) and ok[i]then begin
ok[i]:=false;
sub(s+1);
ok[i]:=true;
end;
end;
begin
writeln('N=');
readln(n) ;
tot:=0;
fillchar(ok,sizeof(ok),true);
sub(1);
writeln(tot);
end.
8.设有2n个运动员要进行网球比赛。现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手每天只能参赛一次;
(3)循环赛在n-1天内结束。
参考程序:
9.数学宝塔,从最顶上走到最底层,每次只能走到下一层的左边或右边的数字,求出使所走到的所有数字之和为60的途径。
        7
       4  6
      6  9  3
     6  3  7  1
    2  5  3  2  8
   5  9  4  7   3  2
  6  4  1  8  5  6  3
 3  9  7  6  8  4  1  5
2  5  7  3  5  7  8  4  2
参考程序:
program ex5409;
var
a:array[1..9,1..9]of byte;
rou,i,j:integer;
ans:array[1..8]of char;
time:longint;
procedure print;
var
i:integer;
begin
if rou=60
then begin
inc(time);
write('Route ',time,': ');
for i:=1 to 7 do write(ans[i]);
writeln(ans[8]);
end;
end;
procedure sub(s,p:integer);
var
i:integer;
begin
if rou>60 then exit;
if s>8
then print
else for i:=0 to 1 do begin
inc(rou,a[s+1,p+i]);
if i=0 then ans[s]:='L'else ans[s]:='R';
sub(s+1,p+i);
dec(rou,a[s+1,p+i]);
end;
end;
begin
a[1,1]:=7;
a[2,1]:=4;
a[2,2]:=6;
a[3,1]:=6;
a[3,2]:=9;
a[3,3]:=3;
a[4,1]:=6;
a[4,2]:=3;
a[4,3]:=7;
a[4,4]:=1;
a[5,1]:=2;
a[5,2]:=5;
a[5,3]:=3;
a[5,4]:=2;
a[5,5]:=8;
a[6,1]:=5;
a[6,2]:=9;
a[6,3]:=4;
a[6,4]:=7;
a[6,5]:=3;
a[6,6]:=2;
a[7,1]:=6;
a[7,2]:=4;
a[7,3]:=1;
a[7,4]:=8;
a[7,5]:=5;
a[7,6]:=6;
a[7,7]:=3;
a[8,1]:=3;
a[8,2]:=9;
a[8,3]:=7;
a[8,4]:=6;
a[8,5]:=8;
a[8,6]:=4;
a[8,7]:=1;
a[8,8]:=5;
a[9,1]:=2;
a[9,2]:=5;
a[9,3]:=7;
a[9,4]:=3;
a[9,5]:=5;
a[9,6]:=7;
a[9,7]:=8;
a[9,8]:=4;
a[9,9]:=2;
rou:=a[1,1];
time:=0;
sub(1,1);
end.
10.顺序读入字符,以‘?’结束,然后以和输入相反的次序输出读入的字符,要求用递归实现。
参考程序:
program ex5410;
procedure main;
var c:char;
begin
read(c);
if c=' '
then exit
else begin
main;
write(c);
end;
end;
begin
main;
end.
a
b
c
d
e
f
g
图5-4-3 计算五边形的面积

展开更多......

收起↑

资源预览