教学的科学性体现在它必须要符合自身内在的客观规律,不能违背规律进行[5]。目前程序设计类的教学方法很多,主要分为三类:第一类是经典类,以语言本身为目标,强调知识点的学习。第二类是案例类,将知识点融入到案例中。第三类是程序设计思想与方法类,一般描述比较抽象,内容较深。项目教学法与这三类教学法有所不同,是以一个完整的企业项目为载体展开的(例如学生成绩管理系统)。项目教学法在深度和广度上达到了本科教育层次要求,在组织方式上,则按照职业任务构建和展开。和前面的三类相比,项目教学法有许多值得肯定的地方[1]。不过,在使用过程中发现,项目内容设计常常缺乏应有的科学性与严密性[2,4]。本文归纳如下,借此与同行商榷。
1值得研究的表述
例如:一杯清水和一杯盐水,交换两个杯子中的液体。交换两个杯子中的液体,一般需要借助一个空杯子。解决问题的步骤如下:⑴将清水杯中的水倒入空杯子中;⑵将盐水杯中的水倒入清水杯子中;⑶将空杯子中的清水倒入盐水杯中。分析:这里⑶空杯子的清水,表述不当,空杯子怎么会有清水。建议修改为“第三个杯子”。
2前后矛盾
2.1计算王晨同学三门课程的平均分
#includevoidmain(){floataverage;unsignedintc_score=82;unsignedintmath_score=80;unsignedintenglish_score=76;average=(c_score+math_score+english_score)/3.0;}分析:程序没有输出,与算法特性中的至少一个输出矛盾。
2.2选择排序算法
基本思想:升序(或降序)排序过程,第1趟,在待排序记录r[1]~r[n]中选出最小(或最大)的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小(或最大)的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小(或最大)的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。初始序列:{49276597761238}第1趟:12与49交换:12{276597764938}第2趟:27不动:1227{6597764938}第3趟:65与38交换:122738{97766549}第4趟:97与49交换:12273849{977665}第5趟:76与65交换:1227384965{9776}第6趟:97与76交换:12273849657697完成。分析:根据选择排序算法思想,应修改第3、4、5趟为:第3趟:65与38交换:122738{97764965}第4趟:97与49交换:12273849{766597}第5趟:76与65交换:1227384965{7697}
2.3冒泡排序算法
假设待排序存放在数组r[n]中,升序(或降序)排序过程为,第一趟,将第一个数据和第二个数据进行比较,若r[1]>r[2](或r[1]stu_score[j]){temp=stu_score[j];stu_score[j]=stu_score[i];stu_score[i]=temp;}}}//冒泡排序算法结束for(i=0;i<7;i++)//输出排好序的数据printf("%dn",stu_score[i]);分析:该程序主要代码思想为选择法排序。冒泡排序主要代码应修改为:for(i=1;i<6;i++)//冒泡排序算法开始{for(j=0;j<6-i;j++)if(stu_score[j]>stu_score[j+1]){temp=stu_score[j];stu_score[j]=stu_score[j+1];stu_score[j+1]=temp;}}
3程序代码与功能需求不一致
例如:在学生成绩管理系统中,学生的信息包括学号、姓名、性别、C成绩、高数成绩、英语成绩、Java成绩,将某位男生高于60分的考试成绩按照两个一组输出。输出的主要代码如下:if(count%3==0){printf("n");}分析:这里的if(count%3==0){printf("n");},功能是按照三个一组输出,与题意两个一组输出明显不一致。
4流程图不完整及表达有误
例如:读下面switch语句的程序段,画出其程序流程图,并说明其执行过程。intx,y,z=97;scanf(“%d%d”,&x,&y);switch(x+y){case10:case20:printf(“%c”,z);break;case25:printf(“%d”,z);break;case30:printf(“%c”,z+5);}画出的程序流程图如图1所示。分析:根据程序代码x+y的值为10和20执行相同的代码,并不是值为10时什么也不做,分支完应是一个出口。图1switch分支流程案例图修改后如图2所示。
5实现功能有误
阅读下面的程序,写出输出结果。#includevoidmain(){inti,j;for(i=1;i<=3;i++){for(j=1;j<=4;j++){if(i==j)printf(“i*j=%dn”,i*j);}}}故最终的输出结果为:1*1=12*2=43*3=9分析:要使结果如上的显示,则程序中的if语句修改为:if(i==j)printf(“%d*%d=%dn”,i*j)。学生成绩管理系统中,经常需要查找某个学生信息,而最准确的查找条件就是使用学号。也就是说,根据输入的学生学号,查找该学生是否在系统中。查找的学生学号代码主要如下:if(strcmp(stu_nos[i],sno)){break;}//如找到查找的学号,终止循环else{i++;}//没有找到,则对比下一个分析:字符串比较函数strcmp,按照ASCII码顺序比较字符串1和字符串2的大小。如果字符串1和字符串2相同则结果为0;字符串1大于字符串2时结果为正数;字符串1小于字符串2时结果为负数。故if(strcmp(stu_nos[i],sno)){break;}else{i++;}应修改为:if(strcmp(stu_nos[i],sno)==0){break;}else{i++;}。
6变量初始化有误
⑴求50个学生的《C程序设计》课程考试成绩的最高分和最低分。程序中最高分和最低分的初始化代码如下:intc_scores[50],max=101,min=-1;//c_scores存分数、max最高分、min最低分分析:程序中的max=101,min=-1赋值出错,根据题意应修改为:max=-1,min=101。⑵根据Student结构体类型定义,定义具体学生“陈奕杨”变量,并初始化该生信息。【示例】第一种直接整体赋初值示例如下:structStudentst={1005,"陈奕杨",100,'F'};第二种成员变量逐一赋值示例如下:structStudentst2;st2.num=1006;st2.name="许铎”;st2.score=100;st2.gender='M';分析:第一种直接赋初值是可行的,但是第二种逐一赋值中的st2.name="许铎”是错误的,字符串赋值不能直接使用等号,可以使用输入函数scanf、gets及复制函数strcpy等方式。⑶假定学生基本情况包含学号和三门科目成绩,编写自定义函数myinit()实现求某学生信息的初始化,并将该生信息和平均成绩输出到屏幕上。代码如下:#defineN3structstuInfo{longnum;charname[10];floatscore[N];}voidmycompute(longintnum,chara[],float*p){inti;floatsum,avg;printf("学号:%ld,",num);printf("姓名:%s",a);for(i=0;i
7结束语
众所周知,教学内容的选用对学习效果有非常重要的影响,是我们开展教学的重要环节,在该环节万万不可忽视科学性与严密性[3]。本文的探讨若有不妥,谨望同行专家及读者不吝指正。
《在程序设计课程中教学的科学性和严密性研究》来源:《计算机时代》,作者:傅荣会