面向过程的程序设计基础配套自检

李祎

 

 

 

 

自主学习

监控检查

 

 

 

 

 

 

 

合肥学院电子与电气工程系基础教研室


目录

.主动学习... 4

1.核心教学点建议... 4

2.与同学的沟通... 5

3.考核方式与注意事项... 7

4.教学与考核之时间安排流程... 8

5.小组注册... 8

6.软件安装... 9

一.作业部分... 11

1.评价指标与评分办法... 11

2.评价内容... 12

3.评价考核时间... 12

4.作业检查表*. 12

二.答辩部分... 13

1.评价指标与评分办法... 13

2.评价内容... 13

3.评价考核时间... 14

4.分组与答辩... 14

5.答辩检查表*. 15

6.答辩参考范例... 15

7.答辩上传文档格式*. 17

三.实验部分... 18

1.评价指标与评分办法... 18

2.评价内容... 19

3.评价考核时间... 19

4.实验检查表*. 19

5.实验上传目录结构,及上传文档格式和内容要求... 24

6.实验上传文档具体要求及参考范例... 25

6.1“小组共享目录中上传文档的具体要求及参考范例... 25

6.2“个人”目录中上传文档的具体要求及参考范例... 27

四.过程测验部分... 31

1.第一次过程考核... 31

2.第二次过程考核... 33

3.第三次过程考核... 35

五.大作业部分... 37

1.大作业设计目的... 37

2大作业评价指标和评分方法... 37

3.大作业评价考核时间... 37

4.大作业题目参考... 38

5.大作业标准要求... 41

6.大作业检查表*. 42

7.大作业范例参考... 42

8.大作业上传文档格式*. 47

9.大作业小组选题及需求分析*. 47

六.章节预习与读书笔记... 48

1.第一章 模型模块... 48

2.第二章 调试技术... 48

3.第三章 基本数据类型(高级数据类型)... 49

4.第四章 低级数据类型... 49

5.第五章 结构编程之顺序与选择... 50

6.第六章 结构编程之循环... 51

7.第七章 数组... 51

8.第八章 字符串... 52

9.第九章 结构体... 52

10.第十章 文件操作... 53

七.作业参考答案... 54

第一章答案... 54

第二章答案... 56

第三章答案... 59

第四章答案... 62

第五章答案... 67

第六章答案... 71

第七章答案... 79

第八章答案... 83

第九章答案... 93

第十章答案... 98

模型模块自检答案... 103

结构编程自检答案... 105

构造类型自检答案... 107

课程结束模拟考核答案... 109

项目设计部分提示... 112

 


.主动学习

1.核心教学点建议

教学内容

核心知识要点

核心智力技能(步骤)

核心检验点

核心教时数

1

模型模块

 

1掌握解决简单问题的四个步骤

2初步掌握面向过程的编程思想-模块化设计思想,初步认识主模块和自定义模块样式与特点

3初步掌握模块的组织形式-模型结构

4初步掌握简单函数的调用规则

5初步掌握规范命名方法

6初步掌握VC开发环境,可以编辑、编译、连接、运行代码

1解决问题的方法步骤

2模型与模块设计方法步骤

3规范命名方法步骤

4从编写代码到运行程序的方法步骤

可仿照教材案例设计最简单的单归属程序,为自行设计单归属程序奠定基础

理论课时(4+实验课时(2

2

调试技术

 

1辨析程序中三种错误及出现环境及调试方法

2进一步认识模块,理解模块的封闭性

3认识多种数学函数及使用方法

1针对各类错误的调试方法步骤

2模型与模块设计方法步骤(强化)

 

可完成对最简单的单归属程序各种类型出错的及时处理

理论课时(4+实验课时(2

3

基本数据类型

 

1理解数据类型的基本概念,分辨不同数据类型的使用环境,掌握基本数据类型特征

2掌握常量、变量的命名规则和使用方法

3初步认识局部变量和全局变量的作用域特性

4掌握运算符分类,以及常用运算符使用方法

5进一步认识模块,理解模块间联系,掌握函数四种形式

1混合运算的方法步骤

2模型与模块设计方法步骤(强化)

 

可设计最简单的单归属程序,为建立多归属程序奠定基础

理论课时(4+实验课时(2

4

高级数据类型

 

1理解指针含义,学会保存指针

2体会指针使用的好处,掌握指针作为函数参数

3理解动态申请空间必要,并学会动态申请空间

4掌握局部变量、全局变量的生存期和作用域

5初步掌握不同指针之间的相互转化

1指针作模块参数的方法步骤

2动态申请空间的方法步骤

3模型与模块设计方法步骤(强化)

 

可设计最简单的多归属程序,为建立系统程序奠定基础

理论课时(4+实验课时(2

5

结构编程之顺序与选择

1理解结构编程的特点,明确数据流程步骤

2掌握交互(标准输入输出)方法、赋值方法,初步理解克隆技术

3学会根据不同选择环境,使用不同的选择语句

4进一步加深对函数的认识,较熟练使用多归属函数编写较大的程序

1操作数据的方法步骤

2使用选择语句的方法步骤

3多模块多归属设计的方法步骤

可设计简单的系统程序,其中选择使用各功能模块

理论课时(4+实验课时(2

6

结构编程之循环

 

1理解循环结构的使用语境和语法结构

2熟练掌握循环规则,即三要素和循环规律

3熟练掌握运用规律的递推和递归两种思路

4初步掌握多人合作思路,进一步领悟面向过程编程中的模型、模块结构和角色分层设计思想

1使用循环语句的方法步骤

2递推和递归的方法步骤

3多人合作的方法步骤

可设计简单的系统程序,其中循环选择使用各功能模块

理论课时(4+实验课时(2

7

数组

 

1掌握一维数组的定义和元素的寻址方法

2掌握一维数组的基本排序方法

3掌握一维数组名作为函数参数进行函数调用的实质

4学会以数组作参数构建模块,实现数组的输入、输出、排序、删除等功能

1一维数组排序的方法步骤

2一维数组作模块参数的方法步骤

 

可设计分数管理系统(数据结构采用分组数组表达分数)

理论课时(4+实验课时(2

8

字符串

 

1掌握字符串的本质和核心指标

2掌握字符串的数组表示方法和指针表示方法

3掌握字符作为函数参数进行函数调用的实质

4理解并掌握指针数组的建立和使用方法

5学会以字符串列表作参数构建模块,实现字符串列表的输入、输出、排序、删除等功能

1字符串作模块参数的方法步骤

2指针数组作模块参数的方法步骤

可设计分数管理系统(数据结构采用分组数组表达分数,指针数组表达姓名列表)

理论课时(4+实验课时(2

9

结构体

 

1掌握结构体类型的含义和定义方法

2掌握结构体变量的定义、输入、输出等方法,及向其他模块传递结构体数据

3掌握结构体数组的定义、输入、输出等方法,及向其他模块传递结构体数组数据

4学会以结构体数组作参数构建模块,实现结构体数组的输入、输出、排序、删除等功能

5初步掌握函数优化的几种手段

1结构体作模块参数方法步骤

2结构体数组作模块参数方法步骤

3模块优化方法步骤

可设计分数管理系统(数据结构采用结构体数组表达整体信息)

理论课时(4+实验课时(2

10

文件操作

 

1理解文件和流的含义

2掌握文本文件的读写方式

3掌握二进制文件的读写方式

4学会建立数据保存模块和数据调入模块

5理解指针函数和体会指针函数带来的方便

1文本文件操作方法步骤

2二进制文件操作方法步骤

3指针函数作模块参数的方法步骤

可设计分数管理系统(文件保存与调入)

理论课时(4+实验课时(2

2.与同学的沟通

1)课程地位?

该课程地位主要由其应用环境决定,当前,绝大多数操作系统、应用软件都与C/C++相关,尤其是当今移动物联网时代,嵌入式编程中C/C++的使用高居前两位。另外,本程课渗透的处理问题的观点、方法和表达将是今后学习其他课程的基础,甚至为你工作生活提供重要的决策根据。

 

2)学习什么?

关于学习内容,需要纠正一个偏见:“高级语言程序设计”课程的目标是---编写出优美和高难度的程序。实际上,人类对客观世界的认识和问题的解决是在一定的观点和方法的指正下进行的,而程序设计正是人类思维和行动的一种表达,所以本课程最重要的目标是---按照明确的观点、方法、表达,熟练地编写出规范易懂程序。 

 

3)如何学习?

①把握课堂教学

学而不思则罔,思而不学则殆,学思不行则废,根据这个原则确定“学思行三位一体”的教学模式,将教学过程分为理论教学课、思维训练课、上机实验课三个部分。

理论教学课:课前预习;课中认真听讲、记好笔记;课后及时总结

课前:课前根据预习提纲预习,并记录预习成果和问题,带着问题来听课效果好。

 

课中:认真听讲无庸质疑,教师的课是教师多年经验的体会,是一种成熟思路的展现,跟紧教师的讲解思路。另外,优秀的学习习惯中一项核心内容就是做笔记,学会做有效笔记,笔记不仅是记忆的痕迹,也是知识同构的重要符号,笔记记的好,课程学的肯定好。

 

课后:根据教师课堂教学和笔记及时复习回忆,在信息丢失之前及时稳定地纳入认知体系。

 

注意,因课程教学要求的不同,复习看书应根据教师指定内容,以免胡子眉毛一把抓,也避免过多的教材内容影响学习的主动性。另外,有效的复习必须做总结(心得体会),将每章的重点、难点、困惑和解决记录下来。

 

推荐使用三种颜色的笔,黑笔用于记录教师上课的提纲;兰笔用于预习记录、提问、解惑、订正;红笔用于写知识结构同化的过程和心得体会。

 

思维训练课:独立完成作业;小组充分交流,尽情答辩

独立完成作业:独立完成《思维训练与实验训练》中自测练习部分,无法解决的问题记录疑问后在小组内交流,形成统一意见,在思维训练课上提问。

 

合作完成答辩:小组合作完成《思维训练与实验训练》中答辩部分,按指定要求分工,拟定课堂中的发言稿,预测可能出现的问题。

 

上机实践课:准备预习报告;上机关注重点、认真调试;课后及时完善报告

学、思是为了行,这个行就是实验,在很大程度上这门课程是凭实验说话的。因此,实验前做好充分地准备工作,撰写规范实验报告,这个实验报告不是给老师看的,是供你做实验时用的,务实准确是报告最基本要求。另外,单凭课内规定上机时间是不够的,每位同学在第一次课之后务必安装开发环境,以做到随时验证和交流。

 

②善于使用教材

把握函数主线,不断提升

教材主线是函数(模块)。教材第一章提供良好的程序结构框架(模块),以后各章节是基于不同的应用背景对程序结构框架(模块)进行扩展。

 

遵循教师指导

由于各校课时不同,教学侧重点不同,接受程度等的不同,教师会选择内容教学,学生必须依据教师的要求,阅读教材时可分必读,选读等。

 

教材也是学材

书中每章前面的“学习导读”告之本章大致内容和核心目标;而“课前预习”需要大家在很短时间内了解其大致含义(并非一定要完全掌握),带着问题的学习效率更高;章节内容中带*号部分应根据教师要求学习,不要陷入细节而忽视关键;每章的“本章总结”告之核心知识点,也期待您能在学习之后在“个人心得体会”中写下感想。另外,教材中思考练习部分,学生需要认真负责将它补充、完善,只有通过双方的一起努力,才能发挥最大作用。

③遇到困难怎么办?

孔子说过:举直错诸枉能使枉者直,意思是说将正确的放在错误的上面能够改变错误。在学习过程中肯定会遇到不少困难,甚至会动摇自己的信心,但我想给你的答案是:肯定能学好。暂时没有学好,不用担心,考虑一下方法对不对、投入时间够不够、上机有效吗?

 

首先,你要确定这是一门很有价值的课程。学习不是为了分数,是让你的思维能力得到提高从而更有效率地处理问题。

 

其次,主动学习、合作学习是非常重要的,不要迷恋静态地接收老师的东西,也不要以为老师将所有问题讲清楚才是最好,而要动态地发展自己,学习是件幸福的事情,你要不断地向你周围的一切去学习,掌握了学习的能力才能使你的学习更加强大有效。

 

再次,掌握正确学习步骤,“学思行”一个都不能少,潜心地学、独立地想、深刻的交流、耐心的上机调试,当所有的步骤都有条不紊地进行下去,你的能力会不断地提高。

 

最后,我想说,罗马不是一天建成的,但没有建成之前,你要保证你的每天的建设都是快乐的(生活中那么多困惑都需要搞清楚才能高兴?)。事实上,很可能前续的学习有不懂的地方,没有关系,保持乐观愉悦的心情,等候着豁然开朗、柳暗花明的那一天。

3.考核方式与注意事项

1)考核方式

对知识、能力、素质全方位、进程式考核。考核从理论知识(卷面考试)、实践环节(实验)、应用能力(上机考核)、自主学习能力(学习笔记)等方面全面考核。

考核方案:N+2;其中N55%,245%

N=7   【过程测试15%;过程测试25%;过程测试35%;过程考核4:自主学习之作业10%;过程考核5:自主学习之答辩10%;过程考核6:实验10%;过程考核7:实战10%

2     【期末40%,笔记5%

 

2)注意事项

各类过程考核,不在考核现场小组同学(缺勤),直接定为不合格,不参加补检。

特别说明:作业、答辩、实验3个教学环节,均为当面评价评分,请各组各同学做好准备,并及时在此手册上(人手一本)记录考核成绩,以便及时了解学习状态。

另外,为维护学习考核的严肃性,从2016年起,取消补过,停止无休止的内耗。


 

4.教学与考核之时间安排流程

1)第1周到第12

准备

1单元

2单元

3单元

机动

1

2

3

4

5

6

7

8

9

10

11

12

过程预演准备

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

教学答辩实验

复习以及机动

 

 

 

 

 

测验1

 

 

测验2

 

 

测验3

2)第13周到第14

13

14

大作业制作

大作业验收

3)第15周到第16

15

16

收交笔记

期末考试

 

请将上述时间安排表裁下,贴在教材扉页上。

 

5.小组注册

1)注册

登录http://172.21.18.62/serv-u,注册小组,输入组名和密码(每一个小组统一用此号登录上传和下载文件)。特别注意:一个组只能注册一次,注册时要选择好自己的班级,否则失联

 

小组注册组名规定:组号-组名。组号用数字,组名用英文字母。例如第8hero队,命名规则是:8-hero

 

小组注册后,在服务器端会生成以小组名命名的目录下三个子目录(答辩/实验/实战):

上述3个子目录表达有3个教学环节,在各教学环节,需要同学们上传相应资料至相应目录。具体上传方式,请见下面二//五的“上传文档格式”。

 

2)安装上传下载软件flashfxp

可在浏览器中登录FTP服务器,也可安装flashfxp更方便登录读写资料。

 

安装flashfxp软件后,点击工具栏上“连接”图标后,可分别用刚注册的帐号登录(如用户名为8-hero,密码自定),或用给定的共享帐号登录(用户名share,密码share),以便于查看本课程的“共享资料”。见下表:

 

自已申请的帐号登录(点左上角闪电,出现窗口)

共享帐号登录(点左上角闪电,出现窗口)

以共享帐号登录FTP服务器后(用户名和密码均为share),可下载其中的软件资源,并在自己机器上安装。

6.软件安装

1)安装开发软件vc6

使用XP系统的同学,可以直接安装目录“vc6完全英文版”中内容,包括以下四个部分:

*安装程序

*vc补丁

*MSDN帮助

*VC助手

 

②使用Windows7/Windows8系统的同学,有两种安装方式

第一种:直接安装目录“vc6完全英文版”,安装时需要注意:凡是出现兼容性问题提示对话框,不要理会,一律把不再显示此消息打上勾,然后运行程序。其他的就默认安装就可以。安装完成之后,还需要进行如下操作:

1步:把FileTool.dll文件拷贝至 C:\Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns 文件夹下 FileTool.dll文件见“vc6完全英文版”目录)
2步:在cmd下手动注册该dll文件:regsvr32 "C:\Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns\FileTool.dll" 
3步:打开VC6,点击Tools下的Customize选择Add-ins and Macro Files标签,选中 FileTool Developer Studio Add-in 附加项,如下图所示:
这个时候就会出现 A  O 的文件栏按钮。

 

4步:打开VC6,点击Tools下的Customize,选择 Commands标签,OpenFile设置快捷键Ctrl+O;同样的方法,可以给 AddFileToProject设置快捷键Ctrl+A如下图所示:

 

第二种:在Windows7/Windows8系统上安装虚拟机Vmware10,并在其上安装XP系统,这样就可以在其上直接安装目录“vc6完全英文版”中内容。安装软件和安装说明见共享目录。

 

2)安装其他工具软件

安装visio作图软件,以及截图软件sngit等。

 

 

 


一.作业部分

1.评价指标与评分办法

评价指标:

1)能够独立完成思维训练手册中“思维训练题-自测部分”及合作完成“思维训练题-答辩部分”。

2)能够正确理解相关知识点,掌握正确的编程思路、方法;对于个别没有理解并完成的内容,必须有经过思考、探索、交流的学习过程,并记录疑问和思考过程。

3)能够提出有价值的问题并思考如何解决。

 

评分方法:

1)检查思维训练手册“自测部分”和“答辩部分”的留空中,完成规定的作业任务。

2)根据学生对于规定作业任务的理解和完成情况,现场评分:完全回答正确:优秀(90-100);大部分回答正确:良好(80-89);回答不正确,但有深入思考:中(70-79);回答不正确,无思考:不通过。巡查检查情况的评分与提问回答情况相同。学生将教师的现场评分记录在下面给的表格中。

3)课堂现场检查中,能够提出有价值问题,并给出具体解决方案,对教师和学生有重要启发,直接确定为极优-100

 

评价评语:

评语:完美。

评语:好,保持。

评语:较好,达到基本要求,努力。

评语:不好,没有达到要求,慎重。

 

评价注意:

1)所有规定题目都必须时完成(上思维训练课前),对不完成或缺少完成的同学,以及看似完成,但提问不知所云的同学,直接确定为不通过(均通过现场抽查、巡查)。未通过者需说明原因,2次没有通过者,本课程不允通过,不参加结束考试。

