夏芸
摘要:C语言程序设计是计算机专业的专业课程,一般是学生所接触的第一门程序设计课程,所以这门课程的实验教学尤为重要。文中主要是探讨结构体实验教学的设计,通过这种设计方案帮助学生掌握结构体的基本知识,能够使用结构体数组和链表解决问题。教学实践证明此种教学设计方案在一定程度上激发了学生的学习热情。
关键词:C语言;程序设计;教学;结构体;实验
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2015)09-0163-02
Abstract: C language programming is a profession course in the computer special field of study, and it is usually the first programming course to the students. So the experiment teaching of the course is too important. It mainly discusses the teaching design of structures in this paper, which can help the students to grasp the basic knowledge about structures, and can solve problems by using arrays of structure and linked lists. It proves that the teaching design can stimulate the students study interest.
Key words:C language; programming; teaching; structure; experiment
《C语言程序设计》这门课一般是计算机专业学生入学时所接触到的第一门程序设计课程,这门课程需要学生掌握程序设计的方法,用C语言编程解决问题。在现实问题求解时,往往用简单数据类型描述问题对象时可能不是很方便和准确,例如,描述职工信息这样不同类型的数据组合时,这时就需要定义一种构造类型的数据结构来描述,这就是结构体。而且,本文认为结构体是实现了数据的封装,在一定程度上体现了封装的特性,对后续课程的教学有一定的启发性。所以,结构体教学是C语言程序设计的一个重要的部分,同样,在实验课教学中结构体的实验教学也是重要的一个环节,特别是链表方面的实验教学对后续课程,如《数据结构》起着基础性的作用。本文主要是对结构体的实验教学的设计进行探讨。
1 结构体实验教学的设计
结构体实验教学在教学时设计了3个实验题目,这三个实验题目的难度由易到难,试图让学生掌握结构体变量、结构体数组和链表的使用。
1.1 结构体变量的实验设计
结构体变量的实验属于结构体实验中比较简单的实验,这个实验就是让学生练习如何根据实际问题,用结构体定义自己所需的类型,再使用这种类型定义变量,编写程序去解决问题。
在实验教学中,教师要求学生解决如下的问题:要求用户输入三个点的坐标,编程判断这三个点是否可以构成一个三角形,如果可以则输出三角形的类型,即直角三角形、锐角三角形或者钝角三角形。这个题目在实验课上是以程序填空题的形式提供,这样既可以引导学生初次使用结构体进行编程,在填写缺失的代码过程中,锻炼学生的程序阅读能力。在题目设计中尽可能的考察学生以前的所学知识点,比如,函数形参、函数调用、选择结构编程等等。
这个程序填空题首先要求完成图1中所示的点的结构体的设计,从而让学生掌握如何根据实际需要来定义结构体这种类型。再要求学生完成图1中input函数和len函数的填写,让学生掌握如何使用结构体变量的成员分量,并注意函数的类型;judgeexist函数用于判断三个点能否构成三角形,在这个函数中强调逻辑运算符的使用,同时让学生注意函数的返回值类型,强调C语言的数据类型没有逻辑型,若想表示真假这样的逻辑型值可以用1和0这样的数值型数据来表示。
图2中的qcos函数在设计填空时主要考察的是指针的使用,让学生加深指针作为函数形参传递的是地址值这一个概念的理解。这个函数在编写时并不是很难,就是三角形余弦函数的使用,关键在于形参变量中指
针变量的引用,即诸如*cosA的赋值。而图2中judgetype函数就是依据三个角的余弦值来判断三角形是直角三角形、锐角三角形,还是钝角三角形。这个函数在设计填空时,主要是考察学生关系运算符的使用,以及嵌套的选择if语句的理解和应用。图3中主函数的设计填空主要是考察学生是否了解上述用户自定义函数的功能,并通过填写函数调用语句能正确的使用这些函数,此外,还考察了switch多分支语句的使用。
这个题目总体来说设计的并不是很难,当学生完成程序填空后,要求学生必须完成4种情况,即无法构成三角形、构成直角三角形、锐角三角形和钝角三角形的数据测试,通过输出的结果与预期结果作比较,从而检查程序是否编写正确。
1.2 结构体数组的实验设计
结构体数组的实验在结构体实验中是中等难度的实验,这个实验题目的设计主要是让学生掌握结构体数组的定义,让学生了解结构体数组元素的访问和其他基本数据类型的数组元素访问是类似的,如若要访问某个数组元素的成员分量时,需要在结构体数组元素后加上“.成员分量名”。
在实验课时,布置了如下的实验题目:输入职工的职工号、姓名、工资和出生年、月、日,按职工工资由高到低输出职工的职工号、姓名和周岁年龄。注意:输入“#”表示输入结束,假设最多只处理200个职工记录。此题在定义职工信息这种数据类型时,涉及到了出生年、月、日这种日期类型,而C语言的基本类型中没有这种类型,因此,教师可以引导学生先写出如图4(a)所示的日期类型struct date,再引导学生思考职工类型如何定义,提示学生职工信息包含出生日期这样的日期型数据,建议定义出如图4(b)所示的职工信息类型struct zg。一般地,学生会依据题目要求定义出struct zg的数组,其数组的大小为200。这个题目之所以这样设计就是希望通过这个练习让学生了解结构体类型中的成员分量没有具体类型要求,完全根据需要而设。
此题的另一个设计要点是排序算法在结构体数组中的应用,在课堂练习时,有的学生使用的是冒泡排序法,有的则使用选择排序法,但是在交换两个struct zg的数组元素时,有部分学生会注意交换结构体数组元素的成员分量,那么这时就需要声明交换结构体数组元素和交换整型数组元素的方法类似,将结构体数组元素看作一个整体。这个设计要点在于复习数组章节中所提到的排序算法。
此题最后一个设计要点是由已知的职工出生年、月、日求出该职工的周岁年龄,此处要求学生使用计算机的系统时间计算出职工的周岁年龄。为了能成功获取计算机的系统时间,则要求学生在帮助菜单或者网上查找C中“time.h”所定义的time_t这个数据类型,让学生了解typedef的用法;了解函数time()和localtime的用法,并能在程序中正确的使用;了解结构体struct tm,掌握该结构体中关于年、月、日表示的成员分量,让学生特别注意每个成员分量所表示的意义及其取值的范围,例如,成员分量tm_year表示的是年份,但是它的取值是从1900开始的一个整数,若想正确获得当前的年份值,应该是tm_year+1900。当学生能正确地完成获取系统时间的年、月、日的程序代码设计后,引导学生思考如何计算周岁年龄,实际上就是用if嵌套语句完成多分支结构的设计。这个设计要点是希望学生了解C程序设计过程中可能会出现书本上所未介绍过的知识,这就需要学生通过其他方式,例如查阅工具书或者上网等手段来获取所需的知识,同时,也复习了多分支结构的程序设计。
此外,在编程时要求学生尽量不要程序中只有一个main()函数,要尽量根据需要编写用户自定义函数。
1.3 链表的实验设计
链表实验的题目主要是让学生熟悉结构体与指针相结合,对链表有个初步认识,了解链表中的一些操作。题目与1.2中结构体数组的题目非常类似,但是要求必须用链表来完成,从而让学生熟悉链表这种结构。实验题目是:输入学生的学号、姓名和年龄,要求按学号由小到大输出学生的学号、姓名和年龄,要求输入“#”表示输入结束。这个题目解决的方法很多,因为学生初次接触链表,因此实验教学时没有提出任何方法的限制,只是要求学生用单链表求解,在求解过程中要求学生注意链表的创建算法,链表的输出算法,以及链表修改结点指针的一些操作。
首先,教师要引导学生正确的完成链表结点的定义,即指针与结构体相结合,学生信息结点的定义可以如图5所示。在求解问题时,需要学生注意结点指针的操作。实验课上,有的学生在输入学生信息时,即建链表时采用插入排序的思想,将待插入的学生信息的结点插入到已建好的且有序的链表中,用这种方法创建链表后,链表本身就是有序的,那么只需用循环结构输出链表就可以完成问题的求解。在实验课上,会发现有的学生有了这个想法但是算法编写有问题,教师在指导的过程中可以建议学生在建链表过程中,每插入一个结点后就完成当前链表的输出,从而有助于发现算法设计出错之处。
在实验课上,有的学生则先是创建链表,即将学生信息结点按输入的顺序插入到链表中,此时链表中的学生信息结点是无序的,再采用冒泡排序法或者选择排序法对链表中的结点调整顺序,最后编写循环完成链表输出。在调整结点时有的学生会出现算法思路不够清晰,有点混乱这种现象,这时教师可以建议学生在草稿纸画出链表结点的调整草图,再依据图示编写代码。在实验课上,有的学生采用排序算法调整结点时直接交换图5所示结点的no、name和age值,这种方法很便捷,但是达不到链表练习的目的,因此,教师可以鼓励学生再换一种算法。
2 结束语
本文给出了结构体实验教学的三个实验题目,这三个题目有各自的重点,而且题目有程序填空,也有程序设计,让学生由浅入深地逐步掌握结构体的定义,使用结构体变量和数组编程求解实际问题。并且实验题目中有的内容是对课本上的知识进行一定的扩展,力图培养学生的自学能力,因为在实际解决问题时,有的知识可能是课堂上没有提到的,因此,学生要学会查阅资料进行自学。
参考文献:
[1] 胡明, 王红梅. 程序设计基础——从问题到程序[M]. 北京: 清华大学出版社, 2011.
[2] 孙燮华. C程序设计导引实验与习题解答[M]. 北京: 清华大学出版社, 2011.
[3] 罗永龙, 方群. C语言程序设计[M]. 北京: 科学出版社, 2013.
[4] 罗永龙, 方群. C语言程序设计辅导及实验指导书[M]. 北京: 科学出版社, 2013.
[5] 蒋小莺. C语言程序设计课程教学方法实践[J]. 电脑知识与技术, 2014, 10(7): 1467-1468.