C语言程序设计扫雷游戏实验报告

2024-07-11

C语言程序设计扫雷游戏实验报告(精选8篇)

C语言程序设计扫雷游戏实验报告 第1篇

C语言程序设计实验报告

实验二 循环结构程序设计

班级 2012196 学号 201219628 姓名 李明月

一、实验目的

(1)掌握用while语句,do-while语句和for语句实现循环的方法;(2)掌握循环结构的嵌套;

(3)掌握break语句和continue语句的使用方法。

二、实验内容及步骤

1.相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗?

程序1:试编程计算舍罕王共要多少粒麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒)总粒数为:sum=1+2+22+23+„+263 程序代码:

#include int main()//定义一个主函数 { int i;double t=1,sum=1,v;//定义变量

for(i=1;i<=63;i++)//用for循环语句实现循环运算 { t=t*2;sum+=t;//循环表达式 } printf(“总麦粒数为:%fn”,sum);v=sum/1.42e8;printf(“折合体积为: %f立方米n”,v);//对结果进行输出

return 0;} 运行结果:

2.求完数。

程序2:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数,输出所有的完数(要求:一行显示6个数);

程序代码:

#include int main(){ int i,j,sum,n=0;printf(“ 1000以内的完数有:n”);for(i=1;i<=1000;i++){

sum=0;for(j=1;j

if(i%j==0)

{

sum=sum+j;

} } if(sum==i)

{ printf(“ %d”,i);

n=n+1;

if(n%2==0)

printf(“n”);

} } printf(“n”);return 0;} 运行结果:

3.打印九九乘法表

程序3:编程输出如下上三角形式的九九乘法表。2 3 4 5 6 7 8 9-------n“);for(i=1;i<10;i++)//i { for(j=1;j<=i;j++)// printf(” “);for(j=i;j<10;j++)//j printf(”%-2d “,i*j);// printf(”n“);}

代表行 输出空格达到来使得向右对齐代表列

输出行与列的乘积 3 1 2 3 4 5 6 7 8 9

运行结果:

三、问题讨论

break语句和continue语句在循环结构中使用时有何区别?举例说明。

break语句是跳出整个循环过程,不再判断执行循环的田间是否成立,并且break语句不能用于循环语句和switch语句之外的任何其他语句中。而continue语句则只是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

例子:

#include int main(){ int i;for(i=100;i<=200;i++){ if(i%3==0)continue;

