孙瑜
摘 要 为了提高程序设计课程的教学效果,通过游戏类趣味问题驱动来引发学习兴趣,借助程序设计的知识载体,学习和掌握基本问题的求解过程和基本思路;以达到在解决问题的实践中训练和培养观察能力、分析解决问题的实践能力。
关键词 教学设计 猜数字游戏 程序设计 实践
中图分类号:G633 文献标识码:A
0序言
计算机程序设计语言课程如 C、C++语言课程,是一门受众面广、实用性强的课程。在多年的C++教学中,不乏学生们对C++编程难学、枯燥的抱怨。程序设计课程是“编”出来的,学生要花大量时间在上机实验中去编程序,仅仅在面授课中讲解是远远不够的。如何在上机实验中激发学生的兴趣,调动起学生的学习积极性,对于学好C++语言这样实践性强的课程是十分重要的。为了达到更好的学习效果,需要让学生主动学习,以学生为主体,以激发学生的兴趣为目标,强调实践和思考的教学理念。更多的是通过学生自主阅读、实验、程序编写、调试等环节达到学习目的。
1问题引入
为了循序渐进地引入教学内容,同时考虑到对不同学生进行因材施教,设计具有游戏趣味的猜数字问题,根据难易程度分为如下三个等级:
(1)问题1(用户猜测100以内随机整数):电脑随机产生一个1-100之间的随机数,让用户猜测,电脑提示用户猜大了、猜小了还是猜对了,根据提示,若没猜对,用户继续猜测下一个数字,直到猜对为止。要求猜测次数不超过10次。
(2)问题2(用户猜测电脑产生的4位整数):电脑随机产生一个各位互不重复的4位整数,请用户猜测一个数字,电脑反馈信息为xAyB,以字母A表示用户猜对了x个仅数值正确,位置不正确的数字,以字母B表示y个数值和位置都正确的数字,例如:如果系统生成的数字为2794,而玩家输入的数字为1234,则反馈信息为 2A1B。根据反馈,用户继续猜测下一个数字,如果反馈信息为4A4B则意味着玩家猜出了全部的4个数字而获胜。
(3)问题3(电脑猜测用户想的4位整数):用户想一个各位互不重复的4位整数,请电脑猜测一个数字,用户反馈信息xAyB,以字母A表示用户猜对了x个仅数值正确,位置不正确的数字,以字母B表示y个数值和位置都正确的数字,例如:如果系统生成的数字为2794,而玩家输入的数字为1234,则反馈信息为 2A1B。根据反馈,电脑继续猜测下一个数字,如果反馈信息为4A4B则意味着电脑猜出了全部的4个数字而获胜。要求电脑猜测的次数不超过10次。
2教学设计
为了达到更好的教学效果,让学生参与学习、主动学习,增强学习兴趣,对不同难度的问题,进行不同的教学过程设计。
问题1:提出问题,程序演示,分析问题,任务分解,流程设计,代码设计,代码调试。
问题2:提出问题,程序演示,分析问题,课下自行代码编写,代码调试。
问题3:提出问题,程序演示,关键任务思路分析,数据结构设计,课下代码编写、调试。
2.1 问题分析
2.1.1问题1的任务分解
任务1.1 产生一个100以内的随机数;任务1.2 用户猜测一个数字; 任务1.3 判断猜测的正确性,并给出提示;任务1.4 若没猜对,继续转任务12。若猜对了,或者猜测次数超过10次,结束程序。
2.1.2问题2的任务分解
任务2.1 产生一个无重复四位数;任务2.2 用户猜测一个数字;
任务2.3 分析猜测结果,给出提示;进一步细分难点任务。
任务2.3.1 将四位数的各位分离,分别分离产生的答案数字和用户猜测数字的各位数字;
任务2.3.2 比较答案和猜测的数字,得出猜测结果xAyB;
任务2.4 若猜测正确或猜测次数>10,结束猜测;否则,转任务22;任务2.5 输出猜测结果。
2.1.3问题3的任务分解
任务3.1 用户默想一个无重复四位数;任务3.2 程序产生一个候选猜测数字;任务3.3 用户输入猜测数字的正确数字和位置xAyB;任务3.4 根据猜测结果,过滤排除候选数字;
任务3.5 若猜测正确或猜测次数>10,结束猜测;否则,转任务3.2。
3.2 教学内容与案例目标的分解
结合案例分析,循序渐进地教学设计,教学内容与案例任务结合如下:
3.2.1教学内容
(1)选择结构:任务1.3 判断猜测的正确性;
(2)循环结构:任务1.4 继续猜测,直至猜对;任务2.4 重复猜测直至 猜对,或者猜测次数>10;
(3)函数:任务2.1 产生一个无重复四位数;任务2.3 分析猜测结果,得出xAyB;任务3.2 产生下一个猜测数字;任务3.4 过滤排除候选数字;
(4)数组:任务2.3.1将四位数的各位分离;利用二维数组进行数据结构设计;
(5)指针、STL::list:利用链表、list进行数据结构设计。
3.3 流程设计
3.3.1问题1 的流程设计
step1. 初始化,产生一个1-100之间的随机数;
step2. 判断猜测正确或猜测次数>10,若是转step5.
step3. 用户输入猜测数字;
step4. 分析猜测结果,并反馈;猜测次数增1,返回step2.
step5. 输出猜测结果。
3.3.2问题2 的流程设计
step1. 初始化,产生一个无重复四位数myRand(); 分离各位数字separate();
step2. 判断猜测正确或猜测次数>10,若是转step5.
step3. 用户输入猜测数字;
step4. 分离并分析猜测结果,并反馈;猜测次数增1,返回step2.
step5. 输出猜测结果。
3.3.3问题3的设计与分析
(1)数据结构设计。
方案一: 定义二维数组tree[4540][6],存放格式:{1, 2, 3,4, 1234, 0} ,最后分量取值为0表示尚未排除,取值为-1表示已排除,取值>0表示很可能候选。
方案二:定义链表决策树tree,存放所有候选4位数字,若排除某个候选数字,则删除此结点,最后直至剩下1个或0个。
方案三:利用STL的list定义主数据结构tree,可以利用STL::list提供的函数,更方便地进行数据存储和处理。
(2)主流程设计。
step1. 初始化tree。void init(){}//将所有四位不重复的数字,从小到大存放在tree中,1023 1024 … 9876。
step2. 产生一个候选数字guessNext()。取下一个候选数字;返回值-1表示没有答案;
step3. 用户输入猜测数字的正确数字和位置xAyB;
step4. 将所有tree中候选数字逐一比较是否满足xAyB,不满足则排除掉;void filter(int n){ }
step5. 转step2.
4 代码设计与调试
问题1可以根据教学内容在课堂上进行代码的逐步完善,并演示基本的代码调试技巧。对于问题2在课堂上进行主流程分析后,编写代码框架,让学生在课下进行代码的具体编写和调试。
问题2的程序主框架
int myRand(){//产生一个四位数,各位数字互不重复
/*产生1-9之间的随机数a;产生0-9之间的随机数b、c、d,且abcd均互不相同。*/
res=a*1000+b*100+c*10+d; return res; }
void seperate(int num,int ans[]){//将一个四位数各位分离,存放在数组中
//将4位数num,分离出千、百、十、个位,存放在ans[0]、ans[1]、ans[2]、ans[3]中。}
void compare(int guess[], int answer[], int & digit, int& location){
//比较guess与answer,猜对了digit个数字,猜对了location个位置 略}
int main(){
int guess=0,guessDigits[4]={0},guessTimes=0; //数据结构定义
int answer=1234,answerDigits[4]={0}; int digitOK=0,locationOK=0; int i=0,j=0;
answer=myRand();//产生一个四位数
seperate(answer,answerDigits);//将答案各位数分离
while(digitOK<=4 && locationOK<4 &&guessTimes<10){ //开始猜测
guessTimes++;
cout< cin>>guess;//输入用户猜测 seperate(guess,guessDigits); //将猜测各位数分离 compare(guessBits,answerDigits,digitOK,locationOK);//判断猜测结果 cout<<"\b "< if(guessTimes>=10 &&locationOK<4)//输出猜测结果 cout<<"Guess more than 10 times,you lose the game.\n"; else{cout<<"you win the game.\n"; } return 0; } 利用STL::list方案进行问题3的思路设计,提供一个思路,让学生自行实现程序。 list int guessed[11][3]={{0}};//存放所有猜测过的数字与反馈结果 void init(){//初始化决策树,分别存放1023,1024,…,9875,存放格式为1 0 2 3 1023 0(-1或1) //略 tree.empty(); i=tree.begin(); //略 tree.push_back(n); i++; //略 } //产生下一个猜测数字,n表示猜测次数 int guessNext(int n){ int res=1234; list if(n==1) return res; i=tree.begin(); if(!tree.empty()){//取出候选数字} else{cout<<"you are cheating.\n"; res=-1;}
return res; }
bool compare(int ans,int gue,int x,int y){ //判断gue与ans的反馈信息是否符合xAyB
/*分离ans和gue的各位数字; 判断数字正确个数是否为x个;判断数字和位置均正确个数是否为y个*/ }
//根据猜测结果,筛选过滤候选数字,留下满足xAyB反馈的数字,去除不满足的候选数字。
void filter(int n){
//略
x=guessed[n][1];y=guessed[n][2];
while(i!=tree.end()){
if(compare(*i,guessed[n][0],A,B)){//符合反馈信息
i++;}
else{ //排除掉该候选数字
i=tree.erase(i); } } }
int main(){//主函数
int numOK=0,locationOK=0,guess=1234,n=0;
init();
while(guess!=-1 && locationOK<4 && n<=10){ //尚未反馈4A4B, 且猜测次数<10
guess=guessNext(n+1);
if(guess==-1)break;//没有正确数字,退出
cout<<++n<<"th guess: "< cin>>numOK>>locationOK;//存放猜测数字以及反馈信息 filter(n);//过滤排除候选数字 } return 0; } 5 结语 从教学实践情况来看,这种教学设计方式确定了课程的实施方案及操作步骤,以提高学生学习积极性和主动性为导引,能够及时获得反馈,取得了很好的教学效果。如何能更加合理地运用更好的教学方式去教学,还是有很多内容值得我们去实践和探索的。 参考文献 [1] 吴文虎.我怎么讲好“程序设计基础”这门课[J].中国大学教学,2011(12):10-12. [2] 李可.编写小型游戏程序在C++教学中的一点应用心得[J].科技资讯,2008(27):19-20. [3] 王之元,易晓东,李姗姗.面向MOOC的程序设计语言课程教学设计[J].计算机教育,2014(2):55-58. [4] 何钦铭.“程序设计基础”课程教学实施方案[J].中国大学教学,2010(5):62-65. [5] 刘芳.《C语言程序设计》教学存在的问题及改进[J].教育理论与实践,2012,32(36):51-52. [6] 孙慧然.“程序设计基础课”理论与实验教学的改革与实践[J].实验技术与管理,2012,29(4):299-300. [7] 教育部高等学校计算机科学与技术教学指导委员会.高等学校计算机科学与技术专业核心课程教学实施方案[M].北京:高等教育出版社,2009. [8] 谭浩强.C++程序设计(第2版)[M].北京:清华大学出版社,2013.