C语言教学中综合案例的设计.docx
- 文档编号:24294615
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:16
- 大小:74.12KB
C语言教学中综合案例的设计.docx
《C语言教学中综合案例的设计.docx》由会员分享,可在线阅读,更多相关《C语言教学中综合案例的设计.docx(16页珍藏版)》请在冰豆网上搜索。
C语言教学中综合案例的设计
C语言教学中综合案例的设计
作者:
***指导老师:
蔡庆华***
摘要:
C语言是理工科大学生应该掌握的一门计算机基础语言,学习该课程旨在使学生掌握C语言的基本语法。
本文从C语言的教学出发,首先结合综合案例的设计要求、思想、方法来说明案例的设计理念,然后采用“成绩排名”这个综合案例进行详细的分析与介绍,最终达到预期效果,有效提高C语言的教学质量和学生的学习兴趣。
关键词:
C语言,综合案例,案例教学,教学模式,成绩排名
1引言
在C语言教学中使用案例教学,通过案例教学法的应用可以实现启发式教学,深刻理解编程思想。
案例是由一个或几个问题组成内容完整、情节具体详细、具有一定代表性的典型事例,代表着某一类事物或现象的本质属性。
案例教学与传统的C语言教学模式不同,在传统的教学模式中,通常以语言的语法系统为主线,往往只对一两个语法要点进行有针对性的练习,缺少培养学生编程能力方面的知识,这种教学模式能较好地保证所讲授知识的系统性,但知识枯燥,导致学生学习的积极性不高,教学效果较差,同时在培养学生的应用能力和创新思维方面也暴露出许多弊端,不能充分发挥学生的学习自主性
。
而案例教学是一种互动式的教学方法,以对案例的分析解决为主线,教学内容围绕案例的讨论、分析逐步展开,通过对案例中的问题进行分析,激发学生的求知欲,调动学生的积极性,使学生主动思考,掌握其原理和方法,教师适时引导和评测,让学生充分讨论并发表各自的见解,最后推出导论
。
在C语言教学中系统使用综合案例设计,将抽象的概念、枯燥的语法、繁多的算法,化为一个个具体生动的实例,更好的激发学生的学习兴趣和参与的积极性,能够让学生进行实际演练,在编程的过程中进行学习。
既可以从自己或他人的正确决策和选择中获取知识,又可以从承受的错误中学习
。
加深学生对该知识点的理解,近而更好的掌握每个知识点的全部功能或各种用法,并运用知识解决软件开发中的实际问题,提高编程水平和能力,加强对C语言的理论知识运用和解决综合问题的能力。
有利于培养学生的应用能力和创新思维能力。
案例教学法的还提高学生学习的主动性,变被动学习为主动学习,加强师生间的互动交流,使学生积极参与到课堂讨论中,教学效果明显提高。
2C语言教学综合案例的设计
2.1C语言综合案例设计要求
在C语言综合案例的设计时提出以下几点要求;
(1)对学生能力的要求。
综合案例首先是建立在一定基础上的实例,是书本上各种知识点的综合,所以学生应该对书本上的基础知识有一定的掌握和理解。
对课本上的知识不仅需要掌握其中的各种语法和编程思想,还要知道怎样简化编程计算和错误处理。
比如计算一个数字的阶乘,需要在计算函数中使用递归来计算,对于10以内的整型数字递归计算阶乘对计算机的要求不是很高,但是对于10以后的稍大点的数计算机就有点显得力不从心了。
如何来简化计算呢?
这是应该要考虑的问题,也是对综合案例设计的一个思考。
其次是指在案例中贯穿编程风格的训练。
编程风格并不是可有可无的东西,它是编程内容中不可或缺的一部分,它反映了一个人的思维品质。
编程风格的训练应该从一开始就加以重视,并贯穿整个编程的始终。
(2)对综合案例的要求。
案例首先要体现知识的综合性,即对各种知识的综合运用。
案例设计所设计的案例应尽量覆盖C语言的主要语言要素,要做到全面覆盖是比较困难的,而且同一个案例也有不同的解决方法。
此案例教学法中的案例尽可能的综合C语言的所有基础知识点,使学生能够熟练掌握C语言的基本语法,以及其中书本中一些例题的编程思想。
即使是在学习C语言的时候,其中的算法及其程序比较抽象,学生对调试过程及运行机制难以理解,对其过程的想象更加困难,但将知识点设计成案例对其进行综合运用,学生就能很快地掌握并尝试去应用,让学生对基础知识做到活学活用。
其次综合案例要有一定的规模和难易程度,即适应性。
案例的适用性首先是指提供的编程案例的大小和难度要适中。
难度和规模太小,难以丰富编程内容,就与一般的小练习没什么两样,达不到应有的效果
;难度和规模太大,又会超出学生的实际知识水平与能力,使学生产生挫败感,同样影响综合案例的设计效果。
另外,C语言的基本要素是函数,具有丰富的库函数又是C语言的特点之一。
因此,在运用案例设计的时候,应该尽量多介绍常用的库函数,为优化教学奠定基础
。
一般而言,具有图形界面的问题较能引起学生的兴趣。
如果能有一个基于C语言、简单易学的图形界面编程框架,是最理想的。
但目前在Windows平台上,学习设计一个具有图形界面的程序,涉及许多操作系统相关的知识,需要较长的学习曲线。
因此,案例的设计要以字符格式的输入输出形式为主,而在可能的情况下,应力争建立易于使用的图形界面编程框架。
同时,应建立案例库,实现资源共享,以提高案例设计的实效性
。
最后,综合案例也要体现一定的实用性。
尽量联系到现实生活当中的实际问题,这会在很大一部分层面上会提高学生的学习兴趣,这对学生的学习爱好的培养是很重要的。
2.2C语言综合案例设计思想和方法
前面提到,综合案例要体现知识的综合性,适应性和实用性。
当拿到一个综合案例时,首先需要认清这是一个什么问题,需要实现什么功能。
其次考虑如何去实现它。
而在考虑实现的过程中需要将问题进一步细化,看具体分为几个模块来进行实现。
到实现阶段首先需要明确如何进行数据存储,然后是完成各功能的函数实现,最后进行各部分的细化实现代码的编写。
在这篇文章中,编写了一个关于学生成绩排名的程序(这里以10人为例,每人涉及四科成绩),分别从以下几个方面来考虑问题。
(1)学生的个人信息包括哪些?
如何存储这些信息?
一般而言学生的个人信息主要包括姓名(字符串)、学号(长整型)、成绩(浮点型)等,由于信息内容较多且类型不一,使用一个结构体来存储这些信息。
(2)如何计算学生的总成绩与平均成绩?
案例中假设每位学生拥有四科成绩,所以其总成绩可用一个for循环将四科成绩累加即可,而平均成绩只需用总成绩除以科目数。
本文用的函数方式实现。
(3)如何对学生的成绩进行排序?
排序的方法有多种,针对本例本文使用的是常用的冒泡排序方法。
当然也可以用其他的方法来实现。
在后文也介绍了其他排序方法的思想和算法。
(4)如何对每位学生的个人信息进行初始化?
为了简便起见,用一个结构体数组来定义学生的人数并在定义学生人数时就对每位学生的个人信息进行静态初始化。
将主要的问题考虑清楚后,具体的细节与实现在下面的综合案例的设计演示的时候再作分析。
3学生成绩管理综合案例设计
3.1问题描述
首先对学生的成绩进行处理,给每位学生一个学号(学生的学号按照某种规则给定,可自行设定),然后将学生成绩登记,计算总分和平均分。
在excel中处理如图1所示:
图1成绩登记
接下来,常常进行的操作是按照平均分对学生的成绩进行排序以得到比较直观的统计效果。
降序的排序结果图2所示:
图2降序排序的结果
不难发现,进行降序排列的时候,学生的学号、姓名都随着平均分一起变化排列的,这就要涉及数据进行处理。
3.2案例分析
在此案例中将学生的学号、姓名、学科成绩等信息存储在一个结构体当中,并用一个结构体数组来表示学生的人数。
在函数调用中将结构体指针变量作为函数实参进行参数传递以计算学生的总分和平均分,然后运用函数嵌套调用另外一个函数对学生的成绩进行排序,最后返回输出排序后的结果。
下面进行具体分析介绍。
3.2.1学生信息的处理
学生的学号、姓名和学科成绩属于不同数据类型的数据,将不同数据类型的数据保存起来,就要涉及结构体。
排序后的新的每个元素(每位学生的信息)都是随着平均成绩的顺序改变而改变,所以这里自然想到用一个单独的类型即student类型来抽象化,这样在处理按平均分排序时就可以按平均分字段来排序。
整体处理。
结构体的定义和初始化方法如下:
structstudent//定义数据类型,用以保存每个学生的分数基本信息
{
longnum;//保存学号
charname[20];//保存学生姓名
intscore[4];//保存学生的各科成绩
intsum;//保存每个学生的总成绩
};
这里主要是以分号结束。
通过定义的结构体类型student来定义结构体变量,系统为结构体变量分配存储单元,将数据存放在结构体变量单元中。
在定义完这个结构体之后定义一个结构体数组stu[10]来表示十位学生。
数组是有序数据的集合,十位学生中每一个元素都属于同一个数据类型,用stu作为统一数组名和下标10来唯一地确定数组中的元素为十位学生。
注意,不允许对数组的大小作动态定义,数组的下标是从0开始的,即此定义stu[10]中不存在数组元素stu[10]。
在对数组定义时同时进行初始化,这里是对数组元素赋予初值,在赋予初值时要将初值依次放在一对花括号内。
这里对全部数组元素赋予初值,由于数据的个数已经确定,因此也可以不指定数组的长度。
定义形式如下:
structstudent
{
...
}stu[10]={{1001,”Sata”,98,87,93,88},
...};
由于四科成绩是以数组的形式表示,所以在进行初始化时要特别注意各科目成绩输入的先后顺序,虽然对总成绩与平均成绩不会有影响,但是不便于学生查看自己对应科目的成绩。
3.2.2平均分的计算
这里计算学生的平均分用到函数的方法,C语言中函数的应用就是为了将代码进行模块化设计,使程序更加容易阅读。
在程序开发中,常将一些常用的功能模块编写成函数,放在公共函数库中供大家选用,以便于减少设计人员编写程序段的工作量。
函数的定义时是分别进行的,且函数之间是相互独立的。
结构体作为参数传递给函数的几种方法及说明如下表所示。
案例借用结构体数组名stu作为实参,调用打印学生信息函数print(structstudent*p,intm),在这个函数中用结构体指针先计算得到总分和平均分。
将平均分保存在数组stud[10]里,便于比较排序后学生的成绩数据,以平均分为比较标准输出排序后的学生、姓名等信息。
参数
说明
结构体变量的成员
与普通变量做参数传值方式一样
结构体变量
这是一种多值传输,需要对整个做一份拷贝,效率低
结构体指针
结构指针变量也必须要先赋值后才能使用
结构体数组名
和数组之间参数传递类似,但是要说明为struct型
表1结构体作为参数传递给函数的方法
这里用到了指针,下面对这里用到的指针进行介绍。
指针是C语言中一个重要的概念,也是C语言的一个重要特色。
灵活地运用可以有效地表示复杂的数据结构,能动态分配内存,方便地使用字符串等。
指针的运用可以使程序简洁、紧凑、高效。
如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元,其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。
所以指针是一个地址,而指针变量是存放地址的变量。
这里使用的是结构体指针形式,作为函数参数指针有float*iStu和structstudent*p,结构体数组名就是结构体的首地址,正如一个简单数组的数组名就是它的首地址一样。
数组名可作为函数的实参。
指针作为实参与形参之间的参数传递有如下表所示的形式,这里用到的是结构体指针的形式。
说明
实参
形参
在一维数组中用指向数组元素的指针变量作函数参数
a[10],*p;p=a;
f(p,10);
f(int*x,intn)
二维数组中使用指针变量作函数参数
score[3][4];
search(socre,2);
search(float(*p)[4],intn)
指向字符串的指针变量作函数参数
char*a,*b;
cstr(a,b);
cstr(char*from,char*to);
指向函数的指针变量作为函数参数
result(a,b,add)
result(floatx,floaty,
float(*pf)(float,float))
指向结构体变量的指针做函数参数
structstudentstu;
print(structstudent*);
print(&stu);
print(structstudent*p)
表2指针作为参数的各种表现形式
这里在函数中用到了以结构体指针作为参数的方法实现参数传递。
函数的之间的参数传递形式有很多,但在参数的传递过程中,遵循的是单向值传送规则,使函数只有一个入口——实参传值给形参,一个出口——函数返回值。
因而函数受外界的影响最小,从而保证了函数的独立性,便于模块化的程序设计。
值得注意的是,实参可以为形参传送数据,是单向的,即在函数调用时实参的值可以影响形参,但形参值改变后不能影响实参。
也可以使用其他的方式,如print(structstudentstu1[],intm)作为形参的函数。
由于学生的成绩也是用数组存放的,所以在函数中需要使用for循环来累加计算总成绩,如p->score[i]。
同时在这个函数中,将计算得到的平均成绩用另一个单独的float类型的一维数组来进行存储,以便于下一步的排序处理。
而该数组的下标必须严格与表示学生人数的结构体数组下标保持一致,以免造成排序名次错误。
3.2.3成绩的排序
完成学生成绩的排序就涉及排序问题,冒泡排序法是排序方法中一种经典的排序策略。
下面介绍冒泡排序的思想及其他的排序方法。
(1)冒泡排序的思想介绍如下:
任意给定几个数,排列如下:
57364。
冒泡排序的做法就是:
先进行第一轮排序,将第一个数字(这里是5)与第二个数字(这里是7)比较,如果第一个数字小,就保持位置不变,留在第一个位置,如果第一个数学大,那么它将与第二个数字交换顺序,很显然,这里的5小,位置保持不变。
然后将第一个数字与第三数字进行比较,如果第一个数字小,就保持位置不变,留在第一个位置,如果第一个数学大,那么它将与第三个数字交换顺序,这里的3小,所以3就交换到了第一个位置,然后将3与第四个数字进行比较。
依次类推,当比较到最后一个数时,就可以得到最小的数字留在第一个位置上,接下来进行第二轮的排序,就是从第二个数开始按照第一轮的比较方法一样进行再排序。
这样,每轮下来都能得到第一个数字是最小的,它就像泡泡一样冒出来,此种排序方法因此而得名。
案例中运用冒泡排序代码如下:
floatsort(float*iStu,intnStudent)
{
inti,j;
floataverage;
for(i=0;i for(j=i;j if(iStu[i] { average=iStu[i]; iStu[i]=iStu[j]; iStu[j]=average; } returnaverage; } 经过冒泡排序后,学生信息根据平均分从大到小进行排序,从而实现本案例最终效果。 (2)快速排序是对冒泡排序的一个改进。 简单介绍它的思想: 第一轮选择一个数,一般是第一个数a[0]作为中间数,比a[0]小的数字放在左边,比a[0]大的数字放在右边。 第二轮就是分别将左边和右边的数进行像第一轮那样的排序。 经过几轮下来就可以得到所需要的排列。 主要算法如下: voidquicksort(intlist[],intm,intn) { intkey,i,j,k; if(m { k=choose_pivot(m,n); swap(&list[m],&list[k]); key=list[m]; i=m+1; j=n; while(i<=j) { while((i<=n)&&(list[i]<=key)) i++; while((j>=m)&&(list[j]>key)) j--; if(i swap(&list[i],&list[j]); } //交换两个元素的位置 swap(&list[m],&list[j]); //递归地对较小的数据序列进行排序 quicksort(list,m,j-1); quicksort(list,j+1,n); } } 4实现过程 4.1实现代码 完整的程序如下,这里是上述陈述方法的实现方式。 #include"stdio.h" #defineSUM(q->score[0]+q->score[1]+q->score[2]+q->score[3]) structstudent { longnum; charname[20]; intscore[4]; intsum; }stu[10]={{1001,"Sara",98,87,93,88}, {1002,"Brown",86,81,84,90}, {1003,"Jim",80,76,90,85}, {1004,"Lucy",78,77,89,82}, {1005,"Kate",94,85,84,84}, {1006,"Lucy",90,88,86,78}, {1007,"Paul",76,68,77,90}, {1008,"Marry",83,80,88,89}, {1009,"Jack",74,71,76,84}, {1010,"Rose",88,78,86,78} };//定义一个结构体,初始化10个学生的学号、姓名和四科成绩 floatsort(float*iStu,intnStudent) { inti,j; floataverage; for(i=0;i for(j=i;j if(iStu[i] { average=iStu[i]; iStu[i]=iStu[j]; iStu[j]=average; } returnaverage; } print(structstudent*p,intm) { structstudent*q; inti,k=0,sum=0,r=0; floatave,nStu[10],stud[10]; for(q=p;q { for(i=0;i<4;i++) sum+=q->score[i]; ave=(float)sum/4; stud[r++]=nStu[k++]=ave;//平均成绩存起来 printf("%ld\t%s\t%d\t%d\t%d\t%d\t%d\t%.2f\n",q->num,q->name, q->score[0],q->score[1],q->score[2],q->score[3],sum,ave); sum=0; } printf("\n-------------------排序后-------------------\n\n"); sort(nStu,10); printf("学号\t姓名\t数学\t英语\tC语言\t体育\t总分\t平均分\n"); for(k=0;k<10;k++) { for(r=0;r<10;r++) for(q=p;q if(nStu[k]==stud[r]&&SUM==stud[r]*4) printf("%ld\t%s\t%d\t%d\t%d\t%d\t%.0f\t%.2f\n",q->num,q->name,q->score[0],q->score[1],q->score[2],q->score[3],stud[r]*4,stud[r]); } } main() { intn=10; printf("\n-------------------排序前-------------------\n\n"); printf("学号\t姓名\t数学\t英语\tC语言\t体育\t总分\t平均分\n"); print(stu,n);//输出按学号排列d的10个学生的总成绩和平均成绩 } 4.2设计结果与分析 案例设计演示的结果如图3所示: 图3案例设计结果 本设计中,对于平均成绩的处理并未将其放入学生信息存储的结构体中,而是单独使用了一个float类型的数组来进行存储,这样也能实现排序,但这样数组下标的对应就很重要,不能出错。 5小结 本文首先谈到学生在学习C语言过程中的困难,得出将综合案例的设计应用到C语言中的必要性。 然后,针对现实存在的问题谈到实例设计的要求、思想和方法,对这些设计理念进行了实例演示并做出分析,以体现实例的综合性和应用性。 将C语言的基本知识点几乎囊括在此综合案例设计的程序当中,让学生切身感受到学好理论知识是解决实际问题的必经之路,尤其是当运用自己所学的理论知识去解决实际问题时,极大地调动了学生学习的主动性和积极性。 通过本案例的设计,对综合案例的设计学习有了更进一步的了解,同时也明白熟练的将各种零散的知识综合的运用到一起的重要性,可以加深自己的理解。 当然,本文所选取的案例较为简单,涉及的面也不是特别广,在今后的学习中可以参照这种模式进行更深入的学习,将所学知识综合利用,以达到更好的学习效果。 致谢 最后感谢我的论文指导老师,感谢他在论文选题、资料收集、写作修改直至最后定稿整个过程中的殷切叮咛、真诚关心和悉心指导。 老师严谨的治学态度、孜孜不倦的言传身教,给我留下深刻的印象。 借此机会衷心感谢蔡老师的谆谆教诲和无私帮助。 参考文献 [1]雷东升.《C语言程序设计》课程案例式教学模式的探讨[J].北京工业大学,2006.11. [2]丁海燕.C语言程序设计案例教学模式的探讨[J].云南电大学报,2011.09. [3]谭浩强.C程序设计(第三版)[M].北京: 清华大学社,2005.07. [4]范劲松,黄友初.案例教学法在C语言教学中的系统应用[J].温州大学数学与信息科学学学院,2005.03. [5]郑金州.案例教学指南[M].上海: 华东师范大学出社,2000. [6]周法国.张帆.综合设计案例在C语言教学中的应用[J].中国科教创新导刊,2011NO.16. [7]蔡庆华.案例式C语言程序设计[M].高等教育出版社,2012.2.20. [8]陈倬.浅谈案例教学法在C语言教学中的应用[J].科技信息,2010.01. [9]HouRuilian,GuoAizhang.ResearchoftheTeachingModelReformofCLanguageProgram[J].2012.06. DesignofintegratedcasesofteachingClanguage Author: ***Director: *** Abstract: Clanguageisabasiccomputerlanguagethatscienceandengineeringuniversitystudentsshouldmas
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 教学 综合 案例 设计