还剩71页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
精品C语言与程序设计实验指导、报告书班级____________________姓名____________________计算机科学与技术学院C程序设计语言课程是计算机专业和非计算机专业的一门技术基础选修课程,大学一年级开设,同时也是作为学生学习计算机的一种启蒙语言通过本课程的学习使学生更好地了解和应用计算机,培养学生应用计算机__解决问题的能力,让学生基本掌握一门使用计算机的语言工具,为学生今后无论是从事计算机或非计算机工作都奠定了良好的、扎实的计算机语言基础C程序设计语言最早是由DennisRichie于1973年设计并实现的从那时开始,C语言已经从其位于贝尔实验室的发源地传播到世界各地,它已成为全球程序员的公共语言,并由此也诞生了两个新的主流语言C++与J__a—它们都建立在C语言的语法和基本结构的基础上现在世界上的许多软件都是在C语言及其衍生的各种语言的基础上__出来的C程序设计语言课程是__度的脑力劳动,不是听会的,也不是看会的,而是自己练习会的因此,要求大家在学习C程序设计语言课程时,不能满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即能__地编写出源程序,__地上机调试程序,__运行程序和分析结果程序设计是一门实践性很强的课程,必须十分重视实践环节,同时还必须保证应有足够的上机实验时间《C程序设计实验指导、报告书》是为配合C程序设计语言课程而编写的一本具有很强的实践性教材C程序设计语言课程为我校精品课程建设之一,为了达到本课程各个教学环节的规范化,并且让学生真正达到学以致用的效果,除了要求学生掌握本课程大纲所要求的知识点外,更重要的还要通过实践教学环节来拓展学生程序设计的逻辑思维和提高程序设计的能力,同时也能让学生深刻地了解关于如何运用软件工程的理念去__软件由于本课程是为面向全校各专业开设,为此,对学生学习本课程的要求也有所不同,考虑这一点,在本教程的内容安排上也有所不同,授课教师可根据授课专业的需要进行必要的题目选择本实验教程中内容的编写,是根据本课程教学大纲的指导下基本上是以学生的兴趣和爱好为出发点进行编排的,其中体现出在掌握了课堂教学环节上的理论知识,得以在本实践环节中得到应用本实验教程共安排了5个实验,每项实验包括实验学时、实验目的、实验内容及部分思考题等整个实验建议用40学时完成,其中计划学时20,另外20学时是对编程感兴趣的同学安排的,可作为选项实验题目,所以学生可以根据自己的情况进行选做书山有路勤为径祝你成功!C程序设计课程教学组2005年秋学期目录实验1简单C程序设计
1.1项目编程1找出abc中最大值2按abc值由小到大输出3报选体育科目统计程序
1.2课外选做题1输入100条数据,找出最大值及位置2统计输入的字符串中,数字、字母与其他字符的个数3打印简单图形实验2数组与排序
2.1项目编程1交换数组元素2排序程序3查询程序
2.2课外选做题1矩阵运算2级数求和3电路计算4字符串处理实验3模块化编程
3.1项目编程1矩阵运算2字符串升序排序3排列方阵程序
3.2课外选做题1计算某数的位数之积2年龄统计程序3字符插入操作实验4指针与链表
4.1项目编程1利用行指针实现成绩查询2建立链表程序3字符删除
4.2课外选做题1字符统计2结构体数组的应用3字符串连接实验5综合程序设计
5.1项目编程1破译__程序2趣味编程3人民币面值统计4考试成绩处理
5.2课外选做题1文本词汇统计2趣味编程3选票统计附录Ⅰ本实验总结附录Ⅱ编程必须注意的几个问题附录Ⅲ程序调试与常见错误分析附录ⅣTC部分出错信息注释____实验1简单C程序设计
一、实验学时4
二、实验目的
1、学习和了解C程序设计语言的数据类型及在内存中的储存方式,理解数据的层次结构;
2、学习掌握输入、输出函数的基本格式和使用方法;
3、了解C语言源代码转换成可执行程序的过程;
4、掌握选择、循环语句的使用规则;
5、能够设计和编写简单的C应用程序
三、必须学习和掌握的知识点
1、常用的数据类型及各类型数据的取值范围(int、longint、float、double、char)
2、选择语句if-elseswitch
3、循环语句whiledo-whilefor
4、编译程序图1-1所表示的是一个简化的编译过程,它简单地描述了计算机执行程序的方式实际编译过程的细节是非常复杂的,且难以理解,在此不予讨论图1-1编译过程编程人员在编程语言中要编写计算机将遵循的指令,类似于英语的命令称为源代码计算机读取这些代码后,将其存入内存,以便进行后续处理因为计算机不能执行这种形式的源代码,所以在处理之前,每条语句必须经历一系列的转换过程图1-1说明了在文本编辑器中输入C语句来创建源程序编译器随后将源程序转换为一中间形式,称为目标程序O__ectProgram),目标程序表示源代码对应的机器码编译器读取和检查源程序的各个语句,在检查过程中将源语句转换为机器码(即计算机可以理解的二进制代码),并检查其语法错误如发现错误,编译器将标记不正确的语句,并打印一系列错误诊断消息,简要说明所有语法错误(即违反C语句有效编写规则的代码)此时,编程人员需要修改错误并重新编译程序查找和修改错误的过程称为调试,在编译器指示编译过程没有错误之后,调试才告终止C程序通常包含对预先编写函数的引用,这些函数存储于称为头文件的库中,链接器的首要任务是引入预编译的库代码,并将其插入到目标程序中,以创建可执行程序
5、程序流程图程序流程图是一个图表,它显示了计算机执行程序的详细处理步骤和顺序,在书中用于描述求解问题的算法图1-2为设计者提供的程序流程图所用的标准符号,请参考图1-2程序流程图标准符号
四、实验项目
1、将下列源代码输入计算机并运行,然后分析其运行结果__in{inta;longintb;floatc;doubled;chare;printf“sizeofa=%d\n”sizeofa;printf“sizeofb=%d\n”sizeofb;printf“sizeofc=%d\n”sizeofc;printf“sizeofd=%d\n”sizeofd;printf“sizeofe=%d\n”sizeofe;}1本程序段要求学生对C语言的数据类型的理解,并通过实际运行结果观察到常用的数据类型在内存的存储方式及占用存储空间的字节数;2源代码中的sizeof函数实现计算数据类型字节的长度
2、将下列由程序流程图描述的算法,转换为C源代码并填写到图1-__框中,然后输入计算机并运行后分析其运行结果图1-3a程序流程图图1-__转换后C语言源代码
3、项目编程1请向计算机输入abc三个值,经过程序处理后,要求输出其中最大的一个项目要求
①画出程序流程图;
②根据流程图编写程序2请向计算机输入abc三个值,经过程序处理后,要求按值从小到大输出项目要求
①画出程序流程图;
②根据流程图编写程序项目提示
①可采用if结构;
②abc由scanf函数输入3编程实现打印下列由字母组成的树形说明本项目编程的知识点是让学生对双重循环语句结构的理解,清楚双重循环的特点(即当外循环变量中的值变化一次时,则内循环变量中的值要变化若干次)提示可用外循环变量代表行数;内循环变量代表需打印字符的个数难点
①字符个数是按奇数变化递增
②左右边界字符打印的位置图1-4字母A-G组成的树形4设计报选体育科目统计程序设某学校在新生入学时,需报选体育选修科目体育科目包括篮球、排球、体操、兵乓球和网球请为某班级(30人)统计报选各体育科目人数项目要求
①画出程序流程图;
②根据流程图编写源程序项目提示可采用switch与for结构
五、知识点检查1解释下列语句的作用,___要在变量名之前加符号?floatx;scanf“%f”x;解答2若忘记在上文中的scanf的语句中加入“”符号,则输出结果将会如何?解答3请将下列给出的两个程序段分别输入计算机后,分析其运行结果,并解答___输出如此的结果不要求助别人,需自己查找资料
①__in{intnum;num=32767;printf“num=%d\n”++num;}解答
②__in{inta=-2;printf“%d%o%d\n”aa--a;}解答5通过本次实验,即从编程输入、运行、调试以及直到最后输出正确的结果,你从中得到了哪些收获?对于程序运行所出现的错误是如何解决的?解答
六、课外选做题
1、从键盘输入100条整型数据,请找出其中最大的一个数,并指出这个最大的数是第几次输入的
2、分别统计出在输入的字符串中字母、数字和其他字符的个数
3、请编程实现打印由部分字母组成的图形,如图1-5所示图1-5字母组成图形实验2数组与排序
一、实验学时4
二、实验目的
1、理解数组的作用、下标的用法及数组元素在内存中的存储;
2、学习并掌握一维数组与__数组的应用;
3、学习并掌握常用的排序算法;
4、了解字符数组的特殊应用
三、必须学习和掌握的知识点
1、数组的定义、特点和使用规则
2、数组的查找、排序和插入
四、项目编程
1、将下列一组数读入到a数组中,然后从a数组中找出其中最大的元素并与第一个数互换;然后从a数组中找出最小的元素并与最后一个数互换,而其余元素的位置不变例如,图2-1所示图2-1a数组中部分元素位置的变化1编程技巧与注意事项
①数组是用来在内存中存储一组相关数据项可对存储于内存的数据进行反复处理,而不必再重新输入
②在C中虽然允许在同一行中定义多个数组,但最好还是每行只定义一个数组,这样做可以消除将逗号错写为分号的可能性;另外在调试过程中,也便于查找数组名2本项目编程指南
①采用循环结构;
②需定义一个一维数组a,四个int型变量主要用于储存最大数和最大数的位置及最小数和最小数的位置项目要求
①画出程序流程图;
②根据流程图编写源程序项目提示可采用switch与for结构
2、以下是某班级(32人)高数的考试成绩要求将此成绩输入到a数组中,然后按其值由高分到低分进行排列,并输出其排列后的成绩清单1本项目编程指南这是一个关于排序的问题所谓的排序是按给定顺序排列数据的过程,可根据数组内容按升序或降序排列元素通常都按数据的输入顺序将数据加载到数组中;如果改变输入顺序,若元素为字符型则应按字母顺序排列,若元素为数值型可按值的大小(即升序或降序)排列为计算机__的排序算法种类繁多,如选择法、比较交换法、冒泡法和shell法等以下简介两种典型的排序算法,其他排序方法学生可查阅其他参考书籍冒泡排序也称“起泡排序”或“气泡排序”,是一种比较简单的排序方法思路是将被排序的元素个数为N,可以对此元素做N-1次处理在第k次(k=012……,N-1)处理时,需比较前N-k个元素此排序方法是,连续从前到后比较相邻的两个元素,如果后面的元素大于前面的元素,则应将二者交换,否则不交换可见每经过一次处理,至少此次被处理的N-k个元素中最小的元素被移到本次处理的最后位置,所以经过了N-1次处理后就使所有的元素被排好序了从分析中可以得出,对长列表而言,冒泡排序的效率并不高它比较适合于对短列表元素的排序,其原因就在于它是反复比较和交换元素,直至数据按指定顺序排列为止关于冒泡排序方法示例请参考___第124页Shell排序Shell排序由DonaldShell__这种排序算法速度比较快,效率高如果需排序列表较小,所含项目元素在10个左右时,Shell排序和冒泡排序的执行次数相当但如果对于一个排序列表在含有100个项目元素时,则冒泡排序比Shell排序所执行的时间高出5倍;如果要是一个包含有1000个项目元素的列表而言,冒泡排序就要比Shell排序所执行的时间高出30倍与冒泡排序一样,Shell排序也是比较和交换元素但不同的是,它是通过计算一系列间距(指两个项目元素间的距离)反复比较和交换元素,直到元素按指定顺序排列为止本项目要求学生采用冒泡法排序方法完成上述给出的学生成绩的排序2项目要求
①画出程序流程图;
②根据流程图编写源程序3项目提示
①利用一维数组与for结构
3、按照下列要求编写一个查询程序某汽车维修厂仓库存有多种型号的汽车零件,请为该仓库___编写一查询程序用于查询库中每种零件的库存量图2-2设置的零件型号与对应的库存量1项目要求
①具有交互式输入(提示操__从键盘输入要查询的零件编号);
②具有重复查询功能;
③具有数据检测功能2项目说明
①当程序运行时,首先在屏幕上显示“请输入要查询的零件编号”,例如,操__输入了150003后,则在屏幕上立即显示出该零件编号及该编号所对应的库存量,如150003230
②如果操__输入的零件编号超出了该库中所规定的范围,则应在屏幕上显示出“您输入的是错误的零件编号,请选择重新输入Y,退出查询N”
③当操__正确地查询到自己所要查询的库存数据后,则在屏幕上应显示出“您还继续查询吗(Y/N)?”,如果继续查,则可输入Y否则输入N,即结束此次查询3项目提示
①利用二维数组
②采用if结构和嵌套式循环结构4编程技巧与注意事项
①二维数组表示的是以行列格式排列的数据表;
②可通过行下标和列下标来访问二维数组中存储的元素;
③如何使用行下标和列下标来操纵二维数组是一个令很多学生感到头痛的问题要想克服这个困难,最好的办法是仔细参阅读___中第129页例
7.5题中的代码,认真领会示例,确保完全理解其工作原理同时利用纸和笔,在程序处理期间,跟踪记录各个元素这同投篮一样,练习的越多,成功率也就越高
④祝你好运
五、思考题1下标在数组中起什么作用?取值范围?解答2在使用数组时,如果数组元素个数超过了数组定义的个数时,将会产生什么现象,是严重问题吗?解答3字符数组在使用规则与数值型数组有哪些不同之处?解答
六、课外选做题
1、请编程计算下列给出直流电路中ab两端的等效电阻R图2-3串并联直流电路项目提示
①图2-3中的R1R2R0电阻值均由键盘输入
②由for循环结构实现
2、请编程计算下列给出的二维数组周边元素之和
3、请编写一个程序,其功能是统计一个子字符串在另一个字符串中出现的次数例如,假设输入的字符串是“Thisisastring”,子字符串为“is”则输出结果是2实践3模块化编程
一、实验学时4
二、实验目的
1、深刻理解模块结构化编程的概念及其优点;
2、了解如何将程序分解为一系列的__模块;
3、学习和掌握模块结构化编程的规则与方法;
4、学会运用自顶向下设计的思想和模块结构化编程技巧来编写C程序
三、必须学习和掌握的知识点
1、模块的划分规则
2、函数的调用规则
3、全局与局部变量
4、变量的存储类别
四、知识点讲解
1、模块(Model)是一个__程序逻辑单元,它执行一个主要处理任务,在编写和测试模块之后,可将它们装配起来,形成一个完整的程序
2、模块结构化编程是一个设计策略,用来管理、组织和__计算机程序它使用的是“分而治之”方法,将程序分解为一系列的被称为模块的逻辑单元模块结构化编程旨只提供一种管理编程编程的方法通过这个方法,可将一个大应用程序分解为有限数量的模块由此看来,大程序细分为一系列更小的、逻辑相关的任务,可____和测试所以每次编写一个模块要比一次性完成整个项目要容易的多总之,模块结构化编程是一种编程技巧,它的理念是自顶向下的设计和模块化编程该发有助于设计和构建高质量的程序,使程序有更好的可读性,且更易于测试和调试在C程序中是利用函数来实现模块的功能例如,在求3个学生四门课程中,每个学生的平均成绩的程序,就是由3个模块构架起来的见图3-1计算平均成绩程序的层次图所示图3-1计算平均成绩程序层次图
3、层次图也称框图(blockdiagram)将程序划分为若干个任务等级(模块),并显示任务之间的关系如图3-1显示了计算每个学生平均成绩的处理过程第一层模块显示的是程序的目的,第二层显示的是程序执行的处理模块,由成绩输入、求平均值和输出成绩单三个子模块组成
4、程序流程图是对每个模块所要处理的任务执行过程的一个描述如图3-2为图3-1计算平均成绩程序层次图中三个子模块的程序流程图图3-2a第一层程序流程图图3-2b第二层程序流程图图3-2描述的程序流程所对应的C源代码如下在上述C程序所完成的功能是计算3名学生四门课程每名学生的平均成绩其中主函数(即主模块)主要是完成子函数(也称子模块)的调用,在__in函数之前所定义的变量和数组均为全局量,因为,下面的三个子函数都要用这些变量从上述的模块结构化编程的示例过程和结果来看,的确提高了程序的可读性,无论是写程序的人或是读程序的人都可以很轻松地分析C程序,符合结构化程序设计的思想所以从本实验开始,要求学生必须遵循模块结构化设计程序的原则来设计程序,逐渐养成良好的编程习惯,不断地积累模块结构化编程的经验,来提高自己软件__的能力
五、模块结构化编程的指导原则为了让学生能达到最佳的项目编程效果,以下提供几条适于模块结构化编程的指导原则,可供学生参考
1、模块应有一个入口点和一个退出点如图3-2中的控制流从各模块的顶部流入,从底部返回处退出
2、每个模块只执行一个任务例如在计算学生平均成绩的示例中成绩输入、求平均以及输出计算结果是三个不同的任务,应分别处理,不要将无关的任务放于同一模块中,只将完成同一任务的语句组合在一起
3、编程注意事项·程序应有自我记录即可利用描述变量、模块和函数的标识符·利用注释记录代码,并说明特殊或复杂的处理·利用简单的代码编写结构·利用注释标识模块和函数·每个模块包含的语句不应超过20条以上列出的编程指导原则只要大家理解了,是不难做到的,真诚地希望参与本实验的学生一定会在更短的时间内编出高质量的程序来,到那时,你一定能够享受到模块结构化编程所带来的如下所说的好处1更易于维护程序即便于更新或修改2更易于设计和编写程序,__期间出现的错误将大量减少3程序的可靠性更高,生产运行期间出现的错误将大量减少4更易于其他人(甚至是不熟悉程序的人)读取和理解程序5更易于测试调试程序6更易于编写和维护文档
六、项目编程
1、矩阵运算请输入一个3行3列矩阵的所有元素,然后输出两条对角线元素之和1要求
①该程序应由一个主函数和3个子函数构成,子函数分别完成矩阵元素输入、两条对角线元素求和、输出结果
②画出层次图、程序流程图及源代码清单2相关知识矩阵运算在软件__中,矩阵是一种常见的数据组织形式,在语言上矩阵与二维数组相对应,故通常总是用二维数组存储矩阵元素有时在试题中会给出计算公式因此,计算过程中的主要工作是核对下标与矩阵相关的主要问题包括
①计算矩阵的对角线元素之和(此时矩阵为方阵,M=N,对角线可以是一条或两条,通常为一条,即主对角线);
②计算矩阵的周边元素之和,即四周的元素和;
③矩阵的上三角或下三角之和;
④两矩阵之和矩阵,即将两个矩阵的各个元素对应求和;
⑤矩阵及其转置矩阵之和;
⑥两矩阵的乘积矩阵3本项目设计步骤
①项目层次图图3-3矩阵运算层次图
②请完成其它三个子模块的程序流程图图3-4a主程序流程图图3-4b输入矩阵元素程序流程图图3-4c矩阵运算程序流程图图3-4d打印输出程序流程图
③C源代码清单
2、将下列给出的城市名列表按降序排序AtlantaBostonChicagoDenverHostonLosAngelesMiamiNewYork1项目要求
①可利用StrCmp、StrCopy函数
②该程序应由一个主函数和2个子函数构成,子函数分别完成城市名列表的排序和输出排序后的城市名列表
③画出层次图、程序流程图及源代码清单2相关知识
①StrCmp字符串比较函数格式strcmp字符串1,字符串2说明函数结果可由如下函数值得出字符串1=字符串2,函数值为0;字符串1字符串2函数值为一正整数;字符串1字符串2函数值为一负整数;
②StrCopy字符串__函数格式strcpy字符数组1,字符串2功能将字符串2__到字符数组1中3请画出__in函数与城市名表列排序和打印输出函数的流程图4程序流程图5C源代码清单
3、请设计一个fun函数,其功能是给一维数组输入任意4个整数后,应如下规律输出如输入整数1234,则程序运行后将输出以__阵要求
①该程序由一个主函数和一个fun函数组成
②按以下给出程序结构填写fun函数中的C代码#defineM4__in{inta[M];funa;}intfuninta[]{intijkm;fori=0;iM;i++scanf“%d”a[i];}
七、思考题1函数都有哪些调用方式?解答2参数在进行信息传递时,都具有哪些传递方式,各有什么特点(即实参与形参的传递)?解答3根据你对局部变量和全局变量的理解,在什么情况下用局部变量合适,在什么情况下用全局变量合适?解答4从课堂的教学以及上机的实践教学中,你是如何理解模块化程序设计的?___提倡模块化?(如果你没有充分理解的话,可去书店或上网查阅有关这方面的资料,一定弄清楚这个问题!!!)解答
九、课外选做题
1、请编写一个fun函数,用于计算给定整数num各位数字之积例如,若输入252,则应输出结果是,20;输入202,输出结果是
02、设某学校在校生的年龄在17岁到23岁,请编写一个fun函数,用于统计该校5000人各年龄的人数
3、请编写fun函数,在下列给出的一个有序的数列中插入一个数,且当该数插入后,应使该数列仍然有序606878889093959698100实验4指针与链表
一、实验学时4
二、实验目的
1、深刻理解指针的特点和作用
2、学习并应用指针来设计算法
3、学习和掌握利用指针对内存进行动态分配
4、学习和掌握指针的编程技巧
三、必须学习和掌握的知识点
1、指向变量的指针变量
2、指向数组和__数组的指针变量
3、指向函数的指针变量
4、指向字符串的指针变量
5、指针数组
6、用指针处理链表
四、主要知识点讲解
1、内存的动态分配动态内存管理使程序员可以在程序运行过程中随时申请一块空闲内存,在使用后即可释放比较之下,它比程序中定义的变量或数组更能灵活有效地使用并节约内存因为程序中变量或数组一经定义,即使不再使用也必须占用内存
2、动态内存管理函数1__lloc函数的一般使用格式类型*__lloc字节数以字节数为单位,动态分配存储空间当存储空间被分配成功时,将返回的是该内存块的首地址,否则返回值为0例如,float*p;p=float*__lloc5*sizeoffloat;上述语句表示,__lloc函数动态分配到了5个内存块,每个内存块为4个字节(即实型数的存储长度),并且指针变量p将指向的是5个内存块的首字节的地址见图4-1所示图4-1指针p指向5个内存块的首地址2free函数的一般使用格式free动态分配的内存块首地址其作用是释放掉由__lloc函数分配的内存空间,也就是将该内存空间归还给系统,以便另行分配使用例如,float*p;p=float*__lloc5*sizeoffloat;freep;
3、指向变量的指针变量,示例floata*p1;p1=a;图4-2指针p指向变量a的首字节地址变量a所占用的存储空间是由4个字节组成,如果假设地址编号是从2000开始,则变量a所占用内存的地址编号应该是20002001,2002,2003,而指针p中所存放的地址编号是2000,也就是变量a的首字节地址
4、指向一维数组和__数组的指针变量,示例floata
[3]b
[2]
[3]*p1*p2
[3];p1=a;p2=b;图4-3a指针p1指向数组a的首地址指针p1被定义为是指向一维数组的指针变量如果执行了p1=a;该指针变量p1具有的是一维数a的首地址(C语言规定,数组名代表地址常量,即该数组的首地址),见图4-3a如果该首地址编号是FFB6,则a代表的是FFB6而当执行p1++时,也就是让指针p1向高字节方向增加1时,相当于增加4个字节的长度,此时,p1将具有a
[1]元素的地址,地址编号是FFBA,见图4-__所示,依次类推图4-__指针p1指向a
[1]元素的地址指针p2被定义为是指向二维数组的指针变量指针,也称为p2是行指针此时,p2具有二维数b的首地址,地址编号是FFA6见图4-3c图4-3c指针p2指向数组b的首地址如果此时执行了p2++操作时,也就是让指针p2向高字节方向增加1时,相当于增加12个字节的长度(就即相当于p2具有了下一行的首列地址),也就是a
[1]
[0]元素的地址,地址编号是FFB2,依次类推见图4-3c所示图4-3d指针p2指向b
[1]
[0]元素的地址请同学们思考若要求利用行指针输出上述b数组中的所有元素的地址和所有元素值的话,则代码将如何编写?
5、指向函数的指针变量,示例intfun,*pa=5b=7c;p=fun;……指针p具有函数fun的入口地址(每个函数都有一个入口点,称该入口点即为该函数的入口地址),本例函数的入口地址编号是0046见图4-4在C语言中,函数的名字是一个指针,其值就是该函数的入口地址此时,函数名fun为一个入口地址常量,且把fun赋给p,则指针p称为指向函数的指针变量,也就是在进行函数fun的调用时,也可利用指针p进行函数的调用了图4-4指针p指向fun函数的入口地址如有下面的语句行c=*pab;此语句就相当于函数调用的语句c=funab;
6、字符串指针变量,示例Char*str=“student”;图4-5字符串指针str所指向字母s的地址
7、指针数组,示例inta
[3]
[4]*p
[3]i;fori=0;i3;i++p[i]=a[i]
[0];图4-6指针数组p指向数组a的首列地址指针p被定义的是指针数组,即在该数组中的每一个元素值都是地址值在该示例中p具有三个指针元素,即p
[0],p
[1],p
[2]它们分别具有数组a
[0]
[0],a
[1]
[0]和a
[2]
[0]的地址,如图4-6所示此时,可利用指针数组间接对a数组进行操作指针数组应用最多的还是对字符串的处理,如利用指针数组对字符串的排序、查找以及字符的统计操作等在本实验中的项目编程中的第3题就涉及到指针数组的应用关于该知识点的详细内容请参阅___第248页
8、链表链表属于动态数据结构,可以类比成一“环”接一“环”的链条,这里的每一“环”可以视作一个结点,如果把结点串在一起就形成了链表这种数据结构非常灵活,结点数目无须指定,可以临时生成每个结点有自己的存储空间,结点间的存储空间也无须连接,结点之间的串连是由指针来完成的,而指针的操作又极为灵活方便,习惯上称这种数据结构为动态数据结构这种结构的最大的优点是插入和删除结点方便,无须__大批数据,只须修改指针的指向即可这是编程中十分重要的一种数据结构在以下项目编程中的第2题就是关于链表的问题
五、项目编程
1、请建立一个学生成绩数组然后调用一个fun函数用于查询该数组中一门课程以上不及格的学生并打印他们全部课程的成绩要求利用行指针作为函数的传递参数1提供部分代码如下,并请完成其他全部代码#defineM3#defineN4__in{floatstu[M][N]={{68906680}{56788090}{50685698}};floatfun;funstuM;}floatfunfloat*p[N]intn{}
2、请为下列给出的某班级C程序编码员列表,建立一个链表图4-7C程序编码员列表1说明
①在上表中,每人为一个节点,节点中有4个成员姓名、出生年、出生月和指针然后用指针将每个节___起来
②节___的条件是生日大者在前,小者在后
③最后输出已按顺序排好的并具有5个节点的链表,如图4-8编码员链表所示图4-8程序编码员链表2本题相关知识这是一个关于建立单向动态链表的问题所谓建立动态链表是指在程序执行过程中从无到有地建立起一链表,即一个一个地开辟节点和输入各节点的数据值,并建立起前后相链的关系在做本实验时之前,首先应弄清楚节点数据类型的定义、如何利用指针的动态地开辟节点以及输出已建立的动态链表等项内容
①动态数据结构本题主要是链表的建立,它的实现依赖于动态的内存管理,即利用__lloc函数;
②描述单向链表的数据类型单向链表的一般结构如图4-9所示图4-9a单向链表为了实现链表必须定义能够描述链表中节点的数据类型,该类型应包含有数值和地址两大部分见图4-9b
③关于链表动态建立和链表输出的具体实现过程,请参阅___第275页到279页图4-9b链表节点
④除了上述建立、输出链表,则与本题相关的内容还有关于链表的插入和删除操作(参照___的第281-286页)3要求设计一个主函数和两个子函数(即建立链表模块和输出链表模块)4请在以下空间内完成本题的C源程序
3、编写一个fun函数,其功能是将字符指针s所指字符串(见图4-10a)所有下标值为奇数的字符删除,然后将串中剩余字符存放到由字符指针t所指的字符数组中(例如图4-10b所示)1要求利用字符指针变量作fun函数中的形参2本题相关知识在字符串相关的所有操作中,包括有计算给定字符串的长度、对奇数位操作、对偶数位操作等一系列问题在这些操作中,需要利用循环语句“遍历”字符串的每一个下标
①字符串的理解字符串是由一串字符组成的整体,包括常量和变量但字符串不是一种专门的数据类型,而是由字符数组充当字符串的常量是以双引号括起来的若干个字符的__,如“hello”,这些字符在内存中都是以ASCII码值形式进行存储的并以“\0”作为字符串的结束标记
②指向字符串常量的指针在程序设计中,可以用字符象指针变量记载字符串常量的首地址,从而形成了一类“字符串变量”例如char*p=”hello”;或char*p;p=”hello”;以上两种形式含义相同,都使指针p存储着字符串常量“hello”的首地址此时,应注意一定不能认为字符串存储在变量p中,而是仅仅是首地址存储在p中这样变量p即可具有与字符数组相同的用法和功能
③字符数组作为字符串变量常用的一种构成字符串变量的方法是使用char类型的一维数组,但在没对数组赋值之前并不能称其为字符串charstr
[10];事实上,上述定义仅定义了一个数组而已如果需要将其用作字符串,最好应该在定义数组的时候就赋以初值,如charstr
[10]=“astring!”;经过上述赋值后,系统就会将字符串常量“astring!”完整地存储到数组str中(注意与指向字符串常量的指针变量的区别)包括结束符‘\0’通过上述说明可以发现,字符串的结束符‘\0’是至关重要的一环因为C语言中并不存储字符串的长度,所以只能利用字符串中的元素是否为结束符作为判定字符串结束的依据另者,还值得注意的一点是,字符串结束符号‘\0’的ASCII码值是整数0,也就是说,‘\0’与整数0相同,当它不同于字符‘0’,应为对于字符‘0’的ASCII码值是48,故可以说,‘0’与整数48相同3提供__in函数代码如下,并请完成fun函数的全部代码__in{charch
[100]t
[100]fun;getsch;funcht;}charfunchar*schar*t{}
六、课外选题
1、请设计一个fun函数,其功能是统计由字符指针ss所指的字符串中指定字符的个数,并将此统计结果返回给主函数例如,若输入字符串123412132,再输入1,则应输出为3,也就是说,该字符串的数字中含有数字1的个数有3个请完成fun函数中的C代码__in{charss
[100]ch;intc;getsss;scanf“%c”ch;c=funssch;printf“%d\n”c;}charfunchar*schar*t{……}
2、学生的记录是由学号和成绩组成,现有N名学生的数据已存在主函数中的结构体数组s中,如图4-11所示请设计一个fun函数,其功能是把分数最低的学生数据放在由指针h所指的数组中,并要求由fun函数返回分数最低的学生人数注意,分数最低的学生可能不止一个,请完成fun函数中的C代码图4-11结构体数组s#defineN6typedefstruct{charnum
[10];ints;}STREC;__in{STRECs[N]={{“10010”85}{“10011”64}{“10012”69}{“10013”91}{“10014”72}{“10015”64}};STRECh[N];intin;n=funsh;printf“%d\n”n;fori=0;in;i++printf“s4d\n”h[i].numh[i].s;}intfunSTREC*aSTREC*b{……}
3、字符串的连接请设计一个fun函数,其功能是将s所指的字符串进行正序和反序的连接,然后形成一个新的串写入由t所指的字符数组中例如,由s所指字符串为ABCD,形成新的串并由t所指的串为ABCDDCBA__in{chars
[100]t
[100];funst;scanf“%s”s;printf“%s\n”t;}intfunchar*schar*t{……}
七、思考题1设有如下定义和语句ints
[6]i;doublea
[3]
[4]*p1
[4]*p
[3];p1=a;fori=0;i3;i++p[i]=a[i]
[0];
①根据已给出的s
[0]的地址,如图4-12所示,请在该图中标出s
[1]-s
[5]的地址图4-12数组s
[0]-s
[5]
②已知指针p1中的值是FFA6即数组a首的地址,如图4-13所示,请在该图中标出a数组各元素在内存所占用的地址图4-13二维数组a与行指针p1
③已知数组a首的地址为FFD6,且有指针数组p中的三个元素分别指向了a数组的三个首列元素,如图4-13所示,请在p数组的三个单元中标出它所指向的三个元素的地址值图4-14二维数组a与指针数组p2请编程实现利用指针p1输出间接地输出a数组中各元素及各元素的地址注意,地址可用十六进制输出图4-14二维数组a与指针数组p和指针变量p13如下定义的二维数,现输出其各元素值,都有哪几种输出方式?inta
[3]
[5]={{1012141618}{2022242628}{3032343638}};
①下标法
②③④⑤4“指针运算”指的是什么操作的运算(可以举例说明)?解答5通过本次实验,即从编程输入、运行、调试以及直到最后输出正确的结果,你从中得到了哪些收获?对于程序运行所出现的错误是如何解决的?解答实验5综合程序设计经过了前面的4个(16学时)上机实验,学生已基本掌握了程序设计的常用方法和一些编程技巧,同时也积累了一些编写、调试程序的经验为了进一步提高学生的逻辑思维能力、动手能力和提高学生__解决问题的能力,本实验将为学生安排有关于应用方面的一些小问题,这些问题__了前几个实验的一些相关知识,同时也涉及到一些有趣的算法希望学生在本实验中尽情地发挥自己聪明才智,设计出最佳、最满意的C程序请记住头脑使用才会敏锐,挣扎努力才会生产力量
一、实验学时4
二、实验目的
1、进一步掌握结构化程序设计方法和编程技巧
2、掌握算法的重要性和灵活性
3、提高编程解题的思路及扩充知识面
4、重点掌握程序调试技术和出错分析
三、学习心态
1、提倡“自立”、“自信”、“自尊”、“自强”
2、知难而进
3、充满信心
4、加油啊!
三、项目编程
1、请设计一个破译__程序为了使电报码保密,往往需要将电文按一定规律译成__,然后收报人再将其译回原文例如,可以按下面规律译成__将每一个字母变成它后面的一个字母,如将‘A’变成‘B’‘a’变成‘b’‘Z’变成‘A’‘z’变成‘a’……,其它字符不变,以‘!’作为电文结束标志现设有一段电文Youareright!按上述给出的译文规则,则应破译成Zpvbsfsjhiu!1要求
①画程序流程图
②C源代码清单2画程序流程图3C源代码清单
2、趣味编程深林里有m只猴子竞选大王,选举办法如下所有猴子按1…m进行编号并围坐一圈,从第1号开始按顺序
1、
2、
3、…、n报数,凡报n号的猴子退出圈外,如此的循环报数,直到圈内只剩下一只猴子时,则这只猴子就晋升为大王其中的m和n变量是由键盘输入的,要求最后打印出剩下的猴子编号1说明这个趣味题是由古罗马著名史学家Josephus提出的问题演变而来的,所以也通常称为Josephus问题2本项目编程指南在确定算法前,首先应考虑如何来组织数据假设m=8n=3可利用具有8个元素的一维数组a,它的下标代表每个猴子的编号用数组元素a[p]来存放第p号猴子报过数后下一只该报数的猴子号码,因此,在一开始,a数组的内容如图5-1a所示若从1号开始报数,凡报数是3时则退出abc图5-1报数时位置的变化见图5-1c所示,为此第1轮编号3退出,从编号4又重复报数,此时,编号6退出,依次类推3程序流程图4C源代码清单
3、在全国计算机等级考试报名工作中,工作人员需为考生__报名款项,为方便款项的处理,需筹集一定额度的零钱现假设有100元的人民币要换成5元、1元和
0.5元面值的票子,但要求换以上的零钱共100张,且要求每种不少于1张,请计算应有几种组合方式1程序流程图2C程序代码
4、请按照图5-1给出模块图为本班级设计一个[C课程考试成绩]处理程序该模块应包含有四个部分,可分别用4个子函数来完成图5-2成绩处理模块图各子模块要求如下1成绩录入将本班级全部学生的[C课程考试成绩]录入到一个数组中(或储存到一个成绩文件中)录入结束后,应将成绩按分值有大到小排序2成绩查询采用交互式方式其功能可以查询到本班级任何一位学生本课程的考试成绩查询要求
①能够重复查询;
②具有数据检测功能,例如,如果学号输入有误,该子模块应提示“数据输入有误,是继续还是退出Y/Q”字样的提示信息,以便得到正确的查询数据;3成绩统计统计各成绩段的学生人数成绩段可分为90-100(优秀)、80-__(良好)、70-79(中等)、60-69(及格)、60以下为不及格4打印成绩单按两种规格打印成绩单,一张是打印60分以下的本课程成绩单,另一张为90分(包括90)以上的成绩单成绩录入模块程序流程图成绩录入模块源代码成绩查询模块程序流程图成绩查询模块源代码成绩统计模块程序流程图成绩统计模块源代码打印成绩单模块程序流程图打印成绩单模块源代码
四、课外选做题
1、请设计一个文本词汇统计程序输入由若干单词组成的文本行(最多80个字符),每个单词之间用空格隔开,请统计该文本行单词的个数
2、趣味编程口袋中有红、黄、蓝、白、黑五种颜色的小球,每次从口袋中取出三个球,问最多可有几种不同颜色的组合
3、统计选票某学校某新生班级在入学后的第二周组织竞选班长活动,在竞选的最后一项是全体学生以投票方式,来决定哪位竞选者当选设选票格式如图5-2所示,选票上提供了3个后选人的__请设计一个C程序,用于统计所有选票中各后选人的得票数1要求采用结构体数组作为选票计数器图5-3选票格式附录Ⅰ实验总结到目前为止,本课程实验共计完成了20个计划学时和20个课外学时的实验内容,累计项目编程题(包括课外选做题)为31道在这些内容中即体现出让学生对于基本知识点的掌握,也同时涵盖了一些实际应用编程技巧方面的内容通过本课程的学习和实验课程的实践,大家一定也从中获得了不同程度上的收获为此,以下为同学们留出了一块方寸空间,希望真实的你能用简短的语言,总结性地笔试一下你在这个实践性的阶段段里获得了哪些最有价值的知识和__也可以包括对本课程的实践教学提出更好的方法和建议本实验课程总结没有给同学规定任何框架,只是希望大家能真实的表达出自己对学习这门课程的__与收获,……附录Ⅱ编程必须注意的几个问题
一、C程序设计风格“风格(style)”通常上指画家、作家们在创作自己作品时所表达自己作品题材的一种方式在这里的风格(codeingstyle)则指的是计算机程序员在设计程序时所表现出来的特点、习惯及逻辑思路等一个公认的、良好的codingstyle可以减少编码的错误,减少读程序的时间,从而提高软件__的效率从70年代以来,编码的目标从情调效率转变到强调清晰与此相反,程序设计的风格也从追求“聪明”和“技巧”,变为“简明”和“直接”人们逐渐认识到,良好的程序设计风格能在一定程度上弥补语言存在的缺点反之,如果不注意风格,即使使用了结构化现代语言,也很难写出高质量的程序特别是对于一个软件__团队来讲,尤其需要强调良好的和一致的codingstyle以下从两个方面来阐述C程序设计风格问题
1、源代码的书写格式对于C程序设计语言的书写格式来讲,它的书写格式规范非常灵活,即一行可允许写多条语句;也可以一条语句分多行书写,其优点是灵活性比较大,非常随意,但这也意味着给程序的可读性带来不便,如下面的C程序的书写格式这段代码虽然节省了书写空间,但它却给大大降低了程序的可读性,同时也增强了程序修改的难度,显然这不是好codingstyle比较好的代码书写格式是采用“缩进式”的书写风格,即对每一组语句进行层次上划分,这样可以大大提高程序的可读性,也为程序的调试修改带来很大的方便如下面采用的是缩进格式书写的C程序两段代码内容完全一样,只是在书写格式上不同,同学们可以从可读性的角度来评价这两段代码,哪一个更Ok
2、程序注释“注释(comments)”是用来记录和描述程序的文本语句注释语句可有可无,是一种非执行语句(即计算机不预处理)置于程序中,起到解释程序的作用和编码方式在C语言中注释是以“/*”符号作为开头;以“*/”符号作为结尾注释是非常重要的一种机制千万不能被忽视了没有注释的程序不能算合格的程序要建立一这样的观念程序是给别人编的,让人家看懂是第一位重要的事情特别是将来你可能要参加一个团队,几十个人或几百人一起合作编程,相互协同,就更须将注释写得请清楚楚,明明白白例如,微软公司在__Windows2000时,就软件__人员1700余人,可想而之,程序注释的重要性关于程序注释内容通常由以下几项组成1程序名称2程序功能3程序的思路和特点4编程的人与合__5一些特殊变量的说明6编程的日期及修改后的第几版本7模块接口等以下是某程序段,请大家注意其中的注释部分
二、程序的运行效率“效率(efficiency)”一般是指对处理机时间和存储空间的使用效率(即时间和空间的问题)通常选择良好的设计方法才识提高程序效率的根本途径,设计良好的数据结构与算法,都是提高程序效率的重要方法下面以一个典型的小程序段来说明如何利用好时间和空间的问题举例请编程实现求解下列问题这是一个嵌套求累加和的问题如果不考虑效率的问题,通常程序员一定会按下列方法设计程序在对上述的程序的分析中,从书写风格来说,程序的可读性比较好,程序所完成功能可以说是一目了然,定义变量的数量也比较得当但是如果要从效率来分析的话,就会发现有问题所在
①从循环次数来看,内循环要执行20*4=80次,再加上外循环所要执行的21次,所以总循环为101次如果我们做一次调整,则循环次数会有所变化,请观察以下被调整后的C程序可以发现整体的循环次数减少了,即内循环减到3*21=63次,外循环减到4次,总循环为67次所以,通过运行调整后,我们可以得出,应该把循环变量变化大的值位于内循环
②从对求和的表达式来看,其中的j+2运算只与外循环的变量j有关系,j+2运算共执行了3*20=60次,其中有57次是重复的运算如果从运算效率的角度来做一次语句的调整,则情况会有所不同,请分析调整后的C程序从对调整后的程序分析得出,j+2运算只执行了3次从而可以总结出应尽量把与本循环无关的运算移到循环外面关于本程序,还可以继续对其效率分析在求和表达式中i+1运算中,每做一次循环则要执行2次i+1运算,这样总共就要执行2*60=120次,显然要有60次是重复计算的进一步调整程序对于调整后的程序中的i+1运算只要执行60次,减少了一倍以上提到的两个方面,对编程人员来讲是必须具备的在这里有必要要求大家养成良好的编程习惯·程序构思要有说明·强调可读性·变量要加注释·学会如何调试程序·对运行结果要做正确与否的分析附录Ⅲ程序调试与常见错误分析写程序时出错是很正常的,即使是经验丰富的程序员,也只能尽量地减少可能的错误,却无法完全避免错误程序中的错误常被称为Bug,就是小虫子的意思,虫子虽小却可能导致程序不能运行或程序结果不正常,大则可能会引起操作系统的崩溃通常把找到并排除错误的过程称为程序调试,英文为Debug程序中的错误是很难避免的,特别是对于一些大型的软件__工程来说,程序要有几百万甚至达几千万行,错误肯定存在,因此调试是必须做的工作在编写完程序以后,除了简单的浏览一下代码,尽量找出一些明显的错误之外,可以通过编译和链接进行纠正错误此时,所能发现的错误大多数是语法错误和未知名称以及含有找不到的代码块等在修改了此类错误之后,就可以形成可执行文件并运行程序了为了使学生尽快地掌握程序调试技术,下面就几个典型程序编译错误进行分析在程序代码输入结束之后,首先对程序进行编译,其目的是检查程序代码中的语法错误在Win-TC环境下,操作菜单项[运行]中的“编译连接”,见图附录II-1所示图附录II-1Win-TC环境下的编译连接C语言中的编译错误主要分为警告(warning)和错误(error)(语法错误、逻辑错误和运行错误)
一、警告类错误1‘xxx’isassignedavaluethatisneverused该类错误信息是提示“变量xxx已被赋值,但从来未使用”请分析下列程序#includestdio.hvoid__in{intx=100;inty=10;printf“%d\n”y;}该程序编译后,显示如下信息这种变量除了运行时占用内存单元外不会对程序产生其他不良影响,但感觉上还是可疑的所以不需要的变量应尽量删除掉2Codehasnoeffect说明程序没有包含有实际作用的代码,如下列程序中的“x+3;”#includestdio.hvoid__in{intx=10;x+3;printf“%d\n”x;}除了笔误之外,常常是对运算符的错误理解导致此类问题出现事实上,除了赋值类运算符之外,只有++和—运算才能改变变量的值,所以这种写法是对表达式错误的理解,应引起注意3Redeclarationof‘__in’一个程序文件中的主函数__in多于一个因为,在C中要求一个程序文件只能有一个__in函数4Non-portablepointerconversion如下列程序段中的“*p=10;”#includestdio.hvoid__in{int*p=10;*p=3+2;printf“%d\n”*p;}由于在本程序段所定义的指针p是用于指向具有2个字节的整型变量的地址,所以p一定事先赋有地址值,然后才能进行指向操作,而本程序段中的p还没有被赋地址值,就进行间接的赋值操作,显然这是有问题的,所以C编译提出了警告正确的写法应该是int*px;p=x;*p=10;5Possibleusedof‘xxx’beforedefination这是指表达式中使用了未被赋值的变量,如下例的程序段中的变量x和p#includestdio.hvoid__in{intx;inty=x+2;printf“%d\n”*p;}或#includestdio.hVoidfintx{x=10;}void__in{int*p;f*p;printf“%d\n”*p;}6Suspiciouspointerconversion为可疑的指针转换通常是使用了基类型不匹配的指针如下例中的语句“p=x;”#includestdio.hvoid__in{int*p;floatx=
3.5;p=x;printf“%f\n”*p;}上述程序段所定义的指针是指向2个字节的整型变量的地址,可是在函数体的执行位置上却让指针p指向的是具有4个字节的实型变量的地址,显然基类型是不匹配的修正的方法可以采用强制类型转换,如#includestdio.hvoid__in{int*p;floatx=
3.5;p=int*x;printf“%f\n”*float*p;}强制类型转换:是指利用强制类型转换运算符将一个表达式转换成所需要的类型程序段中的语句“p=int*x;”的含义是指将x强制转换成int类型这里需要说明的是,在强制类型转换时,得到一个所需类型的中间变量,而原来变量的类型并没有改变关于此类问题的详细说明,参照___第56页诸如上面这样的警告信息,可以说是,都是学生在做编程调试时经常遇到的,希望同学们要逐渐积累,引起__
二、错误错误与警告是不一样的错误是编译器发现程序有问题,根本没有办法执行的;而前面介绍的警告是编译器认为程序可能有问题,但仍旧可以执行错误可分以下3种
1、语法错误如果在程序运行中检测出错误,说明程序中包含若干个语法错误语法错误是指违反语言编写规则的错误换而言之,所编写的语句是错误的,在执行过程中被驳回语法错误通常是因为拼写错误或输入错误而造成的,例如,将printf错写为pintf、括号不匹配、语句后漏掉了分号等,这些都会在编译时被发现并加以提示(其错误提示信息代码见附录)这些都属于“致命性错误”,不改正是不能通过编译的但无论什么原因,要使程序成功运行,就必须改正语法错误并重新编译源代码
2、逻辑错误程序无语法错误,也能正常运行,但输出结果不对例如,求s=1+2+3+……+100,有人写出以下语句fors=0i=1;i100;i++s=s+i;程序运行后,语法上没有错误,但求出的结果是s=1+2+3+……+99之和,原因是少执行了一次循环像这类错误可能是设计算法时的错误,也可能是算__确而在编写程序时出现疏忽所致逻辑错误与语法错误不同,计算机没有与之相应的检测方法,有时候难以查找,所以多数是凭借程序员的程序调试经验来解决
3、运行错误如果程序即无语法错误,又无逻辑错误,但程序不能正常运行或结果不对,则称为运行错误多数情况是数据不对,包括数据本身不合适以及数据类型不匹配等例如下面是求n!的程序段intfintn{intks=1;fork=1;k=n;k++s*=k;returns;}void__in{printf“%d\n”f20;}当程序的显示结果必然是错误的,因为20!不是int类型所能存储的因此,需要根据实际数据范围,小心地选择数据类型,包括函数f的返回类型、变量s的类型、printf中的输出格式,应定在long数据类型比较合适所以,需处理的数据值应根据数据类型的取值范围来进行定义,千万不要忽视了这一点关于运行错误,请分析下面的语句int*x*y;printf“%d\n”*x;*y=10;上述代码将产生的是指针未初始化错误在使用一个指针变量时,最危险的错误就是引用了没有进行初始化的指针,常把这种没有被初始化的指针称为“野指针”如代码中的x,y都没有初始化,那么它们将随机地指向内存中某个地址像第二行的引用一般不会引起太严重的问题,只是显示的值是不定的但第三行这种指针的引用就严重了,这与数组超界类似(但可能更严重),主要是使用了未知的内存区,有可能覆盖了内存中重要的数据,或带来系统的崩溃通常对于初次接触编程学生而言却无奈地发现,第一次尝试编程时,程序往往不会正常运行,而且也会因为一个错引起多个语法错,这是由于编程过程中需要处理大量细节和复杂的逻辑,所以出现错误不足为怪程序__的主要目标是,利用结构化方法来管理编程,以减少错误量及复杂度附录ⅣTC部分出错信息注释Badcallofinlinefunction内部函数的不合法调用Irreducibleexpressiontree不可约表达式树文件中的表达式使得代码生成程序无法为其产生代码应避免使用这种表达式Registerallocationfailure存储器分配失败源文件中的表达式太复杂,代码生成程序无法为它生成代码此时应简化这种繁琐的表达式或干脆避免使用它#operatornotfollowedby__croargumentname“#”运算符后没跟宏变元名在宏定义中,#用来标识一宏变元是串“#”后必须跟一宏变元名‘xxxxxxxx’notanargument“xxxxxxxx”不是函数参数在源程序中将该标识符定义为一个函数参数,但此标识符没有在函数的参数表中出现Ambiguoussymbol‘xxxxxxxx’歧义性符号“xxxxxxxx”两个或多个结构体的某一域名(结构体变量)相同,但具有的位移、类型不同在变量或表达式中引用这些结构体分量未带结构名时,将产生歧义这时需修改某个域名或在引用时加上结构名Argument#missingname参数#名丢失参数名已脱离用于定义函数的函数原型如果函数一原型定义,则该函数必须包含所有的参数名Argumentlistsyntaxerror参数表出现语法错误函数调用的一组参数其间必须以逗号隔开,并以一右括号结束若源文件中含有一个其后不是逗号也不是右括号的参数,则出现此错Arraysizetoolarge数组长度过大定义的数组太大,可用内存不够Assemblerstatementtoolong汇编语句太长接插入的汇编语句最长不能超过480字节Badconfigurationfile配置文件不正确TURBOC.CFG配置文件中包含不是合适命令行选择的非注释文字配置文件命令选择项必须一一短横线(-)开始Badfilenamefor__tinincludedirective命令中文件名格式不正确包括文件名必须用引号(“filename.h”)或尖括号filename.h括起来,否则将产生此类错误如果适应了一个宏,则产生的扩展程序文本也是不正确的(因为没有加上引号)Badifdefdirectivesyntaxifdef命令语法错误:#ifdef必须以单个标识符(仅此一个)作为该命令的体Badifdefdirectivesyntaxifdef命令语法错误:#ifdef必须以单个标识符(仅此一个)作为该命令的体Badifdefdirectivesyntaxundef命令语法错误:#undef必须以单个标识符(仅此一个)作为该命令的体Badfilesizesyntax位字段长语法错误:一个字位段长度必须是1~16位的常量表达式Callofnon-function调用未定义函数:正被调用的函数无定义,通常是由于不正确的函数声明或函数名拼写错误引起的Cannotmodifyaconstanto__ect不能修改一个常量对象:对定义为常量的对象进行不合法操作(例如常量的赋值)将引起本错误Cannotmodifyaconstanto__ect不能修改一个常量对象对定义为常量的对象进行不合法操作例如常量的赋值将引起本错误Caseoutsideofswitchcase出现在switch外编译程序发现case语句出现在switch语句外面通常是由于括号不配对引起的Casestatementmissing:case语句漏掉:case语句必须含有一个以冒号终结的常量表达式可能是丢了冒号或冒号前多了别的符号Casesyntaxerrorcase语法错误case中有一些不正确的符号Characterconstanttoolong字符常量太长字符常量只能是一个或两个字符长Compoundstatementmissing}复合语句漏掉}编译程序扫描到源、文件结束时未发现结束标记通常是由于花括号不配对引起的Conflictingtypemodifiers类型修饰符冲突对同一指针只能指定一种变址修饰符如near或far;同样对于同一函数也只能给出一种语言修饰符如cdecl、Pascal或interruptConstantexpressionrequired要求常量表达式数组的大小必须是常量本错误通常由于#define常量的拼写出错而引起Couldnotfindfile‘xxxxxxxx.xxx’找不到xxxxxxxx.xxx文件编译程序找不到命令行上给出的文件Declarationmissing;声明漏掉;在源文件中包含一个类型或一个存储类但后面漏掉了分号;Declarationneedstypeorstorageclass声明必须给出类型或存储类声明必须包含一个类型或一个存储类如声明:“ij;”是不正确的Declarationsyntaxerror声明出现语法错误:在源文件中某个声明丢失了某些符号或有多余的符号附录Ⅴ____为了让学生很好地完成本课程实验,以下向学生推荐几本参考书籍,可供学生查阅
1、EricS.Roberts著,TheArtandScien__ofC,斯坦福大学,2004年4月
2、D__idM.Collopy著,罗铁庚译,C语言教程模块化程序设计(第2版),清华大学出版社,2004年9月
3、牛连强等,C语言程序设计上机习题指导,大连理工大学出版社,2002年7月
4、BrianW.kernighan等著,徐宝文等译,C程序设计语言(第2版.新版),机械工业出版社,2005年2月
5、牛连强等,C语言程序设计笔试习题点津,大连理工大学出版社,2002年3月/*C语言源代码*/__in{}/*输出最大值*/__in{}程序流程图程序流程图/*将abc三个值由小到大输出*/__in{}/*打印图形*/__in{}}C语言源代码__in{}}程序流程图C语言源代码__in{}程序流程图C语言源代码__in{}程序流程图/*汽车零件查询源代码*/__in{}/*求平均成绩模块代码*/int__erage{intsum;fori=0;i3;i++{sum=0;forj=0;j4;j++sum+=s[i][j];__e[i]=sum/4;}}/*输出平均成绩模块代码*/intoutput{fori=0;i3;i++printf“%f”__e[i];}/*主模块代码*/intijs
[3]
[4];float__e
[3];__in{intput;__erage;output;}/*成绩输入模块代码*/intinput{fori=0;i3;i++forj=0;j4;j++scanf“%d”s
[3]
[4];}/*C程序代码*/。