
摘? 要: 計算機程序設計課程教學內容應符合新時代的需要, 面向行業培養學生的創新意識和創業能力。 教學中應將職業及崗位所需的經驗及技巧融入到問題描述、問題分析、關鍵知識點、任務實現、程序優化、代碼閱讀這六個環節中。文章提出,教師在教學過程中,應重視編程邏輯思維的培養,注重內容的科學性與嚴密性。
關鍵詞: 程序設計; 科學性; 嚴密性; 教學方法
中圖分類號: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-),女,重慶墊江人,碩士,副教授,主要研究方向:計算機應用及相關教學。