2)应全额完成所有要求题目。对于作业中个别(不超过2个)有疑问问题而无法准确做答题目,必须在训练手册中记录学习、思考过程,而非简单写出不理解、不懂之类的敷衍之辞,并请将序号标记在下面第4点的“作业检查表”,以方便自己查找问题所在,促进自我学习,提高学习效率。

3)困难问题可通过小组交流、网络、参考书等找答案。对于经过思考交流后无法解决的问题,可在训练课中以小组身份统一提出(限定每个小组提出不超过2个问题)。

4)现场提问检查的形式有学生口述答案、上黑板板书等。现场巡查检查不要求学生回答,教师随机巡查给出评价。

5)检查为课中随机指定,并分别记录在教师和学生的记录表中。

6)“思维训练课”中第一节课,前15分钟,小组代表提出问题。另外,授课教师每周固定某一时间接待(各位教师和学生协商后自定),回答本周教学内容中的问题,前来提问的问题,必须是经过深思后无法解决的问题。

2.评价内容

思维训练手册中“思维训练题-自测部分”和“思维训练题-答辩部分”。

 

3.评价考核时间

主要安排在思维训练课的第1节课。

 

4.作业检查表*

下表填写问题序号,具体解决问题过程中的疑问和思考,请同学们在思维训练手册中具体文字表达。

问题序号(按思维训练手册中题目序号)

成绩(提问或巡查) ///

1

 

 

2

 

 

3

 

 

4

 

 

5

 

 

6

 

 

7

 

 

8

 

 

9

 

 

10

 

 

 

友情提醒:

1)上表2次未过,课程为不通过。

2)每周教学、答辩、实验后,教师提供本周教学内容的作业参考答案,仅供对比参考。

 

 


二.答辩部分

1.评价指标与评分办法

评价指标:

1)分工有序。每个人都有具体的分工并现场表述。

2)分析准确。按解决问题的4个基本步骤,逐一表述和分析,不是照稿读。

3)代码运行。代码能够运行,且能够解决结果。

5)回答正确。可以正确回答教师或学生的提问。

 

评分方法:

1)各项指标达成,回答问题准确,优秀(90-100)。(评语:完美)

2)大部分指标达成,回答问题基本准确,良好(80-89)。(评语:好,保持)

3)大部分指标达成,回答问题有错误,但经过提示后解释正确,通过(70-79)。(评语:较好,达到基本要求,努力)

4)大部分指标未达成,回答问题错误百出;或根本没有准备,无法回答问题;或没有按时提交材料者。均为不通过。(评语:不好,没有达到要求,慎重)

 

注意:

1)整个教学内容(10章)可分3个大单元,每组学生在整个教学过程中,至少答辩1次(单班3次,合班2次,三班1次)。按下面第4点“分组与答辩”要求,各小组同学即时填写答辩题目,并做好准备。

2)所有章节的答辩材料在答辩课前提交(材料包括:ppt和程序代码(程序代码注意压缩成一个文件)),没有在“思维训练课”前提交者,以不通过评价。

3)答辩小组一般由3人组成,不允许跨班组队。

4)无论是否参与答辩,所有答辩题目均需要在思维训练手册中完成(此为作业检查的一部分)。为减轻负担,不答辩小组可不上传材料。

5)答辩时间5分钟,提问评价2分钟。请事先做好演练,做好合理分工,不能一人表演。答辩小组答辩前事先做好分工,每位同学在对整体结构认识的基础上,各有分工,都要有表达机会。如有同学重要在模型、模块分析,有同学重点在代码描述,有同学重点在演示等。

6答辩未通过或没做好答辩准备的小组,记为未通过,第2次没有通过者,课程学习无效,不参加课程结束考试。

7答辩思路:答辩思考要根据具体的题目要求,如题目要求编写完整程序,则答辩的思路从模型结构至每个模块结构的设计;如题目要求编写某个模块,直接以模块分析为核心。不管是哪种类型的题目要求,在分析模块时,都要遵循模块设计的基本步骤:模块功能、输入输出、解决思路、算法步骤、模块代码。

8)对于答辩中不能很好履行自已在小组中职责的个别同学,没有团队意识的同学(教学目标的一部分),将取消其课程结束考核。

2.评价内容

思维训练手册中 “思维训练题-答辩部分”。

 

3.评价考核时间

主要安排在思维训练课的第2节课,可完成5-7组的小组答辩(详细安排见第4点)。如有特殊原因,无法在“思课”上展开答辩训练或完全完成所有预定组的答辩,安排在实验课中或其他时间完成。

 

4.分组与答辩

 

1)以45人为一个标准班,3人一个小组,分组情况如下:

班级建制

人数

分配方案

每周安排

备注

单班

45

15/每组3

每周5组答辩

3周一个循环

合班

90

30/每组3

每周6组答辩

每周每班安排3

三班

135

45/每组3

每周6组答辩

每周每班安排2

 

说明:

①对于单班,3周完成15组答辩,为一个循环,整个教学确保9周左右完成三个循环教学。即在整个教学过程中,每组需要公开答辩3次。下表中,每章按答辩题目顺序分配组号,题目不够分配,则循环从起始答辩题目再次开始。

章节

1

2

3

4

5

6

7

8

9

10

循环

1次循环

2次循环

3次循环

 

组号

1-5

6-10

11-15

1-5

6-10

11-15

1-5

6-10

11-15

随机组

 

②对于合班,5周完成30组答辩,为一个循环,整个教学确保10周左右完成两个循环教学。即在整个教学过程中,每组需要公开答辩2次。下表中,每章按答辩题目顺序分配组号,题目不够分配,则循环从起始答辩题目再次开始。另外,2班每章按题目分配组号,从思维训练手册中答辩题的第2题开始分配,不够则循环。

章节

1

2

3

4

5

6

7

8

9

10

循环

1次循环

2次循环

1

1-3

4-6

7-9

10-12

13-15

1-3

4-6

7-9

10-12

13-15

2

1-3

4-6

7-9

10-12

13-15

1-3

4-6

7-9

10-12

13-15

 

③对于三班,8周完成45组答辩,为一个循环,整个教学确保8周左右完成一个循环教学。即在整个教学过程中,每组需要公开答辩1次。下表中,每章按答辩题目顺序分配组号,题目不够分配,则循环从起始答辩题目再次开始。另外,2/3班每章按题目分配组号,从思维训练手册中答辩题的第2/3题开始分配,不够则循环。

章节

1

2

3

4

5

6

7

8

9

10

循环

1次循环

其他

1

1-2

3-4

5-6

7-8

9-10

11-12

13-14

15

随机组

随机组

2

1-2

3-4

5-6

7-8

9-10

11-12

13-14

15

随机组

随机组

3

1-2

3-4

5-6

7-8

9-10

11-12

13-14

15

随机组

随机组

 

2)非标准班级

对于非标准班组(即每班人数不是45人),或由于其他原因分配组数不是15/30/45组的情况,可根据每章答辩题目的难易由教师自行分配,遵循一个总的原则:单班在3周将所有组分配完毕(分3次),合班在5周将所有组分配完毕(分2次),三班在8周将所有组分配完毕(分1次)。

 

特别注意:分组与答辩内容的确定,应在首次课后完成。

5.答辩检查表*

注意:以下3单元的答辩题目,根据每个单元内的答辩题目进行循环选择确定,请每组每位学生根据自己的组号确定并事先将信息填写在下面的表头中,并在答辩后及时记录总成绩。

 

1单元:第__章,第__题,P__)页

栏目

检测

分工有

 

分析清楚

 

代码运行

 

回答正确

 

总成绩:_______

 

2单元:第__章,第__题,P__)页

栏目

检测

分工有序

 

分析清楚

 

代码运行

 

回答正确

 

总成绩:_______

 

3单元:第__章,第__题,P__)页

栏目

检测

分工有序

 

分析清楚

 

代码运行

 

回答正确

 

总成绩:_______

 

6.答辩参考范例

1)答辩思路

①两类题目

答辩思路根据具体答辩题目要求而定,一般分两类:一类是完整的程序题(要求编写一个程序,实际包括了主模块、自定义模块等部分,以下简称程序题);一类是单独的模块题目(只要求编写某个自定义模块,以下简称模块题)。它们的区分类似于完整程序题目对应“将大象放在冰箱里”整个事件,而单独的模块题目对应“openTheDoor()”这一个自定义模块。

②两类题目的答辩思路

程序题:答辩的思路从模型结构至每个模块结构的设计,参考教材例题“求2个整数最大数的平方”的解题思路,也就是说给出模型结构后(必须有模型结构图),再具体分析每个自定义模块的设计(必须有模块结构图)。

 

模块题:直接以模块分析为核心,要按4步进行讲述,并给出具体的模块代码,参考教材例题“求2个整数最大数的平方”中某一个模块如getMax的解题思路。

 

注意重点

不管是哪种类型题目的答辩,自定义模块的4步都是重点(遵循模块设计的基本步骤:模块功能、输入输出、解决思路、算法步骤),要给出具体的分析,而不能读PPT讲稿。

模块分析中第2步的输入输出以图形方式表达后,要分析给出具体的形式和归属。

 

2)答辩示范

下面以“模块题”为例,来说明PPT的制作及讲演的顺序

答辩题目:编写模块,根据长方形的高和宽(均为整数),返回长方形的面积。

1自定义模块设计:(本题只要求编写自定义模块,所以不从主模块开始分析)

模块功能

求长方形的面积

输入输出

形式:int getArea(int height,int width)

归属:Int

解决思路

根据长方形面积计算公式,面积=*

算法步骤

首先计算面积,然后返回面积

⑤模块代码

int getArea(int height,int width)

{

return height*width;

}

2测试模块(主模块设计)

int main()

{

int h,w,area;

cin>>h>>w;

area=getArea(h,w);

cout<<area;

return 0;

}

3程序运行

 

 

7.答辩上传文档格式*

以小组8进行第3章的答辩为例,说明上传结构与文档格式如下:

8-3-小组-答辩.ppt文件,ppt中一定要反映重点模块的设计思路和方法,供演讲时使用。这里8指第8组,3指第3章的答辩。

8-3-小组-答辩.rar文件,此文件是程序项目的压缩文件。

 

 


三.实验部分

1.评价指标与评分办法

评价指标:按以下四项考核指标。

1)准备充分,按要求上传文档。(小组文档、个人文档及代码、个人预习报告及代码)

2)程序运行正确,达到预测结果。

3)现场回答提问,正确或大部分正确。从5个方面提问考查:①思想方法:如何体现面向过程编程思想,即如何分模块(分步)做事?②表达手段:第一点:模块(每步)的入口、出口?模块的形式如何?第二点:模块如何归属?③模块的解决思路?④模块中具体代码含义?(关联本章节知识点)⑤实验思考问题的解决思路?

4)实验报告格式项目完整,格式工整(参见下面5.实验报告格式要求),并上传至指点位置(参见下面6.上传文档格式)。

 

评分办法:

1)各项指标达成完美,评定为优秀90-100

2)各指标达成良好,个别指标问题回答不够准确,评定为良好80-89

3)各指标达成一般,多个指标回答不够准确,有1个指标问题回答错误,经提醒后给出正确解释,评定为中70-79

4)各指标达成很差,多个指标回答不够准确,有2个指标问题回答错误,经提醒依然不知,评定为不通过。

 

评价评语:

评语:完美。

评语:好,保持。

评语:较好,达到基本要求,努力。

评语:不好,没有达到要求,慎重。

 

考核注意:

1)学生需知:实验课的内容是实验课前完成,实验课任务有3点。第1点:检查验收实验结果;第2点:写实验总结和思考题;第3点:以小组为单位按教学要求进行自学(按下一章教学预习点预习,并在笔记本上记录学习内容),并做简单记录。

2)考核均实验课现场完成,要求学生现场提供各电子资料和运行程序(按要求上传至服务器中,并且自行在U盘上准备一份以便应急)。

3考核采取团队整体参与、一人主答。小组全部成员上场,随机抽取组内某位同学,对“实验检查表”中的考核指标逐一进行评价,并记为整组分数(小组其他同学即时记录成绩)。下表中的补检指在实验课中因为其他临时安排无法正常检测的处理方式。此种考核方式成功避免传统报告检查评价实验中抄袭等弊端,将考核的目标放在是否真正掌握核心知识点和智力技能点上。

4)程序运行不正确,个人实验报告格式不正确,直接确定为不通过,不参与提问检查。

5)个人实验报告抄袭者,直接确定为不通过,不参与提问检查。说明:个人实验报告可以有限度借鉴小组共享内容,但绝对不允许完全抄袭(即便借鉴,也要调整格式和内容与自己所写报告风格一致,如图形大小、画法,字体大小等要一致),尤其是栏目“数据预测”、“实验调试”、“总结思考”一定是不同的。所以个人实验报告完全是基于个人来写。

6两次实验(总实验次数共10次)不通过,课程不允通过

7)成绩优秀学生可参与考评其余同学,其工作量计入总分(具体根据教师要求)。

8)每组学生代表在实验答辩中,按检查表自动答题,以3分钟为限(学生应做好充分答题准备,而非现场临时准备)。

2.评价内容

思维训练手册中 “思维训练题-上机实验”,以及基本的知识、概念等。

3.评价考核时间

主要安排在实验课中完成,如果有特殊原因没有完成,请学生自行约请教师完成评价。

4.实验检查表*

0章绪论实验检查表

栏目

检测

补检

检查在自己机器上安装成功C/C++开发工具和作图软件

 

 

检查是否按格式上传了自己的资料,实验报告内容完整,项目齐全(7个栏目)

 

 

*安装VM,有哪些注意之处(可选)

*visio画图,如何改变背景,如何画流程图

*如何将画好的图放到个人实验报告中

*个人实验报告的格式应该包括哪些栏目

 

 

总成绩:_______

 

1章模型模块实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2按要求上传文档

2.1小组文档中栏目是否齐全-实验题目,模型结构,小组分工,共享位置

2.2小组个人文档是否按要求完成(注意,如问题比较小而模块不够分配,允许重复写某个模块,但内容不能完全一致)

2.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

2.4个人代码上传

 

 

3思想方法:如何体现面向过程编程思想,即如何分模块(分步)做事?

 

 

4表达手段:第二点:模块(每步)的入口、出口?模块的形式如何?模块如何归属?

 

 

5模块中具体代码含义?return#include含义

 

 

6模块和文件的命名规范?

 

 

总成绩:_______

2章调试技术实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2按要求上传文档

2.1小组文档中栏目是否齐全-实验题目,模型结构,小组分工,共享位置?

2.2小组个人文档是否按要求完成(注意,如问题较小而模块不够分配,允许重复写某个模块,但内容不能完全一致)?

2.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

2.4个人代码上传?

 

 

3思想方法:如何体现面向过程编程思想,即如何分模块(分步)做事?

 

 

4表达手段:第2点:getMax模块的入口、出口?模块的形式如何?模块如何归属?第3点:getMin设计思路?

 

 

5模块中指定具体代码含义:&&是什么意思?

 

 

6main模块的getMax设置断点,运行至此,并进入内部?

 

 

总成绩:_______

3章基本的数据类型实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2按要求上传文档

2.1小组文档中栏目是否齐全-实验题目,模型结构,小组分工,共享位置?

2.2小组个人文档是否按要求完成(注意,如问题较小而模块不够分配,允许重复写某个模块,但内容不能完全一致)?

2.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

2.4个人代码上传?

 

 

3思想方法:在程序代码中,是如何体现面向过程编程思想,即如何分模块(分步)做事?

 

 

4表达手段:第2点:getDeposit模块的入口、出口?模块的形式如何?模块如何归属?

 

 

5模块中指定具体代码含义:34如何代码表达?

 

 

6main模块中调用的lower2Upper模块,定义在哪?使用在哪?相应的实参、形参分别是什么?

 

 

总成绩:_______

4章高级的数据类型实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2思想方法:如何体现面向过程编程思想,即如何分模块(分步)做事?

 

 

3表达手段:针对sort模块,请指出:

3.1模块的输入、输出?

3.2模块的形式?模块如何归属?

3.3实参与形参在哪?

3.4模块的设计思路?

 

 

4基本概念与技能:指针使用3步曲?

 

 

5问题思考:sort模块内部涉及到两个变量值的交换,能否利用教材中定义的swap模块及如何调整?

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全-包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

5章结构编程之顺序与选择实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2思想方法:如何体现面向过程编程思想,即如何分模块(分步)做事?

 

 

3表达手段:(打开程序后,任意指定1个模块,指出)