printf(”%d“,i);} printf(”n");return 0;} 输出:

但是换成break之后:

四、实验心得

个人感觉对于这几个循环语句还是for循环最为灵活,不进可以用于循环次数一句in个确定的情况,还可用于不确定的情况下,它也完全可以代替while语句。并且是程序看起来更为简洁明了。

C语言程序设计扫雷游戏实验报告 第2篇

Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下:

(1)扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。

(2)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。

(3)用户要揭开某个方块,可单击它。若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。

(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。

(5)扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。

(6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G 然后M)即可,此时双击右键并可出现“?”标记。另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。

(7)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。

二、需求分析

1、扫雷游戏概述

扫雷是一种具有迷惑性的对记忆和推理能力的简单测试,它是长久以来最受欢迎的Windows游戏之一。游戏目标:找出空方块,同时避免触雷。

2、扫雷的操作方法

游戏主区域由很多个方格组成。使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。

例如,方格中出现1,说明上下左右及斜角合计有一颗雷,依次类推,2则有2颗,3则有3颗。

3、需实现的主要功能

(1)用户可以自定义级别并且可以任意输入雷数;

(2)具有计时功能,即显示用户完成移动盘子所花费的时间;(3)用户可以选择是否有音效;(4)自动保存扫雷英雄榜;

三、总体设计

1、总体功能图

扫雷游戏主界面游戏菜单重新开始帮助开局级别选择标记英雄榜退出关于扫雷

2、总体流程图

开始定义并初始化个按钮,菜单等菜单菜单事件处理按钮按钮开局选择级别标记声音英雄榜退出重新开始方块展示相应的效果是否点中雷NY结束

四、详细设计

1、扫雷棋盘的布局设计

系统的整体布局为:CardLayout布局, 采用了菜单、按钮、面板„等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出,按钮的功能是重新开始新的游戏。

2、雷区的设计

MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如图2-1所示。

JPanelActionListenerMouseListenerMineArearow,colum,mineCount,markMount: inblock: Block[]blockView: BlockView[][]showTime: JTextFieldshouMarkedMineCount: JTextField initMineArea(int,int,int): voidactionnPerformed(ActionEvent)voidmousePressed(MouseEvent): voidlay: LayMinesrecord: Record reStart: JButtontime: Timer show(int m,int n): voidinquireWin(): voidMineGamemineArea:MineArea------------------MineArea类的UML图

以下是UML图中有关数据和方法的详细说明。

1、成员变量

(1)block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。(2)blockView是BlockView类型的数组,负责为block数组中的Block对象提供视图。

(3)lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。

(4)record负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有扫雷成功后(用时最少),才可以看见对话框。

(5)reStart是一个按钮对象,用户单击它重新开始游戏。(6)time是计时器对象,负责计算用户的用时。

2、方法

(1)initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度、高度、雷的数目以及雷区的级别。

(2)actionPerformed(ActionEvent)是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。

(3)show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。

(4)mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。

(5)inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的累而且用时最少。综上所述,MineArea创建的扫雷区域效果如图2.2.2所示。

3、音效的设计

music类是java.awt包中Frame的子类,通过构造音效声音方法,在MainFrame主类中,通过ActionListener来监视是否已开始游戏,来决定播放计时声,之后又通过ActionListener来监视是否踩到雷和是否完成来决定,播放相应的音乐。下面标明music类的主要成员变量、方法以及和MineFrame类之间组合关系的UML图如图2-2所示。

musiclooping,looping2,looping3:booleanfile1,file2,file3:Filesound1,sound2,sound3:AudioClipchosenClip1,chosenClip2,chosenClip3:AudioClipdidaInit():voiddidaLoop():voiddidaStop():voiddetonationInit():voiddetonationPlay():voidvictoryInit():voidvictoryPlay():void MineArea类的UML图

4、排行榜设计

LogDialog是javax.swing包中Jdialog对话框的子类,并实现了ActiongListener接口。LogDialog创建的对象dialog是MainFrame类(主类)的成员之一,当用户选择查看“英雄榜”菜单项时,该对话框可见,提供了查看扫雷的最好成绩的界面。标明LogDialog类的主要成员变量、方法以及和MainFrame类之间组合关系的UML图如图2-3所示。JDialogActiongListenerLogDialogfile:File 显示成绩:重新记分:JButtonactionPerformed(ActionEvent):voidreadAndShow:voidMineGameshowHeroRecord:ShowRecord

LogDialog类的UML图

五、调试分析、测试结果

在程序代码基本完成后,经过不断的调试与修改,最后测试本次所设计的扫雷游戏能够正常运行,在基本功能与画面上与Windows自带的扫雷游戏没有太大差别,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,比如在游戏中可以加入一些不同语音的提示,在游戏完成和失败的时候可以弹出一些小的Flash动画,还有就是可以扩展一下扫雷英雄榜的功能等。总的来说本次设计在功能上已经基本达到要求,其他细节方面有待以后完善。

六、结论及改进设想

1、界面的美观性做的不太好,比如说布局,颜色搭配有待改进

2、背景音乐在播方的时候有一点小问题,比如单击停止播放,音乐并没有停止,需要单击2次或多次;另外背景音乐似乎很占内存,运行的时候容易死机。

3、MineGame的初始化界面大小难以控制,特别是在自定义的情况下,需在手动改面窗口的大小。

七、心得体会

这个扫雷游戏是完全模拟微软系统自带的扫雷游戏,所以难度是比较大了,必然在编程过程中也遇到很多问题,有些问题比较简单但就不知道错在哪里,有些大问题之道在哪就是不知道怎么办才好,后来经过自己的不断调试,这个扫雷游戏终于大功告成。

经过编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉很吃力,因为这个游戏涉及到好多算法。感触最深的就是我们真的要扎扎实实的打基础!并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西。

通过该课程设计,全面系统的理解了程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。现在通过自己动手做实验,从实践上认识了Java是如何处理命令的,课程设计中程序比较复杂,在调试时应该仔细。

在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

八、参考文献

[1] 耿祥义.Java大学实用教程.北京:清华大学出版社,2009. [2] 耿祥义.Java课程设计.北京:清华大学出版社,2008.

[3] 王鹏.Java Swing图形界面开发与案例详解.北京:清华大学出版社,2008. [4] 丁振凡.Java语言实验教程.北京:北京邮电大学出版社,2005. [5] 郑莉.Java语言程序设计.北京:清华大学出版社,2006.

《C语言程序设计》实验教学探究 第3篇

《C语言程序设计》课程是大学计算机专业及理工类非计算机专业一门重要的公共基础课程, 它不仅是其它高级编程语言的基础, 而且通过这门课的学习可以掌握程序设计的思想。该门课程具有较强的理论性和实践性, 学好这门课程将为后续专业课程的学习打下扎实的理论和实践基础。学生普遍反应, C语言课程内容繁多, 虽然感觉课堂上基本听懂教学内容, 但上机实验也常常显得力不从心, 课堂和上机严重脱节。值得一线教师思考的是程序设计类课程上机实验的重要性丝毫不亚于课堂教学, 这是巩固和发展课堂知识十分重要的一环, 在抓课堂教学质量的同时, 要切实重视实验教学环节。因此, 必须认真思考这门课程实验环节存在的种种问题, 找到解决问题的办法, 切实提高实验教学的效果。

1实验教学存在的问题

1.1实验课效率低下

在以往上机实验课上, 有相当一部分学生事先没有预习实验内容, 坐在电脑前看教材、看实验指导书, 而不是打开电脑动手编写程序, 导致上机实验课效率十分低下, 根本无法完成实验任务。

1.2过度依赖老师解决问题

很大一部分学生在上机调试程序时, 不会根据提示的编译错误找到错误所在, 一味依赖教师把错误指出加以改正, 造成学生发现、解决问题的能力没有得到锻炼与提高。

1.3实验素材有待完善

通过上机实验环节, 可以加深学生对讲授内容的理解, 尤其是一些繁琐、枯燥的语法知识, 可以通过上机实验加以巩固。因此, 上机实验的素材和实验内容安排是否合理显得尤为重要。以往使用的实验教材是和教材配套的实验指导书, 实验项目基本上是教材每章后面的程序编写题, 每个程序代码都可以在实验指导书中找到答案, 学生只需要把书中的源程序代码输入计算机, 进行一些简单的调试工作。这样一来, 学生只能依葫芦画瓢, 无法很好地掌握所学知识点, 学生丧失独立思考和创新的能力。

1.4学生自我检测和老师测评环节缺失

学好C语言这门课程, 仅靠课堂和上机实验的有限时间是不够的, 需要学生课后花很多时间上机实践。以往学生课后只能依靠教材、实验指导书和课件复习所学知识点, 学习资源匮乏, 并且学生无法对自己知识点的掌握情况做评估, 不能很好地补缺补漏。教师也没有提供阶段测评环节及时掌握学生各阶段的学习情况。

2实验教学探索

2.1抓好实验预习工作, 培养学生良好的预习习惯

上机实验是程序设计课程一个非常重要的环节, 通过上机实验编写程序, 可以进一步巩固对理论知识的理解。在以往的实际教学中, 教师往往容易忽视实验课前预习工作, 学生事先不做准备, 到机房才开始看题目思考如何编写程序, 很难在有限的课堂时间内完成作业。因此, 近几年的教学中, 教师要求学生事先将要完成的实验程序代码在预习本上写出, 在上机实验时将代码输入计算机进行调试。教师做到每次上机课检查学生的预习本, 实施“没有完成预习工作的学生不能进机房”的惩罚措施, 经过严格的督促, 所有学生养成了事先预习的好习惯, 保证了上机实验的效率。

2.2养成良好程序书写规范, 掌握程序调试工具, 培养学生发现问题、解决问题的能力

以往在批改学生作业时, 发现大部分学生的程序代码虽然没有语法错误, 但程序书写很不规范, 给查错、日后阅读带来很大的不便。程序书写应该清晰, 便于阅读、理解、维护, 遵循以下规则:①一个语句占一行;②使用{}时, 两个花括号单独占一行, 并且在同一列的位置;③低一层次的语句比高一层次的语句右缩进几个字符;④在必要的地方加上注释语句。

其实在VC 6.0编译环境中, 系统有自动右缩进的功能, 代码书写每次换行, 系统会根据层级关系自动右缩进几个字符;并且对于没有正确采取右缩进对齐的代码, 可以通过按ALT+F8组合键进行自动对齐。

由于C语言内容比较复杂, 对初学者而言, 很容易在编写程序时遇到各种各样问题, 加上学生的英语水平有限, 对于调试出现的错误和警告信息看不明白, 出现问题就会有畏难情绪和依赖思想。

程序调试能力是程序设计能力一个非常重要的方面, 在以往的教学中, 学生调试错误能力的培养往往被忽视。很多教师在辅导上机时, 只要学生出现调试错误, 教师直接把错误指出, 学生发现问题、解决问题的能力没有得到锻炼。

程序错误包括两类:一类是语法错误, 一类是逻辑错误。语法错误是学生比较容易犯的错误, 对于这类错误, 教师要告诉学生找错方法。对于逻辑错误教师应该在课堂上教会学生使用调试工具, 强调调试工具使用的重要性, 在上机实验时, 鼓励学生经常使用调试工具, 特别对于循环结构的程序, 通过调试工具, 可以很好地观察一些重要变量的变化情况。

2.3完善实验教材, 合理安排实验内容

以往教学中, 使用的实验教材是谭浩强版的《C语言程序设计题解与上机指导》, 这门书的实验内容基本上是程序编写题, 并且已经附有答案, 学生使用该教材实验效果很不理想。

2009年10月, 在广东省教育厅下达的课题“C语言程序设计立体教材开发”的资助和要求下, 课题组集中精力编写了一本有助于从多个层次培养学生读程序、分析程序、修改程序以及编写程序能力的实验教材——《C语言实训教程》。该实验教材共有12个实验, 其中1个验证性实验、9个设计性实验、2个综合性实验。验证性实验立足于语法规则, 目的在于巩固C语言的基础语法知识。设计性实验是在给定实验目的和要求的条件下, 由学生结合所学知识, 自行设计实验方案并加以实现的实验, 目的在于培养学生充分运用所学知识, 去发现问题、解决问题。设计性实验突破以往只有编写程序题的模式, 每个实验的实验任务都设置了3个层次:

(1) 程序改错题:读程序找出其中的错误, 通过改错训练, 可以让学生掌握调试工具的使用, 并且避免以后编写程序时犯类似常见错误。

(2) 程序扩展题:培养学生在分析、理解原始程序的基础上, 对程序进行扩充修改, 为独立编写程序打下基础。

(3) 程序编写题:训练学生独立编写程序能力以及解决实际问题的能力。

经过“读程序—模仿改写程序—编写程序”实验环节, 让学生在由浅入深的逐步引导中理解和掌握程序设计的思想、方法和技巧。

综合性实验是学生经过一个阶段的学习之后, 运用所学知识点, 对实验技能和方法进行综合训练的实验。综合性实验是学生反映最难, 也是收获最大的一个部分。在以往教学中, 综合性实验在课程快结束的时候布置, 学生面对如此综合性的实验任务, 要一步到位, 从无到有写出一个完整的程序, 显得思绪混乱、手忙脚乱、无从下手。教师应该在学习初期就把综合性实验要求提出, 演示程序, 让学生直观感受课程最后要完成一个怎样的任务。在这样一个大任务的驱使下, 激发学生的学习兴趣, 随着知识点的不断学习, 将一个简单的小程序逐步完善成一个复杂的程序。以《C语言实训教程》为例, 综合性实验具体实验任务是编写一个学生信息管理系统, 每个学生信息包括学号、姓名、性别、班级、3门课成绩, 主要功能包括数据输入、数据输出、数据修改、按照某字段排序、查询学生信息、统计平均分及不及格科目等功能模块, 通过选择不同的菜单项来实现各功能模块。此综合性实验涉及到知识点有选择结构、循环结构、函数、结构体数组等内容, 基本上涵盖了C语言中所有知识点。

综合性实验不是一步到位的, 而是分步骤实施, 逐步完善程序代码, 具体步骤如下:①在选择结构实验环节中, 要求学生编写程序1.cpp:使用switch语句完成“学生信息管理系统”菜单的输出显示;②在循环结构实验环节中, 要求学生修改程序1.cpp:在1.cpp基础上, 使用while或do while语句实现菜单的循环显示, 修改后的文件名为2.cpp;③在函数实验环节中, 要求学生修改程序2.cpp:在2.cpp基础上, 对每个菜单项对应设计一个空函数 (只有函数名, 函数体内是空语句, 留待以后加以完善) , 选择不同菜单项则调用不同的函数, 此时管理信息系统最初的程序框架已经修改, 建立修改后的文件名为3.cpp;④在数组和结构体的实验环节中, 要求学生把综合性实验中的每个功能模块分别用一个独立的cpp文件编写调试成功, 假设有n个模块, 此时程序名分别为4-1.cpp, 4-2.cpp, …, 4-n.cpp;⑤新建一个新的cpp文件——5.cpp, 在该文件中写入所有功能模块对应的函数定义, 函数定义部分代码提炼于步骤4所有独立的cpp程序文件 (4-1.cpp, 4-2.cpp, …, 4-n.cpp) , main ( ) 函数里顺序调用各函数, 顺序执行各功能模块;⑥要求学生修改程序3.cpp:将5.cpp程序中所有函数定义的代码, 填入到3.cpp程序中对应的空函数的函数体内部, 经过调试修改, 最终完成综合性实验程序。

通过以上循序渐进的步骤, 学生能够深刻体会如何将一个复杂的问题分解成一个个小任务加以解决, 从而使得学生编写复杂程序的能力得到很好的锻炼。

2.4借助立体化资源, 培养学生自主学习能力

《C语言程序设计》课程具有信息量大的特点, 仅仅依靠64学时课堂教学和上机实验无法达到良好的教学效果。因此, 如何把课堂进行延伸为学生搭建一个课堂外的课堂, 为学生自主学习提供一个平台是值得教师思考的一个问题。

本课题组除了编写实验教材之外, 还制作了实验教材配套的辅导学习光碟, 光碟中提供了每个实验项目问题分析及解决方法的讲解视频、流程图及参考程序;搭建Blackboard网络教学管理平台, BB平台除了提供学生自主学习的课程资源之外, 还提供了学生进行自我测评的“在线测试”, 测试题目以章节为单位, 涉及单选、填空、阅读程序及编程题, 此环节允许学生反复练习, 点击“提交”按钮之后, 客观题会自动评分并提供正确的参考答案, 让学生对自己所学知识的掌握情况有个全面了解。通过“实验教材+辅导光碟+网络平台”三位一立体化的资源, 使得本课程的实验教学模式由原来单一的依赖实验指导书资源学习, 转变为学生依托立体化资源进行自主学习的模式。

2.5增加阶段性测试, 及时了解学生学习情况

以往教师只能通过学生提交的实验程序来了解学生知识掌握情况, 而大部分实验作业是学生通过翻看教材和共同讨论完成的, 教师无法了解学生掌握知识的真实情况, 无法及时对掌握不好的知识点加以强化学习。针对这一问题, 本课题组利用计算机技能自动测评系统对学生进行阶段性测试, 通过2~3次的小测试, 了解各阶段学生知识点掌握情况, 及时补缺补漏。测试成绩也作为平时成绩的一部分, 从而督促学生及时复习所学知识点, 不至于边学边忘。

3结语

针对多年来C语言实验教学中存在的若干问题, 本课题组经过一系列教学实验改革和实践, 取得了较好的效果, 学生对课程和教师的满意率也显著提高。在学生对26名任课教师的教学质量评价中, 有5位《C语言程序设计》任课老师排名前7名, 是历年来教学评价最好的一次。由此可见, 对于C语言实验教学环节, 改进方法在实际教学实施过程中取得了良好教学效果。今后要在实践教学中勤于思考、时时总结、不断改进, 争取在教学实践中取得更好的成绩。

摘要:针对《C语言程序设计》课程实验教学存在的若干问题, 结合教学实践, 提出了提高实验教学效果的几个措施:培养学生良好的编程习惯;锻炼学生发现问题、解决问题的能力;合理安排实验内容, 在由浅入深的逐步引导中实现知识点的融会贯通;建设立体化学习资源, 培养学生自主学习能力;通过阶段性测评及时了解学生学习情况。实践证明, 该实验教学改革措施的实施取得了很好的教学效果。

关键词:C语言,实验教学,教学改革

参考文献

[1]侯建花, 杨长青.《C语言程序设计》实验教学的改革与实践——以淮海工学院为例[J].计算机教育, 2010 (1) .

[2]潘丽丽, 钟少宏, 姜瑜.非计算机专业C语言程序设计实验教学模式[J].计算机教育, 2011 (18) .

[3]刘小燕, 申艳梅.《C语言程序设计》教学方法探析[J].计算机教育, 2010 (6) .

C语言程序设计扫雷游戏实验报告 第4篇

【关键词】C语言 程序设计 实验 考核体系

【中图分类号】G64【文献标识码】A 【文章编号】2095-3089(2016)37-0234-01

1.引言

C语言程序设计(实验)通过上机实践,可以帮助学生巩固课堂教学的理论知识,真正体现学生将知识“内化”的过程[1],意在培养学生分析问题、解决问题的实际动手能力和创新能力。传统的实验课程考核方式单一,不能公正的评价学生的实际综合能力。为了全面培养学生的学习兴趣、全面考查学生的综合知识点,全面注重学生的创新能力和实践能力的提高,以达到培养创新人才的目的,切实推进课程考核改革及考核体系已经刻不容缓[2]。

2.课程简介

程序设计基础是一门专业基础课,这门课通过全面、深入、系统地介绍程序设计方法和程序设计语言,使学生初步建立起程序设计的基本概念,通过学习一种典型的程序设计语言(C语言),初步掌握程序设计方法,具有一定的程序设计能力。我院的程序设计基础(C语言)分上下两个学期,程序设计基础(一)和(二),程序设计实验是单独的一门课程,有程序设计基础(一)实验和(二)实验,实验内容主要是辅助,强化理论各个章节的知识点,提高学生的动手能力为目的进行设计的。

本考核体系是基于程序设计基础(一)实验设计的。我院程序设计基础(一)主要的内容有:数据的表示、组织和处理、程序的基本结构控制(顺序、选择和循环)。

3.現行的考核方式

现行的考核方式比较单一,是从三个方面进行成绩给定:(1)考勤;(2)实验报告;(3)创新设计。这里的(2)和(3)都是以实验报告来给定成绩,其中一部分以实验报告的书面结果给定成绩,另一部分以答辩实验报告的方式给定成绩。现行的考核方式不能公正的评定学生的实际综合能力,也没有促进学生进行创新设计。

4.全程考核体系的构建

全程考核体系意在促进学生核心能力的提升,在学习过程和学习结果两个维度上设置考核指标:过程考核可以提高课程的教学质量,培养学生的学习能力以及提高学生的协作能力、表达能力、沟通能力等综合素质;结果考核目标是使学生掌握基本理论、基本知识的基础上增强职业素养与专业技能,提高分析问题及解决问题的能力。

全程考核体系:

(1)考勤

考勤是学生学习的基础和保证,能促使学生养成遵章守纪的习惯,以培养学生进行自我管理。每次实验使用E-learning系统进行签到记录。

(2)实验报告

实验课中,教师观察、了解学生学习的过程,学生参与课堂活动的广度和深度,学生学习过程中表现出来的解决问题的能力。而实验报告是实验过程中唯一存档的资料,是值得重视的环节。教师根据学生的实验报告的完成步骤、完成程度以及答辩等对每次实验进行综合评价。

(3)综合大作业

为培养学生的创新能力及实践工程能力,让学生以三人一组,综合运用所学知识,共同自主学习、相互启发、收集资料、团队协作开发一个趣味性、实用性的小系统。

大作业从三个方面给定成绩:一是系统的整体评价;二是团队分工;三是团队成员各自答辩情况。

成绩给定之一:系统的整体评价包括科学正确性、趣味性/适用性、界面的清晰性。成绩给定之二:根据团队的分工,评价团队各成员的工作量。成绩给定之三:团队成员各自的答辩情况加入各自的成绩。

(4)期末无纸化考试

为对学习结果进行公正的考核,且激发学生对C语言的热爱,我们用C语言编写了一个无纸化考试系统,并让学生观摩编制考试系统中的主要算法。考试系统的中的试题均为编程题目,按照实验教学大纲的知识模块将试题划分成几个组,每个组中的题目难度相当,考试系统从每个组中抽取一道编程题目,随机组成程序设计试卷。

考试过程中,为保证公正,避免学生考试上网查阅资料,使用E-learning系统控制学生,禁止其使用电脑的浏览器、U盘。

考试成绩从三个方面给定:一是程序结果,单纯地考核程序运行的正确性;二是程序设计思路;三是理论基础知识。

5.结束语

本考核体系应用于本学院15级数字媒体专业,将考核贯穿于整个学习过程中,调动了学生学习的兴趣,学生的实践能力和创新能力得到了一定的提升,能更公正地评价学生的综合能力,学生也表现出了对该门课程的热情和自信,本考核体系得到了学生的一致认可。

参考文献:

[1]王丽娜,吕红,张杰,任颖.《计算机程序设计实验》课程的教学改革与实践.计算机工程与科学.2014年.第A1期.

C语言扫雷源代码 第5篇

/*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08 struct { int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/ int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/ }Mine[10][10];

int gameAGAIN=0;/*是否重来的变量*/ int gamePLAY=0;/*是否是第一次玩游戏的标志*/ int mineNUM;/*统计处理过的格子数*/ char randmineNUM[3];/*显示数字的字符串*/

int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16];

void MouseMath()/*计算鼠标的样子*/ {int i,j,jj,k;long UpNum[16]={ 0x3fff,0x1fff,0x0fff,0x07ff, 0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x00ff,0x01ff,0x10ff, 0x30ff,0xf87f,0xf87f,0xfc3f };long DownNum[16]={ 0x0000,0x7c00,0x6000,0x7000, 0x7800,0x7c00,0x7e00,0x7f00, 0x7f80,0x7e00,0x7c00,0x4600, 0x0600,0x0300,0x0300,0x0180 };for(i=0;i<16;i++){ j=jj=15;while(UpNum[i]!=0){ up[i][j]=UpNum[i]%2;j--;UpNum[i]/=2;} while(DownNum[i]!=0){ down[i][jj--]=DownNum[i]%2;DownNum[i]/=2;} for(k=j;k>=0;k--)up[i][k]=0;for(k=jj;k>=0;k--)down[i][k]=0;for(k=0;k<16;k++)/*四种组合方式*/ { if(up[i][k]==0&&down[i][k]==0)mouse_draw[i][k]=1;else if(up[i][k]==0&&down[i][k]==1)mouse_draw[i][k]=2;else if(up[i][k]==1&&down[i][k]==0)mouse_draw[i][k]=3;else mouse_draw[i][k]=4;} } mouse_draw[1][2]=4;/*特殊点*/ }

void Init(void);/*图形驱动*/ void MouseOn(int,int);/*鼠标光标显示*/ void MouseOff(void);/*鼠标光标隐藏*/ void MouseSetXY(int,int);/*设置当前位置*/ int LeftPress(void);/*左键按下*/ int RightPress(void);/*鼠标右键按下*/ int MiddlePress();void MouseGetXY(void);/*得到当前位置*/ int MouseStatus();void Control(void);/*游戏开始,重新,关闭*/ void GameBegain(void);/*游戏开始画面*/ void DrawSmile(void);/*画笑脸*/ void DrawRedflag(int,int);/*显示红旗*/ void DrawEmpty(int,int,int,int);/*两种空格子的显示*/ void GameOver(void);/*游戏结束*/ void GameWin(void);/*显示胜利*/ int MineStatistics(int,int);/*统计每个格子周围的雷数*/ int ShowWhite(int,int);/*显示无雷区的空白部分*/ void GamePlay(void);/*游戏过程*/ void Close(void);/*图形关闭*/

void main(void){ Init();MouseMath();//MouseOn(MouseX,MouseY);Control();Close();}

void Init(void)/*图形开始*/ { int gd=DETECT,gm;registerbgidriver(EGAVGA_driver);initgraph(&gd,&gm,“");} void Close(void)/*图形关闭*/ { closegraph();} /*鼠标光标显示*/ void MouseOn(int x,int y){ int i,j;int color;

for(i=0;i<16;i++)/*画鼠标*/ { for(j=0;j<16;j++){ pixel_save[i][j]=getpixel(x+j,y+i);/*保存原来的颜色*/ if(mouse_draw[i][j]==1)putpixel(x+j,y+i,0);else if(mouse_draw[i][j]==2)putpixel(x+j,y+i,15);} } } /*隐藏鼠标*/ void MouseOff(){ int i,j,x,y,color;x=MouseX;y=MouseY;for(i=0;i<16;i++)/*原位置异或消去*/ for(j=0;j<16;j++){ if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)continue;color=getpixel(x+j,y+i);putpixel(x+j,y+i,color^color);putpixel(x+j,y+i,pixel_save[i][j]);} } void MouseSetXY(int x,int y)/*设置当前位置*/ { _CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);} int LeftPress(void)/*鼠标左键按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&1);} int RightPress(void)/*鼠标右键按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&2);} /*是否按下中键

返回值同上 */ int MiddlePress(){ _AX=0x03;geninterrupt(0x33);return(_BX&4);} void MouseGetXY(void)/*得到当前位置*/ { _AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;} /*鼠标按键情况,返回0表示只移动,返回1表示左右键同时按下,2表示只按了左键,3表示只按了右键*/

int MouseStatus(){ int x,y;int status;int press=0;

int i,j,color;status=0;/*默认鼠标没有移动*/

x=MouseX;y=MouseY;

while(x==MouseX&&y==MouseY&&status==0&&press==0){ if(LeftPress()&&RightPress())press=1;else if(LeftPress())press=2;else if(RightPress())press=3;MouseGetXY();if(MouseX!=x||MouseY!=y)status=1;} if(status)/*移动情况才重新显示鼠标*/ { for(i=0;i<16;i++)/*原位置异或消去*/ for(j=0;j<16;j++){ if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)continue;color=getpixel(x+j,y+i);putpixel(x+j,y+i,color^color);putpixel(x+j,y+i,pixel_save[i][j]);} MouseOn(MouseX,MouseY);/*新位置显示*/ } if(press!=0)/*有按键的情况*/ return press;return 0;/*只移动的情况*/ }

