c程序设计实践报告

2022-10-20 版权声明 我要投稿

一份优质的报告,需要以总结性的语录、合理的格式,进行工作与学习内容的记录。想必你也正在为如何写好报告而发愁吧?以下是小编精心整理的《c程序设计实践报告》,欢迎大家借鉴与参考,希望对大家有所帮助!

第1篇:c程序设计实践报告

“C/C++语言程序设计”课程教学改革与实践

摘要:针对目前高校C语言程序设计课程教学的现状及存在的问题,结合课程组在国家级精品课程“C/C++语言程序设计”建设过程中的经验和收获,提出“以应用为前提,学生为主体,知识为主线,培养学生的实践动手能力为着力点”的教学理念,阐述如何构建一套教材体系完善、教学资源丰富、教学手段先进、教学评价合理、考核方式差异化的教学体系。

关键词:C/C++语言程序设计;教学改革;国家精品课程;教学方法

1 课程教学现状及存在问题

“C/C++语言程序设计”是理工科非计算机专业本科学生的第二门计算机课程,也是大学计算机基础系列课程的核心课程。“C/C++语言程序设计”课程的内容抽象,概念和语法规则较多,特别讲究适用技巧。长期以来,高校都在不断地探索和实践关于“C/C++语言程序设计”课程的教学改革,但仍然存在很多问题。例如,教学依然以传统教学方式为主,不能将实验环节与课堂教学环节很好地相互连贯,相互印证,使得理论教学和实践教学脱节;某些教师忽视学生的实践能力和创新能力的培养,使学生在分析问题和解决问题时无从下手,缺乏编程和调试的能力;实验教学中的多数实验内容是验证性的,学生机械式的运行程序,对知识的理解只停留在表面上;理论和实验课时数较少,上课信息量大,学生接受知识的进度不一样,这就导致教师和学生的学习步调不一致。

针对上述问题,许多高校对“C/C++语言程序设计”课程的教学作出了有益的探索,如文献[1]提出“通、实、新、联”的教学理念;文献[2]提出教学设计原理;文献[3]提出项目教学法;文献[4]提出案例教学法;文献[5]提出“机房授课+自主学习”的授课模式;文献[6]提出将“以应用为背景,以知识为主线,以提高能力和兴趣为目的,变应试为应用”的教学理念应用于该课程的教学中。这些方法均在一定程度上激发了学生的学习兴趣,增强了学生的动手能力,取得了较为明显的教学效果。

为了探究出适合成都理工大学人才培养的课程特点,“C/C++语言程序设计”课程组经过多年的课程建设和对教学环节的研究与探索,提出了“以应用为前提,学生为主体,知识为主线,培养学生的实践动手能力为着力点”的教学理念,构建了一套教材体系完善、教学资源丰富、教学手段先进、教学评价合理、考核方式差异化、精品课程网站新颖的教学体系。下面分别从教学设计、教学方法、教学手段、考核方式以及教学资源等方面进行阐述。

2 教学设计及课程内容组织

2.1教学设计

成都理工大学每年有4000名以上的学生参加“C/C++语言程序设计”课程学习。为实施因材施教,我们重视研究性学习、探究性学习、协作学习等现代教育理念在教学中的应用,根据课程内容和学生特征,对教学方法和教学评价进行设计,并在教学理念与教学设计上实施了多种改革举措。

1)以学生为中心的教学模式。

以学生为中心的教学模式让教师从传统的教学方式中解脱出来,变“教学”为“导学”。教师充分利用多种教学媒体和提示学习资源,讲重点、解难点、释疑点,讲评作业,指导学习方法,辅助小组学习,发挥学生的主体作用,引导学生自主学习,帮助学生培养自学能力。

教师要在理论课前了解学生是否掌握了与课程有关的基础知识和基本技能,根据学生在实验课的表现来了解学生是否掌握了教学目标中要求学会的知识和技能,以及掌握的程度等信息,从而确定后续教学中应重点讲解和辅导的知识,根据学生的实际情况设计教学环节。对于部分优秀学生和已经学习了程序设计的学生,我们要加快他们的学习进度,增加学习难度和深度,使他们可以很快在自己的专业中使用程序设计来解决相关问题。

2)精心准备每一节课,激发学生学习积极性。

激发学生对程序设计课程的学习兴趣,是本课程任务执行的重要目标。学生是主动学习还是被动学习会让教学效果产生明显的差别,因此每位教师都应精心准备每一节课。引领学生跨入程序设计大门的第一节课是极其重要的。学生所关心的是所学课程对自己的专业和今后的工作有什么作用,教师可从不同的专业角度,结合当前最热门的IT话题和实际应用为学生介绍学习本课程的意义和作用,同时介绍一些往届学生将所学程序设计知识用于数学建模、程序设计竞赛、专业课程学习等方面的生动实例,这些都是教师第一节课的良好素材。

3)培养学生系统化的程序设计思维。

程序设计课程长期存在着注重语句、语法和细节的特点,基本上是以程序设计语言自身的体系为脉络展开的。许多学生在学习程序设计语言课程时会觉得枯燥难学,学过后又不能用来解决实际问题。所以学生虽然学了一定的程序设计知识,但编程能力较差。‘部分学生在遇到实际问题依旧无从下手。而系统化程序设计思维培养模式是从本科生的认知特点出发,让教师在教授学生程序设计课程、提高学生编程能力的同时,培养学生的系统化程序设计思维。

程序设计课程不仅教学生如何进行计算机编程,而且教学生如何像程序员一样思考问题。系统化的程序设计思维的培养过程就是让学生自己动手解决实际问题的过程。这个过程充满了学生对未知问题的探索、研究与创新,不仅可以教会学生解决在程序设计中遇到的问题,而且可以锻炼思维,使学生的逻辑思维更加严密,这对一个理工科的大学生来说是至关重要的,对学生整体素质的提高、程序设计课程整体教学水平的提高都有现实意义。

4)互换角色思考与提问。

在教学过程中我们发现,很多学生不提问,有时是学生提不出问题,有时是不知该如何提问。这时,教师需要站在学生位置上,思考学生可能会有什么问题,然后由教师提出问题,让学生来回答。如果学生不能回答,教师再为学生解答。教师备课时不再只是准备我要讲什么,而是思考学生会遇到什么难点,需要向学生提什么问题、解答什么问题。基于此目的,教师需准备大量经典案例,提出问题,分析问题,并在问题中设置一些错误,让学生思考原因,并进一步思考如何修改错误,在这样的学习过程中潜移默化地掌握基本的语法知识和解决问题的方法。这种模式转变了学生的学习方式,激励学生积极思考问题、分析和解决问题。

2.2理论课程设计

由于科学技术的快速发展,计算机科学与其他学科间的交叉、融合日益增强。大多数非计算机专业的培养目标已将学生的计算机程序设计能力作为了一项重要内容。

本课程主要是针对非计算机专业的理工科一年级大学生开设的。与计算机专业不同的是,非计算机专业学生一般只学一门语言课程。因此,该课程的教学就担负起培养学生编程能力的重要责任,成为了学习其他程序设计语言的基础。

根据非计算机专业各学科的培养目标,“C/C++语言程序设计”课程在理论课程内容设计上注意知识结构的合理,强调基本能力的培养,注重基础理论与实际应用的融合。课程内容体系结构重点突出学以致用。课程内容知识结构由C语言简单程序的编写和调试、C语言程序设计基础、控制结构、数组、指针、函数、编译预处理与变量的存储类型、文件、结构体与共用体、图形程序设计基础、C++程序设计基础、查找和排序12部分组成。

根据学以致用的原则,在实际应用中,函数是程序设计的重要内容之一,也是学生学习的难点之一,因此在理论课程设计中,我们将函数的使用提前讲解,让学生尽早接触函数,理解模块化的设计方法,掌握函数的基本设计和操作。在讲授第2章有关输入/输出库函数时,可同时结合第8章文件的知识,使学生掌握实际问题中涉及不同数据的不同输入/输出方式,较好地解决了学生学习C语言后不能熟练掌握文件操作的问题。

教材在内容编排上注重易用性。每章的开头设置本章学习目标,之后设置本章学习指导,包含“课前思考”“本章难点”和“本章编程中容易出现的错误”。每章后的练习题涵盖了程序设计中的常见算法,涉及简单程序设计、较复杂程序设计、易于举一反三的程序设计问题等内容,使学生能够通过练习,大大地提高编程能力。

2.3实验课程设计

“C/C++语言程序设计”是一门实践性很强的课程。在近几年的课程建设与教学改革中,实验课程注重理论课程内容与实验内容的有机结合,强调学生创新能力和实际动手能力的培养。C/C++程序设计实验教学内容改变了以往验证性实验为主的现象,使设计性实验内容占了70%以上。通过实验,培养学生分析问题和解决问题的能力,以及动手能力和程序设计能力,从而加深对理论课程内容的理解。

实验课程配有实验指导书,共设计了11个实验项目和一个综合程序设计,其基本出发点是帮助学生理解和消化课堂教学的内容,培养学生自主学习能力,加强其实践能力和团队协作精神,让学生掌握程序设计的基本思想和方法。具体实验内容包括:C/C++简单程序的编写和调试、C语言程序设计基础、控制结构、数组、指针、函数、编译预处理、文件、结构体与共用体、图形程序设计、C++程序设计基础。

3 教学方法和手段

3.1教学方法

为了实现程序设计课程的教学目标,使学生不但掌握高级编程语言的知识、编程技术和基本算法,更要掌握程序设计的思想和方法,培养学生进行问题求解和编程的能力,以及探索和创新能力,我们采用了多种教学方法,主要做了以下改革。

1)课内与课外训练相结合,注重学生综合能力的培养。

课内教师根据教材进行引导学习,加强典型例题的启发式讲解。在分析常见错误案例的过程中,教师讲解程序设计的基本方法、程序测试方法以及程序调试和排错方法,帮助学生理解错误发生的原因和实质,掌握纠错的方法和解决的对策。在实验教学中,我们为每堂实验课设计相应的实验项目。实验项目的设计注重实用性和综合性。实践教学强调大量程序设计的训练。教师在网上为学生发布一些经典、实用、有一定挑战性的作业,鼓励学生课外多训练,倡导学生课后以寝室为单位,组成学习小组,进行讨论、分析和解决问题。

为了激励学生参与程序设计的实践,进一步提高学生程序设计的兴趣,提升他们的软件技术水平,成都理工大学每年举行一次全校范围的程序设计大赛。大赛采用初赛和决赛制,要求学生在2~4小时内完成一个综合性较强的程序设计题目,或在一段时间内完成一个综合程序设计题目,然后进行答辩。

2)重视实践教学环节、注重学生创新意识与应用能力的培养。

为了培养学生的实践动手能力,我们加强了实践教学环节的管理。教师要积极使用多媒体实验室的教学设备,进行启发、引导式的实验指导,将平时测试与期末测试结合,测试学生在1个小时内调试和正确编写程序的能力,引导和督促学生重视实践教学。开放性实验注重培养学生的创新意识与应用能力。

3)网站互动学习。

课程组建立的教学网站、精品课程网站、课程资源平台等为学生提供了网络课程、网上答疑、作业提交、理论试题及答案、上机试题及答案、教学录像、视频节目、精品课程网站链接、相关学习网站链接等资源,扩充了课堂教学区域。学生可以在任何时候、任何地点进行互动学习。这种方法及时地解决了学生在学习中遇到的疑难问题。