3.1模块的输入、输出?

3.2模块的形式?模块如何归属?

3.3实参与形参在哪?

3.4此模块的设计思路?

 

 

4问题思考:主模块中将switch换成if语句,程序如何调整?

 

 

5演示单步调试,查看从一个模块到另外一个模块变量改变?

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全-包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

 

 

6章结构编程之循环实验检查表

栏目

检测

补检

1程序运行:程序运行正确,达到预测结果?

 

 

2思想方法:对照着主模块,谈其中是如何体现面向过程编程思想,即如何分模块(分步)做事,分哪几个模块?

 

 

3合作方法:对照着模型结构图,谈如何合作?

 

 

4表达手段:(打开程序后,指定整数分析的某个模块,指出)

4.1此模块的输入、输出分别是什么?

4.2此模块的形式什么样?此模块如何归属?

4.3此模块调用时的实参与定义时的形参分别在哪?

4.4此模块的中如何利用循环解决问题?

 

 

5实际操作:现场演示,如何将别人做的代码文件(cpph)纳入自己做的项目中?

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全-包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

7章数组实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2思想方法:对照着程序,谈如何体现面向过程编程思想,即如何分模块(分步)做事。具体检查方法:打开主模块,指出调用哪些模块。

 

 

3表达手段:(打开主模块,随机指定调用的某模块,请指出)

3.1此模块的输入、输出?

3.2此模块的形式?模块如何归属?

3.3此模块的实参与形参在哪?

3.4此模块的代码解释?

 

 

4程序中全局变量定义点,声明点,和使用点在哪?

 

 

5实际操作:现场编写模块,根据给定的数组求所有元素和

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全-包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

 

 

8章字符串实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2思想方法:对照着程序,谈如何体现面向过程编程思想,即如何分模块(分步)做事。具体检查方法:打开主模块,指出调用哪些模块。

 

 

3表达手段:(打开主模块,随机指定调用的某模块,请指出)

3.1此模块的输入、输出?

3.2此模块的形式?模块如何归属?

3.3此模块的实参与形参在哪?

3.4此模块的代码解释?

 

 

4程序输入模块和显示模块,两个模块的参数不同,为什么?

 

 

5在显示模块中指出:如何表达第i个学生的姓名?

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全-包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

9章结构体实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2思想方法:对照着程序,谈如何体现面向过程编程思想,即如何分模块(分步)做事。具体检查方法:打开主模块,指出调用哪些模块。

 

 

3表达手段:(打开主模块,随机指定调用的某模块,请指出)

3.1此模块的输入、输出?

3.2此模块的形式?模块如何归属?

3.3此模块的实参与形参在哪?

3.4此模块的核心思路是什么?

 

 

4指出模块内部结构体的第i个元素的姓名如何表达?并与上一章表达对比?

 

 

5两个数组能直接赋值吗?两个结构体变量能直接赋值吗?

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全-包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全-包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

 

10章文件实验检查表

栏目

检测

补检

1程序运行正确,达到预测结果?

 

 

2思想方法:对照着程序,谈如何体现面向过程编程思想,即如何分模块(分步)做事。具体检查方法:打开主模块,指出调用哪些模块。

 

 

3表达手段:(打开主模块,随机指定调用的某模块,请指出)

3.1此模块的输入、输出?

3.2此模块的形式?模块如何归属?

3.3此模块的实参与形参在哪?

3.4此模块的核心思路是什么?如,如何进行排序的?

 

 

4如何知道读到一个文本文件的末尾?

 

 

5文本文件操作的步骤?及指出相应代码并解释?

 

 

6按要求上传文档

6.1小组文档中栏目是否齐全包括实验题目,模型结构,小组分工,共享位置?小组分工是否按模块划分?

6.2小组个人文档是否按要求完成,是否按分工提供文档?

6.3个人实验报告栏目是否齐全?包括1)实验题目(2)模型设计(3)分工安排(4)模块描述(5)数据预测(6)实验调试(7)总结思考

6.4个人代码上传?

 

 

总成绩:_______

5.实验上传目录结构,及上传文档格式和内容要求

1)上传目录结构

以小组8做第1章实验为例,在chap1下小组自建立“小组共享”、“个人名”、“共享库”子目录。如第8小组有3个成员(张一,李帅,王俊),这样共建立下图5个文件夹。各子目录中上传文档如下:

 

2)上传文档格式和内容要求

小组共享目录:

8-1-小组-协作.doc文件,此文件描述实验题目,模型设计,分工合作方式等。具体请参见第5点的“参考范例”。这里8指第8组,1指第1次实验。

       8-1-小组-张一-分工.doc文件,此文件描述张一负责设计模块的4个步骤,以及相应的代码(代码必须经过验证是正确的)。具体请参见第5点的“参考范例”。

       8-1-小组-李帅-分工.doc文件,此文件描述李帅负责设计模块的4个步骤,以及相应的代码(代码必须经过验证是正确的)。具体请参见第5点的“参考范例”。

8-1-小组-王俊-分工.doc文件,此文件描述王俊负责设计模块的4个步骤,以及相应的代码(代码必须经过验证是正确的)。具体请参见第5点的“参考范例”。

 

张一目录:

8-1-个人-张一-实验报告.doc文件:对小组所有同学的综合。实际上,经过小组的协作,个人实验报告的撰写非常简单,需要增加“数据预测、实验调试、总结思考”三个部分即可。具体请参见第5点的“参考范例”。强调:个人的实验报告,可以借鉴小组共享目录中的文档内容,但格式和内容上应按自己的设计进行调整,尤其是报告中“数据预测、实验调整、总结思考”这三个栏目绝对不能相同

8-1-个人-张一-实验代码.rar文件:将完整的项目代码压缩成一个文件后,再上传,在实验检查中要求演示个人实验代码,并作解释。

李帅目录:同上

王俊目录:同上

 

共享库目录:将本次实验所用的归属文件(经验证是正确的),拷贝至此目录中,以便于今后的开发使用原先做好的代码。提醒:一个归属包括2个文件,后缀名分别是cpph。如第1章的实验,需要上传Int.cppInt.h两个文件。

 

6.实验上传文档具体要求及参考范例

6.1“小组共享”目录中上传文档的具体要求及参考范例

1“协作”与“协作分工”具体要求

此目录下,要提交“协作文档”和“协作分工文档”(如小组有3人,则提交4份文档)。“协作文档”(如8-1-小组-协作.doc文件)中,要求小组在实验前集中,共同研究本次实验题目,确定关键的模型结构,并作好以模块为单元的分工规划。各小组成员按协作中的分工,按解决问题的4个步骤书写,并提交上传“协作分工文档”(如8-1-小组-张一-分工.doc文件)。

 

2“协作”与“协作分工”书写参考范例

1)“协作文档”书写参考范例:文件名,如8-1-小组-协作.doc

采用多文档模型结构实现如下要求:输入2个整数,编程求这2个数的最大数,并求其立方值。(特别注意:实际第一章实验题目,是基于2个小数,求立方值,故实验报告的实验代码需要调整)

 

2)“协作分工文档”书写参考范例

从上述分工中,可看到张一负责主模块main的设计过程及代码,书写内容是main模块解决的四个步骤及模块代码,提供的“协作分工文档”的文件中8-1-小组-张一-分工.doc,具体内容参考如下:

1TwoMaxCubeMain.cpp文件

主模块main

①模块功能:求两个整数的最大数,以及最大数的平方

②输入输出:系统模块,暂不考虑模块级别的输入输出,输入输出在内部完成

形式:int main()

归属:TwoMaxCubeMain

③解决思路

输入两个整数后,先求最大数,再根据最大数求出其立方值。例如:输入两个数分别34,先得到4,然后再计算4的立方值为64

④算法提纲

第一步,输入两个整数a,b

第二步,max=getMax(a,b);

第三步,cube=getCube(max);

第四步,输出maxcube

⑤模块代码

int main()

{

int a,b,max,cube;

cin>>a>>b;

max=getMax(a,b);

cube=getCube(max);

cout<<”最大值是”<<max;

cout<<”最大值的立方是”<<cube;

return 0;

}

 

从上述分工中,可看到李帅只负责主模块getMax的设计过程及代码,书写内容是getMax模块解决的四个步骤及模块代码,提供的“协作分工文档”的文件是8-1-小组-李帅-分工.doc,具体内容参考如下:

2Int.cpp文件

自定义模块getMax

①模块功能:求两个整数的最大值。

②输入输出

 

形式:int getMax(int a,int b)

归属:Int

③解决思路:比较ab,得到最大值,如a=3;b=4则应该返回b的值4

④算法步骤:如果a>b 返回a  ;否则  返回b

⑤模块代码

int getMax(int a,int b)

{

if(a>b)  return a;

else    return b;

}

 

王俊同学的“协作分工文档”与上述格式相同,不再示范。

 

6.2“个人”目录中上传文档的具体要求及参考范例

1“个人”实验报告格式要求

1)实验题目:来源于“上机实验部分”。

2)模型设计:专业软件绘制,结构清晰的模型图。

3)分工安排:根据模型图,确定小组中个人的工作内容(分工具体到某模块)。

4)模块描述:负责模块的模块功能、输入输出、设计思路、算法步骤、模块代码。

5)数据预测:根据事先给定的数据,预测可能产生的结果。

6)实验调试:明确错误,以及原因,并改正。

7)总结思考:包括总结部分和思考部分。

总结部分(4点):

1点,实验结果进行解释:输入什么样的数据,是否得到所要的结果;

2点,实验思路进行梳理:按面向过程的编程思路进行了怎样的设计,模块进行了怎样的归属,每个模块的主要设计思路是什么;

3点,实验过程中的问题进行收集分析:实验中出现的主要问题是什么?(是配合不默契,还是写报告部分?还是编程环境?还是程序问题?),以及如何解决这些问题的。

4点,实验深入研究(可选):本次的实验是否有另外的设计思路?实验要求能否扩展?有没有新的想法?

思考部分:见《思维训练手册》每次实验后的思考题。

 

说明:

1)“个人”实验报告中的七个栏目中,前3个栏目可借鉴“小组共享”的“协作文档”,第4个栏目“模块描述”可借鉴“小组共享”的“协作分工文档”,后3个栏目“数据预测”、“实验调试”、“总结思考”完全由学生个人完成,没有重复性。

2)可借鉴部分仅代表参考,不代表完全抄录,而是基于完全理解,甚至是改变。

3)实验报告格式必须完全统一(图表尺寸,文字大小,排版格式等)。

2“个人”实验报告参考范例

采用多文档模型结构实现如下要求:输入2个整数,编程求这2个数的最大数,并求其立方值。(特别注意:第一章真正的实验题目,是基于2个小数,求立方值,故实验报告的实验代码需要调整)

1TwoMaxCubeMain.cpp文件

主模块main

①模块功能:求两个整数的最大数,以及最大数的平方

②输入输出:系统模块,暂不考虑模块级别的输入输出,输入输出在内部完成

形式:int main()

归属:TwoMaxCubeMain

③解决思路

输入两个整数后,先求出最大数,再根据最大数求出其立方值。例如:输入两个数分别是34,先得到4,然后再计算4的立方值为64

④算法提纲

第一步,输入两个整数a,b

第二步,max=getMax(a,b);

第三步,cube=getCube(max);

第四步,输出maxcube

⑤模块代码

int main(){

int a,b,max,cube;

cin>>a>>b;

max=getMax(a,b);

cube=getCube(max);

cout<<”最大值是”<<max;

cout<<”最大值的立方是”<<cube;

return 0;

}

 

2Int.cpp文件

自定义模块getMax

①模块功能:求两个整数的最大值。

②输入输出

形式:int getMax(int a,int b)

归属:Int

③解决思路:比较ab,得到最大值,如a=3;b=4则应该返回b的值4

④算法步骤:如果a>b 返回a  ;否则  返回b

⑤模块代码

int getMax(int a,int b)

{

if(a>b)  return a;

else    return b;

}

 

自定义模块getCube

①模块功能:求一个整数的立方值

②输入输出

形式:int getCube(int max)

归属:Int

③解决思路:直接max*max*max得到结果,如max=5,结果是125

④算法步骤:先计算max*max*max,然后再返回结果。

⑤模块代码

int getCube(int max)

{

              return max*max*max;

}

3Int.h文件

int getMax(int a,int b);

int getCube(int max);

 

程序运行后,输入:3  5,结果应该是125

程序运行后,输入:3  10,结果应该是1000

问题编号

出错信息

改正办法

1

 

 

2

 

 

3

 

 

 

1.  总结部分

1)实验结果进行解释:输入2个整数3 5(中间用空格),得到125,即得到了最大值的立方,与实验预测是一致,达到目的;

2)实验思路进行梳理:本次实验按面向过程的编程思路进行设计,将整个过程分成两步(两个模块):第一步求两个整数的最大值,第二步求最大值的立方。因为都是针对整数的操作,所以这两个模块归属在Int中。求最大值模块主要设计思路是比较后返回最大值,求最大值立方模块是直接返回max*max*max

3)实验过程中的问题进行收集分析:

问题:实验报告画图时用viso制作时,画不好。解决:网上教程。

问题:报告中格式还是不太清楚。解决:查看学生手册解决。

问题:编程环境vc6安装不上。解决:安装vs2015,也安装了cfree

问题:实验时编译时不通过。解决:找到原因,是因为getMax写成了getmax

问题:实验时编译时不通过。解决:找到原因,是因为没有加入头文件,使用自定义模块时,一定相应的声明文件,本案要加#include<Int.h>

4)实验深入研究(可选):

本次实验要求使用文档方案,即将3个部分(主模块,自定义模块,自定义模块清单)写在3个文件中,我尝试将3个部分写在一起,写成单文档程序,编译连接运行通过。

如果要求求3个整数的最大数,我想思路是这样的,

其他新的想法

2.  思考部分

见《思维训练手册》第1.6节后的思考题


四.过程测验部分

1.第一次过程考核

考核目标:

是否掌握了面向过程的编程思想。

是否学会模型、模块的图形绘制。

是否掌握基本和高级数据类型的表达、存贮、提取。

是否掌握简单的调试能力。

是否学会简单的多模块设计。

 

核心:

完成多模块、多文件简单程序的设计,以传值和传地址方式,两个模块之间的数据传递。

 

时间:

考核时间安排在第4章教学内容之后。

 

参考:

请参考思维训练手册中第1大单元的复习和检测题目。

 

说明:

过程考核不及格的分数直接带入最后的总分,不进行补过。

 

考核自我小结:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


第一次过程考核内容(请将过程考核试卷贴在下方)


 

2.第二次过程考核

考核目标:

是否熟练掌握了面向过程的编程思想。

是否熟练应用模型、模块的图形绘制。

是否掌握结构编程语句的特点及用法,即顺序、选择、循环。

是否掌握基本的结构编程能力,将思维过程顺利转化为结构编程语句,如学生会用循环去解决一些规律性的问题。

 

核心:

上一单元内容:模型与模块结构、基本数据类型、指针类型、调试技术等。

本次单元内容:输入与输出语句、条件判断语句、循环语句、递推与递归表达。

 

时间:

考核时间安排在第六章结构编程语句之后。

 

参考:

请参考思维训练手册中第2大单元的复习和检测题目。

 

说明:

过程考核不及格的分数直接带入最后的总分,不进行补过。

 

考核自我小结:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


第二次过程考核内容(请将过程考核试卷贴在下方)

 


3.第三次过程考核

考核目标:

是否熟练掌握了面向过程的编程思想。

是否熟练应用模型、模块的图形绘制。

是否熟练掌握结构编程语句的使用。

是否掌握使用构造类型来表达不同性质的数据,以及在模块化设计中构造数据的传递。

是否掌握构造类型的数组作为模块参数的传递技术和传递能力。

是否掌握不同类型文件的简单保存技术。

 

核心:

一维数组的结构和特点。

字符串的保存方式及对字符串的常见操作。

结构体的特点和结构体各字段的读取方式等相关内容。

文本文件和二进制文件数据的读取和写入。

 

时间:

考核的时间定于所有的构造类型第10章结束。

 

参考:

请参考思维训练手册中第3大单元的复习和检测题目。

 

说明:

过程考核不及格的分数直接带入最后的总分,不进行补过。

 

考核自我小结:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


第三次过程考核内容(请将过程考核试卷贴在下方)

 


五.大作业部分

1.大作业设计目的

1)简单控制台系统程序设计的能力。

2)系统建模能力。

3)合作编程能力。

4)代码复用能力。

5)科技论文撰写能力。

6)语言组织及表达的答辩能力。

7)资料查询方法和能力。

 

2大作业评价指标和评分方法

评价指标:

1)报告完整。

2)分析准确。

3)分工明确。

4)程序运行正确得到需要结果。

5)个人表现(提问表现及工作量)。

 

评分方法:

1)各项指标达成,回答问题准确,优秀90-100

2)大部分指标达成,回答问题基本准确,良 80-89

3)大部分指标达成,但问题回答错误,经提醒后给出正确解释,评定为中70-79

4)大部分指标未达成,回答错误,经提醒后给出较正确解释,评定为及格60-69;经提醒后依然无法解释,则不通过,不通过者视情况给与0-59分;

 

特别注意:

以下有符合条件之一者,直接确定为没有通过,不通过者不补过。

1)报告及代码雷同者。

2)没有按标准要求(栏目内容和格式)。

3)没有按规定时间上交材料者。

