计算机语言类创新教育课程设计实践体会

2024-08-16

计算机语言类创新教育课程设计实践体会(精选4篇)

计算机语言类创新教育课程设计实践体会 篇1

计算机语言类创新教育课程设计实践体会

本文以计算机语言类课程教学为基础,给出了该类课程的创新教育课程设计实践探索与体会.结合创新课程设计的“五大品质”的.要求和挑战,改革传统的教-学-考模式,采用以案例教学为主线的任务驱动的教学方法,使教学更加贴近应用型人才培养的目标和要求.

作 者:刘世华 作者单位:温州大学,城市学院电子分院,浙江,温州,325035刊 名:计算机教育英文刊名:COMPUTER EDUCATION年,卷(期):“”(22)分类号:G642关键词:应用型人才 创新教育课程设计 案例教学 任务驱动

计算机语言类创新教育课程设计实践体会 篇2

一、计算机语言类课程的特点

1. 计算机语言种类很多

目前世界上流行的程序语言有许多种, 这种情况将来也不会改变, 因为这是由我们所面临的需要解决的计算问题的五彩缤纷所决定的。任何语言都不可能是最完美的工具, 不可能在处理任何问题时都是最锐利的宝剑。每种语言都有其最强的地方, 也有其薄弱之处。当我们面对一项具体工作时, 即使有各种环境因素的制约, 也还是应该尽可能地去选择最适合这个问题的语言。为此, 我们就需要学习多种程序设计语言, 需要在实际工作中, 针对具体问题, 对各种可能用的语言进行评价和比较。而要能正确地做这种评价比较, 就需要有对于语言的更深入理解。

2. 计算机语言的实践性强

计算机语言是一门操作性很强的课程。它比以往任何一门课程更强调学生的操作能力。实践是检验真理的唯一标准, 理论上的许多知识, 如果单凭课堂讲解或者演示操作是远远不够的, 学生只有通过亲手操作, 解决在操作过程中碰到的问题, 才能在实际编写软件时游刃有余。

3. 计算机语言具有创造性

计算机语言类课程的知识看起来都是固定模式, 而真正在应用于软件开发时却是千变万化的, 因此, 这门课程具有很强的创造性。因而在教学过程中开发学生的思维能力、想象能力, 将会激发学生学习的动力。

二、计算机语言类课程传统教学方式的弊端

目前计算机语言教学中普遍存在这样的问题:语言课程难教难学, 学生兴趣索然, 教学质量不高。之所以出现上述问题, 主要有以下几方面原因:

1. 计算机语言教学方法死板, 总是先介绍一条条语句的语法规则, 再用例子讲解, 不能充分地启发学生的思维。这种现象的历史原因也许是在程序设计语言发展的早期, 学生由于受上机条件限制, 难得一次上机机会。这种教学模式必然导致学生自己独立分析问题、解决问题及编写程序的能力很差, 学得好的学生也往往是“语法的巨人, 编程的矮子”, 等到做毕业设计时才发现自己无法真正面对实际问题编写程序进行解决。这种教学模式的弊端日益显现。

2. 教学中片面强调算法, 忽视具体应用语言和应用的关系是辩证的。一方面, 语言是应用的基础, 任何应用都必须用语言来描述;另一方面, 应用是语言的价值归宿, 任何语言的优劣都必须通过具体的应用来验证。目前很多职业学校的计算机语言教学过多地强调算法本身, 忽视其在专业领域中的具体应用, 甚至考试时出一些偏题、怪题, 从而导致课程教学质量不高, 学生的实际应用能力和应变能力、创新能力不强。

3. 一些计算机语言教材中所有的习题及上机操作题都附上了答案, 这对学生的学习并没有好处, 容易将学生的编程思维套入一个固定的模式中, 不能培养学生的发散思维, 也给偷懒的学生创造了条件。

三、计算机语言类课程的教学改革

针对上述传统的计算机语言类课程的教学方法存在的弊端, 必须对其进行改革, 主要措施如下:

1. 教学材料的选择与设计

首先, 要针对不同专业的学生, 挑选一本适合的计算机语言教材, 课本是教学的“纲”, “纲”举才能“目”张。好的课本能够提供一条比较清晰的学习脉络, 为教师搭建一个好的教学平台, 为学生提供一个好的学习桥梁。

再次, 就是课堂教学案例的选择。课本是“纲”, 而具体内容则要由教师来进行选择和组织。如果教师只按照课本的内容来照本宣科, 则只会使学生感到学习的枯燥, 从而失去学习的兴趣。

