摘要:C语言由于应用面广,因此很多高校都会选择C语言作为基础程序设计开发语言,但由于C语言学习难点较多,因此学习效果不太好。本文主要针对其中难点之一多重循环的教学,提出自己的见解和解决方法。
关键词:C语言;教学难点;多重循环
中图分类号:TP3 文献标识码:A
文章编号:1009-3044(2019)34-0153-03
C语言由于它既能直接进行面向高层的应用开发也可进行面向底层的系统开发,因此应用面广,是非常受欢迎的主流语言之一,因此很多高校在进行程序设计基础语言教学时都选择了C语言。但由于它的语法规则繁多,内容抽象,知识点多,所以存在很多知识点学生很难掌握,学习效果不太理想。本文主要针对其中的多重循环教学中的难点问题提出个人的见解和解决问题的思路。希望对同行或学习C语言的人有所启发和帮助。
1 多重循环教学中存在的问题
因为循环结构是构成结构化程序设计的基本结构之一,在实际求解问题的过程中也常常遇到,比如输入全班同学的信息,求若干个数之和,求最大公约数,排序等等,因此循环结构是一个非常重要的知识点,必须掌握。通常对于一重循环(也就是只包含一个完整循环结构的循环),只要把3个基本语句:while,dowhile和for语句的基本语法结构、流程讲清楚,然后通过典型案例加以分析、现场编程演示实现,最后再讲清楚while和dow-hile之间的区别,while语句、dowhile语句和for语句之间如何转换,用特例转换演示一编,让他们彻底弄懂。那么一重循环的知识点差不多就讲解完了,因为比较简单学生们通常都比较好掌握。不会存在很大问题,如个别有问题就单独有针对性讲解就可以了。
但是一遇到多重循环,也就是含有二重或二重以上循环的问题,学生就很容易犯糊涂了。比如:面对具体问题时,他们不知道该如何嵌套,内外层循环的次数如何控制,循环判断条件特别是内层的循环判断条件该如何设置,流程如何走等等。
2 多重循环问题的解决办法
多重循环也就是如果在一个循环体内又包含另一个完整的循环结构,则称为多重循环,也称嵌套循环。内嵌的循环中还可以继续嵌套。
通常对于学生在学习多重循环过程中遇到的难点,本人会通过选择有一定内在关联但看起来又比较简单直观的一系列案例逐层递进,循序渐进的来讲,让学生弄懂是如何由一重循环可以逐渐演变成多重循环,同时如何来实现这样的多重循环的编程。多重循环中通常重点讲解二重循环,因为二重循环弄懂了,二重以上也可用类似的思路处理。为了程序看起来简洁,案例中的循环语句均用for语句来实现。至于其他的循环语句,只需按相互之间的语法转换关系进行变换就可以了。
案例1:让学生输出一行单个的*号,目的是复习下c语言程序的基本结构及输出语句的写法,特别是换行的实现。
编程输出如图1所示的图形!
图1单%號图形
代码如下:
#include
int main0
{
printf(”*\n”);
return 0:
)
很显然在上例中就是简单的输出一个“*”号然后回车,同学们在以前学习的基础上轻易可以实现程序!然后在案例1的基础上进行变化,变化出案例2和案例3,此时代码部分都让学生自行当场完成!
案例2:让学生复习简单的多列重复输出
请输出如图2所示的图形!
********
图2单行8个连续的*号图形
现在可能学生的结果大致上会有以下2种不同的代码会出现,第一种:
#include
int main0
{
printf(”********\n”);//直接连续输出8个*
return 0:
)
第二种,结合前面讲的单层循环写出的语句
#include
int main0
{
inti:
for(i=1;i<=8;i++)
printf(”*”);
printf(”\n”);
return 0:
)
很显然第2种代码是我们在讲了单层循环后希望看到的结果,但如果出现第1种代码说明部分学生对单层循环还没掌握,此时正好再次复习强调何时使用循环语句:就是在满足一定的条件时,如果反复做某种事情就采用循环语句;上面的图形是一行输出8个*,当然既可以用字符串的形式一次性输出,但也可以把它分解为单独的8个*,每次输出一个*,则重复输出8次即可!刚好满足循环的概念。于是定义循环变量i,起点若设为1,则一共要循环8次,所以终点置为8,步长为1;在输出*完毕后还要注意输出换行符。用for语句实现就是上面的程序段。此处还可以强调i的初值不一定非要为1,而只要保证起始点的值及步长的控制使得输出的结果刚好满足题目要求即可,比如改为:i_2;i<=9;i++同样可以实现相应的功能。这样使得学生对循环次数的控制更清楚了。但通常使用1作为起点很频繁,是因为方便计数。
此处小结时可提醒同学们注意:可以把非循环的语句:printf(“********”);替换成一层循环语句:
for(i=1;i<=8;i++)
printf(”*”);
案例3:让学生实现简单的多行重复输出
请输出如图3所示的图形!
此时依然由学生写出代码,但很多同学会出现以下类似的错误,代码如下:
#include
int main0
{
inti:
for(i=1;i<=8;i++)
printf(”*”);
printf(”*);
return 0:
)
先读代码分析执行结果与案例2的结果相同,然后应着重分析他们写法上的错误:只在书写形式上让printf(''*”);和printf(”*”);处于同一层次,但在逻辑上并不属于同一个层次;因为没有用大括号将这2个语句括起来组成复合语句块一起构成for的循环体,因此for的循环体只包含输出*的语句,而不包含输出换行语句;于是实质与案例2的代码结果相同。让学生注意分清循环体的内容及包含多个语句的循环体的写法,避免以后出现类似错误。
因此对应图3的正确代码为:
#include
int main0
{
inti:
for(i=1;i<=8;i++)
{
printf(”*”);
printf(”\n”);
)
return 0:
)
当然也可以将2个输出语句合并为一个写出,写作:printf(”*\n”);上面的写法是为了后面的案例作铺垫。
到目前为止所有图形看起来都还很简单,要不就是单行,要不就是单列,所以通过一重循环就可以实现了。从这里也可以总结出单行或单列的图形也就是线性图形可以通过一重循环来实现;如果演变为一个平面图形的话呢?
案例4输出多行多列的图形
请输出如图4所示的图形!
此时不直接讲二重循环的代码,而还是先用一重循环的代码来实现;
为了直观首先将上面图4稍加变形,因为每行都含8个连续的*,即每行的内容是相同的,假设现在每行的具体内容都由一个长方形的框覆盖了,则图4变成了图5:
对于图5图形的输出,完全可以参考案例3的方法进行编程,与案例3比较,只是行数由8变成了4,“*”变成了长方形的框,所以循环变量的i的起点设为1,终点设为4,步长为l,因此可轻易写出对应的一重循环的重点代码如下(其他代码部分同上,省略):
for(i=1;i<=4;i++)
f
printf(”广———1”);//输出长方形框
printf(”\n”);
)
现再将长方形框揭开,恢复为8个*;也就是需一行连续输出8个*,刚好可以借助案例2的思路,替换printf(“□□”);为:for(i=l;i<=8;i++) printf(”*”);为另一个一重循环,但变量i已经用过,所以把i换成J;现在替换后的重点代码如下(为了突出第二重循环,专门在外面加了一对大括号):
for(i_1;i<=4;i++)
{
{
for(j=1;j<=8;j++)
printf(”*f).
}
printf(”\n”);
)
由上面代码可以显式地看出,在一个for循环体中完整的嵌套了另外一个for循环语句,已是一个两重循环了。这样让学生很轻松自然的就过渡到多重循环,并且很好定位内外层循环变量的起始点及步长等。同时通过这个题目还要提醒学生注意,一个平面图形通常需要一个两重循环来实现。再总结通常外层循环控制行数,内层循环控制列数。外层循环变量改变1次,内层循环的变量值从头至尾改变一趟等重要知识点。
如果上面不采用这种方式,而是讲完多重循环的概念和基本嵌套结构后,就直接讲解案例4,以及案例4对应的代码,学生就会感觉很难,很不好懂。
有了以上基础后,可以在此基础上继续加深,比如输出案例5等腰直角三角形的图案。
案例5:请输出图6所示的图形
分析:首先因为是一个平面图形,所以要采用两重循环.外层循环控制行数,如果行变量用i表示,一共有5行,则i从1变到5;内层循环控制列数,列变量用j来表示;现在主要分析列变量的取值范围,从1到多少?引导学生思考当前行标和当前行的总列数之间的关系。因为是等腰直角三角形,所以在对角线上行标和列标之间刚好j=i,故在此之前均有j
在以上分析的基础上画出流程图(流程图省),然后依照流程图写出二重循环核心的代码如下:
for(i=1;i<=5;i++)
{
{
for(j=1j<=ij++)
printf(”*”);
)
printf(”\n”);
)
随着学生掌握越来越熟练,此时再让他们注意外层循环的循环体中,里面的for循环体只有一个语句所以有无大括号含义完全相同,因此可以省去大括号,让代码看起来更简洁。改后代码如下:
for(i=1;i<=5;i++)
{
for(j=1;j<=ij++)
printf(”*”);
printf(”\n”);
)
)
在案例5的基础上,可以让学生自己思考如何编程实现九九乘法表和杨辉三角形的输出,只在重点地方稍加提醒即可。此外还要讲一些典型的数学上的问题,比如判断某个范围内有哪些数是素数并全部输出等这些问题,这里就不再详述。
3 结束语
总之,讲解多重循环根据本人多年的教学經验感觉这种选定特殊案例循序渐进的方式会让学生学起来很容易上手,并且畏难情绪很少,学习效果更好。当然循序渐进的案例每个老师可以结合自己的经验和学生的实际情况去进行设计,只要是有助于改善他们学习效果的就可以。
参考文献:
[1]谭浩强.C程序设计教程(第3版)[M].北京:清华大学出版社.2018.
[2]张莉.C程序设计案例教程(第3版)[M].北京:清华大学出版社.2019.
[3]厉兰洁,廖雪花,谭良,等.基于SPOC的C语言程序设计课程教学改革研究[J].计算机教育,2016(1):74-76.
【通联编辑:张薇】
收稿日期:2019-08-25
作者简介:裴大容(1974-),女,湖北荆州人,硕士研究生,讲师,研究方向为图像处理、数据挖掘等。