4)程序运行得不到结果

 

注意:

1)以小组为单位选题。

2)同一题目最多不能超过3组选择,即便同一题目,设计与代码应各自不同。

3)题目来源可参考下面给定的题目,给定题目要求实现的功能不得低于要求功能的3/4;也可自拟题目,自拟题目报备最迟于期中。

4)设计报告,认真措辞修改后,打印一份纸质稿,并上传电子稿。

5)从第6章教学开始,小组确定题目,并填写第8点的“小组选题”,着手准备,联系课内教学和课外学习,逐步完善需求分析,逐步将小给带入系统开发过程。

3.大作业评价考核时间

实际教学周的第13/14周,各安排半天的教学时间,第13周半天(4节实验)负责进行项目设计的解释和答疑,第14周半天(4节实验),小组提交纸质打印报告,以及电子报告和源代码,并准备好答辩检查。

 

4.大作业题目参考

4.1简单分数管理系统的设计与实现

[具体功能]

成绩录入

成绩显示

成绩删除

成绩排序

成绩查询

              按学号查询

              按姓名查询

成绩统计

得到总分、平均分

              得到方差

成绩修改

成绩保存

成绩调入

[提示部分]

       数据结构:

1)班级每位学生的信息(如:学号、姓名,分数)用结构体类型Score表达,所有学生信息是结构体数组,如Score scoreAll[40],也可使用指针数组,如Score *pScoreAll[40]

2)简单起间,文件保存可使用文本文件结构。

 

4.2档案管理系统的设计与实现

[具体功能]

信息录入

信息显示

信息查询

              按工号查询

              按姓名查询

              按单位查询

              按单位+部门编号查询

信息排序

              按工号排序

              按姓名排序

              按单位排序

              按单位+部门编号排序*

信息修改

信息保存

信息调入

[提示部分]

数据结构:每位的信息(如:工号,姓名,年龄,电话,家庭住址,职业,单位,部门编号)用类型Info表达,所有信息是结构体数组,如Info infoAll[1000]

 

4.3实验学习系统的设计与实现

[具体功能]

根据菜单提示(出现10章标题),选择某章实验后,执行以下功能:

1)运行本次实验程序

2)显示本次实验代码

3)分析本次实验核心

4)返回

 [提示部分]

       将所有实验代码的主模块改为自定义模块,以备调用。

 

4.4简易通讯录系统的设计与实现

[具体功能]

       输入功能、输出功能、查询功能(根据号码查、根据姓名查、模糊查询)、删除功能、修改功能、保存功能、调入功能等。

[提示部分]

数据结构:每位的信息(如:编号,姓名,年龄,电话)用类型Note表达,所有信息是结构体数组,如Note noteAll[100]

 

4.5图书管理系统的设计与实现

       输入功能、输出功能、查询功能(根据号码查、根据姓名查、模糊查询)、删除功能、修改功能、保存功能、调入功能等。

[提示部分]

数据结构:每本书的信息(如:编号,书名,作者,价格,出版社,ISBN)用类型Book表达,所有信息是结构体数组,如Book bookAll[1000]

 

4.6车票管理系统的设计与实现

[具体功能]

       查询功能

              根据班次查询

              根据目的地查询

              根据起点查询      

              查询余票

       买票:

       退票:

[提示部分]

       数据结构:车票信息(编号,班次,起点,终点,价格,里程,票数),用结构体Ticket表达,所有车票信息存入文本文件,程序运行时,首先调入信息进入结构体数组,如Ticket ticketAll[40]

 

4.7某课程成绩分析系统的设计与实现

[具体功能]

       根据给定的一个数据文件(包括学号,姓名,笔记成绩,测验成绩,实验成绩,期末考试分成绩),得到平均分,最高分,最低分,方差,各分数段人数,优秀率,及格率等,并将得到的数据写入文本文件。

[提示部分]

       数据结构:建立一个结构体数组保存从文本文件中调入的数据,再编写各模块处理。

 

4.8中英文翻译器的设计与实现

[具体功能]

调入词库

保存词库

修改词库

-英翻译

-中翻译

模糊查找

语音朗读

[提示部分]

数据结构:指针数组保存中文和英文,使用2个文本文件分别保存中文词库和英文词库(可事先建立这2个文件),2个文件中每行是一个英文单词或是一个英文单词的中文注解。

 

4.9财务管理系统的设计与实现

[具体功能]

收入管理部分:

              收入输入

              收入显示

              收入查询:

                     按输入类型查询

                     按年、月查询

              统计分析:

                     统计某年某月的收入总和

                     统计某年收入总和

                     统计所有的收入总和

              收入保存:

              收入调入:

支出管理部分:同收入管理部分

收支分析:

某个月的收入与支出分析

某年的收入与支出分析

所有的收入与支出分析

[提示部分]

       数据结构:

       1)收入信息(编号,收入类型,金额,年度,月份),用结构体InCome表达,所有收入信息用结构体数组表达,如InCome inComeAll[40]

2)支出信息(编号,支出类型,金额,年度,月份),用结构体OutCome表达,所有支出信息用结构体数组表达,如OutCome outComeAll[40]

 

4.10分数管理系统的设计与实现

[具体功能]

学生部分(3项功能):登录、查询所有学生信息、查询本人分数;

教师部分(3项功能):登录、针对学生进行各种操作(录入、显示等)、修改教师密码。

[提示部分]

1)编写一个较为完善的系统,一般都需要设计成3层结构,即界面、逻辑、数据。这3层设计好了,可以各自升级,便于物理和空间的发布。本项目可参考教材中给定“学生成绩管理系统”的模型结构或类图结构,使用面向对象或用面向过程(根据课程学习内容而具体选择),以及分层设计思想。分层设计:窗口归属或类、业务归属或类、数据归属或类

2)本设计所需要的数据文件

数据保存方式分3种:文本文件、二进制文件、数据库文件。推荐采用二进制文件,例如本项目,可包括以下3个文件:

TeacherInfo.dat---内容是教师姓名、教师密码、教师所在院校

StudentInfo.dat---内容是学生姓名、密码、家庭住址

Score.dat---内容是学生学号、学生姓名、课程号、学生分数

 

4.11“归属”学习系统的设计与实现

[具体功能]

列出教材中所有归属,选择某一归属后,呈现菜单选择:1查看清单结构2查看源码3查看归属的使用4返回

[提示部分]

       1)归属名单独放在一个文本文件中,读入归属名列表保存到指针数组中

       2)根据选择的归属名,调入相应的清单文件或源码文件或归属使用文档

 

4.12实验室管理系统的设计与实现

[具体功能]

建立功能

查询功能

       按楼层查找

       按专业查找

       按开设课程查找

       按管理员查找

       按空闲查找

查看课表

排课功能

修改功能

保存功能

调入功能

[提示部分]

       建立结构体Lab,尽量让结构更加丰富。某个字段中多个信息注意用特殊符号区分。

 

5.大作业标准要求

5.1栏目和内容标准

1)封面和摘要、关键词:封面包括系别、题目、班级、组员、学号等。摘要写要实现的主要目标,以及设计的关键思路,以及特色。(摘要不少于200字)

2)基本概念:C/C++语言的特点,以及相关重要知识点。(不少于600字)

3)需求分析:解决为啥做(需求分析)?做什么(系统功能)?这两方面问题。即做这个项目的意义、价值;以及列出所有要实现的功能(并以图形方式来反映)。(文字部分不少于300字)

4)概要分析:指出本系统采用的数据结构和存储结构(通常是结构体数组,指出结构体定义方式;存储方式可分为文本文件和二进制文件,指出具体的文件名)。(不少于100字)

5)界面设计:专业绘图软件绘制,制作程序运行的多个界面,并辅助以文字的说明。(不少于200字)

6)模型设计:专业绘图软件绘制,并给出具体的合作方式。(不少于100字)

7)模块设计:即需要分析中列出的各功能模块的设计,要有设计思路和核心代码。(不少于1300字)

8)运行测试:设计要输入的数据,并预计得到的结果,运行结果反映这种预测的正确性。(不少于200字)

9)项目总结:包括制作程序过程中的心得,以及项目设计过程中遇到的难点,以及这个项目还存在那些问题需要今后的改进。(不少于300字)

10)课程心得:收获及建议,小组同学,每人写一份。(不少于500字)

11)致谢:(不少于100字)

12)参考文献:列出本设计的参考资料,不少于5

13)附录代码:

 

注意:不包括“课程心得”、“致谢”、“参考文献”、“附录代码”,正文不少于3300字。

 

5.2格式标准

1)上述每一个栏目标题,新开一页。

2)上述栏目使用一级标题,其下标题用二级、三级等。

3)所有图表加图注和表注。

4)正文文字用小四宋体。

6.大作业检查表*

题目:___________________________________

评价过程:

检测栏目

检测结果

1程序运行正确,达到预测结果?

 

2报告格式是否符合要求(栏目完整,排版正确,字体段落统一)

 

3项目设计中的特色之处?

 

4如何分工(你主要负责完成的内容)?

 

 

 

 

 

5整个项目的设计思路,以及你所负责部分的设计和实现思路?

 

 

 

 

 

 

 

 

 

 

 

 

 

姓名1_______________;大作业成绩_____________

姓名2_______________;大作业成绩_____________

姓名3_______________;大作业成绩_____________

姓名4_______________;大作业成绩_____________

7.大作业范例参考

简易分数管理系统的设计与实现

封面、中文摘要、关键词。例如:

 

 


 

Hefei University

 面向过程程序设计大作业报告

 BACHELOR DISSERTATION

 

    项目题目:                                

专业年级班级:                            

组员姓名:                                

导师姓名:                                

完成时间:                               

 

 

 

 


摘 要

不少于200

 

 

 

 

 

 

 

 

 

 

 

关键词35个关键字,以分号隔开

 

 


一.基本概念(1级标题)(不少于600字)

写出本课程最重要的知识点,以及与本项目相关的一些知识点。如:

1.1C/C++语言的特点(2级标题)

...

1.2指针的使用方法

...

1.3数组传递技术

...

二.需求分析(1级标题)(文字部分不少于300字)

2.1需求分析(2级标题)

本系统的设计是绝对有必要的,因为当前存在的状况是,本系统的设计能够有效地解决

 

2.2系统功能

列出所有功能(以图形表达),并给以必要文字说明各功能的作用。例如:

其中“输入模块”:要求...

其中“显示模块”:要求...

...

 

三.概要分析(不少于100字)

3.1数据结构

本系统使用结构体数组来保存学生的分数信息,结构体结构如下:

struct Score

{

       int id;

       char name[20];

       double math;

       double english;

       double phy;

};

根据上述结构体定义结构体数组来保存所有学生的分数信息,如Score scoreAll[100];另外,采用局部变量方式来记录真实人数,如int num=0;

 

3.2存储结构

本系统采用二进制文件对结构体数组中数据,二进制文件名Score.data

 

四.界面设计(不少于200字)

运行过程多个界面的设计。例如:

4.1主界面

程序运行首先进入主界面,提供5项功能,分别是,如下图

*主界面

欢迎使用分数管理系统

1输入功能   2显示功能

请选择功能(1,2,3,4,5…):

 

4.2输入界面

输入界面,要求输入,如下图

*输入界面

请输入要输入的学生分数信息

学号:1101

姓名:liyi

分数:80

 

4.3…界面

...

...

 

五.模型设计(不少于100字)

5.1模型结构

专业绘图软件绘制,并给出具体的合作方式。例如:

5.2分工合作

必须说明各位同学如何分工,并设定提交工作期限。

 

六.模块设计(不少于1300字)

分各模块实现,包括各模块的模块功能,输入输出,设计思路,算法步骤,模块代码。

 

七.运行测试(不少于200字)

7.1预定测试方案

预定输入什么样的数据,猜测得到什么样的结果。

 

7.2实际运行结果

上述设计预案,实际程序运行结果(以图形表达),并说明是否达到目标。

 

八.项目总结(不少于300字)

包括制作程序过程中的心得,以及项目设计过程中遇到的难点,以及这个项目还存在那些问题需要今后的改进。

 

九.课程心得(每人不少于300字,务求真实)

分人写这门课程的学习心得(包括你觉得学习的最大问题是什么,老师教学有什么问题,教材使用有什么问题,务求真实)。格式如:

李帅的心得:...

王俊心得:...

王五心得...

 

十.致谢(不少于100字)

 

十一.参考文献

列出本设计的参考资料,不少于5篇。

 

十二.附录代码

 

8.大作业上传文档格式*

以小组8的大作业为例,说明上传结构与文档格式如下:

8-小组-大作业.doc文件,此文件是大作业报告内容。

8-小组-大作业.rar文件,此文件是程序项目的压缩文件。

 

9.大作业小组选题及需求分析*

1)小组选题:_________________________________________________________

2)需求分析:

 

 

 

 

 

 

 

 


六.章节预习与读书笔记

1.第一章 模型模块

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

2.第二章 调试技术

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

3.第三章 基本数据类型(高级数据类型)

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

4.第四章 低级数据类型

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

5.第五章 结构编程之顺序与选择

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

存在问题:

 

 

 

6.第六章 结构编程之循环

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

7.第七章 数组

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

8.第八章 字符串

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

9.第九章 结构体

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

10.第十章 文件操作

课前预习表

核心点(见教材)

问题与思考

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

读书笔记表

收获(主要内容):不少于300

 

 

 

 

 

 

存在问题:

 

 

 

 

 

七.作业参考答案

第一章答案

1简答题

(1)       自顶而下,逐步求精,模块设计,结构编程

(2)       函数

(3)       模块是内容,文件是载体

(4)       main

(5)       主模块,自定义模块,自定义模块说明

(6)       包含是为了引用sqrt函数

(7)       需要连接

(8)       方案一更好。原因是命名规范,注释清楚

(9)       5

(10)   图如下:

2选择题

1

2

3

4

5

6

7

8

9

10

C

D

A

B

B

A

A

ABCD

A

A

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

4画图题

图形

表达式

int getAverage(int data1,int data2){...}

int getSquareVol(int l,int w,int h){...}

float getBallArea(float r){...}

void textOut(int x,int y,char * content){...}

float getCentigrade(float fah){...}

5画图题

678同型题参与教材相关代码和图形

9答辩题部分代码

int getPolyValue(int x)

{

       return x*x*x+3*x+1;

}

 

10答辩题部分代码

int getMax(int a,int b)

{

       if (a>b)

       {

              return a;

       }

       else

       {

              return b;

       }

}

 

int getCube(int x)

{

       return x*x*x;

}

 

11答辩题部分代码

float getCircleArea(float r)

{

       return 3.14*r*r;

}

 

12

1)升旗仪式:取旗,奏国歌,升旗,行礼,降旗

2)写论文:写题纲,找资料,写作,修改

3)炸碉堡:取炸药包,掩护,埋包,退回,引爆

4)旅游策划:确定目的地,定路线,订宾馆,订机票等。


第二章答案

1简答题

(1)       编译出错:通过出错信息,定位并改正语法错误;连接出错:检查申明和源码之间是滞匹配等;运行出错:单步调试或者断点调试等,检查变量的状态。

(2)       F10/F11交替使用单步调试,使用变量窗口和查看窗口查看数据状态。

(3)       最关键的是cpp源码文件和h声明文件。如主模块所在cpp源码文件,自定义模块所在cpp源码文件,自定义模块的h声明文件。拷贝一个项目两种方法:一是拷贝整个项目;二是拷贝cpph文件。

(4)       放在章节目录下,如第一章程序位置:c:\c++\chapt1

(5)       新建项目、拷贝核心文件(源码和声明)、项目中添加核心文件

(6)       随机值,因为编译时,会将变量赋一个随机值

(7)       错误信息:c没有被定义

(8)       在相应位置设置断点(F9),运行至断点(F5)即可通过变量窗口查看此时值

(9)       三种常用函数:绝对值函数fabs(3)  正弦函数sin(4) 求平方根函数sqrt(2)。使用数学函数,要加#include <math.h>

(10)   项目名为:ThreeMaxMinProj,项目下建立3个文件,模型图如下:

2选择题

1

2

3

4

5

6

7

8

9

10

B

B

A

A

A

A

ABC

ABC

A

A

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

4改错题

(1)       正确答案

#include <iostream.h>

int getPoly3Value(int x);

int main(){

       int x,y ;

       cin>>x;

       y=getPoly3Value(x);

       cout<<y;

       return 0;

}

int getPoly3Value(int x){

       return x*x*x+2*x*x+1;

}

(2)       正确答案

#include <iostream.h>

void swap(a,b);

int main(){

       int a,b;

       cin>>a>>b;

       swap(a,b);

       cout<<a<<b;

       return 0;

}

void swap(int a,int b){

       int temp;

       temp=a;a=b;b=temp;

}

(3)         主模块中调用getSquareSum,但并没有声明。修改:将Int.h中将getSquare改为getSquareSum

(4)       清单文件中声明是getSquareSum模块,但源码文件提供是getSquare模块,不匹配,故连接出错。修改:将Int.cpp中将getSquare改为getSquareSum

 

5调试题

aa, bb, cc的值是345

6画图题

图形

表达式

int getCommDiv(int data1,int data2)

int getCommMult(int data1,int data2)

char* strCat(char* str1,char* str2)

int getSeriesN(int n)

int getMax(int a,int b,int c)

void printMax(int a,int b,int c)

void printAllInt(void)

 

7画图题