2. 传统教学方法的改变, 要尝试使用新颖的教学方法

在计算机语言教学中, 主要注意培养学生的编程思维, 通过启发法、案例法、比喻法、实验法等各种不同的教学方法的使用, 使学生尽快掌握编程方法。具体运用如下:

(1) 启发式的教学方法。在计算机语言的教学过程中, 传统的教学方式是注入式的教学方式, 这种教学方法往往使学生觉得学习枯燥无味, 慢慢地就失去了学习的兴趣。而采用启发式的教学方法, 就可以克服上述弊端, 激发学生学习的主动性和创造性, 达到事半功倍的效果。程序是“活”的, 每个问题都有多种解决方法。比如在讲解求两个整数的最大公约数时, 计算机语言中解决此问题的方法采用了不同于传统的数学、但又源于数学的方法。在具体解决过程中, 教师可采用先总体讲解, 然后分组讨论, 最后得出具体解决办法的策略, 把每个学生的学习和探索知识的兴趣都调动起来, 从而达到学习的目的。

(2) 案例式的教学方法。所谓案例教学法是指利用已经发生或将来可能发生的问题作为个案形式让学习者去分析和研究, 并提出各种解决问题的方案, 从而提高学习者解决实际问题能力的一种教学方法。

这就要求教师在上课前必须准备好合适的案例, 通过把一些真实的、典型的案例展现在学生面前, 要求他们设身处地去作出反应, 学生在分析案例的同时, 不断形成新的理论视野, 增长案例分析的技巧;探索思考理论如何运用于实际, 从而及时而有效地促进理论向实践的转化, 真正达到理论与实践的结合, 有利于加强高职院校学生的实践动手能力。

(3) 实验的方法。“纸上得来终觉浅, 绝知此事要躬行”。编制程序的目的是要解决实际的问题, 而调制程序的实验过程是必不可少的。在教学过程中, 可以先把需要的知识点讲完, 然后统一要求学生做一个大的综合实训, 我在实际教学过程中就曾尝试着在讲述完必要的内容之后, 留出10~15学时给学生布置相应的综合实训题, 学生可以采取分组的方式来完成各自课题的设计与调试工作, 通过这种分工合作的实验方式, 学生动手能力和学习兴趣大大提高。

我们在具体讲述课程的过程中, 可以把多种教学方法综合在一起, 以达到高职教学的目的。

3. 传统与现代教学手段相结合, 提高教学效果

传统的教学手段采用“语言+黑板+教材”方式, 其优点是注重抽象说理, 学生可以感受到教师的思维过程。缺点是以“听”或“视”的单一通道方式传送信息, 信息量少, 进度较慢。现代教学手段充分利用计算机网络和多媒体技术, 我在具体讲述的过程中, 主要是采取制作电子课件进行讲解的方式, 在比较抽象的问题上, 再在黑板上画图进行详细讲解, 这样, 就把传统与现代的教学手段结合在一起, 取得了很好的教学效果。此外, 我们还可以构建网络学习环境作为辅助教学手段, 将教学资源上网, 建立网上测试题库, 提高学生自主学习能力。

总之, 时代在发展, 计算机语言类课程的教学在整个高职学院的教学中占有很重要的地位, 这就要求我们每位计算机教师都要积极地去探索与尝试不同的教学方式, 从而培养出既有理论知识, 又有更强的实践能力的综合性的优秀人才。

参考文献

[1]罗志军.园林专业学生实习探索[J].渝西学院学报, 2003, (2) .

计算机语言类创新教育课程设计实践体会 篇3

【摘要】卓越工程师教育培养计划是我国践行科技强国战略的重要举措,而计算机语言类课程是软件工程师培养方案的重要组成部分。本文针对目前语言教学中存在的问题与不足,提出“工程导向型”教学理念,针对核心问题,提出问题解决方案。

【关键词】卓越工程师 建构主义 工程导向

【中图分类号】G642 【文献标识码】A 【文章编号】2095-3089(2015)08-0071-02

卓越工程师教育培养计划的核心是创新实践教育,遵循“行业指导、校企合作、分类实施、形式多样”的原则,由国家层面制定相关的配套支持政策,提出行业领域人才培养需求,指导高校和企业在本行业领域实施卓越计划。我校“软件工程”专业被遴选为首批试点专业,按照教育部统一部署,精心制定了适合本校学生层次的教学大纲和实施方案,着力提升学生的工程实践能力、创新能力和行业竞争力。

一、计算机语言类课程的教学困境