void Control(void)/*游戏开始,重新,关闭*/ { int gameFLAG=1;/*游戏失败后判断是否重新开始的标志*/ while(1){ MouseStatus();if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/ {

GameBegain();/*游戏初始画面*/ GamePlay();/*具体游戏*/ if(gameAGAIN==1)/*游戏中重新开始*/ { gameAGAIN=0;continue;} }

gameFLAG=0;if(LeftPress())/*判断是否重新开始*/ { if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){ gameFLAG=1;continue;} } if(kbhit())/*判断是否按键退出*/ break;} } void DrawSmile(void)/*画笑脸*/ { MouseOff();setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/ fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/ bar(287,80,293,81);MouseGetXY();MouseOn(MouseX,MouseY);} void DrawRedflag(int i,int j)/*显示红旗*/ { MouseOff();setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);MouseGetXY();MouseOn(MouseX,MouseY);} void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/ { MouseOff();setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*没有单击过的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);else if(mode==1)/*单击过后显示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);MouseGetXY();MouseOn(MouseX,MouseY);} void GameBegain(void)/*游戏开始画面*/ { int i,j;cleardevice();if(gamePLAY!=1){ MouseSetXY(290,70);/*鼠标一开始的位置,并作为它的初始坐标*/ MouseX=290;MouseY=70;} gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/ mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*画格子*/ for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*画脸*/ randomize();for(i=0;i<10;i++)/*100个格子随机赋值有没有地雷*/ for(j=0;j<10;j++){ Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/ if(Mine[i][j].num==1)mineNUM++;/*现有雷数加1*/ else Mine[i][j].num=2;Mine[i][j].flag=0;/*表示没红旗标志*/ } sprintf(randmineNUM,”%d“,mineNUM);/*显示这次总共有多少雷数*/ setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*变量取空白格数量*/ } void GameOver(void)/*游戏结束画面*/ { int i,j;setcolor(0);for(i=0;i<10;i++)for(j=0;j<10;j++)if(Mine[i][j].num==1)/*显示所有的地雷*/ {

DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);MouseOff();fillellipse(200+j*20,100+i*20,7,7);

MouseGetXY();MouseOn(MouseX,MouseY);} } void GameWin(void)/*显示胜利*/ { setcolor(11);settextstyle(0,0,2);outtextxy(230,30,”YOU WIN!“);} int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/ { int nNUM=0;if(i==0&&j==0)/*左上角格子的统计*/ { if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;} else if(i==0&&j==9)/*右上角格子的统计*/ { if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1)nNUM++;if(Mine[1][8].num==1)nNUM++;} else if(i==9&&j==0)/*左下角格子的统计*/ { if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;} else if(i==9&&j==9)/*右下角格子的统计*/ { if(Mine[9][8].num==1)nNUM++;if(Mine[8][9].num==1)nNUM++;if(Mine[8][8].num==1)nNUM++;} else if(j==0)/*左边第一列格子的统计*/ { if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(j==9)/*右边第一列格子的统计*/ { if(Mine[i][j-1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的统计*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(i==9)/*最后一行格子的统计*/ { if(Mine[i-1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;} else/*普通格子的统计*/ { if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;} return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/ } int ShowWhite(int i,int j)/*显示无雷区的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/ return;mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/ { DrawEmpty(i,j,1,7);

Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*输出雷数*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);MouseOff();outtextxy(195+j*20,95+i*20,randmineNUM);MouseGetXY();MouseOn(MouseX,MouseY);Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/ return;} /*8个方向递归显示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戏过程*/ { int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/ while(!kbhit()){ MouseStatus();if(LeftPress())/*鼠标左键盘按下*/ {

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/ {

gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/ { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/ if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/ continue;if(Mine[i][j].num!=0)/*如果格子没有处理过*/ { if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/ {

GameOver();/*游戏失败*/ break;} else/*鼠标按下的格子不是地雷*/ {

Num=MineStatistics(i,j);if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/ ShowWhite(i,j);else/*按下格子周围有地雷*/ { MouseOff();sprintf(randmineNUM,”%d",Num);/*输出当前格子周围的雷数*/ setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);mineNUM--;

MouseGetXY();MouseOn(MouseX,MouseY);}

Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/ if(mineNUM<1)/*胜利了*/ { GameWin();break;} } } } } if(RightPress())/*鼠标右键键盘按下*/ {

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/ { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/

C语言程序设计实验指导及报告 第6篇

C语言程序设计课程 实验报告

专业班级

指导教师

C语言程序设计 实验指导及报告

实验说明:

1、共4次实验,每次实验完成1个内容。

2、实验报告命名统一为:C语言_专业班级_学号_姓名

3、自备U盘,在实验前认真阅读实验要求,在实验中及时记录保存实验结果和调试过程,并填写到实验报告对应位置,实验结束后将该实验报告电子版在指定时间内提交给各班学习委员。

实验一

C语言开发工具VC6.0和顺序结构程序设计

1、实验目的:熟练掌握VC6.0开发工具进行程序设计及调试,能编写简单的C程序并完成调试。

2、实验内容1:结合课堂讲授学习VC6.0开发工具及调试方法。

单文件编辑运行方法:

打开VC++6.0,如图1所示

(图1)

选择“文件”→“新建”,打开如图2所示

(图2)

选择“文件”项,如图3所示

(图3)

选择“C++ Source File”项,并在“文件名”项目下输入“sum.c”如图4所示

(图4)

单击“确定”,打开如图5所示

(图5)

输入如上源代码,如图6所示

(图6)

选择“组建”→“编译”(或按Ctrl+F7组合键),打开如图7所示

(图7)

在下端的输出窗口会有错误和警告的提示,如果没有错误选择“组建”→“执行”(或按Ctrl+F5组合键)即可出现运行结果,如图8所示

(图8)

程序调试常用方法:

检查错误:

用鼠标单击调试信息窗口中右侧的向上箭头,可以看到出错的位置和性质, 进行改错时, 双击调试信息窗口中的报错行, 这时在程序窗口中出现一个粗箭头指向被报错的程序行,一般在箭头的当前行或上一行,可以找到出错语句。

修改错误后必须重新进行编译链接。从第一个错误开始修改,每修改一个错误就重新进行编译链接。

设置断点、单步跟踪、查看变量等,详细使用方法见下:

按快捷键F5或点击以下图片上标记的图标进入调试模式。

打开调试工具条,一般情况下当你按F5键后会自动弹出,如果没有弹出的话,右击工具栏空白处,会弹出下图,选中调试,就会出现调试工具条。

接下来,在监视窗口中添加你要监视数据变化的变量。

按F11逐语句的调试代码,如果某一语句是一函数,你不希望进入该函数时,F10逐过程来查看,在代码的调试过程中,通过监视窗口查看变量值的变化,从而确定代码是否有问题。

如果希望跳出某一函数时,按快捷键Shift+F11,或者直接点击调试工具条上的按钮就可以跳出该函数了。

如果只是希望调试某一部分代码的话,可以设置断点来调试,调试方法如上,只是在要调试的代码之间用断点来分开。设置断点时,光标放在你要设置断点的那行,按F9或点击编译微型条上面的类似手状的按钮即可。

3、实验内容2:以下程序有错误,请调试改正错误,使之能正常运行。

程序:

/* 登陆密码三次验证程序*/ #include void mian(void){ int nPwd=0;

/* 用于保存输入的密码*/ int i;

/*循环控制变量*/ int nFlag=1

/*密码匹配成功的标志*/

for(i=0;((nFlag=(87569!= nPwd))&& i<3);++i)

{ /* 默认设定密码为87569,可以根据需要进行设定*/

printf(“please input the password:”);

scanf(“%d”,&nPwd);}

if(nFlag=0)

printf(“the password is right!n”);

else

printf(“over the times and the password you input is error!n ”);}

修改程序及运行结果:#include void main(void){ int nPwd=0;

/* 用于保存输入的密码*/ int i;

/*循环控制变量*/ int nFlag=1;

/*密码匹配成功的标志*/

for(i=0;((nFlag=(87569!= nPwd))&& i<3);++i)

{ /* 默认设定密码为87569,可以根据需要进行设定*/

printf(“please input the password:”);

scanf(“%d”,&nPwd);}

if(nFlag=0)

printf(“the password is right!n”);else

printf(“over the times and the password you input is error!n ”);}

4、实验内容3:习题第三章第1题:假如国民生产总值的年增长率为9%,计算10年后国民生产总值与现在相比增长多少百分比,计算公式为

p(1r)n

r为年增长率,n为年数,p为与现在相比的倍数。源程序及运行

5、实验总结

实验二

选择结构和循环结构

1、实验目的:理解和掌握选择结构和循环结构的语法知识,理解自顶向下、逐步细化的结构化程序设计思想,并能熟练应用。

2、实验内容1:习题第四章第4题:有3个整数a,b,c,由键盘输入,输出其中最大的数。源程序及运行结果:

3、实验内容2:习题第五章第8题:输出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各数字立方和等于该数本身。如:153是一个水仙花数153=13+53+33。源程序及运行结果

4、附加内容(非必做,供学有余力的同学):习题第五章第17题:两个乒乓球队进行比赛,各出3人,甲队为A,B,C,乙队为X,Y,Z。已抽签决定比赛名单,有人向队员打听比赛名单,A说他不和X比,C说他不和X,Z比,请编程找出比赛名单。源程序及运行结果:

5、实验总结

实验三

数组和函数

1、实验目的:理解和掌握数组和函数的语法知识,理解模块化编程思想,并能熟练应用。

2、实验内容1:习题第六章第3题:求一个3  3的整型矩阵对角线元素之和。源程序及运行结果:

3、实验内容2:习题第七章第3题:写一个判断素数的函数,在主函数中输入一个整数,输出是否为素数的信息。源程序及运行结果:

4、附加内容(非必做,供学有余力的同学):习题第六章第2题:用选择法对10个整数排序。

源程序及运行结果:

5、实验总结

实验四

指针和结构体

1、实验目的:理解和掌握指针和结构体的语法知识,并能熟练应用。

2、实验内容1:习题第八章第1题:输入3个整数,按由小到大的顺序输出。源程序及运行结果:

3、实验内容2:习题第九章第5题:有10个学生,每个学生的数据包括学号,姓名,3门课程的成绩,从键盘输入10个学生的数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课程成绩,平均分数)。源程序及运行#include #include #define SIZE 10

struct student{ char id[20];char name[20];int score[3];float average;} stud[SIZE];

void input()/* 输入学生的信息 */ { int i;

for(i=0;i

{

printf(“第%d个学生的信息:n”,i+1);scanf(“%s%s%d%d%d”,stud[i].id,stud[i].name,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);stud[i].average=(stud[i].score[0]+stud[i].score[1]+stud[i].score[2])/3.0;} }

void output()/* 输出学生的信息 */ { int i;

printf(“n”);for(i=0;i

void sortput()/* 排序输出最高分的学生信息 */ { int i,j;struct student temp;

for(i=0;i

void main(){ input();

output();sortput();} 结果:

4、附加内容(非必做,供学有余力的同学):习题第八章第6题:写一个函数,求一个字符串的长度,在主函数中输入字符串,并输出长度。源程序及运行结果:

C语言程序设计扫雷游戏实验报告 第7篇

班级:机械09-2学号: 0901010205姓名:某某某

一实验目的和要点(简单描述实验目的和知识要点)

定义变量、变量赋值、符号常量、使用算数运算符、转换规则、赋值语句

二 实验范例阅读(写出预测的范例程序运行结果,上机验证)

范例1 运行结果:

xxxxxxx …….范例2运行结果:

xxxxxxx …….范例3运行结果:

xxxxxxx …….三 实验练习程序设计(写出程序代码)

练习3(4)、4

题目一 程序代码

#include

……………

题目二 程序代码

#include

……………

C语言程序设计扫雷游戏实验报告 第8篇

关键词:Scratch,图形化,C语言程序设计数组循环

国外开展计算机编程时, 早已将Scratch作为中小学生入门软件, 即便是大学生也是同样学习Scratch软件, 在中国中小学中才刚刚兴起, 但是在大学里普及不够, 作为一款计算机编程的图形化入门软件, 对于帮助大学生学习C语言程序设计有很大的帮助。因此我将其作为C语言教学的辅助软件, 尤其在讲解变量、数组、选择和循环等知识点时, 收到了很好的效果, 并想与同行们一起分享这些收获。

1 变量

现在的学生都喜欢打游戏升级刷分数, 那我就通过游戏中的分数变化来讲解变量是怎么回事。先定义一个变量scores来存放分数, 设置初值为0分, 每多买一个水果、蔬菜 (简称果蔬) 就加分, 不同的果蔬的分值不一样, 这样通过购买不同的果蔬增加不同的分数, 通过分数的增加变成新值, 最后通过购买了5个果蔬之后分数累计到了60分的过程, 来给演示所谓的变量变化的过程 (见图1) 。原来就是在游戏 (程序) 运行过程中, 随着判断条件不断变化而变化的量 (变量名是代号而已) 。这样学生很容易接受这样的演示和说明, 除此之外, 我还列举了people_size、interval、speed、sizeofarrow来讲解有关变量的内容。

2 数组

通过对游戏中的有序存放果蔬购物车来演示数组是如何实现的, 尽管其实Scratch中使用的是链表来实现类似数组, 我这里的元素都是果蔬的名称 (字符串) , 从图1可以看出, 每放入一个果蔬shoppingbox, 则都会运行“将potato加入链表shoppingbox”这样的操作, 其实是增加数组元素的操作, shoppingbox内容增加一个果蔬名称, 数组长度从0到5的变化过程, 来描述数组如何有序存放数据元素, 来形象阐述数组这个概念和作用, 包括访问和使用这些元素, 以及加入、获取和删除相应位置的元素值的功能。

3 选择结构

选择结构就是根据判断逻辑条件的“真”、“假”, 来决定执行哪个分支的语句。其实重要的在于逻辑条件的选择上, 可以是判断算术表达式、逻辑表达式、比较表达式等, 但是结果必须是非真即假, C语言中表示选择结构的语句有if、if...else、switch语句, 以及它们之间可以嵌套使用。庆幸的是, 在Scratch中判断条件的类型很多, 比如两个对象是否碰到、是否碰到红色或蓝色等、或是否距离某个对象的距离范围和是否碰到边缘都成为了选择结构的判断类型, 这使得学生在逻辑判断条件类型上的理解更加深入, 扩展学生对逻辑判断条件的认识的范围。如图2中, 小蓝人碰到蓝色1次score扣1分, 如果scores为0分, 则游戏结束, 否则碰到红旗, 则胜利, 这个是对if的使用;小黄人, 如果碰到淡绿色就向左 (-90) 的方向移动, 否则接收到street2home广播再向右 (90) 移动, 这也是if...else的使用。

4 循环结构

循环结构其实就是判断条件满足为真的情况下, 不断执行循环体的语句, 直到条件不满足为假时退出循环, 执行下面的语句, 这是正常的过程, 对于特殊情况会在循环体内, 再满足另外条件式, 强行退出循环。C语言表示循环结构的语句有while、do...while和for语句三种。Scratch中也是这几种基本的语句, 但是判断条件却和选择结构一样的类型丰富。通过图2, 我们可以看到可以无条件也可以有条件的重复执行块内的顺序和选择结构的语句, 例如小蓝人, 再碰到小红旗之前可以一直跟随鼠标坐标移动, 直到碰到小红旗游戏才结束, 小黄人则无条件的一直移动, 或是循环结构使得造型lion1-a和lion1-b相互切换, 实现小动物跑动的动作, 通过游戏演示, 学生们能够很容易的掌握循环的概念和用法。

5 结论

通过使用Scratch软件设计游戏的方式, 来讲解C语言程序设计中变量、数组、选择和循环结构的概念和作用。用Scratch游戏中的得分scores、shoppingbox、检测是否碰到对象或颜色、实现小动物的跑动动作等形式, 来演示和阐述, 使得学生对上述知识点获得由浅入深的理解, 提高了他们学习C语言程序设计的积极性, 也得到了良好的教学效果, 我建议讲授C语言程序设计的教师都可以尝试一下这种方式, 相信会给你带来一些帮助的。

参考文献

上一篇:兴趣小组组建下一篇:优秀城市规划获奖提名项目