第一篇:关于模块教学问题
关于模块化教学问题
一、模块化教学的内涵及模块式教学模式
(一)模块化教学的内涵
模块化教学是以现场教学为主,以技能培训为核心的一种教学方法,不但重视知识的传授、更重视知识的应用,要求教师要精选教学任务,提前做好准备,介绍内容要讲究艺术性,评估时尊重学生成果。但教师本身知识水平的高低、实践能力的强弱、工作量的大小是决定模块化教学成功的关键。“模块化教学法”是师生通过共同实施一个个完整的“模块”工作而进行的教学活动。模块化教学不仅传授给学生理论知识和操作技能,更重要的是培养他们的操作能力,这里的能力不仅仅是知识能力或专业能力,而是涵盖了如何解决问题的能力:方法能力、接纳新知识的能力以及与人协作和进行项目动作的社会能力等几个方面。
“模块化教学法”十分注重学生的主体性和生动性,注重在“做”中学,在“做”中积累经验。通过一个个模块的完成,学生学会查找资料,尝试失败,积累经验,促使学生学会学习,促使学生从“要我学习”向“我要学习”转变。模块化教学法在调动学习积极性和主动性方面有较好的效果。采用以学生为中心的活动,知识是通过模块的实践而形成的,学生厌学的现象得到了改善,为了项目的实现,学生要制定解决问题的方法,从而培养学生的创新精 1 神、认真负责的工作态度和一丝不苟的工作作风、小组活动还为团队精神创造了有利条件。
我国职教界总结出了相对适合我国国情的“宽基础、活模块”教育模式。所谓“宽基础、活模块”教育模式,就是从以人为本、全面育人的教育理念出发,根据正规全日制职业教育的培养要求,通过模块课程间灵活合理的搭配,首先培养学生宽泛的基础人文素质、基础从业能力,进而培养其合格的专门职业能力。
(二)模块式(Modules)教学模式
模块式(Modules)教学模式,指以就业为导向,根据就业岗位的任职要求和在职业领域(生涯)可持续发展的要求,解构教学内容,按认知规律和能力本位导向重构课程,形成模块化的课程体系,并在教学运行中,对教学方法、师资队伍建设、实习实训基地建设、考核考评等方面全面进行改革和创新的一种教学模式。
模块化教学模式以“MES”和“CBE”两种流派比较具有代表性。我国对模块化教学的研究和实践早于“项目化”教学,大概从上世纪90年代已经开始进行探索。
MES(Modules of Employable Skills,模块式技能培训),是20世纪70年代初由国际劳工组织研究开发出来的以现场教学为主,以技能培训为核心的一种教学模式。它是以岗位任务为依据确定模块,以从事某种职业的实际岗位工作的完成程序为主线,可称之为“任务模块”。CBE(Competency Based Education,能力本位教育),主要以加拿大、美国等为代表。它是以执行能力为依据确定模块,以从事某种职业应当具备的认知能力和活动能力为主线,可称之为“能力模块”。
两种流派的共性是都强调实用性和能力化。其区别是CBE是从职业普遍规律和需求出发,侧重于职业基础通用能力;MES是从职业具体岗位工作规范出发,侧重于职业岗位工作能力。
模块式教学模式的核心是课程的模块化。课程模块化包括了四个方面的内容,一是模块的搭建,课程模块是一个个项目化的学习单元,它把实践知识、理论知识与实际运用用情景有机结合起来,是学习领域的具体化,一门模块课程可以设计为若干个模块,一个模块又可以分为若干项目,项目之间,模块之间,依据工作逻辑和工作任务的不同而有差异,可以通过多条路径来选择,如工作对象、产品、岗位、操作程序、系统和设备的解构等;二是模块组合,模块内容通过工作任务引领专业知识,每个模块都是一个相对独立而完整的学习单元和任务的组合,具有明确的学习目标,模块之间的关系可以是平行的,也可以是递进的;三是任务要求,主要是针对职业工作岗位过程所需要的单位任务,对需要采取的动作和行为进行描述,包括了实践技术知识、技术理论知识及拓展知识的内容;四是技能训练,明确训练的项目名称、工具、材料、场地及操作步骤通过这种动态学习方式完成阶段性学习目标,形成综合职业能力。模块化课程的设计路线主要是对课程的解构和重构。一是基于职业岗位工作过程的进行课程解构。一方面明确专业培养目标,这种专业人才培养目标是具体化的,是有具体职业岗位或者岗位群的专业培养目标;另一方面对职业岗位进行深入的工作分析,确定了从事这个职业所要求的能力标准。这种课程解构的核心意义就在于它突破了以知识体系为核心的课程标准,建立了以职业能力为核心的课程标准。二是基于职业岗位能力导向进行课程重构。首先,对形成职业岗位能力所需要的知识、能力和素质进行清晰的梳理,确定了专业教学的基本内容;其次,根据专项能力来划分课程模块;再次,确定每个课程模块的教学目标、内容体系、基本环境、教学组织;然后,根据模块教学目标的要求设计有效的教学方法、教学过程、教学评价;最后,明确知识、能力、素质之间的关系,重点关注如何运用已有的理论知识、操作技能和素质来完成工作任务,从而形成在复杂工作情景中做出判断和采取行动的能力。
二、模块化教学的具体方式
主要有两种方式。
第一种方式:(主要针对具体教学目标任务)
1、划分小组。小组人数以3~6人为宜,推选组长。组与组之间大体上要平衡,控制小组成员的变量很多,如学习者的学习成绩、知识结构、认知能力、认知方式等。教师必须对学生做深入细致的调查研究,如学生的思想表现、各科的入学成绩:家庭背景、性格 爱好、乃至交朋结友等都应心中有数。一般采用互补方式,如成绩好的学生与成绩差的学生相搭配,既有利于差生的转化,又有利于促进优等生的灵活变通,即所谓“教学相长”;不同知识结构的学生相搭配,可以取长补短,相互借鉴;不同认知方式的学生相搭配,在各自发挥其优势的情况下,相互学习,使认知风格“相互强化”。
2、确定内容。一节课的教学目标、教学内容,需要通过完成一项或几项具体的任务融合到教学过程中,从任务中引出教学目标,使学生产生学习知识的兴趣.一项好的任务是完成教学目的的关键,要把知识、能力和素质三个维度的目标融入任务中,使任务有利于学生个性的发展.教师要认真研究课程标准,分析教材,确定教学的目标、内容、重点、难点、疑点,找准教学的切入点,要考虑学生的心理特征和兴趣爱好,以便确定相应的任务。
3、布置任务。确定要完成的任务后,教师要向学生具体详细地讲清任务,充分调动学生学习的积极性。学生认清了自己要完成的任务后,如果觉得对此力所能及,便自然愿意去完成。
4、学生实施。向学生讲明要做什么后,教师不能采取“放鸭式”不管。教学组织者、实施者是教师,教学的指挥、调度仍掌握在教师手中。还要让学生知道怎么做,指导学生想办法、找出路,特别是对有困难的学生要给予必要的指导,使每个学生都能顺利完成任务。这一阶段,教师是“指导者”学习伙伴“导航者”身份较 5 为明显,学生在亲切友好、和谐平等的气氛中进行知识、技能的意义构建。
5、评价结果。学生完成任务之后,教师要展示其作品,进行讨论、总结、评比,使教材内容得到进一步的强化。各小组学生代表要依次对完成的任务发表见解,其他小组提问或发表自己的看法,由老师或小组负责人进行总结,最后由老师评价.评价包括学生对知识的掌握程度、运用知识解决新问题的能力以及学生在活动中的表现等,注意多褒奖,少贬低,以激发学生进行下一轮学习的兴趣。
第二种方式:(主要针对理论知识点学习)
1、情景设置。创设学生当前所学习的内容与现实情况基本相接近的情景环境,也就是说,把学生引入到需要通过某知识点来解决现实问题的情景。
2、操作示范。围绕当前学习的知识点,以便于学生“知识迁移”的要求,选择合适的小项目,并示范完成项目的过程。
3、独立探索。让学生独立思考,对知识点进行理解,消化示范项目的解决要点,为解决练习项目打下基础。
4、确定项目。小组通过社会调查,研究讨论,并在教师的指导下确定具体的项目。
5、协作学习。开展小组交流、讨论,组员分工协作,共同完 6 成工程项目。
6、学习评价。学生学习的效果直接由完成工程项目的情况来衡量,包括教师评价、学习小组评价和自评三部分。
三、模块化教学法的特点与要求
模块化教学是以现场教学为主,以技能培训为核心的一种教学方法,具有灵活性、针对性、现实性、经济性的特点。模块化教学不但重视知识的传授,而且更重视知识的应用。它克服了传统教学方法中只注重教师讲授,学生听课,单项信息传递的教学方法。模块化教学把学生作为教学的中心,强调学生在教学中的主观能动作用,注意调动学生的学习自觉性和主动性,教师和学生之间的活动是互动式的。
(一)模块化教学法的特点
1、以学生为中心的教学活动
模块化教学中教师只是在开始利用很少的时间对任务的内容要求进行讲解,大部分时间学生在教师的指导下完成任务,学生自己写出任务计划书,实施过程,检查评估标准,并亲手按计划实施任务,整个教学过程是围绕学生展开的,教师对学生搞不懂的地方进行指导。学生通过自身的操作活动,创造性得到充分发挥。
2、手脑并用获取知识和技能
学生在操作过程中,遇到不懂的地方,教师讲清学生应如何做,为什么这样做。整个操作完成后,由学生自己总结出这样做的理论依据,然后对照课本看是否和书本上的结论一致,这样在教师帮助下和个人探索中获取理论知识,更能激发学生的学习动机,大大提高学习效率。
3、实现认知目标和操作目标的双赢
认知目标的实现固然十分重要,但不是唯一的目标。在生产实践中往往更加重视操作的熟练程度,因此认知目标、行为操作目标都是重要的学习目标,它们之间既是互相独立的,彼此之间又保持着重要的联系,是一个有机的整体,在具体操作过程中加速认知目标的实现,做到认知目标和行为目标的双赢是模块化教学的一个重要特点。
4、师生之间实现了双向信息的传递
模块化教学的信息传递是双向的。教师是讲课和指导,学生是听课和活动,教师可根据学生活动的成功与否获得其接受教师信息的多少和深浅。教师还可以对那些掌握信息较少和较浅的学生采取措施,帮助他们补充信息,直至他们获得完成工作任务所需要的信息。只有双向传递的信息,只有不断得到反馈的信息,才是真正有效率的信息传递。
5、教学过程中加大了学生的参与程度
模块化教学表现在学生必须独立地完成一项又一项的工作任务,这些工作任务按由浅到深的顺序设计,使学生提高了学习的兴趣。学生参与程度的提高,使学生从一开始的要我学逐步变成我要学。
6、最高境界的激励方法
模块化教学激励的手段完全是内在的,而不是外在的,是学生在完成一个任务之后发自内心的喜悦,是学生从不会到会的心理感受,当学生从不会做一件事到经过努力之后会做一件事,成功的喜悦往往是无法用语言来表达的。再有,任务实施成功与否的评判标准是看任务实施的过程,而不是去看结果,这就完全激发了学生学习热情,提高了他们的自信心。
(二)模块化教学对教师的要求
模块化教学的实施过程可以说从根本上改变了教师一统课堂的局面,使学生和教师共同参与教学,所以一堂课的成功与否既取决于学生,又取决于教师。模块化教学的实施需要教师和学生双方的共同努力。教师从知识的传授者成为一个咨询者或者指导者,这样,对教师的要求反而提高了。
模块化教学对教师提出了全新的要求。教师并不把知识传授作为其唯一的任务,而主要是准备教学情境、构筑学习9 氛围、组织和引导教学过程。这就要求在任务实施的过程中教师做到以下几点:
1、精选教学任务。一个教学任务就是一节课或几节课的教学目标、教学内容,通过完成一项或几项具体的任务来完成教学目标,从任务中引出教学目标,使学生产生学习知识的兴趣。一项好的任务要把知识、能力与素质三个维度的目标融入任务中,使任务有利于学生个性创新思维能力的发展。
2、课前熟悉任务内容,对其进行深入研究,并准备好任务讨论可能涉及到的有关知识。
3、介绍任务内容要讲究艺术性,吸引学生的注意力,激发学生学习的积极性和讨论的热情。
4、在任务内容讨论评估时,教师要尊重学生的成果,切记不要在学生面前评论谁对谁错,任务实施成功与否应看整个过程的进行情况。当然在学生交流任务实施结果的时候,老师也应该耐心地听取,不能因为那个学生讲得不好而有任何不尊重学生的行为,否则,学生就会失去信心,任务实施就会失败。
总之,模块化教学教学目的明确,听、看、做、思、练五环相扣,充分调动学生学习的兴趣,教学的过程由浅入深,注重学生基本技能和能力培养。知识点集中,内容遵循必需、够用的原则,积极推行要让学生懂得做什么、怎么做。作为 教师要积极学习先进的教学理念,更新观念,积极推行课程改革。
第二篇:有效教学问题
有效教学问题
赵卫
“有效教学”是新课改引进的一种现代教学理念。它要求历史教师以“有效教学”理念为指导,提高课堂教学效益。就调查的结果来看,有效教学的困惑主要表现在以下方面:
一、重教学时间的投入,缺乏效益观。“有效教学”关注教学的效益,学生有没有收获。大多数老师理解为有没有教完内容或教得是否认真,学生收获了多少不得而知。所以大多数老师最大特点是舍不得,一是舍不得老教材知识点,上课不断的加老教材的知识点,学生专门有一个笔记本拼命的记。如《新中国的成立》一目,新教材只有新政协的召开和开国大典,以及新中国的历史意义。老教材中巩固政权的斗争略去,但老师舍不得,又按老教材的体系去讲解,理由是新教材知识点不足,不足以应付高考。二是新教材的内容舍不得,如,新教材《新民主主义革命崛起》一文,从五四运动到大革命的失败,跨度之大,内容之多,是要进行重难点的取舍,但有的教师总认为讲不透,学生不理解,考试不过关,就《五四运动》一目就讲了20多分钟,显然完不成教学目标,教师自己也急,一节课下来学生不停的记笔记,补充旧教材的知识,学得很辛苦。
二、理论性较强,轻视能力,远离学生生活。历史教学要贴近学生实际,贴近学生的生活,让学生能运用历史知识来解决生活中的有关问题,切身体会到所学知识是有用的,可以激发学生学习历史兴趣。而在实际的教学中,学生大部分课堂教学都在学习基础历史知识,理论性较强,与学生的生活无关,与学生的体验无关,只与考试有关。忽略了学生情感、态度、价值观的培养。高三下来的教师,从高一就进行高考的培养,培养名校的学生,追求名利,高一就把高三的一轮复习知识拉入高一教学的内容,学生有专门记笔记的本子,都是高考的大问题,学生记得满满的。高二分文理科,在特尖班还会出现文科教师和理科教师抢夺尖子生的问题,理科教师劝全班倒数十五名的学生去读文科,成绩好学生都上理科,文科老师劝好学生上理科,这关系到一个教师,尤其是班主任的名誉。
三、“双主教学”的疑惑。《课程标准》要求:“学习应激发学生的学习兴趣,注重培养学生自主学习的意识和习惯,为学生创设良好的自主学习情境,尊重学生的个体差异,鼓励学生选择适合自己的学习方式。”(《课程标准》)但在实际的教学中却出现了理解偏差,以学生为主体,就是教师不讲课,学生自己学。结果是学生非常的忙碌,有自主无探究,有小组无合作,有讨论无思考,最后课堂乱成一锅粥。所以,学生往往拿不出什么结果或结论,感到非常茫然。如,老师在组织学生讨论抗日战争胜利的原因时,学生刚讨论了一会儿,就要求学生停止讨论,还未深入开展,教师就草草收场。因此,放弃教师的主导地位,课堂教学就会流于形式。
四、集体备课形式化,教案与教学相脱节
集体备课即大家统一制定教学目标。实际上集体备课中只是几个老师在查资料,做课件,整理学案,大多数老师是“拿来主义”,集体备课形式化现象严重。教师对于设计好的教学设计,走上课堂却都抛在了脑后,教师一味强调知识的传授,强调高考的考点,忽视过程与方法、能力的培养,受教学经验的支配,出现很大的随意性。如某位教师在讲授《抗日战争》时,教案目标有一条是这么设计的:探讨抗日战争在世界史的地位,体会中国为反法西斯战争做出的贡献。但一节课老师都在讲日本的罪行和中国的抗战,丝毫没有提及到这个教学目标。
第五,教学手段现代化,教学内容“换汤不换药”。
历史学科不是对死尸的临摹,而是对生命力的鉴赏。现代科技手段,更好的赋予历史学科新的生命力。它能协助历史教师在课堂内外取得最佳的教学效果,但毕竟只是教学的辅助手段。因此,不能过分依赖现代教学设备,课一上完,学生由于缺少了动手写、动脑想这一重要过程,因而课堂授课效果会大大削弱。在调查中发现,教师制作的课件存在许多问题,主要是:资料过多,企图用课件包办一切的现象,缺少精心的取舍,学生一节课都在看,感觉疲劳;制作课件的技术过于简单,课件枯燥无味,难以调动学生的积极性,反而成为学生睡觉的借口——眼睛疲劳;课件的教学内容不是过于简单就是过于复杂,这两种极端的倾向都不利于教学。科科用课件,节节课用课件,一天八节课,学生疲惫不堪。
第六,课堂评价单一化。
新课改实行学分制,对学生而言,平时的40分是课堂评价的有利的工具。教师从上课的提问情况,考勤,交作业的情况,违纪情况等都有严格规定,动不动就是“我扣你一分”,这也成为教师约束学生学习的法宝,因为新疆学生的特点就是自主性极差。“分分分学生的命根”,如此实行,出现了两极现象,学生要么重视,要么置之不理。在给学分时,等级的划分仍是以成绩为主。平时的40分的考核只是参考用以决定这个学生的去留。对教师而言,追求分数是与新课改相违背的;不追求分数,学生成绩不理想,领导、家长就会对教师质疑,因而让历史教师陷入尴尬的两难处境。成也分数,败也分数,历史教师感到极度迷惘。究竟作业分配这40分,才能使分数真正体现学生的真实水平?这是个问题。
第七、强调“基础知识”,创新谈何而来 教学目标分为知识与能力、过程与方法、情感态度与价值观三大领域,但教师似乎只对认知领域情有独钟。有些教师认为只要有高考存在,没有基础知识充实的课程只是一具骷髅,一切以考试为中心。创新,更是纸上谈兵。吴永军教授在《我们究竟需要什么样的基础》一文中指出:“当前各科教学中要培养学生的创新精神和实践能力,必须坚决摒弃过去那种死记硬背、机械训练而得到的僵硬的毫无价值的基础。”所以,基础知识是创新的前提和基础,没有基础讲创新无异于缘木求鱼,基础教育课堂教学是学生学会学习的主战场,教师要通过课堂教学这个主要渠道,教学生学会学习,使学生的创新能力得到明显的提升。
第八、自主学习不实际,学生学习方式难转变。新课改为学生提供了自主学习的空间,由学生自己选择学习的目标、内容、方式,教师只给予必要的指导,而不包揽学生的一切。但多数学生“懒得问”“不敢问” “不质疑”,就等老师解决一切问题,“启而不发”、“启而乱发”,自己“不走路”,依赖心理强。教师不仅要教学生“学会”,更要教学生“会学”。如,上课一提问,只要是书上找不到,学生要么就静静坐着不思考,要么就是胡乱说一通;让学生合作探究问题,学生象征性的翻翻书,然后学生就会把书抛到脑后,相互闲聊—“情人节你收到几朵玫瑰花”等,回答问题也是照书念;学生不关注教学。激发学生勤于思考,善于思考的能力,让学生充分发挥自己的创造力成为一大难题。
第三篇:教学计划编制问题
目 录 课题需求描述..........................................2 1.1 教学计划编制问题..................................2 1.2 进制转换..........................................2 2 总体功能与数据结构设计.................................3 2.1 总体功能结构......................................3 2.2 数据结构设计......................................4 3 算法设计和程序设计....................................6 3.1 教学计划编制问题..................................6 3.2 进制转换问题......................................9 4 调试与测试...........................................23 4.1 教学计划编制问题调试结果.........................23 4.2 进制转换问题调试结果.............................25 5 设计总结.............................................27 6 程序代码.............................................29 课题需求描述
1.1 教学计划编制问题
大学的每个专业都要制订教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。在这样的前提下设计一个教学计划编制程序。通过输入实际的课程及先后关系。结合每学期的学分及课程数,制定好学习计划。在输入相关数据后,程序会安排好每学期的课程。
1.2 进制转换
进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数制有:十进制,二进制,八进制和十六进制。十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制0~15),十六进制数运算规律逢十六进一。
要求:(1)输入一个十进制数N,将它转换成R进制数输出,并可以进行你转换。
(2)输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16)。
(3)为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。总体功能与数据结构设计
1.教学计划编制问题
根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。
2.进制转换问题
由于计算机只能识别二进制,所以当我们从键盘输入其他进制数的时候,计算机内部的系统会利用自带的程序代码自动转换成二进制,我们是学计算机的,所以我们需要弄懂这种机制转换的原理并且能计算出来。
2.1 总体功能结构
2.1.1 教学计划编制问题
教学计划是学校保证教学质量和人才培养的关键,也是组织教学过程、安排教学过程、安排教学任务、确定教学编制的基本依据和课程安排的具体形式。是稳定教学秩序、提高教学质量的重要保证。从教学计划的设计、实施等方面,阐明了如何搞好教学管理,从而为提高教学质量提供保证。随着教育改革的不断深入和社会发展的需要,原旧的教学计划在定位上的方向性偏差,已经不再适应社会的需求。因此,应重视教学计划的改革和修订工作,以确保教育教学质量,提高教育教学水平。教学计划编制中的思路:一是明确培养目标;二是注重学科设置的整体性、统一性和灵活性、全面性;三是与学分制改革有机结合.教学计划是高校实施常规教学活动的基本管理文档,由于传统的手工编制方式存在诸多弊端,开发基于Web应用程序形式的教学计划编制系统具有很好的应用价值。使用C程序设计语言,研究开发教学计划编制系统Web应用系统。
2.1.2 进制转换问题
1.十进制数与非十进制数之间的转换
(1)十进制数转换成非十进制数 把一个十进制数转换成非十进制数(基数记作R)分成两步.整数部分转换时采用“除R取余法”;小数部分转换时采用“乘R取整法”。
(2)非十进制数转换成十进制数 非十进制数(基数记作R,第j个数位的位权记作Rj)转换成十进制数的方法:按权展开求其和。
2.非十进制数之间的转换
(1)二进制数与八进制数之间的转换 ①二进制数转换成八进制数的方法.以小数点分界,整数部分自右向左、小数部分自左向右,每三位一组,不足三位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的八进制数码。②八进制数转换成二进制数的方法:用八进制数码对应的三位二进制数代替八进制数码本身即可。
(2)二进制数与十六进制数之间的转换 ①二进制数转换成十六进制数的方法:以小数点分界,整数部分自右向左、小数部分自左向右,每四位一组,不足四位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的十六进制数码。②十六进制数转换成二进制数的方法:用十六进制数码对应的四位二进制数代替十六进制数码本身即可。
2.2 数据结构设计
2.2.1 教学计划编制问题
LocateVex():图的邻接表存储的基本操作 CreateGraph():构造生成树 Display():输出图的邻接矩阵 FindInDegree():求顶点的入度 InitStack():构造一个空栈
ClearStack():清空栈 StackEmpty():判断是否为空栈 Pop():出栈 Push():入栈
TopologicalSort():输出G顶点的拓扑排序结果 2.2.2 进制转换问题
void D_B(): 十进制转换为二进制 void D_O(): 十进制转换为八进制 void D_X(): 十进制转换为十六进制 void B_D(): 二进制转换为十进制 void B_O(): 二进制转换为八进制 void B_X(): 二进制转换为十六进制 void O_B(): 八进制转换为二进制 void O_D(): 八进制转换为十进制 void O_X(): 八进制转换为十六进制 void X_B(): 十六进制转换为二进制 void X_D(): 十六进制转换为十进制 void X_O(): 十六进制转换为八进制 算法设计和程序设计
3.1 教学计划编制问题
3.1.1采用C语言定义相关的数据类型。
其中包括字符常量,整型,字符型,字符串型,typedef 定义的类型,结构体型,单链表节点类型,结构体数组。
3.1.2主要函数的流程图
1.LocateVex():图的邻接表存储的基本操作。由初始条件G存在,u和G中顶点有相同特征转而进行判断,若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。
2.CreateGraph():构造生成图。采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图)。
3.Display():输出图的邻接矩阵。采用循环设置输出图的邻接矩阵。4.FindInDegree():求顶点的入度。
5.InitStack():构造一个空栈。6.ClearStack():清空栈。
7.StackEmpty():判断栈是否为空。若栈S为空栈,则返回TRUE,否则返回FALSE。
8.Pop():出栈。若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。
9.Push():入栈。插入元素e为新的栈顶元素。
10.TopologicalSort():输出G顶点的拓扑排序结果。有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK, 否则返回ERROR。
3.2 进制转换问题
主要流程图:
进制转换菜单:
1.void D_B(): 十进制转换为二进制
for(j=0;a!=0;j++){ p[j]=a%2;a=a/2;} printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%d”,p[k]);} printf(“n”);
2.void D_O(): 十进制转换为八进制
for(j=0;a!=0;j++){ p[j]=a%8;a=a/8;} printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%d”,p[k]);} printf(“n”);
3.void D_X(): 十进制转换为十六进制
for(j=0;a!=0;j++){p[j]=a%16;a=a/16;if(p[j]<10)p[j]+=48;else { switch(p[j]){ case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;} }
十进制转换为任意进制:
4.void B_D(): 二进制转换为十进制
for(i=1;a!=0;i*=2){
if(a%10>1)
{s=1;break;}
else
{result+=(a%10)*i;a=a/10;} } if(s==1)
printf(“您的输入有误!请重新输入n”);else printf(“n转换后的数为:%dn”,result);5.void O_D(): 八进制转换为十进制
for(i=1;a!=0;i*=8){ if(a%10>7){ s=1;break;} else {result+=(a%10)*i;a=a/10;} } if(s==1)printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:%dn”,result);}
任意进制转换为十进制:
6.void B_O(): 二进制转换为八进制
for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;}
else{result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%8;result=result/8;} if(s==1)
printf(“您的输入有误!请重新输入n”);else
{printf(“n转换后的数为:”);
for(k=j-1;k>=0;k--)
{printf(“%d”,p[k]);}
printf(“n”);}
7.void B_X(): 二进制转换为十六进制
for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;} else{result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%16;result=result/16;if(p[j]>10){switch(p[j]){ case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;
case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;} } else p[j]+=48;} if(s==1)printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%c”,p[k]);} printf(“n”);}
8.void O_B(): 八进制转换为二进制
for(i=1;a!=0;i*=8){if(a%10>7){ s=1;break;} else {result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%2;result=result/2;} if(s==1)printf(“您的输入有误!请重新输入n”);
else {printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%d”,p[k]);} printf(“n”);}
9.void O_D(): 八进制转换为十进制
for(i=1;a!=0;i*=8){ if(a%10>7){ s=1;break;} else {result+=(a%10)*i;a=a/10;} } if(s==1)printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:%dn”,result);}
10.void X_D(): 十六进制转换为十进制
for(i=0;i
case 'A': b[i]=10;break;case 'B': b[i]=11;break;case 'C': b[i]=12;break;case 'D': b[i]=13;break;case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;} }
11.void O_X(): 八进制转换为十六进制
for(i=1;a!=0;i*=8){if(a%10>7){s=1;break;} else{result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%16;result=result/16;if(p[j]<10)p[j]+=48;else { switch(p[j]){
case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;} }
12.void X_B(): 十六进制转换为二进制
for(i=0;i
default: s=1;} }
13.void X_D(): 十六进制转换为十进制
for(i=0;i
14.void X_O(): 十六进制转换为八进制
for(i=0;i
其他进制间的转换: 调试与测试
4.1 教学计划编制问题调试结果
输入学期总数,输入学期学分的上限,输入教学计划的课程数,输入先修关系的边数,输入课程的代表值,输入课程的学分值(如图)
输入每条弧的弧尾和弧头(如图):
显示的课程计划如下:
4.2 进制转换问题调试结果
进入系统时的界面:
二进制转换为八进制:
十进制转换为十六进制:
十六进制转换为十进制: 设计总结 我的收获
虽然在高中我们已经学了C语言,大一我们已经学习了C++语言,但是,直到本期我们才开设了数据结构这一门课程。这门课程让我们对程序的原理有了系统的认识。对以往模糊的经验,起了总结提升的作用。在学习了这门课程后,我们进行了一个星期的课程设计,以实践我们的学习内容。
在这次课程设计中,我被分配到了教学计划课程编制问题,开始感觉很难,因为我从未编写过如此复杂的程序。在多方查找资料并参考类似程序后,我大体将程序的构架描绘好了。一边对照着网上的资料,一边对程序进行修改补充,然后根据拟好的大纲进行编制。期间,我与其它同学进行了讨论和探究,对程序的细节问题和应用方面进行了探索,并解决了主要的问题,于是便着手写具体的程序。
由于老师要求我们编写600多行的代码,但是教学计划课程编制问题的代码不足,所以我又选择了一个课题——进制转换问题,我会选择这个课题是因为我觉得作为学计算机的我,应该要能更好的了解关于计算机方面的知识。
这次实验,我进行了大量的资料查阅,对所学知识进行复习。通过这些努力,我对算法有了更深入的理解,对编程的步骤,有了具体的体会。通过和同学的广泛交流,我体会到了合作的必要性及合作的优势。更重要的是,这个课题完全脱胎于实际问题,让我对计算机行业,充满了信心和自豪。
以往我们学的计算机知识一般停留在理论上,这让我们不太理解计算机的应用和前景,而较少注重我们对算法的实践锻炼。而这一次的实习既需要我们去联系理论,又需要我们去实践方法,很多东西看上去都学过,但是和实际联系才知道变通的艰难。纸上得来终觉浅,这是我这次实习的最大收获。这次的实验让我们知道该如何跨过实际和理论之间的鸿沟。
存在的问题
由于程序十分的复杂,遇到了很多常见的语法错误,及逻辑错误。这需要我们不断的调试分析。符号的格式之类,指针的用法,判断输入输出的条件都是十分容易出错的地方。在逐条排除,程序终于得以完成。这让我明白了,解决问题,要细心认真,集思广益,这样才能把问题解决。
虽然程序变出来了,但是我大量借鉴了别人的程序,中间有很多的程序段都是一知半解,虽然查阅了资料,但是毕竟不是自己思考出来的程序,又无法当面询问写出编程的人,所以对部分程序还存在问题,我会继续查询资料将目前不懂的内容弄清楚。
参考资料:数据结构(C++语言描述)吉根林 陈波主编 C++语言教材 程序代码
教学计划编制问题:
#include // exit()#include #define MAX_VERTEX_NUM 100 typedef enum{DG}GraphKind;/* {有向图,有向网,无向图,无向网} */ typedef struct ArcNode { int adjvex;/* 该弧所指向的顶点的位置*/ struct ArcNode *nextarc;/* 指向下一条弧的指针*/ InfoType *info;/* 网的权值指针)*/ }ArcNode;/* 表结点*/ typedef struct { VertexType data;/* 顶点信息*/ ArcNode *firstarc;/* 第一个表结点的地址,指向第一条依附该顶点的弧的指针*/ }VNode,AdjList[MAX_VERTEX_NUM];/* 头结点*/ typedef struct { AdjList vertices,verticestwo;int vexnum,arcnum;/* 图的当前顶点数和弧数*/ int kind;/* 图的种类标志*/ }ALGraph;/* 图的邻接表存储的基本操作*/ int LocateVex(ALGraph G,VertexType u){ /* 初始条件: 图G存在,u和G中顶点有相同特征*/ /* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i;for(i=0;i { /* 采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图)*/ int i,j,k;VertexType va,vb;ArcNode *p;printf(“请输入教学计划的课程数: ”);scanf(“%d”,&(*G).vexnum);printf(“请输入拓扑排序所形成的课程先修关系的边数: ”);scanf(“%d”,&(*G).arcnum);printf(“请输入%d个课程的代表值(<%d个字符):n”,(*G).vexnum,MAX_NAME);for(i=0;i<(*G).vexnum;++i)/* 构造顶点向量*/ { } printf(“请输入%d个课程的学分值(<%d个字符):n”,(*G).vexnum,MAX_NAME);for(i=0;i<(*G).vexnum;++i)/* 构造顶点向量*/ { } printf(“请顺序输入每条弧(边)的弧尾和弧头(以空格作为间隔):n”);for(k=0;k<(*G).arcnum;++k)/* 构造表结点链表*/ { } scanf(“%s”,(*G).vertices[i].data);(*G).vertices[i].firstarc=NULL;scanf(“%s”,(*G).verticestwo[i].data);scanf(“%s%s”,va,vb);i=LocateVex(*G,va);/* 弧尾*/ j=LocateVex(*G,vb);/* 弧头*/ p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info=NULL;/* 图*/ p->nextarc=(*G).vertices[i].firstarc;/* 插在表头*/(*G).vertices[i].firstarc=p; return OK;} void Display(ALGraph G){ /* 输出图的邻接矩阵G */ int i;ArcNode *p;switch(G.kind){ case DG: printf(“有向图n”);} printf(“%d个顶点:n”,G.vexnum);for(i=0;i } printf(“n”);} } void FindInDegree(ALGraph G,int indegree[]){ /* 求顶点的入度,算法调用*/ int i;ArcNode *p;for(i=0;i printf(“%s→%s ”,G.vertices[i].data,G.vertices[p->adjvex].data);p=p->nextarc; indegree[i]=0;/* 赋初值*/ for(i=0;i } } } typedef int SElemType;/* 栈类型*/ /*栈的顺序存储表示*/ #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack { SElemType *base;/* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top;/* 栈顶指针*/ int stacksize;/* 当前已分配的存储空间,以元素为单位*/ }SqStack;/* 顺序栈*/ /* 顺序栈的基本操作*/ Status InitStack(SqStack *S){ /* 构造一个空栈S */(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW);/* 存储分配失败*/(*S).top=(*S).base;(*S).stacksize=STACK_INIT_SIZE; indegree[p->adjvex]++;p=p->nextarc; return OK;} void ClearStack(SqStack *S)//清空栈的操作 { S->top=S->base;} Status StackEmpty(SqStack S){ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ } Status Pop(SqStack *S,SElemType *e){ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */ if((*S).top==(*S).base)return ERROR;if(S.top==S.base)else return FALSE;return TRUE;*e=*--(*S).top;return OK;} Status Push(SqStack *S,SElemType e){ /* 插入元素e为新的栈顶元素*/ if((*S).top-(*S).base>=(*S).stacksize)/* 栈满,追加存储空间*/ {(*S).base=(SElemType*)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));if(!(*S).base)exit(OVERFLOW);/* 存储分配失败*/(*S).top=(*S).base+(*S).stacksize;(*S).stacksize+=STACKINCREMENT; } *((*S).top)++=e;return OK;} typedef int pathone[MAXCLASS];typedef int pathtwo[MAXCLASS];Status TopologicalSort(ALGraph G){ /* 有向图G采用邻接表存储结构。若G无回路,则输出G的顶点的一个拓扑序列并返回OK, */ /* 否则返回ERROR。*/ int i,k,j=0,count,indegree[MAX_VERTEX_NUM];bool has=false;SqStack S;pathone a;pathtwo b;ArcNode *p;FindInDegree(G,indegree);/* 对各顶点求入度indegree[0..vernum-1] */ InitStack(&S);/* 初始化栈*/ for(i=0;i Pop(&S,&i);a[i]=*G.vertices[i].data; b[i]=*G.verticestwo[i].data;printf(“课程%s→学分%s ”,G.vertices[i].data,G.verticestwo[i].data);/* 输出i号顶点并计数*/ ++count;for(p=G.vertices[i].firstarc;p;p=p->nextarc){ /* 对i号顶点的每个邻接点的入度减*/ k=p->adjvex;if(!(--indegree[k]))/* 若入度减为,则入栈*/ { Push(&S,k);//cout<<*G.vertices[i].data< 课 程 计 划===============================”< 如 下 while(qq<=xqzs){ int result[20];int rtop=0;int nn=0;//int ccount=0;// 学期学分计算 xxf=0;for(i=0;i } if(0==indegree[i]){ } Push(&S,i);while(!StackEmpty(S)){ int bb;Pop(&S,&i);bb=atoi(G.verticestwo[i].data);xxf=xxf+bb;if(xxf>xfsx){ } indegree[i]--;for(p=G.vertices[i].firstarc;p;p=p->nextarc){ /* 对i号顶点的每个邻接点的入度减*/ k=p->adjvex;indegree[k]--; break; /* if(!(--indegree[k]))若入度减为,则入栈 { Push(&S,k);}*/ } result[rtop]=i;rtop++;} cout<<“第”< } cout<<“课程”< ALGraph f;printf(“以下为教学计划编制问题的求解过程:n”);printf(“请输入学期总数:”);scanf(“%d”,&xqzs);printf(“请输入学期的学分上限:”);scanf(“%d”,&xfsx);CreateGraph(&f);Display(f);TopologicalSort(f); 进制转换问题: #include printf(“+===============+n”);printf(“| 欢 迎 使 用 进 制 转 换 程 序 |n”); printf(“+===============+n”); printf(“ 本 版 本 只 做 正 整 数 的 进 制 转 换!”);do { q=0;//fflush(stdin);printf(“n请选择需要被转换的进制:n1、二进制n2、八进制n3、十进制n4、十六进制n0、退出n”);printf(“请输入0~4:”);scanf(“%d”,&i);switch(i){ case 1: printf(“n请选择转换后的进制:n1、二进制n2、八进制n3、十进制n4、十六进制n0、退出n”);printf(“请输入0~4:”);scanf(“%d”,&j);switch(j){ case 1: printf(“n同进制之间不用转化!n”);q=1;break;case 2: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);B_O(k);q=1;break;case 3: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);B_D(k);q=1;break;case 4: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);B_X(k);q=1;break;case 0: printf(“谢谢使用!”);} break;case 2: printf(“n请选择转换后的进制:n1、二进制n2、八进制n3、十进制n4、十六进制n0、退出n”);printf(“请输入0~4:”);scanf(“%d”,&j);switch(j){ case 2: printf(“n同进制之间不用转化!n”);q=1;break;case 1: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);O_B(k);q=1;break;case 3: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);O_D(k);q=1;break;case 4: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);O_X(k);q=1;break;case 0: printf(“谢谢使用!”);} break;case 3: printf(“n请选择转换后的进制:n1、二进制n2、八进制n3、十进制n4、十六进制n0、退出n”);printf(“请输入0~4:”);scanf(“%d”,&j);switch(j){ case 3: printf(“n同进制之间不用转化!n”);q=1;break;case 1: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);D_B(k);q=1;break; case 2: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);D_O(k);q=1;break;case 4: printf(“n请输入您想要转化的数:”);scanf(“%d”,&k);D_X(k);q=1;break;case 0: printf(“谢谢使用!”);} break;case 4: printf(“n请选择转换后的进制:n1、二进制n2、八进制n3、十进制n4、十六进制n0、退出n”);printf(“请输入0~4:”);scanf(“%d”,&j);switch(j){ case 4: printf(“n同进制之间不用转化!n”);q=1;break;case 1: printf(“n请输入您想要转化的数:”);fflush(stdin);gets(r);for(k=0;;k++){if(r[k]==' ')break;} X_B(r,k);q=1;break;case 2: printf(“n请输入您想要转化的数:”);fflush(stdin);gets(r);for(k=0;;k++){if(r[k]==' ')break;X_O(r,k);q=1;break;case 3: printf(“n请输入您想要转化的数:”);fflush(stdin);gets(r); for(k=0;;k++){if(r[k]==' ')break;} X_D(r,k);q=1;break;case 0: printf(“谢谢使用!”);} break;case 0: printf(“n谢谢使用!n”);} }while(q==1);} void B_D(int a)///////以下为: 二进制转换为十进制,八进制,十六进制.{ int i,s=0;int result=0;for(i=1;a!=0;i*=2){ if(a%10>1){s=1;break;} else {result+=(a%10)*i;a=a/10;} } if(s==1)printf(“您的输入有误!请重新输入n”);else printf(“n转换后的数为:%dn”,result);} void B_O(int a){ int i,j,k,s=0;int p[30];int result=0;for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;} else{result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%8;result=result/8;} if(s==1)printf(“您的输入有误!请重新输入n”);else {printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%d”,p[k]);} printf(“n”);} } void B_X(int a){ int i,j,k,s=0;char p[30];int result=0;for(i=1;a!=0;i*=2){if(a%10>1){s=1;break;} else{result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%16;result=result/16; if(p[j]>10){switch(p[j]){ case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break;} } else p[j]+=48;} if(s==1)printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%c”,p[k]);} printf(“n”);} } void O_B(int a)///////以下为: 八进制转换为二进制,十进制,十六进制.{ int i,j,k,s=0;int result=0;int p[30];for(i=1;a!=0;i*=8) {if(a%10>7){ s=1;break;} else {result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%2;result=result/2;} if(s==1)printf(“您的输入有误!请重新输入n”);else {printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%d”,p[k]);} printf(“n”);} } void O_D(int a){ int i,s=0;int result=0;for(i=1;a!=0;i*=8){ if(a%10>7){ s=1;break;} else {result+=(a%10)*i;a=a/10;} } if(s==1) printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:%dn”,result);} } void O_X(int a){ int i,j,k,s=0;char p[30];int result=0;for(i=1;a!=0;i*=8){if(a%10>7){s=1;break;} else{result+=(a%10)*i;a=a/10;} } for(j=0;result!=0;j++){p[j]=result%16;result=result/16;if(p[j]<10)p[j]+=48;else { switch(p[j]){ case 10: p[j]='A';break;case 11: p[j]='B';break;case 12: p[j]='C';break;case 13: p[j]='D';break;case 14: p[j]='E';break;case 15: p[j]='F';break; } } } if(s==1)printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:”);for(k=j-1;k>=0;k--){printf(“%c”,p[k]);} printf(“n”);} } void X_D(char a[],int k)///////以下为: 十六进制转换为十进制,二进制,八进制.{ int i,j,s=0;int result=0;int b[50];for(i=0;i case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;} } } for(i=1,j=k-1;j>=0;j--,i*=16){result+=b[j]*i;} if(s==1)printf(“您的输入有误!请重新输入n”);else {printf(“n转换后的数为:%d”,result);} } void X_B(char a[],int k){ int i,j,s=0;int result=0;int b[50];int p[30];for(i=0;i { switch(a[i]){ case 'A': b[i]=10;break;case 'B': b[i]=11;break;case 'C': b[i]=12;break;case 'D': b[i]=13;break;case 'E': b[i]=14;break;case 'F': b[i]=15;break;case 'a': b[i]=10;break;case 'b': b[i]=11;break;case 'c': b[i]=12;break;case 'd': b[i]=13;break;case 'e': b[i]=14;break;case 'f': b[i]=15;break;default: s=1;} } } for(j=k-1,i=1;j>=0;j--,i*=16){result+=b[j]*i;} for(j=0;result!=0;j++){ p[j]=result%2;result=result/2;} if(s==1)printf(“您的输入有误!请重新输入n”);else { printf(“n转换后的数为:”);for(k=j-1;k>=0;k--) 背景 大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。 问题描述 若用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。试设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。(课程线性排列,每门课上课时其先修课程已经被安排)。 一. 需求分析 1.顶点表示课程名称(包含学分信息),有向边表示课程之间的先修关系,用有向图实现这个教学计划编制问题。 2.采用广度优先的方法搜索每个节点是否有边通向该节点。3.对有向图实行拓扑排序 4.程序输出的拓扑排序就是其教学修读课程的序列 5.测试数据: 输入:请输入课程的数量和课程先后关系:6 每门课程的编号:001 002 003 004 005 006 先修课程编号(课程 课程) 001 002 001 003 002 003 002 004 003 005 004 006 005 006 输出:001 002 003 004 005 006 二. 概要设计 1.抽象数据类型: 由于课程之间存在明显的先后关系,采用拓扑排序进行教学计划的排序,而拓扑排序不直接输出课程信息,而采用队列实现课程信息的输出 拓扑图的ADT的定义: ADT Graph{ 数据对象:Subject是课程编号,是类型为char的二维数组 数据关系R:点a,b∈Graph,若点a到b有一条边,则arcs[a][b]=1;否则=0; 基本操作P: void Adj(Graph &G,char *c1,char *c2)//建立邻接矩阵 int Locate(Graph G,char *c){//图G中查找元素c的位置 int Indegree(Graph G,int pos)//计算入度 void DeleteDegree(Graph &G,int pos)//删除一条边 队列的抽象数据类型定义: ADT Queue{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:Rl={ 约定其中ai端为队列头,an端为队列尾。基本操作 void InitQueue(Queue &Q){//初始化队列 void EnQueue(Queue &Q,int e){//入队列 void DeQueue(Queue &Q,int &e){//出队列 bool EmptyQueue(Queue Q)//判断是否为空 void InitQueue(Queue &Q)操作结果:构造一个空队列Q void EnQueue(Queue &Q,Node e)初始条件:队列Q已存在 操作结果:插入元素e为Q的新的队尾元素 void DeQueue(Queue &Q,Node &e)初始条件:Q为非空队列 操作结果:删除Q的队头元素,并用e返回其值 } 2.算法的基本思想: a.在有向图中选取一个入度为零的顶点并输出 b.删除该顶点及所有以它为尾的弧 c.重复a,b两步,知道所有节点均输出或者无度为零的节点结束。3.程序的流程 程序由四个模块组成: (1)输入模块:从键盘键入课程编号和课程之间的先修关系(2)建立Graph模块:构建符合课程关系的有向图(3)排序模块:对有向图图进行拓扑排序(4)输出模块:输出拓扑序列 三、详细设计 物理数据类型 由于课程与课程之间存在先修关系,可以采用有向图来构建课程与课程之间的关系,用邻接矩阵来实现图,采用入度为零的广度优先搜索来实现拓扑排序,用队列的方式来实现广度优先搜索 typedef struct{ char Subject[MAX_VEX][5];//顶点向量 int arcs[MAX_VEX][MAX_VEX];//邻接矩阵 int vexnum,arcnum;//图的当前顶点数和弧数 }Graph;图的伪代码: class Graph{ //图类 private: int numVertex;int numEdge;Line* line;public: Graph(int v,int e){numVertex=v;numEdge=e;line =new Line[v];} void pushVertex(){ //读入点 string ch; for(int i=0;i cout<<“请输入课程”< cin>>ch; line[i].head->node=ch; line[i].head->position=i; } } void pushEdge(){ //读入边 string ch1,ch2; int pos1,pos2; for(int i=0;i { cout<<“请输入课程关系”< cin>>ch1>>ch2; for(int j=0;j if(line[j].head->node==ch1) pos1=j; //找到该字母对应的位置 if(line[j].head->node==ch2){ pos2=line[j].head->position; break; } } line[pos1].insert(pos2,ch2); } } typedef struct{ int *base; int front; int rear; }Queue;拓扑排序的伪代码为: void topsort(){ //拓扑排序 int i; int *d=new int[numVertex]; for(i=0;i d[i]=0; //数组初始化 for(i=0;i Node* p=line[i].head; while(p->next!=NULL){ d[p->next->position]++;//计算每个点的入度 p=p->next; } 用队列实现拓扑排序的伪代码: int top=-1,m=0,j,k; for(i=0;i if(d[i]==0){ d[i]=top; //找到第一个入度为0的点 top=i; } while(top!=-1){ j=top; top=d[top]; cout< m++; Node* p=line[j].head; while(p->next!=NULL){ k=p->next->position; d[k]--; //当起点被删除,时后面的点的入度-1 if(d[k]==0){ d[k]=top; top=k; } p=p->next; } 算法的具体步骤 void CreateUDN(Graph &G){//建立一个有向图 //输入课程总数 //输入每门课程的编号 //输入课程的先修关系 } bool TopSort(Graph &G){ //有向图G采用邻接表储存结构 //若G无回路,则输出G的顶点的一个top序列并返回ture,否则返回false //队列实现top序列的存储和输出 } 算法的时空分析 Top排序: 对有n个顶点和e条弧的有向图而言,将建立求各顶点的入度的时间复杂度为O(e);建零入度定点站的时间复杂度为O(n),在top排序过程中,若有向图无环,则每个顶点近义词栈,出一次栈,入度减1的操作在while语句中总共执行e次,所以,总的时间复 杂度为O(n+e)。输入输出格式: 输入:请输入课程的数量和课程先后关系的个数:6 课程先后关系课程:7 每门课程的编号:001 002 003 004 005 006 输入课程关系(课程 课程)001 002 001 003 002 003 002 004 003 005 004 006 005 006 输出:教学计划为001 002 003 004 005 006 实验结果截图: 附录(代码)#include string node; int position;//位置 Node* next; bool visit;//是否被访问 Node(){visit=false;next=NULL;position=0;node=' ';} };class Line{ //线性表类 public: int num;Node* head;Node* rear;Node* fence;Line(){num=0;head=fence=rear=new Node();} void insert(int v,string ch){ //插入元素 Node* current=new Node(); current->node=ch; current->position=v; fence->next=current; fence=current; num++;} };class Graph{ //图类 private: int numVertex;int numEdge;Line* line;public: Graph(int v,int e){numVertex=v;numEdge=e;line =new Line[v];} void pushVertex(){ //读入点 string ch; for(int i=0;i cout<<“请输入课程”< cin>>ch; line[i].head->node=ch; line[i].head->position=i; } } void pushEdge(){ //读入边 string ch1,ch2; int pos1,pos2; for(int i=0;i { cout<<“请输入课程关系”< cin>>ch1>>ch2; for(int j=0;j if(line[j].head->node==ch1) pos1=j; //找到该字母对应的位置 if(line[j].head->node==ch2){ pos2=line[j].head->position; break; } } line[pos1].insert(pos2,ch2); } } void topsort(){ //拓扑排序 int i; int *d=new int[numVertex]; for(i=0;i d[i]=0; //数组初始化 for(i=0;i Node* p=line[i].head; while(p->next!=NULL){ d[p->next->position]++;//计算每个点的入度 p=p->next; } } int top=-1,m=0,j,k; for(i=0;i if(d[i]==0){ d[i]=top; //找到第一个入度为0的点 top=i; } while(top!=-1){ j=top; top=d[top]; cout< m++; Node* p=line[j].head; while(p->next!=NULL){ k=p->next->position; d[k]--; //当起点被删除,时后面的点的入度-1 if(d[k]==0){ d[k]=top; top=k; } p=p->next; } } } cout< if(m //输出点的个数小于输入点的个数,不能完全遍历 cout<<“网络存在回路”< delete []d;} };int main(){ int n,m;cout<<“请输入课程总数和课程先后关系的个数”< G.pushVertex();G.pushEdge();G.topsort();system(“pause”); return 0;} } 分层教学问题浅谈 固始县陈集一中 朱世琴 分层教学的渊源最早大约来自孔子,不过他所说的不叫做分层教学,他叫“因材施教”。按马克思的观点来看就是在教学中要根据不同的教育对象采取不同的教育措施,以求取得好的教育效果。把这一原理运用到教学中去,是灵活运用马克思主义的具体表现。这就叫做具体问题具体分析。这种做法无疑是值得提倡的。但是孔子的因材施教也好,马克思的具体问题具体分析也好用到教学中操作起来可不那么简单。搞不好可能会适得其反,好心办了坏事,眼下的一些地方划分重点校划分重点班就是一例。结果造成的损失无法弥补的,为什么?因为在教育学生的问题上一旦违背客观规律出现了问题,就会对学生产生很大的负面影响,这种负面影响有的是伴随学生一生的,想要弥补则需要付出千百倍的努力而最终的收效可能甚微。那么怎样做好分层教学呢?试讨论之! 分层教学可以促进课堂教学的有效性这是毫无疑问的。进行分层教学的首要任务是如何分层,或者说分层的标准是什么。也许有的教师会说通过考试划出分数不就可以了吗?这样做固然是一个办法,但是这个办法难免会让人感觉简单草率,大有贪图省事,息事宁人之嫌!而且事实上,一次考试就能真的评价一个学生的真正水平吗?恐怕不是那样吧?在国家三番五次的禁止划分重点校和重点班的禁令下,现 实中仍然有人“顶风作案”。他们这样做的原因无非是贪省事不想费力,做一道东坡肉和拌一盘凉菜所费的功夫怎么也不会是一样的!而教育学生何止又是做菜那么简单呢!一考了之的结果是短期的升学率上去了,可是那些所谓的非重点班的学生却付出了一生的代价!由于人数众多学生们可能当时并不怎么知道学校这样做会对自己造成怎样的影响。抑或知道但也无能为力,这种情况更加让人心酸!正值十来岁的花季年华,也许有的同学一时没有很好的意识到学习和知识的重要性,就被学校人为分到差班,从此头上就有了好像永远也挥之不去的阴影,和随时都会被别人看到的而自己企图又在隐藏的那差班生的“标签”。这样的学生在毕业的时候不是对未来满怀期待,充满自信的走出校门走向社会的而是以一种自认为是“失败者”的身份走向社会的,他们没有自信,对自己的未来也缺乏合理的规划,更谈不上什么创造性了。这样我们的学生进入社会成为社会的公民只能从事最简单的劳动而绝不是复合型的劳动者,由于知识欠缺会影响技能的掌握,我们的人力资源大国还将一直是大国而不是强国。按照现在社会产品分配原则,这样的公民其个人价值也不会有很大的实现。那么幸福的人生何在,学校对学生的一生负责的承诺何在,学校的社会责任何在?如果说这样也算是分层教学的话,笔者认为还不如不要,为什么呢?因为这是在糟蹋我们前贤的智慧,而不是在继承更不是在发展。 那么,用考试的办法不行怎么才能做到有效而科学的分层呢?我 想还是先来考察一下分层的标准及其合理性吧。处于实际考虑,考试和分数应是一个标准但绝不是唯一标准。这个标准能很直观的考察一个学生的近期的知识掌握情况。假如在考察方式和考察的信度,效度,和合理的区分度有保证的前提下是可以得到比较公正的结果的。但这仅仅只是标准之一,而且这只是给学生暂时的评价。学生是动态发展中的个体,所以在众多的标准中理所当然应该有潜在的或者说是发展性的标准,只有这样才合乎学生的身心发展的规律才合乎公正,平等的要求。当然这种潜在的标准往往不易掌握,我们可以通过和学生“谈话”来了解学生的学习的态度是否正确和学习方法是否科学,可以通过“观察”学生的日常常态下的行为习惯来总结学生优劣现状的原因,预测学生发展中是否存在障碍,发展是否具备潜力以及具备怎么样的潜力。总之,对一个学生做出评价需要通过定性的和定量的两个方面来考察。所谓定性就是用描述的方式评价,这种描述是建立在学生的学习态度和发展要求的基础上的,生活中有大量的例子证明有的学生资质很好但学习态度不好,对自己的发展要求也不高,这类学生在学习的道路上走不远。而那些资质并不是很好,但是学习态度很好,对自己的期望也很高的学生多数都能最终在学业上有所成就。因此,分层也主要以此为据。定量就是通过可操作性的测评进行评价。而且这两方面的比重也是需要斟酌的,笔者认为从发展性角度考虑定性的评价应该占的比重大些,但是这种定性是在认为每位学生都有潜力和可塑性的前提下进行的,这种做法和心理学上的“皮革马利翁效应”差不多。认为每位学生都有优点,每位学生都能通过自己的努力得到发展。 这就是积极的定性评,是和把一棒子打死的消极的定性评价相区别的。中国自古就有“浪子回头金不换”的箴言,是在提醒教育工作者把学生看成不断发展的个体,而不是一成不变的或者是暂时不行就永远不行的个体。只有这样分层也才有真正的意义。为我们以后的工作打下基础。 把好分层关以后,接下来就是具体的分层教育的工作了。对于暂时认为是优等的学生,和暂时认为是差等学生的教育在此时做出区别也才有意义。注意我这里的优和差的前面都有“暂时”二字,意思是说这两类学生是在不断相互转化的。优的可能变差的,差的也可能变优的。即便是在这两类学生中间也有必要做出更细的分层,最好具体到每位学生,真正做到因材施教。例如,有的学生语文差,有的学生数学差,语文差的学生有的是作文差有的是阅读差,数学差的学生有的是数学思想差有的是运算方法差。每个学生的具体情况不一样,就需要有针对性的具体的方法。这是对一类学生的分层教学,对另一类学习态度差,对自己发展要求不高的学生要采取另一类教学措施。对待这一类学生,教育者首先要做的就是让学生树立起正确的学习态度和远大的发展目标。当然要达到这一目的不是一件容易的事。要想解决这一问题,就要弄清楚造成这一问题的原因是什么。那么,原因何在呢? 一是因为学习中没有成就感对学习失去信心固然也没有兴趣,必 然对学习产生抵触的情绪。这种情况居多数,因为没有人天生的就拒绝学习,拒绝接受新的知识和技能,求知欲是人的一种天性。了解到了原因,只要采取有针对性的措施并且坚持下去,多数学生是能够转化的。具体的做法是,逐渐培养起他们的成就感,让他们“跳一跳就能摘到桃子”给他们能够接受的任务让他们去完成,正面鼓励为主,不断强化取得的成果,培养他们的自信心和学习兴趣。至于树立远大的发展目标则主要靠案例教学,用鲜活的事例去感染学生,最好使用那些各种条件不如后一类学生的实例来教育学生,这样的说服力会更大。选取的实例要贴近学生不然也达不到教育效果,实例要重点突出尤其是能够引发学生共鸣的部分。而且最好是正反面相结合选取实例。 第二个原因是学校学习和实际生活两张皮,具体表现是在校一个样在家一个样,实际生活和内心世界相背离,我们可以看到一些学生表面上再看书学习实际上却神游于无物,表里不一。这种习惯一旦形成贻害无穷。如此一来学习态度是无论如何也端正不起来的。而且,他们整天生活在现实世界和内心世界的冲突之中被眼前的琐事所纠缠别说是十几岁的学生就是大人如果意志一旦不清楚也很难冲破现实去追求理想的。由于受到现实世界的牵绊他们对自己的发展要求就不会高,也谈不上有什么远大的理想,更不会为了自己的理想去奋斗。学生也是社会的一份子,必定会和社会发生这样或那样的联系,受到来自社会的影响也是正常的。我们无法人为的把学生与社会隔离,那 种希望学生不受来自社会的任何影响纯属一厢情愿。我们所能做的就是使学生有一双慧眼,能够分辨是与非,真与假,善与恶,美与丑。基于此我们所采取的措施是想办法走进学生的心里,让学生愿意和教师倾吐自己的心声,愿意在遇到麻烦时征求教师的意见。同时还要了解学生的家庭情况,家庭的影响会在学生的身上留下烙印,也可以为我们对学生的言行做出合理的解释。比如,近些年的留守儿童现象,留守儿童有什么特点,会出现那些问题等都可以为我们的更富于有效性的教育提供帮助。 分层教学也好,自然选择教学也好抑或是其他的什么教学也好,目的是不会变的那就是促进学生的身心发展为共和国培养合格的公民。教学模式的探讨也是为了提高教育教学的质量。总之,一切有利于学生发展的模式,有利于学生发展的理念,有利于学生发展的方法措施都值得我们去探讨,值得我们去理解和运用。第四篇:教学计划编制问题
第五篇:分层教学问题浅谈