软件工程专业的核心目标是训练、培养学生的软件使用与创新设计能力,而其中的关键是深入掌握乃至精通一门或多门计算机程序设计语言。多年的教学实践告诉我们,软件工程的教学重点首先应该放在对计算机语言的系统学习上。学生深入掌握计算机语言的精髓,不仅可以帮助其加深对软件的理解,而且可以从本质上领悟软件设计的机理,进而消化、吸收乃至创新。

目前,计算机语言教学存在以下三个误区,一是应试教育思维仍占主流。很多高校开设计算机语言的主要目的就是为了应付各种不同类型的等级考试、资格考试,教学计划的制定仍然是围绕考试大纲,考什么就教什么、学什么。二是形式主义,照本宣科式地教一些基本知识,学一些基本概念,避重就轻。三是教材本位主义。目前很多教师还是就教材章节安排教学内容和进度,并不适合大多数学校的实际教学需求。如果一味强调教材的主导作用,则不利于教学改革,很难收到预期教学效果。

由于存在以上误区,计算机语言类课程的教学突出反映了四个问题:(1)侧重基本概念的讲解而忽视综合应用的训练;(2)强调局部知识点而忽视知识全貌的构建;(3)学习单元相对独立,缺乏对单元间内在联系的深度探讨;(4)教学设计太刻板,片面强调教学过程的可控性,忽视构建一条全局性的知识链。

二、基于建构主义的工程导向型教学理念

建构主义理论认为,学生是教学的主体,教师只是教学活动的组织者、实施者和引导人,仅负责学习情景的创造。学生对知识的获取不是简单被动的接受,而是经过复杂的思维处理形成特定的主观认识。教学过程的实质是一个异步、并发式的过程,不同的学生有不同的学习目标和过程,学生获得知识的多少取决于该学生根据原由知识去建构新知识的能力,而不是取决于学生的记忆力。

结合多年教学实践,我们提出了“工程导向型”教学理念,即将整个教学内容划分为若干单元,每个单元凝聚为一个核心,为每个核心设计一个“工程模型”。首先由教师提出工程的模糊模型,工程的具体内容及实現细则由学生去丰富、细化。可见,工程模型的递次求解过程就是“由点到面”的不断学习过程,学习内容呈“星状”辐射,并向外逐层延伸。

工程导向型教学理念包括以下六个基本原则:

1.一切问题“工程”化。将问题置于软件工程设计情景中,规划设计步骤,循序渐进,力求体现工程设计的完整过程,训练工程处理的基本思路和方法;

2.反馈补偿原则。在对工程后续单元的处理过程中,新建构、新学习的理论反过来又可用于修正前面的结果,调整知识结构,实现优势互补,循环提高;

3.工程单元的逐层嵌套。根据课程内在联系,工程单元的划分采用规模递增的原则,对已学知识反复使用、研究,逐步深入,调整结构,加深理解;

4.自主构建知识链。研究工程单元之间的内在联系,寻找承上启下的知识点,构建一条贯穿始终的主线索,从而形成课程的全局观念;

5.无限循环原则。具体体现在工程单元的无限延伸性和工程体系的首尾相连性上;

6.培养工程技术型人才。工程导向型教学思想的最终目标是使学生树立正确的“工程”观念,掌握工程设计的基本技能,能解决实际的工程问题。

三、工程导向型教学设计

基于工程导向型的教学设计主张学习的主动性和建构性,强调以“学生的自主学习”为中心内容,鼓励学生主动探索、勇于发现,提倡培养创造型人材,强调精英教育与素质教育的全面结合。另一方面,工程导向型的教学设计也注重教师主导作用的发挥,反对忽视师生之间的情感交流和情感因素在学习过程中的重要作用。我们认为,工程导向型教学设计必须正确处理好以下四个方面的关系:

1.学生自主学习与教师讲授的关系。虽然工程导向型教学强调学生为教学活动的主体,以学生自主学习构成整个教学过程,同时更重视教师的导向作用,只是对教师的知识水平和教学能力提出了更高的要求。尤其工程模型的设计与各个处理过程中,应该自觉体现这一点,避免回到传统的课堂教学老路上来。

2.教学内容与大纲、教材的关系。不可否认,目前的教学工作大多要求在指定的教学大纲指导下进行,突出的表现就是对教材的过分依赖。换句话说,很多教学大纲都是教材章节的简单罗列,教学的内容、进度以及教学目标和效果等在很大程度上受到教材的制约。工程导向型教学必须打破这种僵局,以教学目标指导教学计划的制定,教材仅作为教辅材料。