4)改革考核方式,采用多元评价方式考核实验成绩。

为了提高学生的学习兴趣,培养学生问题求解和编程能力,以及探索和创新能力,我们采用了开卷和闭卷相结合的考试方式,鼓励基础好的学生开卷考试,完成一个综合编程题目。经过实践,参加开卷考试的学生在独立分析问题、解决问题和编程能力上得到了很大提高。

3.2教学手段

多年以来,成都理工大学“C/C++语言程序设计”课程最大限度地、多方位地应用了以下现代教育技术手段。

1)课堂多媒体理论教学。

本课程的理论教学将传统教学手段和现代教育技术手段相结合,在应用现代教育技术手段的同时,继续发挥传统教学的优势。课堂上多媒体课件的播放效果直接影响到学生的听课效果,因此我们不仅制作了幻灯片,还利用Autherware、Flash等工具,制作了具有较强动画效果的多媒体课件,将程序的执行过程利用动画演示,生动、形象地模拟了计算机执行程序的真实情况。

2)建立计算机基础教学网站。

我们开发课程网上教学平台,为学生提供电子教案、多媒体课件、视频等丰富的网上教学资源,同时提供讨论和在线答疑,构建以学生为中心的自主学习环境。

3)网上考试系统。

网上考试系统为学生提供了模拟和考试环境,实现了系统自动组卷和评分功能,为学生课后自学和自测、提高教学效果搭建了一个有效的平台。

4 考核方式

课程考核可以采用开卷和闭卷2种形式。

1)闭卷考试由笔试和机试组成。

(1)笔试(占总成绩的50%)主要考核语言基础、基本的阅读和编写程序的能力。题型包括选择题、填空题、程序阅读题和程序填空题。

(2)机试(占总成绩50%)主要考核程序设计能力,包括上机考试(占总成绩的30%)和平时出勤及作业完成情况(占总成绩的20%)。

2)开卷考试主要考核学生综合程序设计的能力,独立分析问题和解决问题的能力,难度较大。通常只有学习优秀的学生可以参加开卷考试。这些学生必须是按时完成了每一次的实验项目,且中期考试合格。开卷考试要求学生提供源程序、开卷考试报告并参加面试。

5 结语

通过对各种教学方法和教学手段的研究和探索,我们改变了传统的知识传授理念,从而更加注重学生解决实际问题的能力,并提出“以学生为主体,教师为引导,网络教学为辅助”的全新理念,极大地激发了学生的学习兴趣,挖掘了学生的创造潜能,又培养了他们自主研究、协作学习的能力。实践证明,通过上述教学改革措施,教学效果取得了显著提高。在计算机二级c语言考试中,学生通过率较往年大大提升。当然,实际教学过程是一个相当复杂的系统,也还存在着一些需要解决的问题,还需要我们在今后的实践中继续开拓,不断探索。

参考文献:

[1]赵珊,贾宗璞,“C语言程序设计”课程教学模式改革方案探讨[J],科技资讯,2011(35):185-187。

[2]黄群,C语言程序设计课程教学设计探讨[J],计算机教育,2010(5):78-81。

[3]陈洪超,项目教学法在“C语言程序设计”课程中的应用[J],重庆电力高等专科学校学报,2012,17(3):29-30,36。

[4]左永文,案例教学法在“C语言程序设计”课程中的应用[J],科技创新导报,2012(18):175-175。

[5]陈刚,朱晓燕,江汉大学“C语言程序设计”课程教学改革[J],计算机光盘软件与应用,2012(7):245-246。

[6]李敏杰,吕橙,王雅杰,“C语言程序设计基础”的教学改革与实践[J],现代计算机:专业版,2012(8):45-49。

(见习编辑:刘丽丽)

作者:鲁红英 肖思和 孙淑霞

第2篇:C语言程序设计教学探索与实践

摘要:围绕着如何提高C语言程序设计课程的教学效果,就C语言程序设计课程教学中存在的问题和现象进行分析,从教师和学生两个方面,提出解决问题的对策和措施方案,倡导“教师主导,学生为主体”的教学观念,采用启发式教学方法。

关键词:C语言程序设计;以应用为本位;启发式教学

C语言功能丰富,应用面广,当下,很多高校依然把C语言作为非计算机专业学生的一门通识平台课开设。然而,在C语言课程的开设过程中,教师和学生不同程度地存在着缺位和误区,教与学的效果不尽如人意。在C语言的教学过程中,不少任课教师因循守旧,教学目标不清,教学方法单一,教学观念陈旧,使C语言的课堂蜕化为单纯的语法规则的灌输,使C语言的学习变为简单的语法知识的学习,学生普遍反映难学厌学。C语言程序设计课程一般面向的都是大学一年级的新生,他们刚刚结束高中生活步入大学校园,对一切充满了新鲜感和不适应感,学习观念、学习目的和学习方法有待转变和调整,学习的主体意识和自觉性有待增强和提高。针对这些问题和现象,笔者在自己的教学过程中进行一些了探索和实践,取得了一定的效果。

1 教师自觉转变教学观念,提高自身素质

纵观C语言程序设计课程的教学,现在最典型影响面最大的教学模式就是由教师和学生构成一个教学体,教师在讲台上自我表演,学生充当看客或听众【1】。所谓知识也好、信息也好,都是一个从教师到学生的单向流动。在这种以教师为主导、以教材为核心、以课堂为中心的教学模式下,教学蜕化成为一种单纯的知识传授,学生学习的积极性和主动性的调动,学生创新能力和创新思维的培养,都无从谈起。面对这样的现状和背景,教师教学观念的转变和自身素质的提高显得尤为重要。本着对学生负责,对学校负责的态度,教师应在自身责任感的驱使下,主动了解先进的教育思想和教学理念,像教学互动性、学生主体性和知识建构性等等;认真思考大学教育的功能,比如授人以鱼还是授人以渔;结合教学实际,转变教学观念,改变传统的教与学的地位,由过去的“以教师为中心”转变为“教师主导,以学生为主体”,营造民主的教学氛围;改变课堂老师单向灌输、学生被动听讲的授课模式,引入多元化的教学方法,比如启发式,探究式,引导学生独立思考,鼓励学生主动参与学习。

2 引导学生转变学习观念,培养学生学习的主体意识

C语言程序设计课程的开设面对的多数是大学一年级的新生,而对于刚入校的大学生来说,受中学养成的学习习惯的影响,学习的自主意识淡薄,学习还习惯性地全部寄托在老师身上,对老师的依附心理严重。同时,面对大学里比中学多得多的自由学习时间不知如何有效地管理和支配,对新的学习环境和新的学习生活有不同程度的不适应和困惑。面对这样一个处在比较特殊阶段的学生群体,承担C语言程序设计课程的任课教师要有针对性对学生进行引导和管理。首先,任课教师从一开始就让学生明确一个观点,即C语言是学生自己学会的,而不是老师教会的。俗话说,“师傅领进门,修行在个人”,尽管教师的教在教学活动中起着主导作用,但更重要的是学生的学,学习的主体是学生本人,只有学生充分发挥自己学习的自觉性和主动性,教师的教学思想才能得到很好地贯彻,教学效果才能得到很大的提高,整个学习活动也才会成功。其次,强化学生的责任意识。对绝大多数学生来说,如果单从年龄判断,步入大学校园也往往意味着步入成年人的行列。而成年人也就意味着要对自己负完全责任了。教师在教学过程中要不断强化学生对这一点变化的认知,让他们知道要对自己负责,对自己的学习负责,而不应再完全依赖教师或家长的监督。最后,教师的指导和管理。学习观念的转变,新的学习习惯的养成,不是一蹴而就的事情,需要在实际的学习活动中逐步完成。课前的预习、课堂的参与、课后的作业、实验的完成、期末的考试等是C语言教学活动不可或缺的环节,每一个环节里需要学生完成的任务,任课教师从一开始都给出一个明确的要求并严格按照要求去管理,将大大有益于转变学生的学习观念,培养学生学习的主体意识。

3 激发学生的学习兴趣,调动学生学习的积极性

在C语言程序设计课程的教学过程中,往往有学生反映C语言比较抽象,课堂教学又枯燥无味,很容易丧失学习的兴趣和热情。如何激发学生学习C语言的兴趣并始终保有这种兴趣,也常常是教授C语言课程的老师很头疼且又不能回避的问题。“兴趣是最好的老师”,每位教师都深知学生的学习兴趣对教学活动成功的重要性,但C语言程序设计课程侧重思维训练的特点又决定了在这方面留给任课教师的空间是有限的。笔者在自己的教学实践中做了一些尝试。

1)演示典型的完整的C语言应用,培养学生的学习兴趣

学生在学习C语言程序设计课程之初,对该门课程的学习目的和学习目标多数是模糊的,对C语言的认识也多半是空白,任课教师适当的引导很容易引起学生学习的兴趣和探究的欲望,因此该门课程的开篇很重要。笔者摒弃了以往通过文字抽象地介绍C语言的产生、C语言的特点和C语言的应用的做法,直接从演示典型的完整的C语言的应用开始。演示的程序有难有易,涉及的范围涵盖实际生活中的应用、有趣的数学问题、图形动画、游戏等。笔者一度选择了图书管理系统、文本编辑器、学生成绩管理系统、兔子产子问题、百钱百鸡问题、图形时钟、扑克牌的自动发牌、猜数游戏、五子棋游戏等应用,引起了学生浓厚的学习兴趣。

2)营造轻松的学习氛围,创造愉快的学习体验,强化学生的学习兴趣

要引起学生对C语言一时的兴趣不是一件难事,但要让学生在整个C语言程序设计课程的教学过程中始终抱有这样的学习兴趣就不是一件易事了。哪位任课教师做到了这一点,他的教学活动无疑就是成功的。C语言比较抽象,课堂教学容易枯燥无味,是一个不争的事实。为此,在实际的教学活动中,选择难易适中贴近生活的问题,比如利息的计算、持有的股票价值的计算、学生成绩的管理、募捐活动的模拟等;涉及C语言的语法特性时,尽量使用生活化的直白的语言,少用专业术语;课堂教学的开展过程中鼓励学生积极参与,对学生提出的任何有意义的问题都及时地给予肯定;面对问题,对学生做出的任何有价值的回答都及时地给予表扬,都有助于营造轻松的学习氛围,有助于让学生体验到成功的欢乐,有一种成就感,有助于强化学生学习的学习兴趣和热情。

4 践行以应用为本位的教学思路,有选择性地采用以知识为本位的教学思路

C语言程序设计课堂教学的组织有两种思路两种模式。一种是以知识为本位的教学思路下形成的“建筑模式” 【2】,课堂教学以讲授语法为主,先是提出语法概念,然后解释该语法概念,最后举例说明其应用,强调先系统学习理论打下宽厚的理论基础,然后再进行应用,讲究的是理论的系统性与严密性。另一种是以应用能力为本位的教学思路下形成的“生物模式”,课堂教学以程序设计为中心,以编程为目的,从应用的角度切入,先是提出问题,然后引导学生分析解决问题,最后着重介绍涉及的C语言的语法特性,强调结合应用学习必要的理论知识,随着应用的展开,编程难度的逐步提高,算法和语法的学习同步趋向深入,有利于学生能力的培养。