8答辩题-模块代码

int getMin(int aa,int bb,int cc)

{

       if(aa<bb&&aa<cc) return aa;

       if(bb<aa&&bb<cc) return bb;

       if(cc<aa&&cc<aa) return cc;

}

 

9答辩题-模块代码

#include <math.h>

float getDeposit(float capital,float rate,int year)//可归属于Finance

{

       float deposit;

       deposit=capital*pow(1+rate,year);

       return deposit;

}

 

10编程题(提高)-模块代码

#include <iostream.h>

#include "Finance"

int main(){

       float capital,rate;

       int year;

       float result1,result21,result22;

       //不转存情况

       capital=10000;rate=0.03;year=5;

       result1=getDeposit(capital,rate,year);

       cout<<"不转存结果:"<<result1<<endl;

      

       //转存,先求前三年,在此基础上,求后两年

       capital=10000;rate=0.02;year=3;

       result21=getDeposit(capital,rate,year);

       capital=result21;rate=0.04;year=2;

       result22=getDeposit(capital,rate,year);

       cout<<"转存结果:"<<result22<<endl;

}


第三章答案

1简答题

(1)       假如整形变量a,则(int)a强制转成小数

(2)       算术>关系>逻辑

(3)       大于 小于 等于 不等于

(4)       字符常量用单引号,字符串常量用双引号。如’a’”a”

(5)       三步骤:定义,声明,使用

(6)       ’a’是字符a,其码值是97;’\a’是字符响铃,其码值是70’是字符0,其码值是48;’\0’是不可见字符,其码值是0

(7)       void

(8)       假如整形变量a,通过sizeof(a)可知道分配多少单元

(9)       小数表示法,科学计数法

(10)   -2147483648 --- 2147483647

(11)   假如整形变量a,则一个整数得到最后一位方法:a%10;去除最后一位方法:a/10

2选择题

1

2

3

4

5

6

7

8

9

10

11

C

C

A

A

B

B

A

A

A

A

A

3计算题

125   212.5  318

4读程序写结果

3 3

原因:

return a,b相当于retrun b。因为a,b是逗号表达式,仅表示运算顺序,后算b,所以结果是b。另外,即使返回了b,也达不到改变主模块a,b的目的。

5画图题

模块图

表达式

int calc(int a,int b,char sign)

void calc(int a,int b,char sign)

int calc(void)

void calc(void)

int calc(int a,int b,char sign)

bool isAlpha(char c)

int isDigital(char c)

void welcom(void)

int choiceMenu(void)

float str2Float(字符类型 str)

 

6编程题

void lower2Upper(char c1,char c2,char c3,char c4,char c5){

       c1=c1-32;

       c2=c2-32;

       c3=c3-32;

       c4=c4-32;

       c5=c5-32;

       cout<<c1<<c2<<c3<<c4<<c5;

}

7编程题

void sort (){

       float a,b,c,temp;

       cout<<”请输入第一个数:”;cin>>a;

cout<<”请输入第二个数:”;cin>>b;

cout<<”请输入第三个数:”;cin>>c;  

if (a>b){ temp=a;   a=b; b=temp; }

       if (a>c){  temp=a;   a=c; c=temp;   }

       if (b>c){ temp=b;  b=c; c=temp;   }

       cout<<” 最后的排序结果是:”<<a<<b<<c;

}

 

8编程题

void changeChar(char c1,char c2,char c3,char c4,char c5){

       c1=c1+5;

       c2=c2+5;

       c3=c3+5;

       c4=c4+5;

       c5=c5+5;

       cout<<c1<<c2<<c3<<c4<<c5;

}

9编程题

calc模块

main模块

int calc(int a,int b,char sign)

{

       if (sign=='+')

       {

              return a+b;

       }

       else

       {

              return a-b;

       }

}

int main()

{

       int a,b,result;

       char sign;

       cin>>a>>b>>sign;

       result=calc(a,b,sign);

       cout<<result<<endl;

       return 0;

 

}

 

 

10编程题

char getChangedChar(char ch)

{

       return ch+5;

}

 

11阅读题

 

12编程题

方法一

方法二

char getChangedChar(char ch)

{

       if (ch>='a'&&ch<='z')

       {

              if (ch+5>'z')

              {

                     return ch+5-26;

              }

              else  return ch+5;

       }

 

       if (ch>='A'&&ch<='Z')

       {

              if (ch+5>'Z')

              {

                     return ch+5-26;

              }

              else  return ch+5;

       }

}

bool isChar(char ch)//先做判断是否字符模块

{

         if (ch>='a'&&ch<='z' || ch>='A'&&ch<='Z')

       {

              return true;

       }

       else return false;

}

char getChangedChar(char ch)

{

       ch=ch+5;

       if (isChar(ch))

       {

              return ch;

       }

       else return ch-26;

}

 

 


第四章答案

1简答题

(1)       在传递的模块中改变自身的值

(2)       传地址、类型匹配、间接操作

(3)       sizeof(指针变量)

(4)       随机地址

(5)       不能直接赋值,需要强制转成整形地址后再赋值。int *p;p=(int *)0x12ff7c;

(6)       pC++表示指针移动1个字节;pI++表示指针移动4个字节

(7)       static可改变局部变量的生存期和限制全局变量的作用域在某文件中

(8)       从一个指针类型A到另一个指针类型B,需要强制转换,格式如下:

类型A * pA;

类型B * pB;

pA=(类型A *)pB;

(9)       编译器分配栈空间和主动申请的堆空间

(10)   两种写法都正确,第一种写法是定义指针变量p时初始化,第二种是定义后,通过赋值语句赋值.

 

2选择题

1

2

3

4

5

6

7

8

9

10

C

D

A

A

B

C

C

C

D

D

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

4画图题

模块图

表达式

int charCmp(char c1,char c2)

int getDays(int year,int month)

int sort(int a,int b,int c)

void sort(int *pA,int *pB,int *pC)

bool getChars(char *pC1,char *pC2)

 

5编程题

void setMaxMin(float a,float b,float *pMax,float *pMin){

       if (a>b) {

              *pMax=a;*pMin=b;

       }

       else {

              *pMax=b;*pMin=a;

       }

}

 

6编程题

int getMax(int data1,int data2,int data3)

{

       int max;

       if (data1>data2&&data1>data3) max=data1;

       if (data2>data1&&data2>data3) max=data2;

       if (data3>data1&&data3>data1) max=data3;

       return max;

}

 

int getMin(int data1,int data2,int data3)

{

       int min;  

       if (data1<data2&&data1<data3) min=data1;

       if (data2<data1&&data2<data3) min=data2;

       if (data3<data1&&data3<data1) min=data3;

       return min;

}

 

#include <iostream.h>

int main()

{

       int data1,data2,data3,max,min;

       cin>>data1>>data2>>data3;

       max=getMax(data1,data2,data3);

       min=getMin(data1,data2,data3);

       cout<<max<<min;

       return 0;

}

 

7编程题

void setMaxMin(int data1,int data2,int data3,int *pMax,int *pMin)

{

       if (data1>data2&&data1>data3) *pMax=data1;

       if (data2>data1&&data2>data3) *pMax=data2;

       if (data3>data1&&data3>data1) *pMax=data3;   

       if (data1<data2&&data1<data3) *pMin=data1;

       if (data2<data1&&data2<data3) *pMin=data2;

       if (data3<data1&&data3<data1) *pMin=data3;   

}

 

#include <iostream.h>

int main()

{

       int data1,data2,data3,max,min;

       cin>>data1>>data2>>data3;

       setMaxMin(data1,data2,data3,&max,&min);

       cout<<max<<min;

       return 0;

}

 

8编程题

void setMaxMin(int data1,int data2,int data3,int &aMax,int &aMin)

{

       if (data1>data2&&data1>data3) aMax=data1;

       if (data2>data1&&data2>data3) aMax=data2;

       if (data3>data1&&data3>data1) aMax=data3;     

       if (data1<data2&&data1<data3) aMin=data1;

       if (data2<data1&&data2<data3) aMin=data2;

       if (data3<data1&&data3<data1) aMin=data3;     

}

 

#include <iostream.h>

int main()

{

       int data1,data2,data3,max,min;

       cin>>data1>>data2>>data3;

       setMaxMin(data1,data2,data3,max,min);

       cout<<max<<min;

       return 0;

}

 

9编程题

void sort(int *pA,int *pB,int *pC)

{

       int temp;

       if (*pA>*pB){temp=*pA;*pA=*pB;*pB=temp;}

       if (*pA>*pC){temp=*pA;*pA=*pC;*pC=temp;}

       if (*pB>*pC){temp=*pB;*pB=*pC;*pC=temp;}

}

 

10编程题

1welcome模块

void welcome(void)

{

       cout<<"*********************************************************";

       cout<<"*                  欢迎使用本程序                       *";

       cout<<"*             本程序是将三个整数进行排序                *";

       cout<<"*                   作者:李祎                          *";

       cout<<"*********************************************************";

}

2sort模块,见前题

3quit模块

void quit(void)

{

       cout<<"*********************************************************";

cout<<"*         谢谢您使用本程序,请提出宝贵意见              *";

       cout<<"*********************************************************";

}

 

4main模块

#include <iostream.h>

int main()

{

       int a,b,c;

       welcome();

       cin>>a>>b>>c;

       sort(&a,&b,&c);

       cout<<a<<b<<c;

       quit();

       return 0;

}

 

11编程题

void seperatorInt()

{

       int data,end;

       cin>>data;

       end=data%10;cout<<end<<endl;data=(data-end)/10;

       end=data%10;cout<<end<<endl;data=(data-end)/10;

       end=data%10;cout<<end<<endl;data=(data-end)/10;

}

 

12编程题

void seperatorChar(char c)

{

       char ref=1;

       cout<<"测试:如果传进的c'a',则从高位到低位显示'a'字符的位:";

       cout<<"结果应该是:0 1 1 0 0 0 0 1"<<endl;

       cout<<"本次传进的是"<<(char)c<<",转成二进制应该是:";

       cout<<(int)( (c&ref<<7)>>7)<<" ";ref=1;

       cout<<(int)( (c&ref<<6)>>6)<<" ";ref=1;

       cout<<(int)( (c&ref<<5)>>5)<<" ";ref=1;

       cout<<(int)( (c&ref<<4)>>4)<<" ";ref=1;

       cout<<(int)( (c&ref<<3)>>3)<<" ";ref=1;

       cout<<(int)( (c&ref<<2)>>2)<<" ";ref=1;

       cout<<(int)( (c&ref<<1)>>1)<<" ";ref=1;

       cout<<(int)( (c&ref<<0)>>0)<<endl;ref=1;

}


 

第五章答案

1简答题

(1)       通过调用模块的返回值给本模块的的变量赋值;将本模块变量的地址传递过去,在调用模块中通过间接方式修改本模块的变量值;将本模块变量的名传递过去,在调用模块中通过引用名修改本模块的变量值;

(2)       模块设计指的是将所要实现的功能写成一个独立的单元,这个单元的名字叫模块或者叫函数;结构编程指的是模块内部编程时,只有一个入口和一个出口的顺序、选择、循环三种结构代码,不能够在三种结构里随意地跳转。

(3)       一般情况下,switch用于离散值的选择,根据输入的几个特定的值去选择分支走向,如菜单的制作;if/else用于较复杂的选择环境。

(4)       对齐格式用setiosflags(ios::对齐格式)来控制,具体小数的位数用setprecision(小数位数)控制,总长度用setw(总长度)控制,另外总长度需要每次输出时都明确。

(5)       赋值是对一个已经定义的变量传值,而克隆是在定义变量的同时传值。

(6)       if(fabs(a)<1e-6)表示小数变量的值为0

(7)       扩展函数的作用域:使用extern声明;限制函数作用域:定义时头部加static

(8)       可能会产生指针变量所指向的空间丢失。

(9)       代表都不能匹配的情况下,选择default语句部分执行。

(10)   printf换行显示:printf(“\n”)  cout换行显示:cout<<endl;

2选择题

1

2

3

4

5

6

7

8

9

10

B

A

C

C

B

D

D

A

C

D

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

×

×

4画图题

5编程题

#include <iostream.h>

void prtGrade(float score){

       char grade;

       if (score>=85)      grade='a';

       else if (score>=70)  grade='b';

       else if (score>=60)  grade='c';     

       else              grade='d';

       cout<<"grade is:"<<grade<<endl;

}

6编程题

void prtByGrade(char grade){

       switch(grade){

       case 'a':cout<<"85-100\n";break;

       case 'b':cout<<"70-84\n";break;

       case 'c':cout<<"60-69\n";break;

       case 'd':cout<<"<60\n";break;

       default:cout<<"输入有错";break;

       }

}

7编程题

char getGrade(float score){

       char grade;

       if (score>=85)         grade='a';

       else if (score>=70)     grade='b';

       else if (score>=60)     grade='c';      

       else                 grade='d';

       return grade;

}

8编程题

bool isLeapYear(int year){

       bool flag;

       if (year%4==0&&year%100!=0||year%400){

              flag=true;

       }

       else{

              flag=false;

       }

       return flag;

}

9编程题

判断是否构成三角形模块isTri

求三棱锥体积模块

bool isTri(float a,float b,float c){

       bool flag;

       if (a<b+c&&b<a+c&&c<a+b)  

{

  flag=true;

}

       else  

{

  flag=false;

}

       return flag;

}

float getTriVol(float a,float b,float c,float h){

       float p,vol;

       if (isTri(a,b,c)){

              p=0.5*(a+b+c);

              vol=h*sqrt(p*(p-a)*(p-b)*(p-c))/3;      

       }

       else{

              cout<<"这不是三棱锥";

              vol= 0;

       }

       return vol;

}

 

10编程题

void guess()

{

       int guess=10;//例如要猜的数是10

int x;

       cout<<"请输入猜数:";

       cin>>x;

       if (x> guess)

       {

              cout<<"大了,请猜小一点:"<<endl;

              cout<<"请输入猜数:";

              cin>>x;

              if (x> guess)

              {

                     cout<<"大了,没机会了"<<endl;

              }

              else if (x< guess)

              {

                     cout<<"小了,没机会了"<<endl;

              }

              else cout<<"正确"<<endl;

       }

       else if (x< guess)

       {

              cout<<"小了,请猜小一点:"<<endl;

              cout<<"请输入猜数:";

              cin>>x;

              if (x> guess)

              {

                     cout<<"大了,没机会了"<<endl;

              }

              else if (x< guess)

              {

                     cout<<"小了,没机会了"<<endl;

              }

              else cout<<"正确"<<endl;

       }

       else cout<<"正确"<<endl;

}

11编程题

求根模块setRoot

主模块main

#include <math.h>

int setRoot(int a,int b,int c,float *pRoot1,float *pRoot2){

         float det=b*b-4*a*c;

         bool flag;

         if (det>0)

         {

                   *pRoot1=(-b+sqrt(det))/(2*a);

                   *pRoot2=(-b-sqrt(det))/(2*a);

                   flag=1;

         }

         else if (det==0)

         {

                   *pRoot1=*pRoot2=(-b*1.0)/(2*a);

                   flag=0;

         }

         else

         {

                   *pRoot1=(-b*1.0)/(2*a);

                   *pRoot2=sqrt(-det)/(2*a);

                   flag=-1;

         }

         return flag;

}

#include <iostream.h>

int main()

{

         int a,b,c;

         float root1,root2;

         bool flag;

         cout<<"请输入3个系数:";cin>>a>>b>>c;

         flag=setRoot(a,b,c,&root1,&root2);

         if (flag==1)

         {

                   cout<<"两个不等实根:"<<root1<<" "<<root2;

         }

         else if (flag==0)

         {

                   cout<<"两个相等实根:"<<root1<<" "<<root2;

         }

         else

         {

                   cout<<"两个虚根:"<<endl;

                   cout<<"虚根1:"<<root1<<"+"<<root2<<"i"<<endl;

                   cout<<"虚根2:"<<root1<<"-"<<root2<<"i"<<endl;

         }

}

 

 


第六章答案

1简答题

(1)       循环初始值、循环条件、循环变量的改变

(2)       while(1)

(3)       找到第n项的项值

(4)       执行一次,执行多次

(5)       递推:从低项推出高项,递归:从高项调用低项

(6)       break中断整个循环,continue中断本次循环

(7)       一个是中断选择,一个是中断循环

(8)       设置指针、关联文件、读写数据、关闭

(9)       死循环使整个程序处于可控制交互状态,可用breakcontinue来非正常中断

(10)   rand()/(b-a+1)+a;

 

2选择题

1

2

3

4

5

6

7

8

9

10

A

C

B

A

B

A

A

C

B

C

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

×

4改错题

1

ERROR1:int sumFromA2B (int m, int n);

ERROR2: if(a>b)

ERROR3: for(int i=m;i<=n;i++)

2

ERROR1:去了末尾;

ERROR2: #define GLO_VOL(x) (4/3*PI*(x)*(x)*(x))

5填空题

第(1)题

2

s=s+c;

b=c;

a=b;

c=a+b;

i++;

i表示21

c表示第21项值

b表示第20项值

1  1

1  2

1  3

2  1

2  2

2  3

第(3)题

左图:

       if (c1)

       {

              s1;

              if (c2)

              {

                     s2;

              }

              else

              {

                     s3;

              }

       }

       else

       {

              s3;

       }