3.教学目标与学习目标的关系。教学目标是课程教学的整体目标,是根据授课学生层次、教学资源环境等提炼出来的一个笼统的计划性目标。而学习目标是具体的阶段性目标,需要根据每个学生的具体情况、当前时期的学习内容来决定,它不具有统一的形式,因而是仍然可调控的、可显的。

4.工程概要与工程模块的关系。工程概要即工程框架结构,由教师提出粗略设想,从全局角度出发,关心的是工程单元之间的内在联系,重点在于课程主导线索的建立。而工程模块由学生设计,根据每位学生对工程要求的理解,结合其自身的经验素质、所处学习环境等因素,设计具体的工程实施步骤。

四、教学设计案例分析

我们以Visual C++(简称VC++)课程教学为例,介绍工程导向型的教学理念在计算机语言课程教学设计中的具体应用。我校的VC++课程主要涉及C++基本语法、类与对象、可视化界面和数据库等四个方面。为此,我们构造一个综合性的应用型工程“试题库管理系统”,主要包含试题录入、编辑、删除、查询与统计等管理功能,涉及文字处理、图形编辑、界面设计和后台数据管理等四个方面内容。如图1所示。

(1)C++语法规范,包括类与对象部分,作为程序设计的基础知识,可以在学期开始时讲授,也可以穿插在过程中讲授。如果之前开设过C语言等课程,则可以由学生自学完成。我们在实际教学时,根据我校培养方案实施情况,把这部分内容分成两个阶段,首先把基础语法讲授完毕,而把类与对象的知识穿插在工程实现的过程中,当整个工程完成后,再引导学生反馈、巩固。

(2)工程构建从界面设计开始,教师只给出大致的界面布局,放任学生自由发挥,鼓励他们创造性地设计个性突出的丰富多彩的界面。把原本枯燥无味的控件罗列性介绍融入趣味性十足的界面美化中,激发学生学习热情,引导他们自学课本未涉及的知识点。实践表明,这种自由发挥式的教学模式很受学生欢迎,大家你追我赶,各领风骚,设计成果出乎意料的好,学习效果显著,学习深度在不自觉中得到加深、升华。

(3)努力为学生创造良好愉快的学习情境。图1中的“文字处理”负责试题的文字编辑。在进行这部分教学设计时,我们专门安排一次课时间让学生熟悉一些典型的文字处理软件,如Word、WPS等,有针对性地学习它们的设计风格及功能设置。在此基础之上,再引导学生在VC++中寻找类似的控件,拓展深度设计。再如图中的“图形编辑”,考虑到数学、化学、机械等课程试题中经常需要用到各种形状的图形,所以需要系统提供给用户一个图形制作功能,允许用户根据实际需要自行绘制各类图形。因此,我们要求学生深入研究Word的图文混排功能和VC++的图形处理原理,要求了解相关课程的试题对图形操作的具体要求,如此等等才能设计出满足不同课程需求的图形编辑模块。

(4)数据库管理原本是一门独立的课程,在VC++课程中只作扼要介绍。由于“试题库管理系统”需要管理数据,加之同学们对这部分知识很感兴趣,我们就因势利导加深了这方面的讲授力度,包括ADO、ODBC、DAO等,让学生在实践中感受C++强大的数据管理能力。很多学生自觉学习SQL、Oracle等数据库知识,完善自己的系统功能,设计成果大大超出预期效果。

(5)正确定位教师角色

工程导向型教学理念强调学生是教学主体的同时,同样重视教师作用。教师的职责在于确定学习任务,组织学习活动 ,引导学生正确使用信息资源。教师由舞台主角变成了幕后导演。这一转变不仅没有削弱教师的地位和作用,而且对教师的知识水平和教学能力提出了更高的要求。要求教师既要为学生提供充足的学习资源,帮助学生完成学习过程,而且要加强教学过程管控,把握教学进度,保证学习效果。

参考文献:

[1]张庆久.德国应用科技大学与我国应用本科的比较研究[J].黑龙江高教研究,2004,(8):32-34.

[2]Hiebert, J., Carpenter, T. P., Fennema, E., Fuson, K., Human, P., Oliver, A. & Wearne, D. (1996). Problem solving as a basis for reform in curriculum and instruction: The case of mathematics. Educational researcher, 25(4):12-21.

[3]Riedel, E., Dresel, L., Wagoner, J., Sullivan, L. & Borgida, E.. Electronic communities: assessing equality of access in a rural Minnesota community[J].Social Science Computer Review,2001(6):370-390.