C语言系人工设定的具有确定内涵的概念和知识体系[3],同时C语言程序设计又是一门实践性很强的学科。为此,在C语言程序设计课堂教学的组织上,笔者始终践行以应用为本位的教学思路,同时根据课程内容的特点有选择性采用以知识为本位的教学思路,比如C语言中的基本数据类型、运算符和表达式、文件等基本概念和语法知识,在教学中只需把规定的内容阐述清楚,使学生理解并接受,同时又不破坏这些理论知识的系统性,就适宜采用以知识为本位的教学思路。

5 根据课程内容特征,选择灵活多样的教学方法

教学方法是在教学过程中,教师为了实现教学目的、完成教学任务而采取的教与学相互作用的活动方式的总称。C语言程序设计课程的教学目的是使学生掌握用C语言进行程序设计的基本思想和方法,并具有灵活应用这些思想和方法分析解决实际问题的能力。实现这一教学目的要完成的教学任务包括C语言基本语法的介绍,结构化、模块化程序设计思想和方法的引入,基本程序设计训练以及程序调试方法的演示等。面对这些多样的教学目标和任务,灵活多样的教学方法的选择和恰当应用成为必须。笔者在自己的教学实践中,结合课程内容的特点,有选择性地应用了如下的教学方法。

1)启发式教学,引导学生思考,在应用中学习。

在C语言程序设计的课堂教学中,根据课程内容的特点,精心设计任务或场景,引导学生发现问题、思考问题,使学生在启发诱导下获取知识,解决学习中的疑难问题。比如,在引入数组时,笔者设计了这样一个任务,即编写一个C语言成绩管理程序,要求能够统计出学生C语言成绩的平均分、最高分、最低分以及各个分数段的人数(为了说明问题的方便,假设当前要处理的有10个学生的成绩)。第一步,引导学生描述出10个学生的成绩。根据之前的学习经验,学生很容易想到用10个float类型的简单变量表示,比如score1,score2,、、、,score10。第二步,为节省时间,直接给出用这10个相互独立的简单变量实现的程序,引导学生观察。在学生感叹程序复杂之余,带领学生读程序,引导学生发现,当前的程序无论是成绩的录入、求学生成绩的最高分、最低分,还是统计各个分数段的人数,对每位学生成绩的处理方法都是一样的,存在大量的相似的操作。同时提出问题,这些相似的操作能不能用循环结构描述和实现,让学生思考。诱导学生分析发现,要想用循环结构描述这些相似的操作,学生成绩的描述必须有一个统一的表示方法。适时地给出score[i]这一表示方法,指出让i从0到9变化表示10个学生的成绩,和学生一块用该表示形式改写之前程序的关键部分。让学生比较改写前后的两个程序,很容易得出结论,用score[i]描述批量数据,方便和循环结合起来使用,数据的处理更为有效。最后指出score[i]这一描述形式就是数组,接下来介绍数组的定义完善改写后的程序。

和学生一块模拟执行该程序,由之前的知识积累学生知道,形参m、n和实参a、b对应的是不同的存储单元,m、n和temp是自动变量,从变量的作用域和生存周期的角度,容易得出一个让学生意外的结论,该swap函数中形参m、n值的交换影响不到实参a、b。在学生诧异之余,启发学生思考,诱导学生尝试给出不同的解决方法。往往有学生提出定义a、b为全局变量,诚然这不失为一种解决方法,在鼓励学生的同时,再次诱导学生发现问题的关键并在此基础上找解决方法。和学生一块梳理思路,发现swap函数中形参m、n值的交换传递不到实参a、b,一方面是因为彼此对应的是不同的存储单元,另一方面是由于变量的作用域和生存周期的问题。学生提出的定义a、b为全局变量的解决方法显然是从后者考虑的,现在有意识地诱导学生只从前者考虑,让学生大胆假设在什么样的前提下形参m、n值的交换即是实参a、b值的交换。毋庸置疑,只有当形参m、n和实参a、b对应的是相同的内存单元时。在学生给出了这一假设之后,启发学生思考该假设能不能成立以及如何成立。和学生一块分析,要使形参m、n和实参a、b对应的是相同的内存单元,表面上看它们不能是相同的类型,但实现又要求形参m、n操作的对象是实参a、b,显然形参m、n操作的对象和实参a、b应该是相同类型,同时形参m、n指向的是和实参a、b相同的内存单元,学生相对容易想到形参m、n应该是指向实参a、b的指针变量,问题由此迎刃而解。最后结合该任务的完成引导学生总结,在主调函数和被调函数之间双向传递数据变化,全局变量和指针变量都是不错的解决方法。

2)注重当堂实践,现场编程互动,在学习中应用。

C语言程序设计是一门实践性很强的课程,在践行以应用为本位的教学思路的过程中,笔者不仅重视实验课这一实践环节,更是把实践延伸到课堂教学中。在带领学生对特别设计的问题做了充分的分析之后,引导学生当堂实践,或者师生现场编程互动,不仅可以调动学生学习的积极性,更能培养学生解决实际问题的能力。

参考文献:

[1] 李克东.教育技术学研究方法[M].北京:北京师范大学出版社,2003:132-137.

[2] 熊芳敏,许烁娜..C语言课程教学探讨[J].计算机教育,2010(13):104-105.

[3] 顾钧.程序设计语言课程的概念体系及教学策略探讨[J].中国成人教育,2010(16):159-160.

作者:张露

第3篇:C语言程序设计课程教学改革与实践

摘 要: 为提高C语言程序设计课程的教学质量,让学生更好地掌握核心技能,针对课程中教学难点多、语法知识多、学生重视程度不够等问题进行了认真分析,同时结合笔者在长期的教学实践过程中积累的经验,从教学目标、教学设计、教学内容选取、教学方法应用、考核方式等方面进行教学改革,提出了相关的解决方案,取得了较好的教学效果,教学质量明显提高。

关键词: C语言程序设计; 教学改革; 教学方法; 教学设计

Key words: C language programming; teaching reform; teaching methods; teaching design

0 引言

C语言课程通常在大学新生入校的第一学期开设,是学生接触程序设计的第一门课程,学习难度大,要取得好的成绩相对比较困难。如何在较短的时间内使学生掌握C语言的基础知识,获得编程能力,达到教学目标,是进行教学改革的重点。本文对实际存在的问题进行分析,结合作者近十年的C语言课程教学经验,在教学设计、课程内容组织、教学形式、教学方法和考核方式上大胆尝试改革,积累了一些实践经验,取得了不错的教学效果。

1 C语言程序设计课程教学现状及问题分析

长期以来,在“C语言程序设计”课程的教学过程中,存在着诸多影响学生学习积极性,影响教学质量的不利因素。从主观上来说,如教学方法陈旧、教学手段单调、学生学习积极性不高等;从客观上而言,C语言本身也有知识点多,概念抽象,编程算法使用灵活等特点。以下综合分析现存的几个具体问题。

1.1 教学方法没有创新

教学方面仍沿用老一套的理论加实验模式,实践训练与课堂教学未能很好地连贯,理论教学与实际应用脱节。教师的讲授照本宣科,忽视培养学生的实践能力和创新能力,较少考虑学生的实际学习状况,提供给学生主动思考的机会不多,重点和难点把握不好,引导学生积极思维方面欠缺。

1.2 教学手段相对单一

在教学安排上,理论课和实验课分离,在多媒体教室上理论课,然后过几天再在实验室安排实验课,这样对学习基础和自觉性稍差的高职学生来说很不合适。C语言程序设计这门课程需要实践教学,引入真实案例,培养学生分析问题和解决问题的能力,通过“教、学、做”达到对知识的深入理解和熟练应用。

1.3 学生基础知识薄弱

用C语言进行程序设计需要较为灵活的思维,而高职学生数学基础和逻辑思维能力较弱,习惯于死记概念、硬背知识点。教学中应训练他们思考问题、分析问题和解决问题的独立性。进而,培养其主动性。

1.4 概念抽象,知识点多

C语言中有大量的难以记忆和理解的概念,名词术语多、使用灵活、逻辑性强,在使用时容易出错。部分学生对抽象的内容始终难以掌握,甚至思维混乱,如++i,i--等。学生在学习中对一些复杂、灵活、综合性的算法,感到太难接受,独立编程时不知从何入手,渐渐失去学习的兴趣。

1.5 对学习重视程度不够

教师和学生均对本课程重视不够。有很多学生认为,这只是一门基础课,在以后的学习和实际工作中作用不大,在程序设计工作岗位中很少会使用到C语言,更愿意花较多的时间去学习C++、VB、JAVA等语言,从心理上抗拒这门课程的学习。而有的学校也对本课程重视不够,少有安排具有丰富教学经验的教师承担本门课程的教学。

2 教学设计及课程内容组织的改革与实践

为了探究适合高职软件技术专业人才培养的C语言课程教学特点,笔者经过多年的一线教学实践研究与探索,重新进行教学设计,对课程的设计思路是:以学生为主体,以教师为主导,基于实际工作任务精心构建课程内容,通过项目驱动、任务引领的模式培养学生的程序设计能力。

2.1 教学设计

从分析学生的基本特点入手,融入现代教育理念,重新进行课程的教学设计。本着“以学生为主体,以教师为主导,以实际案例为主线”的教学基本原则,积极鼓励学生通过“认知、理解、应用、综合”四个阶段的学习,达到使用C语言熟练编写程序的学习目标。

2.1.1 以学生为主体

教学以学生为主体,变常规的“教学”为创新的“导学”。充分利用现代化的教学设备提供学习资源,发挥学生的主体作用,提出问题,引导学生分析问题和解决问题。

对于第一次接触程序设计的学生,其编程训练应从小程序和一些简单问题起步,通过一些常用的经典算法和相应的案例学习,逐步掌握编程方法,待有了一定的知识储备后,再逐渐加大练习的难度,实现从算法到程序代码的转化,使学生能够将一个实际问题描述为一个计算机算法,然后再编写相应的程序代码。

2.1.2 以教师为主导

教师课前要了解学生的基本学习情况,了解其已有的知识结构和技能,根据学生的实际情况设计教学环节,根据知识点设置可扩散思维的问题,有重点地讲解,引导学生积极思维和主动学习。对于少数学习特别优秀且自学能力强的学生,可适当加快教学引导,增加学习难度和深度,这样可以在学生中树立榜样,带动其他学生自觉利用所学知识解决相关问题,提高学习质量[1]。

从第一次课开始,教师就要引导学生主动学习。选取的素材可以是当前最热门的IT话题,也可以从不同的专业角度和实际应用为学生介绍学习本课程的意义和作用,同时介绍一些历届学生参加省级和国家级的程序设计竞赛所取得的成绩,列举一些学生被选拔到知名企业实习的例子,如微软实习生等,引导学生对学习本门课程产生较大的兴趣。

2.1.3 以实际案例为主线

教学中引入实际案例,根据解决案例中的问题需要的知识结构选取教学内容,以实际编写解决问题的程序代码作为学习的主线。选用的案例如:“计算机三角形的周长和面积”、“计算机模拟抽奖”、“竞赛现场评分统计”等,选择案例的难度要形成一个梯度,随着学习的深入,学生的编程能力增强,逐渐形成系统化的程序设计思维。

常规的程序设计课程通常都注重语句、语法,以程序设计语言自身的体系展开,学生学习时难免会感觉枯燥难学,学过后又少有用来解决实际问题。而以实际案例贯穿整个教学过程,训练学生像程序员一样思考问题,使之逻辑思维更加严密,有利于学生整体素质的提高,更有利于程序设计课程整体教学水平的提高[1]。