或下面代码

       if(c1&&c2) {s1;s2;}

       else if(c1&&!c2) {s1;s3;}

       else s3;

 

右图:

       do

       {

              s1;

              s2;

              if (c)

              {

                     s3;

              }

       } while(c);

 

6画图题(图略,仅给出形式表达)

1bool isPrime(int x)

2bool isSXH(int x)

3)写两个函数int getSum(int a,int b) int getAverage(int a,int b)

       或只写一个函数:void setSumAverage(int a,int b,int *pS,int *pA)

4bool saveData(FILE *pF,float f)

5char* getCharAddress()

6int menu(void)

7int getDigit(int a)

8void setABCounts(FILE *pF,int *pACounts,int *pBCounts)

9double getValue(double m1,double m2,double distance)

10int getSum(int a,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10)

 

7编程题

#include <iostream.h>

int main(){

       int s=0,a=4,i=1;

       while(i<=20){

              s=s+a;

              a=a+3;

              i=i+1;

       }

       cout<<s;

}

8编程题

int main(){

       int i;

       float s=0,nu=2,de=3,sign=1;

       while(i<=100) {

              s=s+sign*nu/de;

              nu=nu+2;

              de=de+4;

              sign=-sign;

              i++;

       }

       cout<<s;

}

9编程题

#include <iostream.h>

void displayArray(int a,int b){

       int counts=0;

       for (int i=a;i<=b;i++){

              cout<<i<<" ";

              counts++;

              if (counts%3==0){

                     cout<<endl;

              }

       }

}

10编程题

方法一:递推

方法二:递归

int fact(int n)

{

       int i,s;

       s=1;i=1;

       while (i<=n)

       {

              s=s*i;

              i++;

       }

       return s;

}

int fact(int n)

{

       if (n==1) return 1;

       else return n*fact(n-1);

 

}

 

测试fact的主模块代码如下:

int main(){

cout<<fact(4);

}

 

11编程题

void displayPrimeNum(int a,int b)

{

       int counts=0;

       for (int i=a;i<=b;i++)

       {

              if (isPrime(i))

              {

                     cout<<i<<" ";

                     counts++;

              }

              if (counts%3==0)

              {

                     cout<<endl;

              }

       }

}

12编程题

void display(int a,int b){

       int counts=0;

       for (int i=a;i<=b;i++)

       {

              if (i%3==0&&i%4==1)

              {

                     cout<<i<<" ";

                     counts++;

              }

              if (counts%3==0)

              {

                     cout<<endl;

              }

       }

}

13编程题

long int getProgSum(int n){

       long int s=0,a=1;

       for (int i=1;i<=n;i++)

       {

              s=s+a;

              a=a*(i+1);

       }

       return s;

}

14编程题

analyzeInt模块

sequence模块

unsequence模块

void analyzeInt(int num)

{

         int digit;

         digit=getDigit(num);

         sequence(num,digit);

         unsequence(num,digit);

}

#include <math.h>

void sequence(int num,int digit)

{

  int head;

  for (int i=1;i<=digit;i++)

  {

         head=num/(int)pow(10,digit-i);

         cout<<head;

         num=num%(int)pow(10,digit-i)

         //num=num-head*pow(10,digit-i);

  }

}

void sequence(int num,int digit)

{

  int end;

  for (int i=1;i<=digit;i++)

  {

         end=num%10;

         cout<<end;

         num=num/10;

  }

}

15阅读题,见思维训练手册

16编程题

int getSumDivsion37(int n)

{

       int s=0;

       for (int i=1;i<n;i++)

       {

              if (i%21==0)

              {

                     s=s+i;

              }

       }

       return s;

}

17编程题

int main()

{

       for (int i=1;i<=20;i++)

       {

              for (int j=1;j<=33;j++)

              {

                     int k=100-i-j;

                     if (i*5+j*3+k/3==100)

                     {

                            cout<<i<<j<<k;

                     }

              }

       }

}

18阅读题,见思维训练手册

19编程题

#include <stdio.h>

#include <math.h>

float getPolMaxX(int m,int n)

{

       float max=-9999.00;

       int x,y,cx;

       for (x=m;x<=n;x=x++)

       {

                     y=x-sin(x);

                     if (y>max)

                     {

                            cx=x;

                            max=y;

                     }

              }

       }

       printf("x is:%d,y is:%d\n",cx,max);

       return cx;

}

20编程题

int getRevertInt(int num){

       int end,newNum=0;

       do

       {

              end=num%10;

              newNum=newNum*10+end;

              num=num/10;

       }while(num!=0);

       return newNum;

}

 

21编程题

#include <iostream.h>

#include <math.h>

double getCubeRoot(double a)

{

       double x1,x2;

       x2=a;

       do

       {

              x1=x2;

              x2=(2*x2+a/(x1*x1))/3;

       } while(fabs(x2-x1)>1e-6);

       return x2;      

      

}

int main(){

       double a;

       cout<<"请输入a:";cin>>a;   

       cout<<a<<"的立方值:"<< getCubeRoot (a);

       return 0;

 

}

 

22编程题

#include <iostream.h>

#include <math.h>

double getNthRoot (double a,int n)

{

       double x1,x2;

       x2=a;//迭代因子可任意

       do

       {

              x1=x2;

              x2=x1-(pow(x1,n)-a)/(n*pow(x1,n-1));

       } while(fabs(x2-x1)>1e-6);

       return x2;

 

}

 

int main()

{

       double a,val;int n;

       cout<<"请输入数:";cin>>a;

       cout<<"请输入多少次方根:";cin>>n;

       val= getNthRoot (a,n);

       cout<<a<<""<<n<<"方根值是:"<<val<<endl;

}

运行结果:

 

23编程题

#include <iostream.h>

int main(){

       int s=0,x,y;

       while(1){

              //person part

              do{

                     cout<<"请输入火柴数[1-5]:";

                     cin>>x;

                     if(x>5||x<1) cout<<"您输入的数字有误";

              }while(x>5||x<1);

             

              //computer part

              y=6-x;

              cout<<"计算机给出的选择:"<<y<<endl;

             

              //current s

              s=s+x+y;

             

              //current cirmos

              cout<<"两方已选总数:"<<s<<"  剩下数:"<<25-s<<endl;

             

              //end

              if(s==24){

                     cout<<"您输了,您只能输入1:";

                     break;

              }

       }

}


第七章答案

1简答题

(1)       数组名a,其实质是一个固定地址

(2)       09

(3)       1个元素(标号从0开始)

(4)       a[i]*(a+i)

(5)       头地址和长度

(6)       int *p[4];一维指针数组可表示二维数组

(7)         int *p=new int[10];

           p[0]=1;//操作第1个数据

(8)       int **p=new int*[4];

          for (int i=0;i<4;i++)

p[i]=new int[10];

          p[0][0]=1;//操作第1个数据

          

       int *p[4];

for (int i=0;i<4;i++)

       {

              p[i]=new int[10];

       }

       p[0][1]=9;

(9)       因为二维数组的空间是连续的

(10)   i*N+j

2选择题

1

2

3

4

5

6

7

8

9

10

C

B

ACD

A

B

A

AC

BD

ABC

D

3判断题

1

2

3

4

5

6

7

8

9

10

11

12

13

×

×

×

4读程序

(1)       1 2

(2)       返回一个文件中所有小数数据的个数

5编程题

float getMin(float *pArray,int n){

float min=pArray[0];

for (int i=1;i<n;i++){

       if (pArray[i]<min){

              min=pArray[i];

       }

}

return min;

}

6编程题

void sort(float *pArray,int n){

       float t;

       for (int i=0;i<=n-2;i++){

              int maxNo=i;

              for(int j=i+1;j<=n-1;j++){

                     if (pArray[maxNo]<pArray[j]){

                            maxNo=j;

                     }

              }

              if (i!=maxNo) {

                     t=pArray[i];pArray[i]=pArray[maxNo];pArray[maxNo]=t;

              }

       }

}

7编程题

void arrayCpy(int *pDes,int *pSrc,int n){   

       for (int i=0;i<=n-1;i++){

              pDes[i]=pSrc[i];

       }

}

int main(){

       int a[3]={3,4,5},b[3];

       arrayCpy(b,a,3);

}

8编程题

void arrayRevert(int *pArray,int n){

       int t;

       for (int i=0;i<=(n-1)/2;i++){

              t=pArray[i];

              pArray[i]=pArray[n-1-i];

              pArray[n-1-i]=t;

       }

}

9编程题

void delScore(float *pScore,int n,int no){

       for(int i=no;i<=NUM-1;i++){

              pScore[i-1]=pScore[i];

       }

       NUM--;

}

10编程题

void delScore(float *pScore,int n,int no,int *pNum){

       for(int i=no;i<=*pNum-1;i++){

              pScore[i-1]=pScore[i];

       }

       (*pNum)--;

}

11编程题

void getFabN(int *pFab,int n){

       pFab[0]=pFab[1]=1;

       for (int i=2;i<n;i++){

              pFab[i]=pFab[i-1]+pFab[i-2];

       }

}

12()

 

13编程题

void arrayCopyRevert(int *pDes,int *pSrc,int n){

       for (int i=0;i<=n-1;i++){

              pDes[i]=pSrc[n-1-i];

       }

}

 

14编程题

statisPosSum统计正数和模块

main测试模块

int statisPosSum(int *pArray,int n){

       int sum=0;

       for (int i=0;i<=n-1;i++){

              if (pArray[i]>0){

                     sum=sum+pArray[i];

              }

       }

       return sum;

}

#include <iostream.h>

int main()

{

       int a[4]={-33,89,-78,11};

       int sum;

       sum=statisPosSum(a,4);

       cout<<sum;

}

 

15编程题

int getPassDays (int year,int month,int day){

       int days[13]={0,31,28,31,30,31,30,31,30,31,30,31,30};

       int sum=0;

       for (int i=0;i<month;i++){

              sum+=days[i];

       }

      

       if (year%4==0&&year%100!=0||year%400==0){

              sum+=1;

       }

       sum+=day;

       return sum;

}

16编程题

void insertSequenceArray (int *pA,int n,int *pNum,int data){

       for (int i=0;i<*pNum;i++){

              if (data<=pA[i]){

                     break;

              }

       }

       for (int j=*pNum;j>=i;j++){

              pA[j+1]=pA[j];

       }

       pA[i]=data;

       (*pNum)++;

}

17编程题

一个是作普通指针传递,一个作数组指针传递,两者使用时注意寻址方式不同

普通指针传递优势:通用,但寻址需自行计算

数组指针传递优势:寻址方便,但不通用

18编程题

见思维训练手册


第八章答案

1简答题

(1)       头地址

(2)       a[i] 或者*(a+i)

(3)       char name[]=”wangwu”是初始化给字符串,字符串名name;

char name[10];name=”wangwu”;是错误的,name是固定地址,不能赋值

(4)       p是随机地址,不能在其中赋值或交互输入

(5)       0

(6)       什么都不显示,因为字符串的第一个字符是0,表示字符串结束之意

(7)       整数3的码值是3,字符‘3’的码值是51

(8)       因为标准字符串的末尾固定是0,以此可以确定字符串的长度

(9)       char str[10]="china";cout<<str;//输出字符串cout<<str+1;

(10)     char *p[10]={"c/c++","basic","data structure"};

              cout<<p[0]<<endl;//显示第一本书

              cout<<p[2]<<endl;//显示第三本书

              cout<<p[2]+2<<endl;//显示第三本书自第三个字符开始的所有字符

              cout<<p[2][2]<<endl;//显示第三本书的第三个字符

(11)   name是固定地址,不能赋值,而pName是指针变量,可以赋值

(12)   liming☆乱码

(13)   因为至少包括了0这个结束标记

2选择题

1

2

3

4

5

6

7

8

9

10

C

C

A

B

D

B

A

C

ABCD

BD

3判断题

1

2

3

4

5

6

7

8

9

10

11

×

4画图题

模块图

形式及归属

形式:void strRevert(char *pStr)

归属:MyString

形式:void strAdd(char *pDes,char *pSrc)

归属:MyString

形式:void subStrCopy(char *pDes,char *pSrc)

归属:MyString

形式int getWordNums(char *pStr)

归属:MyString

形式:int getDiffWords(char **pp,char *pStr)

归属:MyString

5改错题

1/*$ERROR1$*/  i=0;   /*$ERROR2$*/ s[i]!='\0';  /*$ERROR3$*/ i--;

2/*$ERROR1$*/ <iostream.h>       /*$ERROR2$*/   #include  "string.h"

/*$ERROR3$*/ int main( );            /*$ERROR4$*/   i=0;

/*$ERROR5$*/ while(i<k)          /*$ERROR6$*/   if(m>n)

3/*$ERROR1$*/ pa[i]!=0||pb[i]!=0   /*$ERROR2$*/   i++;

/*$ERROR3$*/ return 1;

4/*$ERROR1$*/    *str=0;         /*$ERROR2$*/ char a[10];

6读程序

(1)       英翻汉或者汉翻英

(2)       strcspn (str1,str2)的作用是在str1中找出出现str2中字符的位置,本例子位置4

(3)       result=n*result+(src[i]-48);

7编程题

void strEncrypt(char *pDes,char *pSrc)

{

       int i=0;

       while (pSrc[i]!=0)

       {

              pDes[i]=pSrc[i]+4;

       }

       pDes[i]=0;

}

8编程题

strLen模块

main模块

int strLen(char *pStr)

{

       int i=0;

       while (pStr[i]!=0)

       {

              i++;

       }

       return i;

}

 

#include <iostream.h>

int main(){

       char a[20];

       cin.getline(a,20);

       int n;

       n=strLen(a);

       cout<<"长度是:"<<n;

       return 0;

}

 

9编程题

int main(){

       char *p[40];

       for (int i=0;i<40;i++){

              p[i]=new char[21];//书名长度定为20

              cin>>p[i];

              cout<<p[i];

       }

}

 

10编程题

strCat模块

main模块

void strCat(char *pA,char *pB){

       int i=0,j=0;

       while (pA[i]!=0)

       {

              i++;

       }

       while (pB[j]!=0)

       {

              pA[i+j]=pB[j];

              j++;

       }

       pA[i+j]=0;

}

#include <iostream.h>

int main()

{

       char a[20]="hello,",b[20]="how are you.";

       strCat(a,b);

       cout<<a;

       return 0;

}

 

11编程题

strCmp模块

main模块

int strCmp(char *pA,char *pB)

{

       int i=0;

       int flag=0;//默认两串相等

       while (pA[i]!=0&& pB[i]!=0)

       {

              if (pA[i]>pB[i])

              {

                     flag=1;//a串大,为1

                     break;

              }

              if (pA[i]<pB[i])

              {

                     flag=-1;//a串小,为-1

                     break;

              }

              i++;

       }

       return flag;

}

#include <iostream.h>

int main()

{

       char a[20]="hello,",b[20]="how are you.";

       int flag;

    flag=strCmp(a,b);

       switch(flag)

       {

              case 1:cout<<"a串大";break;

              case -1:cout<<"b串大";break;

              case 0:cout<<"a,b一样大";break;

       }

       return 0;

}

 

12编程题

void displayChrNums(char *pStr)

{

       int i=0,lowerNums=0,upperNums=0,otherNums=0;

       while (pStr[i]!=0)

       {

              if (pStr[i]>='a'&&pStr[i]<='z')

              {

                     lowerNums++;

              }

              else if (pStr[i]>='A'&&pStr[i]<='Z')

              {

                     upperNums++;

              }

              else

              {

                     otherNums++;

              }

       }

 

       cout<<"小写字母个数:"<<lowerNums<<endl;

       cout<<"大写字母个数:"<<upperNums<<endl;

       cout<<"其他字母个数:"<<otherNums<<endl;

}

 

13编程题

ltrim模块

main模块

void ltrim(char *pA)

{

         int i=0;

         if (pA[i]!=' ')

         {

                   return;

         }

         while (pA[i]==' ')

         {

                   i++;

         }

         int j=0;

         while (pA[i]!=0)

         {

                   pA[j++]=pA[i];

                   i++;

         }

         pA[j]=0;

}

#include <iostream.h>

int main()

{

         char a[]="  aaa  bb    ccc  ";

         ltrim(a);

         cout<<a;

         return 0;

}

运行结果:aaa  bb    ccc 

14编程题

rtrim模块

main模块

void rtrim(char *pA)

{

         int i=0;

         while (pA[i]!=0)

         {

                   i++;

         }

         i--;

         if (pA[i]!=' ')

         {

                   return;

         }

         while (pA[i]==' ')

         {

                   i--;

         }

         pA[i+1]=0;

}

#include <iostream.h>

int main()

{

         char a[]="  aaa  bb    ccc  ";

         rtrim(a);

         cout<<a;

         return 0;

}

运行结果:  aaa bbb ccc

 

15编程题

trim模块

main模块

void trim(char *pA){

         int i=0,j=0,k=0;

         //跳至首字母非空格

         while (pA[j]==' ') j++;

        

         while (pA[j]!=0)

         {

                   k=0;

                   while (pA[j]==' ')

                   {

                            j++;

                            k++;

                   }

                   if (pA[j]==0)

                   {

                            pA[i]=0;

                            break;

                   }

                   if (k>=1)//大于等于1个空格,拷贝1空格

                   {

                            pA[i++]=' ';

                   }

                   pA[i++]=pA[j];

                   j++;

         }      

         pA[i]=0;

}

#include <iostream.h>

