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

文档属性

名称 5.3 循环结构程序设计 教学设计 -2025-2026学年《高中信息技术》(沪科版)(重庆地区版)
格式 doc
文件大小 89.5KB
资源类型 教案
版本资源 其它版本
科目 信息技术(信息科技)
更新时间 2025-09-10 14:46:47

图片预览

文档简介

第五章 程序设计初步
概述
本章前三节将通过一些具体的Pascal程序实例来帮助学生了解Pascal程序的基本结构,掌握程序的三种基本结构:顺序结构、选择结构、循环结构,了解使用用户自定义数据类型:枚举类型、子界类型及数组类型进行数据定义的方法。第四节,介绍了函数和过程的有关知识,包括函数和过程的递归调用以及其它一些基本算法,通过阅读程序和尝试编写简单程序让学生能够掌握定义、编写和调用函数和过程的方法。最后,在本章第五节中介绍了面向对象的程序设计,要求学生在前几节的内容上,进一步体会编写大型程序或复杂程序的困难性,从中领会面向对象设计思想的精髓所在。
本章的主要内容
节名 教学内容
顺序结构程序设计 通过一些具体的Pascal程序来介绍顺序结构程序设计的编程思想,其中着重介绍了赋值语句、输入语句、输出语句、复合语句的使用方法。
选择结构程序设计 通过一些具体的Pascal程序来介绍选择(分支)结构程序设计的编程思想,其中还针对IF语句、Case语句作了较为深入详细的介绍和比较。
循环结构程序设计 通过一些具体的Pascal程序来介绍循环(重复)结构程序设计的编程思想,其中详细介绍了三种循环语句:For语句、While语句、Repeat语句,本节后半部分还详细介绍了有关循环嵌套的知识及三种用户自定义数据类型:枚举类型、子界类型和数组类型。
函数和过程 通过一些具体的Pascal程序来对函数和过程作了较为详细深入的介绍,其中包括函数或过程调用时的形式参数、实际参数、和标示符的作用域等相关知识,最后,介绍了函数或过程的递归调用的使用方法。
面向对象程序设计 能够熟悉与面向对象方法有关的六个重要概念,能够了解当今比较流行的几种面向对象语言;学习程序示例是如何编写面向对象程序的。
第三节 循环结构程序设计
一、教材分析
教学目标
目标 实现
知识 掌握循环结构程序设计的思想方法。 贯穿于整个教学活动过程中
掌握并能灵活运用三种循环语句: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.
同课章节目录