2.2 课程内容组织

2.2.1 课程内容选取的基本原则

教学改革首要任务是教学内容的选择,如何选取教学内容是改革的第一步。“C语言”的语法结构复杂,对初学者学习难度大。高职学生虽然学习基础比本科生略差,却乐于动手、可塑性较强。基于此,课程内容选取的原则是:根据学生情况、课程特点以及后续课程对知识结构的要求,从实际工作需要出发,按所学知识够用好用的标准,确定本课程的必修内容。

2.2.2 课程内容的选取

本课程选择具有实际应用的典型案例作为具体的教学内容。将多个小项目按照编写程序的难易程度渐次推出,使学生把所学内容紧密结合实际应用,在基于工作过程的学习中获得职业能力。本课程具体内容的选取如表1[2]。

3 教学形式及教学方法的改革与实践

3.1 教学形式

⑴ 根据C语言知识结构的内在联系,依次安排教学内容。以各个小项目的开发工作主导教学过程,将课堂学习和工作过程学习融为一个整体。

⑵ 运用项目导向、任务驱动的方式,设计课程引入、启发、讲解、讨论、实训等过程,采用教学做一体化的形式带动学生自主学习,通过工作任务进行能力训练。

⑶ 在每个学习单元中均将应掌握的知识融入项目开发任务中,进而转化为学习任务,激发学生的学习兴趣,让学生在主动学习中完成各个任务。学习过程中注重教、学、做相结合,从讲解、演示、练习、讨论,递进到学生自主学习、独立完成任务。

⑷ 教学过程中注重学生能力的培养。如自主学习能力及独立思考、分析问题、解决问题的能力等。

3.2 教学方法

为确保课程教学目标的实现,让学生通过学习高级编程语言的知识,能够使用C语言编写应用程序,同时培养学生程序设计的思维能力以及探索创新的能力,我们在教学中引入了多种方法进行改革,取得了不错的教学效果。

3.2.1 分析案例,启发引导, 增强学习兴趣

每一次上课都引入一个实际案例。教师对案例进行分析,讲解案例中涉及的知识点,然后提出相关问题,给出初步解决方案。比如递归算法一直是C语言教学中的难点,通过分析如“扫雷游戏”这样学生比较有兴趣的问题来讲解算法的构造, 学生较容易理解递归算法的工作框架及流程。讲解二维数组也是通过“学生成绩计算与统计”这个项目来完成的。通过具体的案例分析, 既能把抽象问题具体化,又可以调动学生的学习兴趣,较快接受新知识[3]。

3.2.2 知识讲解与应用并重,训练程序设计思维模式

讲解C语言的知识点时,不能只侧重于简单的语法知识介绍,还应注重知识的连贯,同时辅以相应的应用技能训练,以免学生死记语法而忽略了程序设计方法。强化“自顶向下、逐步细化分解”的程序设计思维训练,培养学生在编写复杂代码之前能将复杂的问题分解为若干个逻辑结构合理的简单算法的能力,探索解决问题的方法。

3.2.3 “教、学、做”一体化

“教、学、做”一体化的教学方法,符合学生的认知规律,适合运用于项目导向式的案例教学。课堂上教师注重把握好“应用为主线,减少抽象理论描述”的原则,将“精讲多练,以教师为主导,以学生为主体”的教学设计理念贯穿于整个教学过程。注重调动学生的学习积极性,启发学生勤思考、多动手,充分利用好学生的“听、思、做、练”各个阶段,及时检查思和练的效果,培养学生求真务实的科学精神[4]。

3.2.4 分组讨论,培养团队协作能力

对于难度不大的学习内容,可安排学生自学,而对于综合性较强的学习内容,则可以安排学生分组进行讨论。自学和讨论的结果由学生在课堂上向同学讲述,让每个学生都有积极参与的兴趣,这样既能活跃课堂气氛,又能培养学生的自学能力和团队协作精神[5]。

3.2.5 课内外训练相结合,培养学生综合应用能力

课内教师进行引导教学,通过典型案例讲解程序设计的基本方法、程序测试方法、程序调试和排错纠错方法,并为每次课设计相应的实训项目。课内时间有限,鼓励学生课外进行自主学习,将课堂上学习过的内容融会贯通,充分地消化和吸收。安排有一定挑战性的实训项目,鼓励学生课外多训练,倡导学生课后以寝室为单位,组成学习小组,进行讨论、分析和解决问题。鼓励学生积极参加各类程序设计比赛,以赛促学。如参加广东省举办的“高校杯”程序设计比赛,进一步提高学生程序设计的兴趣,提升综合应用能力。

4 考核方式的改革与实践

考核采用闭卷上机编程和实训项目答辩相结合的形式。

4.1 闭卷上机考试

上机测试占总成绩的70%,考核基本知识的掌握情况。主要考核基本语法、常用算法、编写小型程序、测试小型程序和解决一般问题的能力。

教师根据考核要求给出7个编程题,让学生任选5个。题目涵盖基础知识的80%以上,对每个编程题提出具体要求,如使用冒泡法排序、使用选择法排序、使用函数、使用指针等非常具体的要求,以较为全面的考核学生对知识的掌握情况。

4.2 实训项目答辩

实训项目答辩占总成绩的30%,考核学生运用知识的能力、综合程序设计的能力、分析问题和解决问题的能力,以及团队合作能力。以下给出具体实施方法。

⑴ 教师给出8-10个实训项目,供学生任意选择一项。

⑵ 学生5-6人为一组,在给定的项目中选择一项,也可以自行拟定其他的项目。

⑶ 成立答辩小组。答辩小组由任课教师、课代表和各小组指派的一名同学组成。

⑷ 答辩时,先由各小组指派一名同学对他们的项目设计进行讲解,然后小组其他成员接受答辩小组的提问。

⑸ 成绩由答辩小组各成员现场打分,分数统计后去掉最高分和最低分,取平均值记入小组每个成员的成绩表。

这样的考核方式,有利于学生灵活运用所学知识,有利于创新思维的培养。

5 结束语

通过改进课程教学方法、重新序化教学内容、不断完善教学手段、改进考核方式等教学改革,有效提高了学生主动学习的积极性。以往不及格率最高的C语言课程,近三年的及格率均在90%以上,30%以上的学生获得了优秀,对于课程设计绝大多数学生都完成得很好。我校大一学生在2013年的“蓝桥杯”全国软件专业人才设计与创业大赛中取得了一、二等奖的好成绩,这从一个侧面验证了教学改革是卓有成效的。

虽然高职院校对基础核心课程不断提高重视程度,但C语言程序设计课程的教学方法、教学内容、考核方式的研究和改革是一个长期的课题,必须与时俱进,在教学实践中不断探索新思路。

参考文献:

[1] 鲁红英,肖思和,孙淑霞.“C/C++语言程序设计”课程教学改革与实践[J].计算机教育,2013.7:95-98

[2] 康玉忠,甘宏,段传林.C语言程序设计项目教程(第1版)[M].中国商业出版社,2010.

[3] 李杰,刘延岭,苏建华.C程序设计课程教学方法的实践与探索[J].计算机与网络,2014.1:127

[4] 董淑娟.高职“C#程序设计”课程教学方案研究[J].教育与职业,2012.20:125-127

[5] 袁学倩.《C语言程序设计》课程教学改革的探讨[J].职校论坛,2012.21:137-138

作者:任淑美 李宁湘 陈杰

第4篇:C语言课程设计实践报告

北京理工大学珠海学院 C语言程序设计实践报告

2014—2015学年第1学期

学 院: 计算机学院 专业班级: 软件工程5班 学 号: 130202051006 学生姓名: 陈洪阳 指导教师: 戴俊雅

成 绩:

时 间:

2015年 1月5日

实践1.猜数游戏 题目概述:

编程先由计算机“想”一个1~100 之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10 次,如果猜了10 次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。

程序设计概要与分析:

在源程序的开头中包含stdlib和time库函数,这样我们就可以调用srand()和rand()函数,其中调用srand()提供一个种子,它是一个unsigned int类型,取值范围是0~65535,然后调用rand(),根据提供给srand()的种子值返回一个随机数,我们用rand()%100就把随机决定的数值范围确定在1~100之间,然后定义一个num,记录这个随机产生的随机数,定义input,来储存用户输入的猜数值,用times来记录猜的次数,用do while循环来执行用户猜的次数有10次,用if else条件语句来判断用户是否猜中,或猜得太大、太小,用一个while循环来做总嵌套,设置n的值一开始不为零,while循环的条件是当n的值不等于0,最后用户就可以修改n的值来决定是否退出。

程序代码:

#include #include #include

int main() {

int n=1; while(n!=0) {

srand((unsigned)time(NULL)); int num,input; int times=0; num=(rand()%100)+1; printf("在1~100间猜一个数 "); scanf("%d",&input); do{

if(input==num){

} else if(input>num){

} else if(input

}

}

} printf("你猜的数太小了,请再猜一个 "); scanf("%d",&input); times++; }while(times<9); if(times>=9)printf("你已经猜了10次都猜不中,你输了 "); printf("继续下一轮新的猜数请按1,退出请按0 "); scanf("%d",&n); return 0; 运行结果示例:

选择继续下一轮新的猜数,猜了10次都没猜中

心得体会:

要懂得如何生成一个随机数,并且要确定它的范围在1~100之间,同时我们还要用do while循环体把猜数的次数控制在10次,每当我们输入猜想的数时就要做出判断,看看是否猜中,或者猜得太大或太小,输出提示信息。也懂得了通过修改while判断循环里面的条件,使得循环体里面的程序受我们修改的条件控制,可以继续循环执行或者不再继续执行。

实践2.成绩排名次 题目概述:

某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30 人参加考 试,学号可以用输入的序号代替。考试后要求: (1)计算每个学生的总分和平均分;

(2)按总分成绩由高到低排出成绩的名次;