int main()

{

         char a[]=" aaa  bb       ccc  ";

         trim(a);

         cout<<a;

         return 0;

}

运行结果:aaa bbb ccc

 

16编程题

#include <assert.h>

#include <string.h>

void strLeft(char *pSub,char *pSrc,int n)

{

       assert(n<=strlen(pSrc));

       int i=0;

       while (i<n)

       {

              pSub[i]=pSrc[i];

              i++;

       }

       pSub[i]=0;

}

17编程题

#include <assert.h>

#include <string.h>

char * strLeft(char *pSrc,int n)

{

       assert(n<=strlen(pSrc));

       char *pSub=new char[n+1];

       int i=0;

       while (i<n)

       {

              pSub[i]=pSrc[i];

              i++;

       }

       pSub[i]=0;

       return pSub;

}

18编程题

#include <assert.h>

#include <string.h>

void strRight(char *pSub,char *pSrc,int n)

{

       assert(n<=strlen(pSrc));

       int i=0;

       while (i<n)

       {

              pSub[i]=pSrc[strlen(pSrc)-1-i];

              i++;

       }

       pSub[i]=0;

}

19编程题

#include <assert.h>

#include <string.h>

char * getSubStr(char *pStr,int m,int n)

{

       assert(m>0&&n>0&&m+n<strlen(pStr));

       int len=m-n+1+1;

       int *p=new char[len];

       int j=0;

       for (int i=m-1;i<=n-1;i++)

       {

              p[j]=pStr[i];

              j++;

       }

       p[j]=0;

       return p;

}

20编程题

void delChFromStr(char *pDes,char *pSrc,char ch)

{

       int i=0,j=0;

       while (pSrc[i]!=0)

       {

              if (pSrc[i]==ch)

              {

                     continue;

              }

              pDes[j]=pSrc[i];

              j++;

              i++;

       }

       pDes[j]=0;

}

21编程题

void revertStr(char *pDes,char *pSrc){

       int i=strlen(pSrc)-1,j=0;

       while (i!=0)

       {

              pDes[j]=pSrc[i];

              j++;

              i--;

       }

       pDes[j]=pSrc[i];

       pDes[j+1]=0;

}

22编程题(程序阅读)

 

23编程题(程序阅读)

不足之处:增加字符,可能会导致字串容器的容量不够,解决思路有两种:第一种,在模块内对字串扩容(为防止极端情况,可扩容1倍),而由编译器分配的数组空间的地址和长度是固定的,无法扩容,所以必须重新确定源串的位置,故要求做到源串以指针变量表达且传入源串指针变量的地址,即传入二级地址(可参考教材8.9.2)。修改代码(变动加粗)如下:

addChar模块

main模块

#include <string.h>

void addChar(char **ppA,char c1,char c2){//pA串的c1前加c2

         char *temp=*ppA;

         char *pA=new char[strlen(temp)*2+1];//扩容1倍

         strcpy(pA,temp);//拷贝原字符

 

         int i=0;

         while(pA[i]!=0){

                   if (pA[i]==c1){

                            int len=strlen(pA);

                            for (int j=len-1;j>=i;j--)

                            {

                                     pA[j+1]=pA[j];

                            }

                            pA[i]=c2;

                            pA[len+1]=0;

                            i++;

                   }

                   i++;

         }

         *ppA=pA;

}

#include <iostream.h>

int main()

{

         char a[40]="abc daf",*pA=a;

         char c1='a',c2='z';

         addChar(&pA,c1,c2);

         cout<<pA;

      return 0;

}

 

 

24编程题(程序阅读)

模块设计思路:遍历数组,找到待删除字符后,将此后字符前移一位。

效率较低的原因是:每找到一个待删除字符,都要做一个循环将后面内容提前一位。

调整思路:只需要一次循环,扫描到非删除字符记入ps[ii]位,扫描到删除字符,跳至下一字符。代码如下:

void delChar(char *ps,char ch)

{

       int i=0,ii=0;

       while (ps[i]!=0)

       {

 

              if (ps[i]==ch)

              {

                     i++;

                     continue;

 

              }

              else

              {

                     ps[ii]=ps[i];

                     ii++;

              }

              i++;

       }

       ps[ii]=0;

}

25编程题(程序阅读)

26编程题(程序阅读)

27编程题(程序阅读)

28编程题

extraceWordsNo模块

main模块

//a是存放单词标号的数组,n是数组长度,*pNums是实际长度

void extraceWordsNo(char *pSrc,int a[],int n,int *pNums)

{

         int i=0,j=0,k=0;//a数组里记入单词头尾位置

         bool spaceFlag=true,charFlag=false;

         *pNums=0;

         for(;pSrc[i]!=0;i++)

         {

                   //记单词前、后位,两种情况,记单词头部和尾部

                  //尾部:当前是空格,肯定要跳,跳之前判断前位是否是字符,记位置i-1

                   if (pSrc[i]==' ')

                   {

                            spaceFlag=true;

                           

                            if (charFlag)

                            {

                                     a[(*pNums)++]=i-1;

                                     charFlag=false;

                            }

                            continue;

                   }

                  

                   //头部:当前是字符,判断前位是否空格,记位置i

                   if (spaceFlag)

                  {

                            spaceFlag=false;

                            charFlag=true;

                            a[(*pNums)++]=i;

                   }      

         }

         if (pSrc[i-1]!=' ') //适用尾部无空格情况,如"i love you"

         {

                   a[*pNums]=i-1;

         }

         else  (*pNums)--;//适用尾部有空格情况,如"i love you "      

         (*pNums)++;//实际记录下标个数

}

#include <iostream.h>

int main()

{

         char src[40]="i love you",b[40];

         int a[100],nums;

         extraceWordsNo(src,a,100,&nums);

         for (int i=0;i<nums;i++)

         {

                   cout<<a[i]<<" ";

         }

}

运行结果:

 

29编程题

revertWords模块

main模块

void revertWords(char *pDes,char *pSrc)

{

         int i,j,k=0,a[100],nums=0;

         extraceWordsNo(pSrc,a,100,&nums);

        

         //根据位置拷贝进目标数组字符串

         for (i=nums-2;i>=0;i=i-2)     

         {

                   for (j=a[i];j<=a[i+1];j++)

                   {

                            pDes[k++]=pSrc[j];

                   }

                   pDes[k++]=' ';

         }

         pDes[k]=0;

}

#include <iostream.h>

int main()

{

         char a[40]="i love you",b[40];

         cout<< "原串:"<<a<<endl;

         revertWords(b,a);

         cout <<"颠串:"<<b<<endl;

         return 0;

}

 

运行结果:

原串:i love you

颠串:you love i

 

 

30编程题(程序阅读)

31编程题(程序阅读)

32编程题(程序阅读)


 

第九章答案

1简答题

1)如汽车,包括品牌、价格、发动机排量等

struct Car

{

       char[20] brand;

       float price;

       float motor;

       char[10] color;

};

//定义变量和指针变量

Car car,*pCar;

PCar=&car;

2s.fNo; (*pS).fNo; pS->fNo;

3)表示第i个同学两种方法:scoreAll[i]   *(scoreAll+i)

表示第i个同学的学号有三种方法:scoreAll[i].fNo;(*(scoreAll+i)).fNo;(scoreAll+i)->fNo;

4)两个结构体变量可直接赋值。使用循环一个一个地赋值.

5)结构体类型定义时,某字段是指针变量

6)三个方面优化:函数重载、函数模板、参数默认值

7)只需要传递一个地址(4B),而无需传递整个结构体的数据,效率高。另外还可改原变量

8)自右向左设置默认值

9)静态函数的作用域限定在某区域(如定义文件),可有防止多人合作时的函数重名现象

10)插入、删除等动作中效率高

2选择题

1

2

3

4

5

6

7

8

9

10

B

D

AB

A

BD

B

AB

A

AB

ABC

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

4写结果

原始值:2 aaa 2 调用后:2 bbb 2

5改错题

ERROR1:void searchScore(Score  *pScoreAll, int n)

ERROR2: char *name=new char[20];

ERROR3: if (strcmp(name,pMove->fName)==0)

ERROR4: void searchNoPassScore(Score *pScoreAll, int n)

ERROR5: pScoreEnd=pScoreAll+n-1;

6编程题

float getScoreSum(Score *pS)

{

       return pS->fScoreC+pS->fScoreE+pS->fScoreP;

}

7编程题

void scoreCopy(Score *pDes,Score *pSrc,int n)

{

       for (int i=0;i<n;i++)

       {

              pDes[i]=pSrc[i];

       }

}

8编程题

inputScore输入

scoreSum求总分

void inputScore(Score *pS)

{

       cin>>pS->fNo;

       cin>>pS->fName;

       for (int i=0;i<3;i++)

       {

              cin>>pS->fScore[i];

       }

}

void scoreSum(Score *pS)

{

       float sum=0;

       for (int i=0;i<3;i++)

       {

              sum=sum+pS->fScore[i];

       }

    cout<<sum;

}

 

9编程题

inputScore输入

scoreSum求总分

void inputScore(Score *pS,int n)

{

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

       {

              cin>>pS[j]->fNo;

              cin>>pS[j]->fName;

              for (int i=0;i<3;i++)

              {

                     cin>>pS[j]->fScore[i];

              }

       }

}

void scoreSum(Score *pS,int n)

{

       float csum=0,esum=0,psum=0;

       for (int i=0;i<n;i++)

       {

              csum=csum+pS[i].fScore[0];

              esum=esum+pS[i].fScore[1];

              psum=psum+pS[i].fScore[2];

       }

       cout<<"语文总分:"<<csum<<endl;

       cout<<"英语总分:"<<esum<<endl;

       cout<<"物理总分:"<<psum<<endl;

}

10编程题

void sortScore(Score *pScoreAll,int n,int num)

{

       for (int i=0;i<=num-2;i++)

       {

              for (int j=i+1;j<=num-1;j++)

              {

                     if (pScoreAll[i].fScore>pScoreAll[j].fScore)

                     {

                            Score t;

                            t=pScoreAll[i];

                            pScoreAll[i] =pScoreAll[j];

                            pScoreAll[j] =t;

                     }

              }

       }

}

11编程题

void searchByName(Score  *pScoreAll, int n,char *pName)

{

       Score *pScoreBeg,*pScoreEnd,*pMove;

       bool flag=false;

       pScoreBeg=pScoreAll;pScoreEnd=pScoreAll+n-1;

       for(pMove=pScoreBeg;pMove<=pScoreEnd;pMove++)

       {    

              if (strcmp(pName,pMove->fName)==0)

              {    

                     flag=true;      

                     break;

              }

       }

       if (flag==true)

       {    

              cout<<pMove->fName<<"|"<<pMove->fScore;

       }

       else{

              cout<< "没有找到此人";

       }

       return flag;

}

12编程题

Date 结构与main模块

getDays模块

struct Date

{

         int year;

         int month;

         int day;

};

int main()

{

         Date d={2013,1,3};

         int days;

         days=getDays(&d);

         cout<<days;

         return 0;

}

int getDays(Date *pD){

         int days[13]={0,31,28,31,30,31,30,31,30,31,30,31,30};

         int year=pD->year;

         int month=pD->month;

         int day=pD->day;

         int sum=0;

         for (int i=0;i<month;i++)

         {

                   sum+=days[i];

         }      

         if (year%4==0&&year%100!=0||year%400==0)

         {

                   sum+=1;

         }

         sum+=day;

         return sum;

}

 

13编程题

void sortScore(Score *pScoreAll,int n,int num)//根据姓名排序

{

       for (int i=0;i<=num-2;i++)

       {

              for (int j=i+1;j<=num-1;j++)

              {

                     if (strcmp(pScoreAll[i].fName,pScoreAll[j].fName)>0)

                     {

                            Score t;

                            t=pScoreAll[i];

                            pScoreAll[i] =pScoreAll[j];

                            pScoreAll[j] =t;

                     }

              }

       }

}

 

 

int getBestNo(Score *pScoreAll,int n,int num)//求成绩最好学生的学号

{

       int no=0;

       float best=pScoreAll[0].fScore;

       for (int i=1;i<num;i++)

       {

              if (pScoreAll[i].fScore>best)

              {

                     best=pScoreAll[i].fScore;

                     no=i;

              }

       }

       return no;

}

 

14编程题

1)文件结构

按模块化程序设计思想:应该将BOOK写在文件Book里,将print写在BookManager文件里,而将主模块写在BookMain文件里。

2)模块结构

应该将排序部分单独写成一个模块。

3)预处理(文件包含和宏定义)

#include "iostream.h"应该写成#include <iostream.h>

#define n 6应该写成#define N 6

4)命名规则

BOOK结构体命名应为Book

5)代码行的书写规范

if (!count)应该写成      if (count=0)

for语句后应该加{}

6)程序效率

效率低,因为结构体数组元素的整体交换浪费时间,可以设计书的地址的数组,然后地址数组交换。

 

15编程题

结构定义和主模块,及程序运行结果

两个自定义模块

#include <iostream.h>

struct Score{

              int fNo;

              char fName[10];

              float fScore;

};

 

struct Node

{

       Score s;

       Node *link;

};

 

int main(){

       Node *first=NULL;//链表的头

       int n=0;//当前真实结点个数

       //可能改变first,需将first的地址传过来

       Score s1={1,"liyi",90};

       insert(&first,-1,&s1,&n);

       Score s2={2,"liming",93};

       insert(&first,0,&s2,&n);

       Score s3={3,"lizhi",99};

       insert(&first,1,&s3,&n);

       display(first);

}

程序运行结果:

bool insert(Node **pFirst,int i,Score *pS,int *pN){

       if (i<-1 || i>*pN-1){           

                   cout<< "Out Of Bounds"; return false;   

       }   

       //产生一个新结点t用来插入

       Node *t=new Node;  t->s=*pS;    

       //定位重要,即找到第i个元素的位置p   

       Node *p=*pFirst;        

       for (int j=0; j<i; j++) p=p->link;

       //i>-1插在表里,i=-1是插在表头   

       if(i>-1){              

              t->link=p->link; //新结点t插在p后       

              p->link=t;   

       }   

       else{            

              t->link=*pFirst; //新结点t成为新头        

              *pFirst=t;   

       }         

       (*pN)++;      

       return true;

}

 

void display(Node *first){

       Node *p=first;

       while(p) {//与while(p!=NULL)等价

              cout<<(p->s).fNo<<" ";

              cout<<(p->s).fName<<" ";

              cout<<(p->s).fScore<<endl;

              p=p->link;

       }

}

 


第十章答案

1简答题

(1)       文件种类包括:键盘、显示器、磁盘文件、内存

(2)       两种方式:文件指针和流对象。思路是:定义文件指针或流对象;与具体文件关联;通过相应函数或方法来操作数据;关闭文件指针或流对象。

(3)       FILE *p;

(4)       键盘和显示器

(5)       通过函数或方法的返回值来判断是否文件结束。

文件指针方案:通过fgetc,fscanf,fread等函数能读出具体数据个数判断,或feof函数返回值是否为真

流对象方案:通过流对象的各种读方法的返回值是否为空判断,或流对象eof方法返回值是否为真

(6)       文本文件是无格式文件,而二进制文件是格式文件。读写两种文件,使用的函数不同。文件指针方案中:读写文本文件用fscanf/fprintf,读写二进制文件用fread/fwrite

(7)        

格式

读入函数:int fread( void *buffer, size_t size, size_t count, FILE *stream );

读入方法:istream& read( char* pch, int nCount );

参数

读入函数4个,读入方法2

过程

读入函数是按块大小读入,而读入方法按字符一次性读入

返回

读入函数返回的块数,而读入方法返回的是流对象

8)如:int (*p)(int a,int b);定义了一个指向int xxx(int a,int b)的函数指针

9)在连接阶段将库中代码放入用户程序的库

10CRT(C Run-Time Library) WINDOWS APIMFC

2选择题

1

2

3

4

5

6

7

8

9

10

D

B

D

A

A

C

C

C

A

C

3判断题

1

2

3

4

5

6

7

8

9

10

×

×

 

4读程序

a b

5编程题

#include <stdio.h>

void writeChar2File(){

       FILE *p;

       p=fopen("a.txt","w");

       for (int i=1;i<=5;i++)    {

              char ch;

              ch=getchar();

              fputc(ch,p);

              fflush(stdin);

       }

       fclose(p);

}

6编程题

#include <stdio.h>

void writeInt2File(){

       FILE *p;

       p=fopen("a.txt","w");

       for (int i=1;i<=5;i++)    {

              int a;

              scanf("%d",&a);

              fprintf(p,"%d ",a);

       }

       fclose(p);

}

7编程题

void readScore(int *pScore,int n)

{

       FILE *p;

       p=fopen("score.txt","r");

       int i=0;

       while (fscanf(p,"%d",pScore[i])==1)

       {

              i++;

       }

}

8编程题

写整数模块

读整数模块

void writeInt2File()

{

       FILE *p;

       p=fopen("a.dat","wb");

       for (int i=1;i<=5;i++)    {

              int a;

              scanf("%d",&a);

              fwrite((void *)&a,4,1,p);

       }

       fclose(p);

}

void readIntFromFile(int *pA,int n)

{

       FILE *p;

       p=fopen("a.dat","rb");

       for (int i=0;i<n;i++)      {

              fread((void *)pA[i],4,1,p);

              printf("%d",pA[i]);

       }

       fclose(p);

}

 

