摘 要: 计算机程序设计课程教学内容应符合新时代的需要, 面向行业培养学生的创新意识和创业能力。 教学中应将职业及岗位所需的经验及技巧融入到问题描述、问题分析、关键知识点、任务实现、程序优化、代码阅读这六个环节中。文章提出,教师在教学过程中,应重视编程逻辑思维的培养,注重内容的科学性与严密性。
关键词: 程序设计; 科学性; 严密性; 教学方法
中图分类号:TP312;G642 文献标识码:A 文章编号:1006-8228(2021)01-89-03
Research on the scientificity and strictness of teaching in programming courses
Fu Ronghui
(College of Computer Science, Neijiang Normal University, Neijiang, Sichuan 641100, China)
Abstract: The teaching content of computer programming courses should meet the needs of the new era, and face the industry to cultivate students' innovative consciousness and entrepreneurial ability. In the teaching process, the experience and skills required by occupation and post should be integrated into the six links, i.e., problem description, problem analysis, key knowledge points, task realization, program optimization and code reading. This paper proposes that, in the teaching process, teachers should pay attention to the training of programming logic thinking and pay attention to the scientificity and strictness of the teaching content.
Key words: programming; scientificity; strictness; teaching method
0 引言
教學的科学性体现在它必须要符合自身内在的客观规律,不能违背规律进行[5]。目前程序设计类的教学方法很多,主要分为三类:第一类是经典类,以语言本身为目标,强调知识点的学习。第二类是案例类,将知识点融入到案例中。第三类是程序设计思想与方法类,一般描述比较抽象,内容较深。项目教学法与这三类教学法有所不同,是以一个完整的企业项目为载体展开的(例如学生成绩管理系统)。项目教学法在深度和广度上达到了本科教育层次要求,在组织方式上,则按照职业任务构建和展开。和前面的三类相比,项目教学法有许多值得肯定的地方[1]。不过,在使用过程中发现,项目内容设计常常缺乏应有的科学性与严密性[2,4]。本文归纳如下,借此与同行商榷。
1 值得研究的表述
例如:一杯清水和一杯盐水,交换两个杯子中的液体。
交换两个杯子中的液体,一般需要借助一个空杯子。解决问题的步骤如下:
⑴ 将清水杯中的水倒入空杯子中;
⑵ 将盐水杯中的水倒入清水杯子中;
⑶ 将空杯子中的清水倒入盐水杯中。
分析:这里⑶空杯子的清水,表述不当,空杯子怎么会有清水。建议修改为“第三个杯子”。
2 前后矛盾
2.1 计算王晨同学三门课程的平均分
#include
void main()
{ float average;
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]交换,使有序序列不断增长直到全部排序完毕。
初始序列:{49 27 65 97 76 12 38}
第1趟:12与49交换:12 {27 65 97 76 49 38}
第2趟:27不动 :12 27 {65 97 76 49 38}
第3趟:65与38交换:12 27 38 {97 76 65 49}
第4趟:97与49交换:12 27 38 49 {97 76 65}
第5趟:76与65交换:12 27 38 49 65 {97 76}
第6趟:97与76交换:12 27 38 49 65 76 97完成。
分析:根据选择排序算法思想,应修改第3、4、5趟为:
第3趟:65与38交换:12 27 38 {97 76 49 65}
第4趟:97与49交换:12 27 38 49 {76 65 97}
第5趟:76与65交换:12 27 38 49 65 {76 97}
2.3 冒泡排序算法
假设待排序存放在数组r[n]中,升序(或降序)排序过程为,第一趟,将第一个数据和第二个数据进行比较,若r[1]>r[2](或r[1] for(i=0; i<7; i++) //冒泡排序算法开始 { for(j=i; j<7; j++) { if(stu_score[i]>stu_score[j]) { temp=stu_score[j]; stu_score[j]=stu_score[i]; stu_score[i]=temp; }}} //冒泡排序算法结束 for(i=0; i<7; i++) //输出排好序的数据 printf("%d\n",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) { case 10: case 20:printf(“%c”, z); break; case 25:printf(“%d”,z); break; case 30:printf(“%c”, z+5); } 画出的程序流程图如图1所示。 分析:根据程序代码x+y的值为10和20执行相同的代码,并不是值为10时什么也不做,分支完应是一个出口。图1switch分支流程案例图修改后如图2所示。 5 实现功能有误 阅读下面的程序,写出输出结果。 #include void main() { int i,j; for (i=1; i<=3; i++) { for(j=1; j<=4; j++) { if (i==j) printf(“i*j=% d\n”, i*j); }}} 故最终的输出结果为: 1*1=1 2*2=4 3*3=9 分析:要使结果如上的显示,则程序中的if语句修改为:if(i==j)printf(“%d*%d=%d\n”,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结构体类型定义,定义具体学生“陈奕杨”变量,并初始化该生信息。 【示例】 第一种直接整体赋初值示例如下: struct Student st={1005,"陈奕杨",100,'F'}; 第二种成员变量逐一赋值示例如下: struct Student st2; st2.num=1006; st2.name="许铎”; st2.score=100; st2.gender='M'; 分析:第一种直接赋初值是可行的,但是第二种逐一赋值中的st2.name="许铎”是错误的,字符串赋值不能直接使用等号,可以使用输入函数scanf、gets及复制函数strcpy等方式。 ⑶ 假定学生基本情况包含学号和三门科目成绩,编写自定义函数myinit()实现求某学生信息的初始化,并将该生信息和平均成绩输出到屏幕上。 代码如下: #define N 3 structstuInfo { longnum; char name[10]; float score[N]; } voidmycompute(long intnum,char a[],float *p) { int i; floatsum,avg; printf(" 学号:%ld,",num); printf(" 姓名:%s",a); for(i=0;i { printf("%5.1f",*(p+i)); sum=sum+*(p+i); } avg=sum/N; printf(" 平均成绩:%5.1f",avg); printf("\n"); } main() { structstuInfo yang={2014106,89.5,95.0,87.5}; mycompute(yang.num,yang.name,yang.score); } 分析:函數mycompute的代码中,sum变量的作用是累加求和,故变量应该初始化0,即sum=0。根据结构体的定义及教材的运行结果图分析,main函数中对结构体初始化,也缺少对成员name的初始化,应修改为:structstuInfo yang={2014106,“陈奕杨”89.5,95.0,87.5}。 7 结束语 众所周知,教学内容的选用对学习效果有非常重要的影响,是我们开展教学的重要环节,在该环节万万不可忽视科学性与严密性[3]。本文的探讨若有不妥,谨望同行专家及读者不吝指正。 参考文献(References): [1] 王廷梅,胡正坤等.C语言程序设计[M].科学出版社,2018. [2] 周学文.关于教材习题的科学性与严密性—评《Visual Foxpro程序设计教程》的习题[J].内江师范学院学报,2003.8. [3] 王亚平,王萍.教材例题引入应重视其科学性与严密性[J].锦州医学院学报,2000.4. [4] 张希海.由一道春季高考题谈教学的严密性——对全反射及临界角定义的一点看法[J].物理教师,2001.7. [5] 如何把握教育的科学性[EB/OL].http://www.gaojunpeng.com/jiaoyu/39264.html. 收稿日期:2020-08-14 基金项目:内江师范学院一流本科专业软件工程子项目“在程序设计课程中融入创新创业教育的改革研究”(YLZY201911) 作者简介:傅荣会(1978-),女,重庆垫江人,硕士,副教授,主要研究方向:计算机应用及相关教学。