C++实践报告(精选5篇)
本科生课程设计(实践)任务书、设计报告
(C++程序设计)
题 目 学生姓名 指导教师
C++程序设计实践
* *
孙 岱
学 院 地球科学与信息物理学院 专业班级 信息物理工程类1106班 学生学号
01451106**
计算机基础教学实验中心
2012年 7 月 日
C++程序设计实践报告书
C++是一种使用非常广泛的电脑程式设计语言,在当今网络如此发达的时代能够运用C++语言进行编程显得尤为重要。它是一种静态资料类型检查的,支援多范型的通用程式设计语言。C++支援程序化程式设计、资料抽象化、面向对象程式设计、泛型程式设计、基于原则设计等多种程式设计风格。在系统学习完《C++程序设计基础》课程后,我们在老师的指导下进行了这次C++程序设计实践,主要以visual C++6.0为编译环境,重点使用了visual C++ MFC编程实现实践所要求的功能。
【任务描述】
这次实践采用了上机实践与老师集体辅导结合的方式,以完成辅导老师下发的《C++语言课程设计任务书》中指定任务与要求为目的,要求我们在已学过的《C++程序设计基础》所掌握的一些C++语言的结构和函数的基础上,以全新的角度去感知和运用C++语言进行一些具有相关目的和功能的程序设计和编译。在这次实践中,我们统一以visual C++ 6.0为编译系统,使用visual C++ MFC编程来达到和完成辅导老师给的《C++语言课程设计任务书》中给出的题目,其中部分题目以基本对话框为应用程序的框架,另一部分则设计为单文档界面(SDI)应用程序。这些程序都具有不同的设计目的和应用功能,运用了常用的基本控件,如静态文本框、命令按钮、编辑框、复选框、列表框、组合框、滚动条等。
本次实践可分为三部分:
一、基于对话框的Windows应用程序:
这部分以知识要点掌握与编程实例主辅结合的方式,让我们基本掌握了基于对话框的应用程序的创建过程,建立基于对话框的 MFC 应用程序框架,放置控件并设置控件属性,以及为控件连接变量(即为控件命名),添加并且编写消息处理函数。在这部分实践中,我按照任务书中要求按照任务书所给的实例,基本掌握了基于对话框的 MFC 应用程序中各常用的基本控件的使用。在完成对MFC编程的初步了解后,我们按《C++语言课程设计任务书》所给出的题目和要求完成了相关基于对话框的 MFC 应用程序的编译。实践完成了以下任务和要求:
1.编写一个如图所示的应用程序。若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。
2.输入一元二次方程 ax2 +bx+c=0 的系数 a、b、c,计算并输出两个根 x1、x2。
3.编写一个能对列表框进行项目添加、修改和删除操作的应用程序。
4.设计如图所示的对话框。若选定了“日期”或“时间”复选框,则在对应的只读编辑框中显示系统当前日期或时间。
5.设计如图所示的对话框。单击“确定”按钮后,在列表框中显示选择的信息。
二、文档/视图结构应用程序:
文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。在这部分实践过程中,通过对任务书中介绍的几种SDI结构的典型应用程序来了解其结构及设计方法,学习和实践了典型应用包括:利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。利用定时器控件制作动画程序。对鼠标和键盘进行编程的基本方法。文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。菜单的设计方法。
通过课程实践,以及与同学之间的讨论,我们完成了这一阶段的任务要求:
6.编写一个程序,绘制如图所示的-2π~2π 之间的 sin 曲线。
7.设计一个如图所示的画图程序。要求按下鼠标右键画圆,按住鼠标左键移动画线。(图略)
8.用定时器控制蝴蝶在窗口中飞舞,如图所示。(图略)
9.设计一个如图所示的应用程序。若用户单击左键,则弹出输入成绩对话框,选择 OK 后平均成绩和总分在窗口的客户区输出。(图略)
10.设计如图所示的菜单,并编写相应用的消息处理函数。(图略)
三、完成综合题的程序设计:
将实践过程中选择3~5题(或类似的题),做成一个综合程序,要求通过菜单调用各部分功能。可自行组织和发挥,使其安排合适。
【系统设计思想】
首先建立一个单文档结构的应用程序作为综合程序的主程序,通过对菜单的设计完成与所需调用的各个对话框功能相适应的编辑。利用对话框类资源创建自己的对话框,然后建立成与实践中3~5题相对应的对话框,并分别按要求进行相关功能的实现。然后建立对话框类CMyDlg,在调用的地方建立对话框类对象CMyDlg dlg;然后dlg.DoModal();从而实现主程序对各个对话框的调用。在主程序的单文档界面的菜单中,可以对所需功能进行选择,然后调用出不同的对话框实现所系的功能,达到设计程序通过菜单调用各部分功能的目的。
【系统功能】
设计的综合程序以一个文档类的程序界面为依托,实现其余各个部分功能的调用。对书目管理、时间显示以及教师综合信息管理者三部分进行了整合,达到了对各个部分功能之间的调用。在主界面中,我们可以对所需功能进行选择,从而到达不同的对话框界面进行不同功能的交互。当我们在菜单中选择“书目管理”时,程序自动弹出书目管理对话框,然后我们能对列表框进行项目添加、修改和删除操作等。而我们如果在主界面的菜单中选择“时间显示”,则系统会跳至另一个对话框界面,这个界面可以对当前的时间进行显示,在对话框中若选择了“日期”或者“时间”复选框,则在对应的只读编辑框中显示系统当前的日期或时间,从而实现了对系统当前时间信息的捕获。如果我们在最初的主界面菜单选择了“教师综合信息管理”,则在弹出的对话框中我们可以实现对教师姓名、性别、爱好、工龄以及职称进行选择。
【设计过程】
首先打开VC++ 6.0编译系统,因为我设计的综合程序以一个文档类的程序界面为依托,实现其余各个部分功能的调用。对书目管理、时间显示以及教师综合信息管理者三部分进行了整合,从而达到了对各个部分功能之间的调用。所以创建过程如下:
按照任务书要求设定工程名为“xw1106_0145110626“,利用 AppWizard 创建一个 SDI 应用程序框架。
在工作区中选定“ ResourceView ”,展开 Menu,双击其中的 IDR_MAINFRAME,可以看到由 AppWizard 生成的标准菜单。首先删除原有菜单项,然后添加自己所需要的菜单,添加方式为:双击空白菜单框,弹出“ Menu Item Properties ”,输入菜单项的标题(名称)。若菜单项有一个子菜单(单击会弹出了一子菜单),则选定“弹出”,否则不要选定“弹出”;要输入一条分割线,则选定“分隔符”。我将菜单栏设定为三项,分别为“菜单”、“小工具”以及“QQ”,其中菜单包含三个子选项分别为“方程求解/时间显示/书目管理”,小工具包含“复制/字符游戏”,而“QQ”则是通过进程方式实现对外部软件QQ的调用。
利用“CDialog dlg;dlg.DoModal();”来实现各个子菜单项所对应的对话框的调用,而QQ的调用是个人加进去的(不是任务要求),利用了进程方式调用外部exe程序:STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si,sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi,sizeof(pi));if(!CreateProcess(NULL, ”G:Program FilesTencentQQBinQQ.exe “,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi)){ MessageBox(”出错 “, ”提示 ",MB_OK|MB_ICONINFORMATION);} WaitForSingleObject(pi.hProcess,INFINITE);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);【运行情况】
编译链接后程序运行正常,能实现通过菜单项调出相应的对话框的目的,以一个文档类的程序界面为依托,实现其余各个部分功能的调用。对书目管理、时间显示以及教师综合信息管理者三部分进行了整合,达到了对各个部分功能之间的调用。其中点击QQ也能很快的弹出QQ登陆界面。在主程序的单文档界面的菜单中,可以对所需功能进行选择,然后调用出不同的对话框实现所系的功能,达到设计程序通过菜单调用各部分功能的目的。
【心得体会】
在为期不到两周的课程设计中,我体会颇多,学到很多东西。我懂得了如何用 MFC编写可视化界面的应用程序,我加强了对C++的认识,复习了自己以前的知识,自己的逻辑思考能力也提高不少。从而对Microsoft Visual C++ 6.0又有了更深入的认识!在这次课程设计中,我还懂得了程序开发的一些比较重要的步骤,总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大的好处。最重要的还是激发了我编程的兴趣和热情,让我从理论变成了能做一些小型程序,让我对编程更加热爱了。整体地评价这次课程设计,我认为收获很大,正如上面所说的那样,通过课程设计,既复习了以前的旧知识,又学到了一些新的知识;设计增强了我们用所学知识去解决具体问题的能力,进一步培养了我们独立思考问题和解决问题的能力。特别是学会了在Visual C++ 集成开发环境中如何调试程序的方法。当然,老师的悉心指导和同学的帮助也是不可忽视的,在此感谢本次课程设计中所有辅导老师对我的关心和帮助,诚心诚意感谢老师对我的鼓励与教导,是老师在我迷茫的时候给了我些许提示,激发了我编程的灵感;还有,我在此也十分感谢本次课程设计中同学们对我的帮助,尽管本次不是团队合作,但是他们也给了我不少的提示和帮助,我们相互沟通、共同进步。
【参考文献】
[1] 杨长兴、刘卫国.《C++程序设计》.中国铁道出版社
关键词:C++程序设计,互动式教学,启发式教学
《C++程序设计》是国内外各高校计算机专业及许多理工类院校的非计算机专业学生的必修课程。其目的是使学生掌握一门高级程序设计语言, 具备一定的编程能力, 能够独立分析问题和解决问题。作为一门实践性很强的课程, 传统的课堂讲授教学模式教学效果不佳, 《C++程序设计》课程的教学改革已经成为高校教学中讨论的热点。
1 存在的问题
1.1 大课堂教学
随着各大学的扩招, 大学生人数激增, 由于教室、师资等的限制, 很多学校采用了大课堂教学。在大课堂教学中, 学生很难始终如一地保持遵守纪律、积极发言等良好行为, 一些学生上课期间交谈、发短信甚至逃课。教师没有精力了解每个学生的学习状态, 对于学生的接受能力没有准确的定位。
1.2 学时有限
对于非计算机专业而言, 授课学时一般在40个学时左右, 实验学时为20个学时左右, 这样的学时安排对于《c++程序设计》的教学内容而言非常有限, 如果教师急于完成内容的讲授, 只能采取传统的填鸭式教学法, 学生感觉难以接受, 也失去了对这门课程的兴趣。
1.3 实践环节薄弱
课内实验的主要形式为教师布置题目, 学生在上机时自己编写程序并调试运行。实验课上, 通常是学生问题过多而教师分身乏术。学生们面对错误更多的是无奈与困扰, 只能不停地举手等待老师指点。实验课效率低, 学生调试能力差, 更有少数学生趁老师不注意上网、打游戏、看视频浪费宝贵的课堂时间。
1.4 后续学习能力弱
虽然学习了《C++程序设计》课程, 但没有了老师的讲授, 面对需要学习的新的程序设计语言仍感觉无从下手, 或者学习时间过长, 事倍功半, 其原因在于没有学会如何去学习一门程序设计语言。
2 互动教学
解决程序设计语言教学中问题的关键在于调动学生主动学习的积极性, 教会学生如何学。通过有效的师生互动来创新大课教学, 是解决当前大课教学困境的一个思路。师生互动, 关键是让学生参与到课堂教学中。因为有效的课堂互动, 较大地改变了以往那种老师教、学生记的传统形式, 加重学生主动参与的比重, 提高课堂学习的自主性, 发挥学生学习的积极性和主动性, 促进大课教学目标的实现。[1]
大课教学互动实现的主要措施为化大为小。将大课堂分为小的讨论组, 例如每班3个讨论组。为了将学生实现有效的组合, 参考学生以往的学习成绩由教师分组, 由学生选定组长。在讨论组划分好后, 利用小组在课堂中有效地实现互动式教学。
2.1 讨论式互动教学
有效的课堂互动, 必须具有多样化的方式与途径。否则, 方法单一容易引起学生视觉疲劳。对此, 教师要善于创新互动方式。其中课堂讨论较为重要。由于人数多, 以前小课堂的提问与讨论方式已经不能让更多的学生参与教学。但是, 有效的课堂互动必须有讨论。所以, 在《C++程序设计》课程中采用小组讨论形式。这就需要教师精心设计讨论主题及发言方式。程序设计语言是一种机器语言, 就像英语汉语一样, 会有很多语法规则, 需要实践才能真正地去理解。采用灌输式的教学法[2], 似乎在有效的课时内向学生传达了足够多的消息, 实际上学生只是进行了机械的记忆, 根本没有真正地理解。例如for循环的用法, 老师不断地重复for循环的执行过程及三个表达式的作用及需要注意的事项, 学生也只是似懂非懂。采用讨论式互动教学发, 能让学生主动地发现问题, 加深记忆。例如, 讲述for循环的相关内容时, 可将教学过程分为两部分:第一部分:针对题目“打印1到10的平方根”, 让学生先用顺序结构写, 感觉繁琐不便后, 教师引出循环结构并逐步写出具体的程序:for (i=1;i<=10;i++) {x=sqrt (i) ;cout<<x<<endl;}, 向学生简要介绍for循环的基本语法和执行过程。第二部分则以学生讨论为主, 讨论内容为for循环测试提案。每个学生将自己对该结构所存在的疑问及希望测试的案例提出, 组长归纳总结后形成本组的for循环测试学习方案。课堂中学生提出了这样的问题:1) 依次将表达式“i=1”, “i<=10”, “i++”去掉程序会如何。2) 如果将一对括号{}去掉后程序会如何。3) 在程序后加一条语句“cout<<x<<endl”会输出什么。4) 如果i<=10的位置只出现个“10”可以吗。5) 能在界面上输入数据吗?通过上述问题的解决学生对for循环有了基本的了解。教师只要再做一些简要的补充就可以让学生对for循环有一个全面深入的理解。
2.2 竞赛式互动教学
人脑处于竞争状态时的学习效果要比平时的学习效果好得多。“石本无火, 相击而发光。”学生对即使是毫无直接兴趣的智力竞赛活动, 因渴望竞争取胜而产生的间接兴趣, 也会忘记事件本身的乏味而兴致勃勃地投入到竞争中去。教师可在课堂中设置程序竞赛环节[3]。时间以1小时内为宜, 每部分内容可设置一次竞赛, 题目的难度要适中, 最好是已经讲授过的题目改动而来。仍然以讨论小组为单位, 以抢答的方式进行。小组派代表在教师机上编写程序, 小组内成员可提出修改意见并进行调试, 其他小组成员则对该程序进行测试。在有限的时间内完成题目的可给组内每个成员的平时成绩加分。这样, 小组成员形成了一个小的“利益集团”, 每个人都有动力为问题的解决出一份力, 从而达到好的学习效果。
2.3 实验课中的反串式互动教学
程序设计教学中的实验是必不可少的。通过自己动手编写程序, 学生才能将上课所学的知识内化理解并熟练地应用。教师通常会感觉到上课强调的问题学生还是在重复地犯同样的错误, 这也是知识只从耳入, 没有内化的结果。教育心理学研究发现, 不同的教学方式产生的教学效果是不相同的。学生对所教内容的平均记住率为:教师讲授的方式, 学生记住率只占5%;学生讨论的方式, 学生记住率占50%, 学生教别人的方式, 其记住率高达95%以上。反串互动式教学模式正是以别开生面的形式, 给学生展示自我、张扬个性的机会, 引导其发现知识的奥秘, 培植学生的成功体验。因此在《C++程序设计》的实验教学中采取了反串式互动教学。
实验机房为多媒体广播式教学机房, 多媒体教学软件有助于教师进行学生实验过程监管, 也可以实现教师演示、学生示范等多种功能。首先要对实验课的时间进行合理的分配, 三分之二的时间用于学生自由上机。在自由上机的过程中, 教师主要通过一对一的答疑方式辅导学生。在答疑的过程中留意能体现共性错误的典型程序并予以提示和修改。在第二阶段, 进行学生示范, 即学生反串教师角色, 向大家讲解自己的程序及调试中遇到的问题。示范的学生分自荐发言和教师指定两种。教师采用随即指定的方式, 可以给能动性差的学生施加压力, 督促其更好地学习。
2.4 教师为主的启发式互动教学
问题启发是一种最常用的教学方法, 它从具体问题出发, 通过巧设悬念, 激发学生兴趣, 引导学生积极思考, 让学生在一种成就感的情景下寻求解题方法, 从而达到教学任务的目的。程序设计中一些基本结构、语法是需要教师直接讲授的, 使用问题启发在教师为主, 学生积极响应的互动氛围中进行, 能够激发学生的求知欲, 发挥主动性[4]。
例如在讲述程序设计结构的三种典型结构时, 以一个简单的求平方根的例子入手。初始题目为:读入一个数, 输出该数的平方根。算法为:1) .通过键盘读入一个数x。2) .计算x的平方根。3) .通过显示屏向用户显示结果。测试程序, 发现输入负数后出错, 然后教师可抛出问题:如果在输入负数的情况下正常结束程序?由此引入分支结构。继而引导学生站在用户的角度考虑输错后希望有怎样的处理呢?学生会自然地想到不希望程序结束而是能够再次输入数据, 直到输入正确, 由此引入循环结构。三种结构的引入顺其自然, 学生很轻松地理解了每种结构存在的必要性和作用。
3 结语
作为一门实践性很强的课程, 在有限的课时内达到好的教学效果, 我们所考虑的重点不是在有限的时间内教多少, 而是在有限的课时内教会学生如何去学习程序设计语言, 这样即便离开了课堂, 学生仍然有能力学, 能够带着兴趣学, 这才是程序设计语言课程真正的教学目标。本文针对当前《C++程序设计》教学中存在的问题, 提出了互动式教学法。经过实践检验, 收到了很好的教学效果, 受到了学生的好评。
参考文献
[1]闫东.大学教学中课堂互动的组织安排[EB/OL].http://www.bift.edu.cn/yxjf/skb1/skbjxgg/9298.htm, 2010-06-04.
[2]范贵海.创建以人为本, 课堂互动教学模式.考试周刊, 2011 (81) :216-217.
[3]高睿, 刘俊.互动教学法与竞争机制的理论探索与应用研究[J].科技信息, 2011 (31) :194-196.
姓
名
学
号
实验学时 2 实验时间 2017 年 12 月 1 日
实验地点
指导教师
课程名称 C++程序设计 专
业班
级
成绩
实验项目 类和对象(构造函数、析构函数、组合类、友元)
实 验 目 的 1、理解类的概念;2、掌握声明类的方法; 3、掌握对象的定义和初始化 4、掌握通过类编写程序 5、构造函数、析构函数 6、对象数组、对象引用、对象指针 7、组合类 8、静态成员 9、友元 实 验 内 容 和 要 求 1、阅读“程序 1.txt”,然后回答以下问题:
1)行 A 定义了一个类 Test 的对象,它将调用哪个构造函数?
2)行 A 能否写成 Test t1();?
为什么不可以或者可以?
3)行 B 定义了另一个对象,它将调用哪个构造函数?
4)解释第二个构造函数的函数体中用到 this 指针的原因:?
5)解释行 C 数组 p 的含义?
2、阅读“程序 2.txt”,然后回答以下问题:
1)行 A 中动态申请的数组为何还要将数组大小加 1?
2)String 类中是否还存在默认的构造函数“String();“?
3)行 B 开始的构造函数称之为
构造函数。解释其功能
4)执行行 C 时会调用哪个构造函数?
5)上机验证该程序。
3、阅读“程序 3.txt”,然后回答以下问题:
1)执行行 A 后,a1.c=
a2.c=
A::c=
2)执行行 B 后,a1.c=
a2.c=
A::c=
3)行 B 可否改为”A::c=400;”
为什么
4)c 为类 A 的私有成员,但行 D 中为何通过 t 能直接访问成员 c?
5)执行行 E 后,a1.c=
a2.c=
A::c=
第 1 题、第 2 题和第 3 题不用抄题目,只需写答案在报告纸上。
4、定义一个点类 Point,包括数据成员点的 x 坐标和 y 坐标(int)、构造函数以及设置点 x,y 坐标的成员函数。定义一个 CRect 类,代表一个矩形,要求
CRect 类中有代表矩形的左上角坐标(x1,y1)和右下角坐标(x2,y2)点类的对象(组合类),要求 CRect 类中有三个成员函数 RectHeight()、RectWidth()以及area(),通过这三个函数能得到矩形的高和宽和面积。
要求 CRect 类中有构造函数,要求 CRect 类中有成员函数 SetR(),通过这函数能设置矩形的左上角坐标和右下角坐标。
5、建立一个类 primenum,求指定数据范围内的所有质数。具体要求如下:
1)私有数据成员 int data[25]
依次存放指定范围内求出的所有质数 int low,high
存放指定的数据范围的下限和上限 int num
存放 low 与 high 之间的质数的个数
2)公有成员函数 primenum(int low,int high)
构造函数,初始化 low 和 high,同时在函数体内初始化 num 为 0 int isprime(int x)
判断 x 是否为质数。若是质数,返回 1;否则,返回 0.void process()
求指定范围内的所有质数,把它们依次存放在数组 data,并将求出的质数个数存放在 num 中 void print()
输出求出的质数个数以及所有质数,要求每行输出 5 个质数。
3)在主函数中对该类进行测试。例如:定义一个 primenum 类的对象 test,指定查找范围为 100~200,求出 100~200 之间的所有质数。
实 验 过 程(算法、源代码以及注释)
实 验 结 果(记录程序执行的结果,分析结果)
我们的题目是银行定期存款管理系统,在编程过程中,我预订的任务是学习并掌握MFC,并将其运用到我们的程序中。学习MFC的过程是我认为非常痛苦的事,因为完全都是自学,并且因为图书馆中的相关书籍全部被借阅出去,所以没有太多的自学资料,因此虽然费了很大的精力,但仍是无果。经过了很多的小组讨论和自己的心理斗争后最终决定放弃MFC而将自己能力以内的程序尽可能地优化,就这样,我开始在半路阶段加入了程序优化的工作,一遍遍的调试程序,遇到某个攻坚问题,几个人一起在网上查询,一起想解决的办法,就这样,我们团结地将我们现在认为将近完美的程序呈现给老师和同学。
一开始学习MFC时,我总是不能很好的转换思维,不能将自己以前的编程思想和以前的一些不良编程习惯甩掉,因此很多的程序都联系不起来,反而是自己学会了好多的零碎的片面却无法将程序大楼竖起来。在困惑很久后,我选择了询问老师,老师耐心地将MFC的思维方式讲给了我听,这让我受益匪浅,虽然我最后没能将MFC成功的做出来,但我认为我从MFC中才直接地感受到了C++中面向对象编程的封装性。以前用C++编程时总是将类中的变量随便规定属性,甚至在编程的过程中突然需要加一个变量,为了省事直接将其放于public中,在学习了解MFC后,深刻地感受到自己以前的编程习惯是多么的不科学,而那些习惯又是多么的重要。
我们这一次是以团队的形式来做这个项目,并且作为这个小组的组长,我感觉自己的压力很大,因为团队合作不仅讲求整体的团结而且为了团队工作的高效又要有明确的分工。在我们的小组工作中每个人都一刻不放松自己手里的工作,而一些时候我们又配合地很密切,尤其是当我们遇到程序的瓶颈时,我们都是在宿舍里你一句我一句地出谋划策,在遇到一个提取时间的程序时,大家纷纷查询各种辅导书,上网查各种资料,在遇到定期存款支取问题时甚至打电话给家长,寻求“场外支持”,种种的配合都给我们这个部门协调的运作提供了动力。我感谢我的团队,他们让我有一种很舒服的做事情的感觉。
最终决定放弃MFC,我承认自己有一种如释重负的感觉,但是也有一丝惭愧,无论老师要求与否,既然自己决定了就应该走下去,但是我最后退却了,感觉很遗憾也很羞愧,因为我认为对自己降低要求就是放纵自己堕落。
关键词:C++,教学改革,教学模式,教学方法,教学内容
一、引言
“高级语言程序设计 (C++) ”一直是计算机专业、信息类和电类一年级学生开设的专业基础课程, 部分其他理工科专业也将此课程纳入公共基础课范畴。本课程培养学生软件设计逻辑思维和编程能力, 特别对于计算机专业的学习, 是后续专业课程必不可少的先修课程。目前, 课程的建设综合考虑了各专业学生的接受能力和学习条件, 事实上, 对于计算机学科领域的学生, C++作为他们学习的第一门计算机高级语言, 掌握和运用的好坏不仅仅影响了他们对整个学科知识体系的理解, 更体现了他们的专业素质和技巧。
通过一段时间的教学, 我们发现, 目前存在的主要问题是课程学习完毕以后, 学生能掌握一定的理论知识, 但实际动手能力较差。大部分学生在通过一年的学习后, 只会解决书本和试卷中的练习题, 但不会处理解决实际问题, 不能动手编制较复杂的程序。因此, 我们建设更适于计算机相关专业的C++课程, 而改革的核心在于实验。
二、教学模式改革
笔者认为, 当前高校教学改革的长期目标之一是要改变传统的以教师为中心的教学模式, 建构一种既能发挥教师的主导作用又能充分体现学生认知主体作用的新型教学模式。在此基础上逐步实现教学内容、教学手段和教学方法的全面改革。之所以要把教学模式作为此次教改的主要目标, 是因为教学模式是指在一定的教育思想、教学理论和学习理论指导下, 在一定环境中展开的教学活动进程的稳定结构形式, 也就是说, 教学模式是指按照什么样的教育思想、教学理论和学习理论来组织教学活动进程。所以教学模式是教育思想、教与学理论的集中体现。教学模式的改变将要引起教学过程的深刻变革, 也必将导致教育思想、教学观念、教与学理论的根本变革。
从我们目前的现实情况看, 教学模式基本上都是以教师为中心。这种模式的优点是有利于教师主导作用的发挥, 便于教师组织、监控整个教学活动进程, 便于师生之间的情感交流, 因而有利于系统的科学知识的传授, 并能充分考虑情感因素在学习过程中的重要作用。其严重弊病则是:几乎完全由教师主宰课堂, 很大程度上忽视了学生的认知主体作用, 不利于具有创新思维和创新能力的创造型人材的成长 (按这种模式培养出的绝大部分是知识型人材而非创造型人材) 。
建构主义学习理论和学习环境强调以学生为中心, 要求学生由外部刺激的被动接受者和知识的灌输对象转变为信息加工的主体、知识意义的主动建构者, 建构主义的教学理论则要求教师要由知识的传授者、灌输者转变为学生主动建构意义的帮助者、促进者;要求教师应当在教学过程中采用全新的教育思想与教学模式 (彻底摒弃以教师为中心、强调知识传授、把学生当作知识灌输对象的传统教育思想与教学模式) 、全新的教学方法和全新的教学设计。因而很自然地, 建构主义的学习理论与教学理论就成为以学生为中心教学模式的主要理论基础。以学生为中心的教学模式注意在学习过程中发挥学生的主动性、积极性, 相应的教学设计主要围绕“自主学习策略”和“学习环境”两个方面进行。前者是整个教学设计的核心——通过各种学习策略激发学生去主动建构知识的意义 (诱发学习的内因) ;后者则是为学生主动建构创造必要的环境和条件 (提供学习的外因) 。
上述两种教学模式各有其优点和不足, 结合我们社会和学校自身的实际情况, 我们希望能够实践一种更加符合实际的“主导—主体”的双主教学模式。双主模式介于上述两种总模式之间, 它不是以教师为中心, 也不完全是以学生为中心, 而是既发挥教师的主导作用 (而不是像“教师中心模式”中那样发挥“主宰”作用——自始至终主宰课堂, 完全由教师唱主角) , 又要充分体现学生的认知主体作用, 即要把“教师中心”和“学生中心”两者的长处吸收过来, 而把两者的消极因素加以避免。这就要求在基本保留“传递-接受”教学活动进程 (在大班授课情况下, 这有利于教师对教学的组织和主导作用的发挥) 的条件下, 要对这种“进程”加以认真的改造, 即在此进程中要利用计算机为核心的技术手段, 在建构主义理论指导下通过人机交互让学生更多地去主动思考、主动探索、主动发现, 从而形成一种新的教学活动进程的稳定结构形式:在整个进程中, 教师有时处于中心地位 (以便起主导作用) , 但并非自始至终;学生有时处于传递-接受学习状态, 但更多的时候是在教师帮助下进行主动思考与探索;教学媒体有时作为辅助教的工具, 有时作为学生自主学习的认知工具;教材要素也各自有不同的作用, 彼此之间有不同的联系, 从而形成一种新的教学模式——“双主模式”。这种模式的理论基础既有“传递-接受”教学理论和行为主义学习理论, 也有建构主义的教学理论和学习理论。
教学模式的改革必将引起教学策略、教学设计方法和教学内容的变化, 因此, 我们还要对现有的教学策略和教学内容进行一定的改造, 以适应模式的转变。
三、教学设计方法改革
在双主教学模式的背景下, 可以采用很多不同的具体的教学设计方法, 如支架式教学设计、抛锚式教学设计、随机进入式教学设计等, 这些设计方法可以在具体的教学过程中有选择性地采用, 在我们新的教学改革方案中, 我们也给学生定义了这样的七个学习阶段:
1.选——找到帮助
选包括选老师、选教材、选参考资料、选信息来源、选学习渠道, 等等。虽然一部分选择教师负责完成, 但教会学生充分利用网络资源、有效利用开发工具, 并以此作为他们的良师益友是非常重要的。笔者经常在第一堂课就告诉学生, 教师只是一个领路人, 他们的良师益友是编译器、是优秀的文献资料、是网络另一端的先行者们。
2.拓——认识程序
给学生们一些简单的例程, 给学生们一段操作的步骤, 让他们依葫芦画瓢地将程序输入, 编译、连接之后运行。这个时候他们多数只知道是连续的点击不同的按钮的操作过程。当出现错误时, 只能让他们仔细检查输入的每一个字符是否准确。但是, 这将树立他们对于程序的第一印象, 他们能迅速地体会到程序“启动”的欣喜和成就, 尽管不是自己创作的程序。
以往教学中, 习惯于先解释字、词、语句。每完成一部分内容的教学, 让学生们尝试用他们已经认识的信息组成的一段代码进行实验。实际上, 学生们在知识筹备的时间内, 他们对于词法、语法的学习是漫无目标的, 不知道什么时候有用, 不知道该怎么用;自然而然以一种死记硬背的方式去学习, 真正进行实验的时候, 一些记忆模糊了, 一些已经不记得了, 再一次从头来过。
事实上, “拓”的过程中, 学生对于语言知道的越少, 他对于程序的运行越感兴趣, 在后续的学习过程中, 更加能够集中精力去研究清楚程序中的每一个组成部分。这其实是在教学的初期阶段给学生建立一个谜题的过程, 而解开谜题的过程与科学探讨的过程及其相似。通过目标的创建, 不仅激发学生对于学习目标的兴趣, 还可以引导他们像专业人员一样思考。再给学生准备好一些更复杂的源程序, 让他们可以直接打开运行, 这些都可以吸引他们的注意力。
3.临——改动程序
在原样照搬的基础上, 一些变化能够激起学生更多的好奇心。通过让学生在例程上自由的进行一些改动, 记录下改动的内容, 猜测这样的改动将给程序的运行带来怎样的变化后再次编译运行, 来验证他们的想法。运用“差距理论”来调动学生的学习主动性。1994年, 卡耐基梅隆大学的行为经济学家Georgy Loewenstein给出了对情境兴趣最全面的解释。他认为, 当我们感到在知识上存在差距时就会产生好奇心;Loewenstein认为差距导致痛苦。当我们想知道什么事却无法知道的时候, 就像我们身上有个非挠不可的痒痒。为了解除这种痛苦, 我们就必须填补这种知识差距。即便看烂电影本身就是一种痛苦, 我们也会耐心地坐着, 因为不知道解决实在是太痛苦了。差距理论的一个重要含义是在填补差距之前要制造差距。说出事实之前, 他们先要认识到他们需要这些事实才行。根据Loewenstein的观点, 说服人们相信自己需要我们的信息的诀窍在于首先要强调某种他们所没有的特定知识。我们可以给学生们提出一个就他们的知识而言存在差距的问题, 给他们预测结果的挑战。
“改变‘=’左边的内容程序会怎么样?”, “改变‘=’右边的内容程序会怎么样?”不管结果和猜测是否吻合, 是否能分析出原因呢?“为什么改变‘=’左边的字符对于运行结果没有任何改变, 但是改变右边的字符, 运行结果就变了?”“如果把‘=’左右两边的内容交换又会怎样?”解决一个问题往往能引发出更多的问题, 让学生在一个自问自答的过程中思考和学习。
4.仿——重写程序
在帮助学生解答问题的过程中, 其实已经把语言的基本要素教授给了学生, 虽然他们还会拼写错关键字, 会不记得运算符的优先级别, 但是他们已经知道怎么去运用每一个元素。那些字面上的错误, 或者用户手册上清楚列明的问题不需要花费他们太多的时间去解决, 也将随着运用次数的增加牢牢地刻在学生脑海之中。
既然他们已经清楚了每一个分词在例程中的作用, 他们可以通过改写程序来实现一些类似但不同的功能。刚才他们只能把一个从1累加到10的程序改成从1累加到100的程序, 再改成从1累加到n的程序, 现在让学生解决一个计算2的n次方, 或者n的阶乘的程序, 接下来他们可以计算任意复杂的表达式了。
5.脱——创造程序
前面四个阶段是本科生必须在一年级完全经历的学习阶段, 后面的三个阶段在本课程的学时内或多或少的会有一些闪现, 然后一直贯穿学生专业学习的过程, 乃至从事软件开发工作的职业生涯。
当前面积累的例程代码都转变成个人的编程经验, 学生们面对问题不再需要摆着例程在面前。他们通过将问题不断分解, 直到每个小问题都是一个自己曾经解决过的问题。把积累的那些代码拼装起来, 得到新问题的解决方案。
进一步的脱离模板、程序创造, 需要学生进行数据结构和算法的学习, 这让他们能够组织的问题规模更加庞大, 结构更加复杂。每个学生有自己拆分现实世界的角度, 也有重新拼装的独特想法。同样的问题, 解题的思路丰富了, 编写的代码也各不相同。
6.变——创新程序
大作业或者课程设计是检验学生掌握计算机语言, 并能灵活运用的好方法。在布置大作业时, 让学生自由选题, 只对于程序的规模, 功能的完整性和知识点在程序中的应用提出。在检查学生们的大作业时, 总能出现一些很陌生的代码, 需要花上一些时间才能看懂看明白。到这一阶段时, 老师对于学生的影响已经很小, 尤其是技术的指导, 学生基本形成了特有的技术风格, 并感受到方法学、模式、结构框架等对于大规模开发的重要作用, 软件工程对于团队开发的重要作用。老师引导学生更加关注知识体系的组成、行业的发展趋势、先进技术的产生, 帮助他们开拓视野。Mitchell kapor的《软件设计宣言》说道“设计就是脚踏两个世界, 即技术的世界和人及其愿望的世界, 设计人员努力要做的是把两者结合到一起”。让学生懂得, 技术不是全部, 技术为人类服务。
四、教学内容改革
目前的教学内容主要依赖于课本, 但课本由于编写周期较长, 很多内容比较陈旧, 而且由于缺乏可视化编程的内容, 很多学生在学习完成之后无法编写标准的Windows程序, 导致他们学习兴趣骤然降低。我们计划在教学内容上作出如下改进:
1.采用课本+课外书藉+MSDN帮助+网络的多元化教材
课本和相关书籍由于结构清晰、层次清楚, 因此很适合学生作为系统的学习材料, 但也因其更新速度慢、离今后的实际工作距离较远, 导致学生学不到最新的知识, 进而导致学生缺乏实际的动手能力。采用多元化的教材, 一方面, 可以促进学生阅读大量的中英文技术文档, 提高其自主学习和研究的能力, 另一方面, 也可以让学生接触到最新的技术发展趋势。
2.加强可视化编程内容的学习
集成开发环境VC是可视化编程的开发工具。在以往的教学中, 只关注语言本身的练习, 因此只开发控制台 (DOS) 程序。但学生的兴趣不高, 成就感不强。将可视化开发纳入C++实验课程体系, 可以提升学习乐趣, 尽早给学生提供实现创新想法的工具。
3.加强编程模式的学习
计算机语言的学习, 不仅是语法规则的学习, 更重要的是编程模式的学习。在编程特别是面向对象编程方面有很多前人总结的模式和习惯用法, 这决定这一个程序设计人员水平的高低。这就好像人人都会下象棋, 但真正的高手是需要有一个行棋的模式的。常见的编程模式包括简单工厂模式、工厂方法模式、策略模式、装饰模式、建造模式、单例模式、多例模式、代理模式、适配器模式、桥梁模式、观察者模式等, 所有这些内容在现在的教材中都没有得到体现。
4.提倡规范化编程
好习惯从小养起, 好的编程习惯也要从初学就开始培养。在实验中应强调和贯彻专业的编程规范, 不仅可以减少程序中错误, 更是帮助学生树立了良好的专业形象, 培养职业道德, 为以后的团队合作、软件工程实践奠定基础。
五、总结和展望
高级语言程序设计是计算机和软件专业专业学习必不可少的先修课程, 能不能学好就意味着专业知识的基础是否扎实, 直接影响到后续学习的效果。笔者认为, 在传统的教学内容上, 必须融入团队精神和编程规范的思想, 以引导学生主动探究的方式开展教学, 从而提高学生的应用能力和创新能力。
参考文献
[1]Heath, Chip&Dan.Made to Stick[M].Random House, 2007.
[2]威诺格拉德.Bringing Design to Software[M].机械工业出版社, 2005.
[3]何克抗.关于网络教学模式与传统教学模式的思考.电化教育研究, 1998, (1) :34-36.
【C++实践报告】推荐阅读:
电气暑假实践实践报告05-30
社会实践报告:会计类社会实践报告11-17
支教社会实践报告格式_社会实践报告10-02
社会实践报告实践名称07-23
信息系C++实验报告(练习)07-04
大学生暑期实践实践报告10-28
会计社会实践报告实践总结范文10-07
电力实践报告06-03
军训实践报告06-07