9编程题

loadStudentTXT模块

main

void loadStudentTXT(Student *pS,int n,int *pNum){

       FILE *pF;int i=0;

       pF=fopen("Student.txt","r");

         while (fscanf(pF,"%s %s %d",

pS[i].fName,pS[i].fPwd,&pS[i].fAge)==3)

       {

              i++;

       }

       *pNum=i;

       fclose(pF);

}

#include <stdio.h>

#include <iostream.h>

struct Student{

       char fName[20];

       char fPwd[20];

       int fAge;

};

int main(){

       Student s[40];int num=0;

       loadStudentTXT(s,40,&num);

         for (int i=0;i<num;i++)  {

                   printf("%s %s %d\n",

s[i].fName,s[i].fPwd,s[i].fAge);

       }

       return 0; 

}

 

10编程题

loadStudentBIN模块和saveStudentBIN模块

main

void loadStudentBIN(Student *pS,int n,int *pNum)

{

       FILE *pF;int i=0;

       pF=fopen("Student.dat","rb");

       while (fread((void *)&pS[i],sizeof(Student),1,pF)==1)

       {

              i++;

       }

       *pNum=i;

       fclose(pF);

}

void saveStudentBIN(Student *pS,int n)

{

       FILE *pF;int i=0;

       pF=fopen("Student.dat","wb");

       fwrite((void *)&pS[i],sizeof(Student),n,pF);

       fclose(pF);

}

#include <stdio.h>

#include <iostream.h>

struct Student{      

char fName[20];

       char fPwd[20];

       int fAge;

};

#define  N 3

int main(){

       Student s1[N]={"liyi","abc",44,

                                   "lizhi","xyz",33,

                                   "liming","ttt",42};

       saveStudentBIN(s1,N);

       Student s2[N];

       int num=0;

       loadStudentTXT(s2,40,&num);

       for (int i=0;i<num;i++)  {

              printf("%s %s %d\n",s2[i].fName,s2[i].fPwd,s2[i].fAge);

       }

       return 0; 

}

 

11编程题

writeSum2TXT模块

main模块

void writeSum2TXT(int *pS,int n){

       FILE *pF;int s=0,i=0;

       pF=fopen("Score.txt","r");

       while (fscanf(pF,"%d",&pS[i])==1){

              s=s+pS[i];

              i++;

       }

       fclose(pF);

       pF=fopen("Score.txt","a+");

       fprintf(pF," %d",s);

       fclose(pF);

}

int main()

{

       int s[40],num=0;

       writeSum2TXT(s,40);

       return 0; 

}

 

12编程题

loadFromTXT模块与save2BIN模块

main模块

void loadFromTXT(int *pS,int n,int *pNum)

{

       FILE *pF;int i=0;

       pF=fopen("Score.txt","r");

       while (fscanf(pF,"%d",&pS[i])==1)

       {

              i++;

       }

       *pNum=i;

       fclose(pF);

}

void save2BIN(int *pS,int n,int num)

{

       FILE *pF;int i=0;

       pF=fopen("Score.dat","wb");

       fwrite((void *)pS,4,num,pF);

       fclose(pF);

}

int main()

{

       int s[40],num=0;

       loadFromTXT(s,40,&num);

       save2BIN(s,40,num);

       return 0;

      

}

 

13编程题

saveStudentBin与 loadStudentBIN

main模块

void saveStudentBin(Student *pS,int n)

{

       FILE *pF;

       pF=fopen("Student.dat","wb");

       fwrite((void *)&n,sizeof(int),1,pF);

       fwrite((void *)pS,sizeof(Student),n,pF);

       fclose(pF);

}

 

void loadStudentBIN(Student **ppS,int *pn)

{

       FILE *pF;

       Student *ps;int n;

       pF=fopen("Student.dat","rb");

       fread((void*)&n,4,1,pF);

       ps=new Student[n];

       fread((void*)ps,sizeof(Student),n,pF);

       fclose(pF);

       *ppS=ps;

       *pn=n;

}

#include <stdio.h>

#include <iostream.h>

struct Student{       char fName[20];

       char fPwd[20];

       int fAge;

};

int main(){

       Student s[3]={"liyi","abc",44,

                            "lizhi","xyz",33,

                            "liming","ttt",42};

       //保存数据

       saveStudentBin(s,3);     

       //调入数据

       Student *ps;int n;

       loadStudentBIN(&ps,&n);

       //显示数据

       for (int i=0;i<n;i++){

              printf("%s %s %d\n",s[i].fName,s[i].fPwd,s[i].fAge);

       }

       return 0;

}

 

14编程题

loadSomebody

main

void saveStudentBin(Student *pS,int n)

{

       FILE *pF;

       pF=fopen("Student.dat","wb");

       fwrite((void *)pS,sizeof(Student),n,pF);

       fclose(pF);

}

 

Student* loadSomebody()

{

       FILE *pF;

       pF=fopen("Student.dat","rb");

 

       printf("input no");

       int no;cin>>no;

       fseek(pF,no-1,SEEK_SET);

       Student *ps;ps=new Student;

       fread((void*)ps,sizeof(Student),1,pF);

       return ps;

}

#include <stdio.h>

#include <iostream.h>

struct Student{       char fName[20];

       char fPwd[20];

       int fAge;

};

 

int main(){

       Student s[3]={"liyi","abc",44,

                            "lizhi","xyz",33,

                            "liming","ttt",42};

       //保存数据

       saveStudentBin(s,3);     

 

       Student *ps;

       ps=loadSomebody();

 

       printf("%s %s %d\n",ps->fName,ps->fPwd,ps->fAge);

       return 0;

}

 


模型模块自检答案

一.选择题

1

2

3

4

5

6

7

8

9

10

D

A

B

A

A

D

A

A

B

B

二.判断题

1

2

3

4

5

6

7

8

9

10

×

×

三.简答题

(1)       可有三种方法。方法一,调用模块通过retrun返回数据后,再赋值给某变量;方法二,将这个变量的地址传递给调用模块,在调用模块中通过间接方式改变某变量的值;方法三,将这个变量的大名传递给调用模块,在调用模块中通过引用名改变某变量的值。

(2)       三步:传变量地址、设置相应的指针变量接收地址、用间接方式操作变量

四.画图题

模块图

表达式

float getVol(float r,float h)

int setRoots(int a,int b,int c,float *pRoot1,float *pRoot2)

五.改错题

主模块所在文件sortMain.cpp

sort模块所在文件Int.cpp

#include <iostream.h>;//错误,末尾无;

#include "Sort.h"//错误,应#include "Int.h"

int mian()//错误,应int main()

{

       int a;b; //错误,应int a,b;

          //错误,少cin>>a>>b;

       sort(a,b);

       cout<<a,b; //错误,应cout<<a<<b;

       return 0;

}

Void Sort(int *pA,int *pB) //错误,void是小写

{

       int *temp; //错误,应int temp;

       temp=*pA;*pA=*pB;*pB=temp;

}

 

sort模块声明文件Int.h

 

void Sort(int *pA,int *pB)

//错误,末尾少;

//错误,void是小写

六.编程题

1

#include <math.h>

float getArea(int a,int b,int c){

       int p=0.5*(a+b+c);

       float area;

       area=sqrt(p*(p-a)*(p-b)*(p-c));

       return area;

}

2

float convertT(float f){

       return 5.0*(f-32)/9;

}

3

主模块文件MaxMinMain.cpp

自定义模块文件Int.cpp

自定义模块声明文件Int.h

#include <iostream.h>

int main(){

         int a,b,max,min;

         cin>>a>>b;

         max=getMax(a,b);

         min=getMin(a,b);

         cout<<max<<min;

     return 0;

}

int getMax(int a,int b){

         if (a>b) return a;

         else return b;

}

int getMin(int a,int b){

         if (a<b) return a;

         else return b;

}

#ifndef Int_h

#define Int_h

 

int getMax(int a,int b)

int getMin(int a,int b)

 

#endif

 

4

主模块文件MaxMinMain.cpp

自定义模块文件Int.cpp

自定义模块声明文件Int.h

#include <iostream.h>

int main(){

         int a,b,max,min;

         cin>>a>>b;

         setMaxMin(a,b,&max,&min);

         cout<<max<<min;

     return 0;

}

void setMaxMin(int a,int b,

int *pMax,int *pMin){

         if (a>b) {

*pMax=a;*pMin=b;

}

         else {

*pMax=b;*pMin=a;

}

}

#ifndef Int_h

#define Int_h

 

void setMaxMin(int a,int b,

int *pMax,int *pMin) ;

 

#endif

 

 


结构编程自检答案

一.选择题

1

2

3

4

5

6

7

8

9

10

A

C

D

B

BD

C

B

C

A

D

二.判断题

1

2

3

4

5

6

7

8

9

10

×

×

三.改错题

ERROR1int n , s=0 ,t=1 ;

ERROR2:少{}

ERROR3printf("1!+2!+3!+4!+5!+6!+...+20! =%e \n" , s);

ERROR4while(r!=0);

ERROR4return r;

四.填空题

s表示的含义是:1!+2!+…+30!

c表示的含义是:31!

b表示的含义是:30!

当输入num234的时候,程序运行的结果是432

代码2正确,因为如果给定整数0,则代码1得到的位数是0,这是错误的。

五.编程题

1 bool isLeap(int year){

       bool flag=false;

       if (year%4==0 &&year%100==0&&year%400!=0){

              flag=true;

       }

       return flag;

}

2 bool isTri(float a,float b,float c){

       bool flag=false;

       if (a+b>c&&b+c>a&&a+c>b){

              flag=true;

       }

       return flag;

}

#include <math.h>

float getArea(float a,float b,float c){

       float p=0.5*(a+b+c);

       float area=sqrt(p*(p-a)*(p-b)*(p-c));

       return area;

}

3 bool isPrime(int n){

       bool flag=false;

       for (int i=2;i<n;i++){

              if (n%i==0){

                     flag=true;

                     break;

              }

       }

       return flag;

}

 

int getPrimeSum(int a,int b){

       int sum=0;

       for (int i=a;i<=b;i++){

              if (isPrime(i)){

                     sum=sum+i;

              }

       }

       return sum;

}

 

4#include <iostream.h>

int  main( ){

       int sign=1,s=0;

       for (int i=1;i<=20;i++)  {

              s=s+sign*i*(i+1)*(i+2);

              sign=sign*(-1);

       }

       cout<<s;

}

 


构造类型自检答案

选择题

1

2

3

4

5

6

7

8

9

10

D

C

A

C

C

D

B

D

B

BD

判断题

1

2

3

4

5

6

7

8

9

10

×

×

×

改错题

第1题

第2题

if(c[i]>='0'&& c[i]<='9')

      k=k*10+c[i]-48; 

  printf("k=%d\n",k); 

while (c[i]!='\0')

else {c[n]=c[i];n++;i++;}

四.编程题

1

2

int getMax(int *pA,int n)

{

       int max=pA[0];

       for (int i=1;i<n;i++)

       {

              if (pA[i]>max)

              {

                     max=pA[i];

              }

       }

       return max;

}

void eye(int *p,int m,int n){

       for (int i=0;i<m;i++))

       {

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

              {

                     if (i==j)

                     {

                            p[i*m+j]=1;

                     }

                     else p[i*m+j]=0;

              }

       }

}

 

3

4

int strLen(char *pStr)

{

       int i=0;

       while (pStr[i]!=0)

       {

              i++;

       }

       return i;

}

int getPosition(char *pStr,int no){//no表示子串号

       int i=0,counter=0;

       if (no==1) return 0;

 

       while (pStr[i]!=0){

              if (pStr[i]==',')

              {

                     counter++;

              }

              if (counter==no-1)

              {

                     break;

              }

              i++;

       }

       if (pStr[i]==0) return -1;

       else        return i+1;

}

#include <iostream.h>

int main()

{

 

       char str[20]="aa,bb,cc,dd";

       cout<<getPosition(str,4);

}

5

getScoreMean模块

main模块

float getScoreMean(Score *pS,int n)

{

       float sum=0;

       for (int i=0;i<n;i++)

       {

              sum=sum+(pS+i)->fScore;

       }

       return sum/n;

}

int main(){

       Score s[3]={{1,"liyi",90},

                            {2,"limi",80},

                            {3,"lizhi",88.5}};

       float ave;

       ave=getScoreMean(s,3);

       printf("%f",ave);

       return 0;

}

 


 

课程结束模拟考核答案

一、选择题

C

A

D

A

B

B

A

D

C

B

A

A

C

D

D

二、判断题

×

×

×

×

×

×

×

三.画图题

1

int getMax(int a,int b)

归属:Int

 

2

int getSum(int *pA,int n)

归属:Array

 

四、改错题

ERROR1                                                  int s=1,i,n;

ERROR2                                                  for(i=1;i<=n;i++)

ERROR3                                                  {1,2,3,4,5,6,7,8,9,10}

ERROR4                                                  t=0

ERROR5                                                  i<=9

五、读程序题

1结果是5

2结果是8

 

六、编程题

1

#include<iostream.h>

 

void displayNum()

{

         for (int i=0;i<=100;i++)

         {

               if (i%15==0&&i%2!=0)

               {

                      cout<<i<<" ";

               }

         }

}

void main()

{

         displayNum();

}

 

 

2

int strLen(char *pStr)

{

       int i=0;

       while (*pStr!=0)

       {

              i++;

              pStr++;

 

       }

       return i;

}

 

 

3

主模块代码:

#include <iostream.h>

#include"Student.h"

#define N 40

 

int main()

{

         float score[N];

         char *p[N];

         for (int i=0;i<N;i++)

         {

               p[i]=new char[20];

         }

         inputStudent(score,N,p);

         displayStudent(score,N,p);

}

 

输入模块代码

#include <iostream.h>

#include"Student.h"

int NUM=0;

void inputStudent(float pArray [],int n,char **p)

{

        

               int x=1;

               for(int i=0;i<=n-1;i++)

               {

               cout<<"请输入第"<<x++<<"个数据";

               cin>>pArray[i]>>p[i];

               NUM++;

               }                                                                           

}

 

输出模块代码

void displayStudent(float pArray [],int n,char **p)

{

         cout<<"\t"<<"学生的分数显示结果如下:"<<endl;

         cout<<"\t"<<"************************"<<endl;

         cout<<"\t"<<"序号\t"<<"分数\t"<<endl;

         for (int i=0;i<NUM-1;i++)

         {

               cout<<"\t"<<i+1<<"\t"<<pArray[i]<<p[i]<<endl;

         }

         cout<<"\t"<<"************************"<<endl;

         cout<<"\t"<<"学生的分数显示结束:"<<endl;

         cout<<endl<<endl;

}

 

4

void ScoreManager:: inputScore(){

       if (num==n){//说明当前人数已经满了,n是数组的长度

              cout<<"对不起,人数已满";

       }

       else{

              cout<<"要输入数据吗?(y/n)";

              char choice;    cin>>choice;

              while (choice=='y') {

                     cout<<"请输入数据(学号/姓名/课程/分数):";

                            cin>>pS[num].fNo>>pS[num].fName>> pS[num].fCourse>>pS[num].fScore;

                     num=num+1;

                     cout<<"还要输入数据吗(y/n)";  cin>>choice;  

              }

       }

}

 

项目设计部分参考模型

1实验练习系统参考模型

 

2分数管理系统参考模型

 

3图书管理系统参考模型

3.1简单,无借阅学生数据结构

 

 

 

 

 

3.2较简单,有借阅学生数据结构(按归属进行人员划分)

3.3较简单,有借阅学生数据结构(按功能进行人员划分)

4档案管理系统参考模型

 

5实验室管理系统

//labCourse,以分号隔开,能够开设的课程

//labActualCourse,以指针数组表达多个课程最为严格,并再设计一个字段记录相应时间,这里全放在一起了

struct Lab

{

       char id[20];

       char labName[50];

       char labPos[10];

       char labCourse[200];

       char labActualCourse[200];

       char labBelongTo[10];

       char labManager[10];

};

 

#include "Lab.h"

#include <iostream.h>

#include <string.h>

 

//查某门课程,可以在哪些实验室上

void searchLabByCourse(Lab *lab,int n)

{

       char course[20];

       cout<<"请输入要查询的课程名";cin>>course;

       cout<<"查询到的可以在如下实验室上课\n"

       for (int i=0;i<n;i++)

       {

              if (strstr(lab[i].labCourse,course))

              {

                     cout<<lab[i].labName<<"  "<<lab[i].labManager<<"\n";

              }

       }

}

 

int main()

{

       Lab lab[3]={{"1101","CPLD实验室","36#406","j2me网络编程技术;数据结构;android程序设计","数据结构-张三-(2-12/3/1-4,2-13/4/3-4);android程序设计-李四-(11-12/3/1-4,12-13/4/3-4)","通信","小尹"},

       {"1102","通信实验室","36#106","j2me网络编程技术;光纤通信","j2me网络编程技术-张三-(1-12/3/1-4,1-13/4/3-4);光纤通信-张倩-(1-12/3/1-4,1-13/4/3-4)","通信","小金"},

       {"1110","检测实验室","36#407","检测转换;数据结构","检测转换-高六-(7-12/3/1-4,7-13/4/3-4);数据结构-李一-(7-12/3/1-4,7-13/4/3-4)","自动化","小孙"}};

      

      

       searchLabByCourse(lab,3);

       return 0;

 

}