[4]Szajna, B.. Empirical evaluation of the revised technology acceptance model[J]. Management Science,2004(42) :85-92.

[5]Brooke Smith, Peter Caputi, Patrick Rawstorne.The development of a measure of subjective computer experience[J].Computers in Human Behavior,2007 (23):127-145.

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

2014—2015学年第1学期

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

成 绩:

时 间:

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间猜一个数n”);scanf(“%d”,&input);do{

if(input==num){

} else if(input>num){

} else if(input

}

}

} printf(“你猜的数太小了,请再猜一个n”);scanf(“%d”,&input);times++;}while(times<9);if(times>=9)printf(“你已经猜了10次都猜不中,你输了n”);printf(“继续下一轮新的猜数请按1,退出请按0n”);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(“请输入你要查询学生的学号:n”);scanf(“%d”,&number);for(int i=0;i

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

{

printf(“学号t姓名t数学t英语t物理t总分t平均分t排名n”);

printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,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(“请依次输入他们的学号,姓名,数学成绩,英语成绩和物理成绩n”);for(int i=0;i

printf(“第%d位同学的学号,姓名,数学成绩,英语成绩和物理成绩n”,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(“ 学生成绩表n”);

printf(“-----------------------------n”);

printf(“学号t姓名t数学t英语t物理t总分t平均分t排名n”);

printf(“-----------------------------n”);}

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

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

printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,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(“-----------------------------n”);} }

运行结果示例:

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

打印出名次表:

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

心得体会:

懂得了用结构体将不同的数据类型结合在一起,然后定义结构体数组,使得每个数组中的成员都具有不同的数据类型变量。而且同属于一个数据类型,也可以定义数组来表示相同的类型但是有多个不同值,比如成绩这个变量。也懂得了用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条件语句来判断输入的成绩处于哪个分数阶段,定义n1、n2、等整形变量来存储各个分数段的总人数,变量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个学生的姓名和成绩n”,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(“学生信息录入完毕nnn”);} void getnotpass(stu s[]){ printf(“不及格人数为:%dn”,n1);printf(“不及格人员名单如下:n”);for(i=0;i

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

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

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

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

printf(“%st”,s[i].name);} printf(“nnn”);} void percent(stu s[]){ printf(“各分数段的学生人数及所占的百分比如下:n”);printf(“分段t 人数t 图形n”);printf(“<60t%d(%.0f%%)t ”,n1,(float)n1/(float)num*100);for(i=0;i=90t%d(%.0f%%)t ”,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(“请输入你要查询学生的学号:n”);scanf(“%d”,&number);for(int i=0;i

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

{

printf(“学号t姓名t数学t英语tC语言t总分t平均分t排名n”);

printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,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(“请依次输入他们的学号,姓名,数学成绩,英语成绩和物理成绩n”);

for(int i=0;i

printf(“第%d位同学的学号,姓名,数学成绩,英语成绩和物理成绩n”,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!n”);

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

fprintf(fp,“%ut %dt %dt %dt %dn”,s[i].num,s[i].grade[0],s[i].grade[1],s[i].grade[2],s[i].rank);} fclose(fp);} void title(){

printf(“ 学生成绩表n”);

printf(“-----------------------------n”);

printf(“学号t姓名t数学t英语t物理t总分t平均分t排名n”);

printf(“-----------------------------n”);}

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

printf(“%ut%st%dt%dt%dt%dt%5.2ft%dn”,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(“-----------------------------n”);} }

运行结果示例:

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

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

在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(“ 学生信息统计n”);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(“n”);} }

运行结果示例:

心得体会:

懂得了从文件中输入信息到定义的数据中。就是要先构造与文件信息中相对应的结构体数组,然后用打开文件,需要知道文件的具体位置还有文件名,”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.显示学生信息n”);

printf(“2.姓名升序排序n”);

printf(“3.平均成绩降序n”);

printf(“4.学号查询学生信息n”);

printf(“0.退出n”);

printf(“n输入需要查询的序号:”);

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(“ 学生信息统计n”);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(“n”);} } void search(struct student *stu,int n){ int m,col=0;printf(“请输入你要查询学生的学号:n”);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(“不存在该名学生信息n”);} 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(“按姓名的升序排序如下!n”);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(“n”);} } 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循环输出即可。

参考文献:

上一篇:2022年三八节宣传口号下一篇:造价员管理暂行办法(辽建价发[2007]16号)