C语言与程序设计.docx
《C语言与程序设计.docx》由会员分享,可在线阅读,更多相关《C语言与程序设计.docx(74页珍藏版)》请在冰点文库上搜索。
C语言与程序设计
C语言与程序设计
实验指导、报告书
班级:
____________________
姓名:
____________________
计算机科学与技术学院
C程序设计语言课程是计算机专业和非计算机专业的一门技术基础选修课程,大学一年级开设,同时也是作为学生学习计算机的一种启蒙语言。
通过本课程的学习使学生更好地了解和应用计算机,培养学生应用计算机独立解决问题的能力,让学生基本掌握一门使用计算机的语言工具,为学生今后无论是从事计算机或非计算机工作都奠定了良好的、扎实的计算机语言基础。
C程序设计语言最早是由DennisRichie于1973年设计并实现的。
从那时开始,C语言已经从其位于贝尔实验室的发源地传播到世界各地,它已成为全球程序员的公共语言,并由此也诞生了两个新的主流语言C++与Java—它们都建立在C语言的语法和基本结构的基础上。
现在世界上的许多软件都是在C语言及其衍生的各种语言的基础上开发出来的。
C程序设计语言课程是高强度的脑力劳动,不是听会的,也不是看会的,而是自己练习会的。
因此,要求大家在学习C程序设计语言课程时,不能满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即能独立地编写出源程序,独立地上机调试程序,独立运行程序和分析结果。
程序设计是一门实践性很强的课程,必须十分重视实践环节,同时还必须保证应有足够的上机实验时间。
《C程序设计实验指导、报告书》是为配合C程序设计语言课程而编写的一本具有很强的实践性教材。
C程序设计语言课程为我校精品课程建设之一,为了达到本课程各个教学环节的规范化,并且让学生真正达到学以致用的效果,除了要求学生掌握本课程大纲所要求的知识点外,更重要的还要通过实践教学环节来拓展学生程序设计的逻辑思维和提高程序设计的能力,同时也能让学生深刻地了解关于如何运用软件工程的理念去开发软件。
由于本课程是为面向全校各专业开设,为此,对学生学习本课程的要求也有所不同,考虑这一点,在本教程的内容安排上也有所不同,授课教师可根据授课专业的需要进行必要的题目选择。
本实验教程中内容的编写,是根据本课程教学大纲的指导下基本上是以学生的兴趣和爱好为出发点进行编排的,其中体现出在掌握了课堂教学环节上的理论知识,得以在本实践环节中得到应用。
本实验教程共安排了5个实验,每项实验包括实验学时、实验目的、实验内容及部分思考题等。
整个实验建议用40学时完成,其中计划学时20,另外20学时是对编程感兴趣的同学安排的,可作为选项实验题目,所以学生可以根据自己的情况进行选做。
书山有路勤为径
祝你成功!
C程序设计课程教学组
2005年秋学期
实验1:
简单C程序设计
1.1项目编程
(1)找出a,b,c中最大值
(2)按a,b,c值由小到大输出
(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语句来创建源程序。
编译器随后将源程序转换为一中间形式,称为目标程序ObjectProgram),目标程序表示源代码对应的机器码。
编译器读取和检查源程序的各个语句,在检查过程中将源语句转换为机器码(即计算机可以理解的二进制代码),并检查其语法错误。
如发现错误,编译器将标记不正确的语句,并打印一系列错误诊断消息,简要说明所有语法错误(即违反C语句有效编写规则的代码)。
此时,编程人员需要修改错误并重新编译程序。
查找和修改错误的过程称为调试,在编译器指示编译过程没有错误之后,调试才告终止。
C程序通常包含对预先编写函数的引用,这些函数存储于称为头文件的库中,链接器的首要任务是引入预编译的库代码,并将其插入到目标程序中,以创建可执行程序。
5、程序流程图
程序流程图是一个图表,它显示了计算机执行程序的详细处理步骤和顺序,在书中用于描述求解问题的算法。
图1-2为设计者提供的程序流程图所用的标准符号,请参考。
图1-2程序流程图标准符号
四、实验项目:
1、将下列源代码输入计算机并运行,然后分析其运行结果。
main()
{inta;longintb;floatc;doubled;chare;
printf(“sizeofa=%d\n”,sizeof(a));
printf(“sizeofb=%d\n”,sizeof(b));
printf(“sizeofc=%d\n”,sizeof(c));
printf(“sizeofd=%d\n”,sizeof(d));
printf(“sizeofe=%d\n”,sizeof(e));
}
(1)本程序段要求学生对C语言的数据类型的理解,并通过实际运行结果观察到常用的数据类型在内存的存储方式及占用存储空间的字节数;
(2)源代码中的sizeof()函数:
实现计算数据类型字节的长度。
2、将下列由程序流程图描述的算法,转换为C源代码并填写到图1-3b框中,然后输入计算机并运行后分析其运行结果。
图1-3a程序流程图图1-3b转换后C语言源代码
3、项目编程
(1)请向计算机输入a,b,c三个值,经过程序处理后,要求输出其中最大的一个。
项目要求:
画出程序流程图;
根据流程图编写程序
(2)请向计算机输入a,b,c三个值,经过程序处理后,要求按值从小到大输出。
项目要求:
画出程序流程图;
根据流程图编写程序
项目提示:
可采用if结构;
a,b,c由scanf函数输入
(3)编程实现打印下列由字母组成的树形。
说明:
本项目编程的知识点是让学生对双重循环语句结构的理解,清楚双重循环的特点(即当外循环变量中的值变化一次时,则内循环变量中的值要变化若干次)。
提示:
可用外循环变量代表行数;内循环变量代表需打印字符的个数。
难点:
字符个数是按奇数变化递增
左右边界字符打印的位置
图1-4字母A-G组成的树形
(4)设计报选体育科目统计程序
设某学校在新生入学时,需报选体育选修科目。
体育科目包括:
篮球、排球、体操、兵乓球和网球。
请为某班级(30人)统计报选各体育科目人数。
项目要求:
画出程序流程图;
根据流程图编写源程序
项目提示:
可采用switch与for结构
五、知识点检查:
(1)解释下列语句的作用,为什么要在变量名之前加&符号?
floatx;
scanf(“%f”,&x);
解答:
(2)若忘记在上文中的scanf()的语句中加入“&”符号,则输出结果将会如何?
解答:
(3)请将下列给出的两个程序段分别输入计算机后,分析其运行结果,并解答为什么输出如此的结果(不要求助别人,需自己查找资料)。
main()
{intnum;
num=32767;
printf(“num=%d\n”,++num);
}
解答:
main()
{inta=-2;
printf(“%d,%o,%d\n”,a,a,--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=0,1,2,……,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、请编程计算下列给出直流电路中a,b两端的等效电阻R。
图2-3串并联直流电路
项目提示:
图2-3中的R1,R2,R0电阻值均由键盘输入。
由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名学生四门课程每名学生的平均成绩。
其中主函数(即主模块)主要是完成子函数(也称子模块)的调用,在main函数之前所定义的变量和数组均为全局量,因为,下面的三个子函数都要用这些变量。
从上述的模块结构化编程的示例过程和结果来看,的确提高了程序的可读性,无论是写程序的人或是读程序的人都可以很轻松地分析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、将下列给出的城市名列表按降序排序。
AtlantaBostonChicagoDenver
HostonLosAngelesMiamiNewYork
(1)项目要求:
可利用StrCmp()、StrCopy()函数。
该程序应由一个主函数和2个子函数构成,子函数分别完成城市名列表的排序和输出排序后的城市名列表。
画出层次图、程序流程图及源代码清单。
(2)相关知识:
StrCmp():
字符串比较函数。
格式:
strcmp(字符串1,字符串2)
说明:
函数结果可由如下函数值得出:
字符串1=字符串2,函数值为0;
字符串1>字符串2,函数值为一正整数;
字符串1<字符串2,函数值为一负整数;
StrCopy():
字符串复制函数
格式:
strcpy(字符数组1,字符串2)
功能:
将字符串2复制到字符数组1中。
(3)请画出main函数与城市名表列排序和打印输出函数的流程图。
(4)程序流程图
(5)C源代码清单
3、请设计一个fun函数,其功能是给一维数组输入任意4个整数后,应如下规律输出。
如输入整数1,2,3,4,则程序运行后将输出以下方阵:
要求:
该程序由一个主函数和一个fun函数组成
按以下给出程序结构填写fun函数中的C代码
#defineM4
main()
{inta[M];
fun(a);
}
intfun(inta[])
{inti,j,k,m;
for(i=0;iscanf(“%d”,&a[i]);
}
七、思考题:
(1)函数都有哪些调用方式?
解答:
(2)参数在进行信息传递时,都具有哪些传递方式,各有什么特点(即实参与形参的传递)?
解答:
(