(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分; (4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。

程序设计与概要:

定义存储学生信息的结构体,包括学生编号,姓名,各科成绩,总分,平均分还有名次。该结构体命名为student,然后定义结构体数组student s[],首先输入准备录入学生信息的人数,用amount来记录人数,用一个for循环,从0~amount-1,依次输入每个学生的各种信息,如学号,姓名,数学、英语和物理成绩。用grade[]数组来存这三科的成绩,如grade[0]存储数学成绩,grade[1]存储英语成绩。输入之后,再用一个for循环把每个同学的总分求出来,总分再除去3求出该名同学的平均分。按总分成绩由高到低排出名次,用两个for循环嵌套,第一个循环从0~amount,表示从第一个同学开始拿出来比较,第二个循环从1~amount,表示除了之前取出的同学以外的每一个同学,如果前一位同学的总分小于后一个同学的话,就交换两人的信息,第二个循环比较之后,便会把总分最高的同学的信息储存在第一个,然后我们设置排名rank的值为1,rank++,进行筛选第二名的,之后对应地把rank的值设给学生的总分排名

打印学生信息,输出表格的基本框架后,用一个for循环,依次输出每个学生的信息,最后还有根据学号查询学生信息,用户输入要查询的学生学号,在for循环里面依次比较,如果找到学号与用户输入相同的,便输出该名学生的信息。

程序代码:

#include #include #include #define M 30 struct student { unsigned int num; char name[10]; int grade[3]; int sum; float ave; int rank; }; student s[M]; int amount;

void input(student s[]); void title();

void list(student s[]); int main() { input(s); int i=0; for(i=0;i

//要求1 计算总分 平均分

s[i].sum=s[i].grade[0]+s[i].grade[1]+s[i].grade[2];

s[i].ave=(float)s[i].sum/3; } //要求2 按总成绩排序

int rank=1; student t; for(i=0;i

for(int j=i+1;j

{

if(s[i].sum

{

{t=s[i];

s[i]=s[j];

s[j]=t;

}

}

}

s[i].rank=rank;

rank++; } //要求3 打印名次表

title(); list(s); //要求4 查询

int number; printf("请输入你要查询学生的学号: "); scanf("%d",&number); for(int i=0;i

if(number==s[i].num)

{

printf("学号 姓名 数学 英语 物理 总分 平均分 排名 ");

printf("%u %s %d %d %d %d %5.2f %d ",s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);

} } system("pause"); return 0; }

void input(student s[]) { printf("输入班上参加期末考试的人数(不大于30人)"); scanf("%d",&amount); printf("请依次输入他们的学号,姓名,数学成绩,英语成绩和物理成绩 "); for(int i=0;i

printf("第%d位同学的学号,姓名,数学成绩,英语成绩和物理成绩 ",i+1);

scanf("%u%s%d%d%d",&s[i].num,s[i].name,&s[i].grade[0],&s[i].grade[1],&s[i].grade[2]); } }

void title() {

printf(" 学生成绩表 ");

printf("----------------------------- ");

printf("学号 姓名 数学 英语 物理 总分 平均分 排名 ");

printf("----------------------------- "); }

void list(student s[]) { //n表示人数

int i;//rank=1; for(i=0;i

printf("%u %s %d %d %d %d %5.2f %d ",s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);

printf("----------------------------- "); } }

运行结果示例:

确定录入人数之后,依次输入每个学生的信息

打印出名次表:

输入学生的学号,查询学生信息:

心得体会:

懂得了用结构体将不同的数据类型结合在一起,然后定义结构体数组,使得每个数组中的成员都具有不同的数据类型变量。而且同属于一个数据类型,也可以定义数组来表示相同的类型但是有多个不同值,比如成绩这个变量。也懂得了用for循环语句求总分,用for循环语句将数组从头到尾输出。

实践3.单科成绩统计 题目概述:

学生成绩统计(一维数组)从键盘输入一个班(全班最多不超过 30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实

现下列功能:(1)统计不及格人数并打印不及格学生名单;

(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单; (3)以直方图方式统计各分数段的学生人数及所占的百分比。形式如下: 分段 人数 图形 <60 3(10%)*** 60‐69 8(…) ******** 70‐79 7(…) ******* 80‐89 8(…) ******** >=90 4(…) ****

程序设计与概要:

定义一个结构体stu,里面有学生的姓名和成绩,然后定义一个s[]数组存放每个学生的姓名和成绩,输入函数中用一个for循环来依次输入每个学生的姓名,还有输入成绩,用if条件语句判断输入的成绩是否为负数,如果是就退出整个输入函数,同时,我们还用if条件语句来判断输入的成绩处于哪个分数阶段,定义n

1、n

2、等整形变量来存储各个分数段的总人数,变量num来存放输入的学生共有多少人,变量sum是将每个学生的成绩都加在一起,最后用sum/num就等于全班该门成绩的平均分,我们用一个for循环语句,判断每个学生的成绩是否小于60分,如果是就输出他的姓名,这样就可以打印出不及格学生的名单了。同样的,用一个for循环语句,判断每个学生的成绩是否大于等于平均分,如果是就变量count+1,用来记录成绩大于或等于平均分的学生人数,同时可将成绩大于平均分的同学姓名输出,这样就打印出了成绩在大于等于平均分的学生名单了。最后是输出分数段,用前面记录各个分数段人数的n值除以总人数再乘以100%就得出比例,每一个分数段都用一句for循环语句,根据n值的大小输入对应数目的*。

程序代码:

#include #include #define M 30 struct stu { char name[20]; int score; }; stu s[M]; int i=0,num=0; int n1=0,n2=0,n3=0,n4=0,n5=0; float sum=0,ave=0; int count=0; void input(stu s[]); void getnotpass(stu s[]);

void getavg(stu s[]); void percent(stu s[]); int main() { /*stu s[M]; int i=0,num=0; int n1=0,n2=0,n3=0,n4=0,n5=0; float sum=0,ave=0;*/ input(s); getnotpass(s); getavg(s); percent(s); return 0; } void input(stu s[]) { for(i=0;i

printf("请输入第%d个学生的姓名和成绩 ",i+1);

scanf("%s%d",&s[i].name,&s[i].score);

if(s[i].score<0)

break;

if(s[i].score>=0&&s[i].score<60)

n1++;

if(s[i].score>=60&&s[i].score<70)

n2++;

if(s[i].score>=70&&s[i].score<80)

n3++;

if(s[i].score>=80&&s[i].score<90)

n4++;

if(s[i].score>90)

n5++;

num++;

sum+=s[i].score; } printf("学生信息录入完毕 "); } void getnotpass(stu s[]) { printf("不及格人数为:%d ",n1); printf("不及格人员名单如下: "); for(i=0;i

if(s[i].score>=0&&s[i].score<60)

printf("%s ",s[i].name); } printf(" "); ave=sum/num; } void getavg(stu s[]) { for(i=0;i

if(s[i].score>=ave)count++; } printf("成绩在全班平均分及平均分之上的学生人数为:%d ",count); printf("成绩在全班平均分及平均分之上的学生名单如下: "); for(i=0;i

if(s[i].score>=ave)

printf("%s ",s[i].name); } printf(" "); } void percent(stu s[]) { printf("各分数段的学生人数及所占的百分比如下: "); printf("分段 人数 图形 "); printf("<60 %d(%.0f%%) ",n1,(float)n1/(float)num*100); for(i=0;i=90 %d(%.0f%%) ",n5,(float)n5/(float)num*100); for(i=0;i

运行结果示例:

依次输入每个学生的姓名和成绩,当输入成绩为负时,便退出整个输入:

统计不及格人数还有打印不及格学生名单:

统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单:

以直方图方式统计各分数段的学生人数及所占的百分比:

心得体会:

懂得了在for循环体内用if条件判断语句判断输入的值为负值时退出循环体。用变量计数器把符合要求的计数起来,最后可以得出符合要求的值共有多少个,也懂得了用for循环从所有值里进行筛选符合条件的值出来,更懂得了在求百分比时候要强制类型转换,把int类型的计算结果给转换为float单精度类型。

实践4.函数与文件训练 题目概述:

将实践练习2 中的第2题利用函数的思想进行修改,并将学生的成绩等信息输出到文件中。要求函数参数中

包含结构体数组或指针。输出到ASCII 文件的信息包括每个学生的学号、三门成绩和名次,每人一行。

程序设计与概要:由于我的实践2中就已经用了函数,所以我只需要把学生的成绩等信息输出到文件中。用FILE *fp,fp就代表我们要对其操作的文件,用open函数,根据文件的所在位置还有文件名,打开文件,并对应要求进行只写的操作,如源代码中fp=fopen("f: st udent.txt","w"),w代表写入操作,char一个c[]数组,存放对应项的名称,用fputs函数把数组里面的字符串写入到文件里面去,用一个for循环,循环调用fprintf函数,把每个学生的学号,各科成绩和排名都写入到文件当中去,最后关闭文件即可。

程序代码:

#include #include #include #define M 30 struct student { unsigned int num; char name[10]; int grade[3]; int sum; float ave; int rank; }; student s[M]; int amount;

void input(student s[]); void title(); void list(student s[]); int save();//输出到文件中 int main() { input(s); int i=0; for(i=0;i

//要求1 计算总分 平均分

s[i].sum=s[i].grade[0]+s[i].grade[1]+s[i].grade[2];

s[i].ave=(float)s[i].sum/3; }

//要求2 按总成绩排序

int rank=1; student t; for(i=0;i

for(int j=i+1;j

{

if(s[i].sum

{

{t=s[i];

s[i]=s[j];

s[j]=t;

}

}

}

s[i].rank=rank;

rank++; } save(); //要求3 打印名次表

title(); list(s); //要求4 查询

int number; printf("请输入你要查询学生的学号: "); scanf("%d",&number); for(int i=0;i

if(number==s[i].num)

{

printf("学号 姓名 数学 英语 C语言 总分 平均分 排名 ");

printf("%u %s %d %d %d %d %5.2f %d ",s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);

} } system("pause"); return 0; } void input(student s[]) { printf("输入班上参加期末考试的人数(不大于30人)"); scanf("%d",&amount); printf("请依次输入他们的学号,姓名,数学成绩,英语成绩和物理成绩 ");

for(int i=0;i

printf("第%d位同学的学号,姓名,数学成绩,英语成绩和物理成绩 ",i+1);

scanf("%u%s%d%d%d",&s[i].num,s[i].name,&s[i].grade[0],&s[i].grade[1],&s[i].grade[2]); } } int save() {

FILE *fp; fp=fopen("f:student.txt","w"); if(!fp) {

printf("can not open file! ");

exit(1); } char c[]="学号 数学 物理 英语 排名 "; fputs(c,fp); for(int i=0;i

fprintf(fp,"%u %d %d %d %d ",s[i].num,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].rank); } fclose(fp); } void title() {

printf(" 学生成绩表 ");

printf("----------------------------- ");

printf("学号 姓名 数学 英语 物理 总分 平均分 排名 ");

printf("----------------------------- "); }

void list(student s[]) { int i; for(i=0;i

printf("%u %s %d %d %d %d %5.2f %d ",s[i].num,s[i].name,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].sum,s[i].ave,s[i].rank);

printf("----------------------------- "); } }

运行结果示例:

首先输入准备录入的学生人数,然后依次输入每个学生的信息:

打印出按总成绩排序后的学生信息表,以及根据学号查询:

在f盘中找到文件并打开:

心得体会:

懂得了用如何运用文件,把向程序中输入的数据全部输出到文件中去。用FILE *fp,fp就代表我们要对其操作的文件,用open函数,根据文件的所在位置还有文件名,打开文件,并对应要求进行只写的操作,如源代码中fp=fopen("f: st udent.txt","w"),w代表写入操作,char一个c[]数组,存放对应项的名称,用fputs函数把数组里面的字符串写入到文件里面去,用一个for循环,循环调用fprintf函数,把每个学生的学号,各科成绩和排名都写入到文件当中去,最后关闭文件即可。

实践5. 实践4(1)(2) 题目概述:

每位学生信息包括:学号、姓名、性别、学院、10 门成绩。共有不超过100 位同学的信息存放在ASCII 文件StudentInfo.txt 中;不超过10 个学院的信息存放在CodeInfo.txt 中,性别代码存放在SexInfo.txt 中,均为代码和其对应的名称。要求:

1. 定义至少包含以上学生信息和学院代码的结构体类型和指针(或数组)变量。 2. 函数实现从文件中输入信息到定义的数据中。

程序设计与概要:

定义一个结构体,名为student,里面的内容有学生的学号,姓名,性别,还有那个学院,以及10门成绩,构造结构体数组,student stu[100],用于存储100名学生的信息。定义读取文件中内容的函数,FILE *fp代表文件,调用fopen函数,通过文件所在位置以及文件名打开特定的文件,r表示只对文件进行读取,接着调用fscanf函数,把第一个位置的数据赋给学生的学号,用while循环体,循环的条件是调用feof判断文件是否读取结束,如果没有则返回0,用!feof()来让没读取结束的文件继续读取,接着再把同一行后面的数据分别赋给学生的姓名,性别代码和所属学院代码,再用一个for循环,把同一行后面10个数据分别赋给学生的10门成绩。一行读取完毕后,意味着已经读取完一个学生的所有个人信息,定义一个I值来存储已经读取学生的人数,每读完一人就i+1,再读取下一行的第一个数据赋给下一个学生作为他的学号。通过while循环把文件中的全部信息读取出来赋给所有学生,函数最后返回的是读取学生的人数i。定义结构体名为sxy,用于存储性别代码和代码对应的性别,可以在后面输出的时候,把对应的性别代码转变为用中文表示性别。定义一个结构体名为scode,用于存储学院代码和代码对应的学院名称,可以在最后输出的时候,把学院代码对应的学院名称输出。再定义一个输出函数,通过for循环,从0~i-1,把i个学生的全部信息输出,所以我们在主函数里面先调用读取文件中内容的函数之后再调用输出函数即可。

程序代码:

#include #include #include int readData(char *filename,struct student *stu); int readDataxy(char *filename,struct sxy *s1); int readDataco(char *filename,struct scode *s2); void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k); struct student { int id; char name[10]; int sexno; char sex[4]; int deptno; char dept[20]; int scores[10]; float ave;

}; struct sxy { int id; char sex[4]; }; struct scode { int id; char dept[20]; }; int main() { struct student stu[100]; struct sxy s1[2]; struct scode s2[10]; int n,m,k; n=readData("f:StudentInfo.txt",stu); m=readDataxy("f:SexInfo.txt",s1); k=readDataco("f:CodeInfo.txt",s2); if(n==-1||n==0)

return 0; if(m==-1||m==0)

return 0; if(k==-1||k==0)

return 0; printStudent(stu,s1,s2,n,m,k);

system("pause"); return 0; } int readData(char *filename,struct student *stu) { FILE *fp; int i=0,j; fp=fopen(filename,"r"); if(!fp) {

printf("error1");

return -1; } fscanf(fp,"%d",&stu[i].id); while(!feof(fp))//feof返回0 表示文件还没结束 返回1表示结束

{

fscanf(fp,"%s%d%d",stu[i].name,&stu[i].sexno,&stu[i].deptno);

for(j=0;j<10;++j)

fscanf(fp,"%d",&stu[i].scores[j]);

++i;

fscanf(fp,"%d",&stu[i].id); } return i; } int readDataxy(char *filename,struct sxy *s1) { FILE *fp; int i=0; fp=fopen(filename,"r"); if(!fp) {

printf("error2");

return -1; } fscanf(fp,"%d",&s1[i].id); while(!feof(fp)) {

fscanf(fp,"%s",s1[i].sex);

++i;

fscanf(fp,"%d",&s1[i].id); } return i; } int readDataco(char *filename,struct scode *s2) { FILE *fp; int i=0; fp=fopen(filename,"r"); if(!fp) {

printf("error3");

return -1; } fscanf(fp,"%d",&s2[i].id); while(!feof(fp)) {

fscanf(fp,"%s",s2[i].dept);

++i;

fscanf(fp,"%d",&s2[i].id); }

return i; } void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k) { int i,j; printf(" 学生信息统计 "); for(i=0;i

for(j=0;j

{

if(stu[i].sexno==s1[j].id)

{

strcpy(stu[i].sex,s1[j].sex);

}

} } for(i=0;i

for(j=0;j

{

if(stu[i].deptno==s2[j].id)

{

strcpy(stu[i].dept,s2[j].dept);

}

} } for(i=0;i

printf("%d%8s%4s%12s",stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);

for(j=0;j<10;++j)

printf("%4d",stu[i].scores[j]);

printf(" "); } }

运行结果示例:

心得体会:

懂得了从文件中输入信息到定义的数据中。就是要先构造与文件信息中相对应的结构体数组,然后用打开文件,需要知道文件的具体位置还有文件名,”r”就是表示只采取读取操作,用while循环,循环条件的判断标准就是用feof来判断文件是否读取到文件尾部,用fscanf把每个数据赋给对应的变量。其中最难解决的就是一开始学生文件里面的信息,学生性别用代号表示,学生所在学院也用代码显示,这样一来我们把文件中的信息赋给定义好的结构体

数组之后,用for循环把结构体数组一个一个输出后,显示的是性别代码和学院代码,我们要把代码都改为相对应的值,所以我们同样定义性别的结构体数组,学院的结构体数据,之后用for循环把性别数组里面的代号和学生数组中的性别代码想比较,用strcpy函数,相同的就把代码对应的性别赋给学生数组里面定义好的性别字符数组。同理的,学院代码相对同的就把代码对应的学院名称赋给学生数组里面定义好的学院字符数组。

实践6.实践4(3)(4)(5) 题目概述:

每位学生信息包括:学号、姓名、性别、学院、10 门成绩。共有不超过100 位同学的信息存放在ASCII 文件StudentInfo.txt 中;不超过10 个学院的信息存放在CodeInfo.txt 中,性别代码存放在SexInfo.txt 中,均为代码和其对应的名称。要求:

3. 函数实现排序(1):学生平均成绩的降序排序,并输出所有信息到显示屏。 4. 函数实现排序(2):学生姓名的升序排序,并输出所有信息到显示器。

5. 函数实现查询(1):根据学号查询学生信息,并输出该生信息,并输出所有信息到显示器。

程序设计与概要:

同上个实践一样构造结构体名为student,用来存储学生的信息,如学生姓名,性别代号,学号,学院代号和成绩等。构造结构体名为sxy用来存储性别代号和性别名称,构造结构体名为scode用来存储学院代号和学院名称。用三个不同的函数来实现读取三个不同文件中的内容,把文件里面的内容放到以上构造的三个结构体里面去,定义输出函数,用for循环把每个学生的性别代号同sxy结构体数组中的代号对应,把代号对应的性别名称赋给每个学生的性别sex属性值中,把每个学生的学院代号同scode结构体数组中的代号对应,把代号对应的学院名称赋给每个学生的学院sdept属性值中,最后再用一个for循环把从第一个学生到最后一个学生的全部信息输出。实现要求3中的根据学生平均成绩的降序排序,要求在从文件中读取成绩之后要计算出总分然后再除以10门成绩得出平均分,然后定义一个函数,用双重for循环,把第一个学生同其他学生比较平均分,如果比下一个同学的平均分低就交换两个的位置,否则就继续与下一个同学比较,直到第一层的for循环结束退出为止。再用for循环把排序后的学生信息从第一位到最后一位输出即可。实现要求4中的根据学生姓名的升序排序,要求也是用双重for循环,用函数strcmp比较两个学生的姓名,把第一个学生的姓名同下一个同学比较,如何比下一个同学大,就交两个学生的位置,否则就继续与下一个同学比较,直到第二层的for循环结束,意味一个同学的位置确定,继续第一层for循环的下一个同学,直到第一个层的for循环结束,就意味所有同学比较完毕,再用for循环语句把从第一个位置的同学到最后一个位置的同学,把他们的信息输出。实现要求5的查询要求,需要我们从键盘上输入要查询的学生的学号,然后用for循环从我们的学生结构体数组中遍历一遍,如果有找到学号同输入的学号相同的学生,便把他的所有信息输出,否则则输出不存在该名学生。

程序代码:

#include #include #include int readData(char *filename,struct student *stu); int readDataxy(char *filename,struct sxy *s1); int readDataco(char *filename,struct scode *s2); void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k); void search(struct student *stu,int n); void sortbyname(struct student *stu,int n); void sortbyave(struct student *stu,int n); struct student

{ int id; char name[10]; int sexno; char sex[4]; int deptno; char dept[20]; int scores[10]; double ave; }; struct sxy { int id; char sex[4]; }; struct scode { int id; char dept[20]; }; int main() { struct student stu[100]; struct sxy s1[2]; struct scode s2[10]; int n,m,k,b; while(1) {

system("cls");

printf("1.显示学生信息 ");

printf("2.姓名升序排序 ");

printf("3.平均成绩降序 ");

printf("4.学号查询学生信息 ");

printf("0.退出 ");

printf(" 输入需要查询的序号:");

scanf_s("%d",&b);

switch(b)

{

case 1:

n=readData("f:StudentInfo.txt",stu);

m=readDataxy("f:SexInfo.txt",s1);

k=readDataco("f:CodeInfo.txt",s2);

if(n==-1||n==0)

return 0;

if(m==-1||m==0)

return 0;

if(k==-1||k==0)

return 0;

printStudent(stu,s1,s2,n,m,k);

break;

case 2:

sortbyname(stu,n);

break;

case 3:

printf("按平均成绩降序排序如下:");

sortbyave(stu,n);

printStudent(stu,s1,s2,n,m,k);

break;

case 4:

search(stu,n);

break;

case 0:

return 0;

} system("pause"); } system("pause"); return 0; } int readData(char *filename,struct student *stu) { FILE *fp; int i=0,j; double sum; fp=fopen(filename,"r"); if(!fp) {

printf("error");

return -1; } fscanf(fp,"%d",&stu[i].id); while(!feof(fp))//feof返回0 表示文件还没结束 返回1表示结束

{

fscanf(fp,"%s%d%d",stu[i].name,&stu[i].sexno,&stu[i].deptno);

for(j=0;j<10;++j)

{

fscanf(fp,"%d",&stu[i].scores[j]);

sum=stu[i].scores[j];

}

stu[i].ave=sum/10;

++i;

fscanf(fp,"%d",&stu[i].id); } return i; } int readDataxy(char *filename,struct sxy *s1) { FILE *fp; int i=0; fp=fopen(filename,"r"); if(!fp) {

printf("error2");

return -1; } fscanf(fp,"%d",&s1[i].id); while(!feof(fp)) {

fscanf(fp,"%s",s1[i].sex);

++i;

fscanf(fp,"%d",&s1[i].id); } return i; } int readDataco(char *filename,struct scode *s2) { FILE *fp; int i=0; fp=fopen(filename,"r"); if(!fp) {

printf("error3");

return -1; } fscanf(fp,"%d",&s2[i].id); while(!feof(fp)) {

fscanf(fp,"%s",s2[i].dept);

++i;

fscanf(fp,"%d",&s2[i].id); } return i;

} void printStudent(struct student *stu,struct sxy *s1,struct scode *s2,int n,int m,int k) { int i,j; printf(" 学生信息统计 "); for(i=0;i

for(j=0;j

{

if(stu[i].sexno==s1[j].id)

{

strcpy(stu[i].sex,s1[j].sex);

}

} } for(i=0;i

for(j=0;j

{

if(stu[i].deptno==s2[j].id)

{

strcpy(stu[i].dept,s2[j].dept);

}

} } for(i=0;i

printf("%d%8s%4s%12s",stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);

for(j=0;j<10;++j)

printf("%4d",stu[i].scores[j]);

printf(" "); } } void search(struct student *stu,int n) { int m,col=0; printf("请输入你要查询学生的学号: "); scanf("%d",&m); for(int i=0;i

if(stu[i].id==m)

{

col=1;

printf("%d%8s%4s%12s",stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);

for(int j=0;j<10;++j)

{

printf("%4d",stu[i].scores[j]);

}

} } if(col==0) printf("不存在该名学生信息 "); } void sortbyname(struct student *stu,int n) { student temp; for(int i=0;i

for(int j=0;j

{

if(strcmp(stu[i].name,stu[j].name)>0)

{

temp=stu[i];

stu[i]=stu[j];

stu[j]=temp;

}

} } printf("按姓名的升序排序如下! "); for(int i=0;i

printf("%8d%8s%4s%12s",stu[i].id,stu[i].name,stu[i].sex,stu[i].dept);

for(int j=0;j<10;++j)

{

printf("%4d",stu[i].scores[j]);

}

printf(" "); } } void sortbyave(struct student *stu,int n) { int i,j,flag; student s; for (j=0;j

flag=0;

for (i=0;i

{

if (stu[i].ave

{

s=stu[i];

stu[i]=stu[i+1];

stu[i+1]=s;

flag=1;

}

}

if(flag==0) break; } }

运行结果示例: 开始的菜单界面:

输入1便会显示文件中所有学生的信息:

输入2便会实现学生姓名升序排序,且把排序后的学生所有信息输出:

输入3便会实现学生平均成绩降序排序,且把排序后的学生所有信息输出:

输入4便会实现根据学号查询学生信息:

心得体会:

懂得了运用双重for循环比较全体成员,如题目中所要求的姓名升序排序还有平均成绩降序,比较平均成绩可以用值的大小进行比较,但是比较姓名的大小就要用strcmp函数进行比较,如果有需要交换位置的,就定义一个同类型的中间值,作为交换的协助者,帮助完成两个值的交换,完成整个过程之后,把交换完成后的全体成员从头到尾用for循环输出即可。

参考文献:

[1] 张克军:《程序设计基础》,科学出版社。

第5篇:《C语言程序设计实践》课题

综合实践大作业

任务1 课题名称:

学生顺序表的处理

课题内容:

在一个数据文件中存放若干学生数据记录,每条记录都有如下数据项:学号,姓名,性别,成绩。

编一个程序,采用顺序存储结构存储这批数据,并对该数据进行排序。要求:数组前部为女同学,后部为男同学,并且男女同学都按成绩递减排序,分别计算男生合格率、女生合格率、全班的成绩平均分,并把排序后的学生数据记录及计算结果存入另一个数据文件中。

任务2 课题名称:

学生成绩的管理(顺序存储)

课题内容:

某班级学生C语言第一次正考的成绩存于数据文件score.dat中,记录了学生学号、姓名和考试成绩,bk.dat文件中记录了补考学生的学号、姓名和补考成绩,编写程序以顺序存储结构实现以下要求:

1、对该班级按成绩降序排序并统计成绩平均分及每个分数段的人数,结果写入到result.dat中。

2、再根据补考成绩修改原成绩,修改成绩后仍按成绩降序写在result.dat的后面。成绩修改原则: 1)补考成绩大于等于60,原成绩以60分记;2)补考成绩小于60,取两次成绩中最高值记。

任务3 课题名称:

学生基本信息的管理(顺序存储)

课题内容:

已知学生的信息包括:学号,姓名,性别,出生年月,地址,电话,E-mail等。以顺序存储结构设计程序能实现以下功能: (1)学生信息录入:可随时增加学生信息到数据文件中 (2)学生信息浏览:学生的信息输出到屏幕 (3)查询:按学号查询、按姓名查询 (4)修改:修改指定学生的信息 (5)删除:删除指定学生的信息

(6)排序:按指定的关键字排序后输出到屏幕。 (7)系统以菜单方式工作

任务4 课题名称:

图书顺序表的处理

课题内容:

在一个数据文件中存放若干图书数据记录,每条记录都有如下数据项:书名,作者,出版社,ISBN,出版时间,价格,类别。

编写一个程序,采用顺序存储结构存储这批数据,并对该数据进行排序。要求:按出版社进行分类存取图书信息,同一出版社中的图书信息按照出版时间降序排列。分别统计每个出版社出版的图书数量,并把排序后的图书记录及计算结果存入另一个数据文件中。

任务5 课题名称:

旅游信息顺序表的处理

课题内容:

在一个数据文件中存放若干旅游信息数据记录,每条记录都有如下数据项:线路编号、目的地、旅游天数、旅游类别、出行月份、价格。

编写一个程序,采用顺序存储结构存储这批数据,并对该数据进行排序。要求:顺序表按旅游目的地进行分类存取,同一目的地的旅游线路按照月份升序排序。分别统计每个月、每个目的地的旅游线路总数。把排序后的旅游记录及旅游线路总数存入另一个数据文件中。

第6篇:《C程序设计实践》课程设计指导

一、课程设计目的

1、通过课程设计,熟练掌握Visual C++ 6.0 开发环境的使用,提高程序调试能力;

2、通过课程设计,提高学生分析问题、解决问题的能力;

3、通过课程设计,复习巩固C语言的循环结构、指针、数组、结构体、文件等方面的知识,并在实践中加以运用。

4、通过课程设计,提高学生查阅资料、吸收和运用新知识的能力。

二、课程设计要求

每个学生在下列课题中至少选一题,并独立完成。

1、学生成绩管理系统

2、学生档案管理系统

3、同学通信录管理系统

4、职工档案管理系统

5、职工工资信息管理系统

6、小型图书信息管理系统

7、超市商品信息管理系统

8、实验室设备信息管理系统

9、试题(选择题)信息管理系统

10、列车时刻表信息管理系统

每课题均须具有以下功能:

1、信息录入,包括记录的追加和插入;

2、信息删除;

3、信息修改;

4、信息排序和查询;

5、信息的保存和装载;

6、简单的帮助。

三、设计方法及过程

1、问题分析

包括系统所要完成的功能、数据结构分析,如问题处理过程中使用的结构体及包含的成员等,文件的类型、存储的内容等,输入/输出的格式等。

2、系统功能设计及模块(函数)划分

根据分析结果,画出系统结构图,确定系统的功能模块,包括模块的名字、接口(即函数的参数、返回值)及功能,模块间的调用关系。

3、模块的算法设计

设计每个功能模块的算法,可以用伪代码或流程图表示。

4、编码

代码的编写要符合规范,程序中对各个模块的功能、模块主要实现部分都需要加上注释,以增加程序的可读性,便于软件维护。

5、调试

四、设计报告

课程设计完成后,每位同学要写出《程序设计及C语言》课程设计报告,打印并上交(同时上交源代码),作为成绩的评定依据之一。报告的内容包括:问题分析、系统功能设计及模块(函数)划分、模块的算法设计、源代码及设计总结五个部分。

第7篇:《C语言程序设计实践教程》答案-完整版

4.2练习题

一、选择题

1. D

2. B

3. A

4. B和D

5. C

6. A

7. B

二、填空题

1. //或/**/

2. 主或main

3. 函数首部和函数体

4. 编译和连接

5. 公号

5.2练习题

一、选择题

1. A

2. D

3. B

4. B

5. C

6. C

7. D

8. A

9. B

10.B

11.D

12.B

13.A或B

14.C

15.B

17.D

18.D

19.C

20.D

21.B

22.A

23.D

24.C

25.C

26.B

27.C

28.D

29.A

30.B

二、填空题

1. 102,10

2. #define宏名 字符串

3. 1

4. n=1

5. -4

6. a=1,b= ,c=2

7. c=A

8. n1=%d n2=%d

9. a+b>c&&a+c>b&&b+c>a

10.ch>=’a’&&ch<=’z’|| ch>=’A’&&ch<=’Z’ 11.7

12.0

13.11110000

14.8,4

6.2练习题

一、选择题

1. A

2. C

3. D

4. C

5. A

7. A

8. D

9. B

10.C

11.A

12.A

13.C

14.B

15.正确答案为:12345678

二、填空题

1. 10

2. y=1x%i==0

3. 屏幕中间输出一个由星号组成的菱形

4. 1

5. 13

6. (cx=getchar())!=-1front=cx;

7. m%n

8. 4

9. *ppx=&xpy=&y

三、读程序,写结果

1. -1

2. 3,1,-1,

3. a=16,y=60

4. x=12,y=4

5. 59

7.2练习题

一、选择题

1. B

2. C

3. C

4. A

5. D

6. C

8. D

9. C

10.D

11.D

12.D

13.A

14.B

15.C

16.B

17.B

18.A

19.A

20.D

21.B

22.D

23.C

24.D

25.D

26.C

二、填空题

1. ‘a’0

2. a[k]a[k]a[k]

3. 06

4. A B C D E

A

5. 1,6

6. k=p;

7. i

8. 18

9. 4,some string * test

10.you&me

三、读程序,写结果

1. 54820

2. 1024156

3. love china! Hwl

4. 666655

5. Front

一、选择题

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17. A A B B B A D C A A A B B A B B C

二、填空题

1.

2.

3.

4.

5.

6.

7.

8. 12 Itis fun(n-1)*nfun(k) s[i]-t[i] n%mi-1x[d] x=nx%10x m=f(a,4)+f(b,4)-f(a+b,3) a=1,b=1

三、读程序,写结果

1. s=7

2. s=37

3. bij1

2一、选择题

1. B

2. C

3. B

4. D

5. B

6. A

7. B

8. D

9. D

10. B

11. D

12. A

13. B

14. C

15. C

16. C

17. A

18. D

19. B

20. D

二、填空题

1. b->day(*b).day

2. DDBBCC

3. zhang 170.000000

wang 150.000000

4. 99

5. max=imin=istud[max].name,stud[max].score

6. &r1feof(fp)break

7. BBB AAA 123

8. rewind

三、读程序,写结果

1. 2002,shangxian

2. 32 stud[min].name,stud[min].score

第8篇:C语言程序设计课程考试模式改革实践与研究

摘要:针对程序设计类课程教学效果不佳的教学实际,以C语言程序设计课程为例,通过分析历年试卷,提出加强中间实践教学过程考核及以程序设计题为主的无纸化期末考核,并从试题库建设、系统设计思想、软件功能结构、运行效果等方面介绍无纸化考试平台。

关键词:动手编程能力;教学质量;无纸化考核方式

引言

C语言程序设计是理工科类专业的一门必修课程。就当前严峻的就业形势及社会对计算机操作能力越来越高的要求而言,学校在培养学生程序设计能力方面还有待提高。针对当前的教学现状,进行本门课程的考试方法改革,即以无纸化考试方式驱动学生加强平时动手能力的训练,以提高C语言程序设计课程的教学质量。与传统纸质考试模式比较,无纸化机试考试模式可以很好地考查学生的程序设计能力,同时也能很好地排除考试各环节中人为因素的影响,比如评分标准不一致等现象。此外,机试考试也减轻了教师的出题、评阅、统计、分析等工作任务,提高了工作效率。

1教学现状分析

1.1学生的程序设计能力水平普遍较低

通过对近3年3100份试卷的分析发现,能够编写出完整正确程序的学生人数不足40%,而卷面分数达到合格的人数却超过了75%,如图1所示;此外,近3年全国计算机等级考试(二级C)的合格率不超过28%,如图2所示。这些数据说明学生的程序设计能力与社会对人才的要求还存在一定差距。

1.2传统纸质考试方式弱化了对学生程序设计能力水平的考查

程序设计语言类课程的考试应着重考查学生的动手编程能力。目前,该类课程的学习效果评价手段多以传统纸质试卷为主,其中程序设计题仅占20%,弱化了对学生程序设计能力的考查,因此普遍存在卷面合格的学生不能编写完整正确程序的现象。

一个完整正确的程序往往不能一次就编写成功,需要不断地调试,从中发现错误并加以改正,学生在调试过程中不断巩固所学内容。传统纸质试卷考试方式在考查学生调试程序能力方面也存在弱势。

1.3传统纸质考试方式不符合全国计算机等级考试改革方向

教育部规定自2013年开始全国计算机等级考试所有科目均采用无纸化考试方式,学生是否具有计算机语言程序设计能力,是否具有解决实际问题的能力,都不再是纸上谈兵。无纸化考试教学改革可提高学生学习的积极性和主动性,培养其实际动手编程能力,提高教学质量。

2改革举措

针对C语言程序设计课程建立一套5000道试题的试题库,涵盖教学大纲规定的所有知识点,且重点、难点突出,开发与之对应的无纸化考试平台,并制定科学合理、切实可行的无纸化考试管理办法及平时考核机制。

2.1以教学大纲为蓝本建设试题库

根据C语言程序设计课程教学大纲,组织该课程的一线授课教师共同建设试题库,确保试题内容设置具有科学合理、难度适宜、重点突出、结合实际等特点,能够全面评价学生的程序设计能力。该试题库建立过程中,参与教师达到17名,试题类型包括程序填空、程序改错和程序设计3类,试题数量分别为1000道、1000道、3000道,覆盖知识点69个,涉及算法26种。

2.2结合软件工程思想开发无纸化考试平台

无纸化考试平台以提高教学质量及学生的动手编程能力、全面考核学生的程序设计能力、减轻教师出题和评阅等繁琐工作任务为主要目标,功能主要包括服务器端与客户端两部分。服务器端完成试题库维护、考试参数设置、考试数据文件生成与打印等功能,客户端完成随机抽题、考生作答、自动评阅等功能,具体功能如图3所示。

该平台的关键功能是随机抽题和成绩评定:随机抽题模块确保所抽试题覆盖知识点广、涉及算法不重复;同时对于程序设计题的成绩评定,建立科学合理的评分准则。此外,该平台注重考

2.3加强平时实践教学环节的考核

考试模式改革的目的不是用机试考试方式简单地代替纸质考试方式,而是通过考核方式的转变,扭转学生对C语言学习的认识,强调利用计算机语言解决实际问题的学习目的,加强动手编程能力的培养。全面考核学生的程序设计能力不能仅依赖于期末考核,还要侧重于平时实践环节的考核,只有这样,学生才能在实践中不断积累经验,牢固掌握知识。

学校已将C语言程序设计课程平时实践考核成绩作为最终成绩的重要部分,比例为50%。平时成绩的具体考核形式主要有两种:一是针对每一章设置独立知识点的试题,各章学习结束后,利用该考试平台进行章节测试,随机抽取一道试题,让学生利用25~30分钟作答;第二种形式是以2~3人的组为单位,课下完成一个复合知识点的题目,这类题目考核的知识点既包含学过的,也包含没学过的,需要学生课下主动查阅资料,寻找解决方法,最终以答辩形式向其他同学汇报,成绩由其他同学打分确定。

核学生利用计算机语言解决实际问题的能力,即以程序设计题为主,辅以程序填空及程序改错题。平台的建立利用面向对象程序设计方法并结合软件项目开发思想,其部分运行界面如图4所示。

2.4加强程序设计能力的考核

无纸化考试系统既能考核学生阅读程序的能力,又能考核学生编程调试程序的能力,采用该系统进行期末考试,每份试卷包含3道试题,均为程序设计题,它们所属章节不同。本系统将章节分为3部分:顺序结构与选择结构为第1部分,循环结构与数组为第2部分,函数、指针及结构体为第3部分。此外,3道试题所涉及的算法均不同,各试题分值分别为30分、30分、40分,试题难度由易到难。这样既能保证考核知识面广,又能公正地评价每位学生的程序设计能力。

2.5人性化的考核模式

C语言程序设计课程的教学任务分两个学期完成,其中第1学期任务量在4400人左右,第2学期任务量在2200人左右。面对众多的考生,无纸化考试需分批分阶段完成,根据制定的科学有效的无纸化考试管理办法,结合网上预约考试平台,学生可在规定的时间段内合理选择考试时间,实现人性化的考试。具体实施步骤为:课程结束前两周由教务处发布考试通知,考试时间一般定于课程结束后的第2周,从周一至周五全天工作时间均可进行考试,考场数量根据本学期考生数量适当增加或减少。学生自收到通知之日起,就可通过预约系统进行考试预约,教务工作人员随时查看预约情况,合理安排监考教师,学生根据预约结果合理安排考前准备进度。

3改革效果

3.1激发了学生学习的主动性

考试方式的转变,加强了学生动手编程能力的训练,学生不再每天纸上谈兵,靠死记硬背获取知识,而是通过上机编写程序、调试程序,灵活掌握课堂中学到的知识,并举一反三,收到了事半功倍的效果。学生对本门课程的相互讨论增多了,对获取更多知识的欲望增强了,课堂教学过程中学生主动与教师的交流也增多了。

3.2提高了学生的编程能力

经过近两年的实践,本门课程的考试成绩有了明显的提高,全国计算机等级考试(二级C)的通过率增长了约9个百分点。由于C语言程序设计课程是大一阶段的必修课,学生通过实践锻炼,掌握了程序设计语言类课程的学习方法,在学习后续的其他类似课程时入门快、效率高,增强了自信心。如数据结构课程,绝大多数学生不会再因为程序设计语言不过关而学不好,可完全将学习重点放在数据的逻辑结构学习中。

3.3减轻了教师的工作量

无纸化考试方式减少了教师考前出题、试后评阅、分数统计等繁杂的工作,同时也避免了由于工作失误而造成的分数统计错误等现象,教师的工作重点完全转向如何改进教学方法、提高学生的实际动手编程能力和提高教育教学质量。

4结语

加强实践教学环节是学好计算机语言的关键所在,机试考核方式驱动了学生对计算机语言的学以致用。下一步的工作是借鉴C语言程序设计课程取得的改革经验,结合其他各门计算机语言课程的特点,逐步完成Java语言、c++语言等课程的教学改革。

第9篇:C语言课程实践-实践1实验报告

实验报告

1. 程序源代码

程序1 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则计算机给出提示“Right!”,否则提示“Wrong!”,并告诉人所猜的数是大还是小,然后结束游戏。要求每次运行程序时机器所“想”的数不能都一样。 #include #include #include void main() {

int input_number;

int random_number; srand( (unsigned)time( NULL ) ); random_number = rand()%100+1; printf("输入您想猜的0~100之间的数:"); scanf("%d",&input_number); if (input_number >= 0 && input_number <= 100) {

if (input_number == random_number)

{

printf(" right!");

}

else if (input_number > random_number)

{

printf(" 您猜的数过大 ");

}

else

{

printf(" 您猜的数过小 ");

} }

else

{

printf(" 您猜的数应在0~100之间"); } } 程序2 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。 #include #include #include void main() {

int input_number;

int random_number; int n; srand( (unsigned)time( NULL ) ); random_number = rand()%100+1; for(n=1;;n++) {

printf("输入您想猜的0~100之间的数:"); scanf("%d",&input_number); if (input_number >= 0 && input_number <= 100)

if (input_number == random_number)

{

printf(" right! ");

if(n==1)

{

printf(" 您猜了%d次,太牛逼了. ",n);break;

}

else if(n>1&&n<6)

{

printf(" 您一共猜了%d次,水平还行. ",n);break;

}

else

{

printf(" 您一共猜了%d次,才猜对,很勉强啊. ",n);break;

}

}

else if (input_number > random_number)

printf(" 您猜的数过大 ");

else

printf(" 您猜的数过小 ");

else

printf(" 您猜的数应在0~100之间"); } } 程序3 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏。

#include #include #include void main() {

int input_number;

int random_number; int n; srand( (unsigned)time( NULL ) ); random_number = rand()%100+1; for(n=1;n<=10;n++) {

printf("输入您想猜的0~100之间的数:"); scanf("%d",&input_number); if (input_number >= 0 && input_number <= 100)

if (input_number == random_number)

{

printf(" right! ");

if(n==1)

{

printf(" 您猜了%d次,太牛逼了. ",n);break;

}

else if(n>1&&n<6)

{

printf(" 您一共猜了%d次,水平还行. ",n);break;

}

else

{

printf(" 您一共猜了%d次,才猜对,很勉强啊. ",n);break;

}

}

else if (input_number > random_number)

printf(" 您猜的数过大,您还有%d次机会 ",10-n);

else

printf(" 您猜的数过小,您还有%d次机会 ",10-n);

else

printf(" 您猜的数应在0~100之间"); } if(n==11)

printf(" 你输了! "); }

程序4 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。 #include #include #include void main() {

int input_number;

int random_number; int n,i=1;

game: srand( (unsigned)time( NULL ) ); random_number = rand()%100+1; for(n=1;n<=10;n++) {

printf("第%d轮游戏,输入您想猜的0~100之间的数:",i); scanf("%d",&input_number); if (input_number >= 0 && input_number <= 100)

if (input_number == random_number)

{

printf(" right! ");

if(n==1)

{

printf(" 您猜了%d次,太牛逼了. ",n);break;

}

else if(n>1&&n<6)

{

printf(" 您一共猜了%d次,水平还行. ",n);break;

}

else

{

printf(" 您一共猜了%d次,才猜对,很勉强啊. ",n);break;

}

}

else if (input_number > random_number)

printf(" 您猜的数过大,您还有%d次机会 ",10-n);

else

printf(" 您猜的数过小,您还有%d次机会 ",10-n);

else

printf(" 您猜的数应在0~100之间"); }

} if(n==11) { printf(" 你输了! "); i=i+1; goto game; } 2. 遇到的问题及解决方法

问题1:随机数如何调用?

解决方法:运用srand( (unsigned)time( NULL ) )函数。

问题2:”直到人猜对为止”功能如何实现? 解决办法:运用一个“无穷循环”,另游戏能够不断进行,并运用break语句停止于猜对情况。

问题3: “以此来反映猜数者“猜”的水平”功能的实现?

解决办法:在猜对情况下的if语句中嵌套if语句实现“猜数次数”的判断,分支输出“猜”的水平。

问题4:“每次运行程序可以反复猜多个数”功能的实现?

解决办法:此功能比较困难,但反复阅读程序后,发现代码并不复杂,运用goto语句和if语句的运用进行循环,即可实现此功能,且不会因为运用goto语句造成程序模块的混乱。

3. 总结(心得体会)

这是“C语言课程实践”的第一次实践,由于平时并没接触过Microsoft Visual C++ 6.0这个编译软件,因此刚开始还存在操作方面的苦难。经过一两节课的实践,能够熟悉界面和学会新建工程。

此次实践题目是“猜数游戏”,题目分成4个部分,其实内容相同,只是功能逐渐增加。鉴于这种题目,编写程序中需要思考预留部分,比如运用if语句嵌套时,要注意把“猜对”、“猜错”和“误猜”分支出来,使程序容易阅读也容易进行修改。

在编写程序过程中,遇到几个核心问题,通过学习后把困难一个个突破,并成功实现题目所要求的功能。

最后,我对编程有进一步认识,而且在编程调试过程中,能够从中发现问题并解决问题,这是程序能够走向成功的必经之路,也是带来成功喜悦必不可少的过程。

上一篇:服装设计培训班哪家好下一篇:七年级上学期期末测试