精品C语言与程序设计
实验指导、报告书
班级:____________________
姓名:____________________
计算机科学与技术学院
C程序设计语言课程是计算机专业和非计算机专业的一门技术基础选修课程,大学一年级开设,同时也是作为学生学习计算机的一种启蒙语言。
通过本课程的学习使学生更好地了解和应用计算机,培养学生应用计算机独立解决问题的能力,让学生基本掌握一门使用计算机的语言工具,为学生今后无论是从事计算机或非计算机工作都奠定了良好的、扎实的计算机语言基础。
C程序设计语言最早是由Dennis Richie于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、long int、float、double、char)
2、选择语句:if-else switch
3、循环语句:while do-while for
4、编译程序
图1-1所表示的是一个简化的编译过程,它简单地描述了计算机执行程序的方式。实际编译过程的细节是非常复杂的,且难以理解,在此不予讨论。
图1-1 编译过程 
编程人员在编程语言中要编写计算机将遵循的指令,类似于英语的命令称为源代码。计算机读取这些代码后,将其存入内存,以便进行后续处理。因为计算机不能执行这种形式的源代码,所以在处理之
前,每条语句必须经历一系列的转换过程。               
图1-1说明了在文本编辑器中输入C语句来创
建源程序。编译器随后将源程序转换为一中间形式,称为目标程序Object Program),目标程序表示源代码对应的机器码。编译器读取和检查源程序的各个语句,在检查过程中将源语句转换为机器码(即计算机可以理解的二进制代码),并检查其语法错误。
如发现错误,编译器将标记不正确的语句,并打印一系列错误诊断消息,简要说明所有语法错误(即违反C语句有效编写规则的代码)。此时,编程人员需要修改错误并重新编译程序。查和修改错误的过程称为调试,在编译器指示编译过程没有错误之后,调试才告终止。
C程序通常包含对预先编写函数的引用,这些函数存储于称为头文件的库中,链接器的首要任务是引入预编译的库代码,并将其插入到目标程序中,以创建可执行程序。窗户漏水
5、程序流程图
程序流程图是一个图表,它显示了计算机执行程序的详细处理步骤和顺序,在书中用于描述求解问题的算法。图1-2为设计者提供的程序流程图所用的标准符号,请参考。
图1-2 程序流程图标准符号
四、实验项目:                                             
1、将下列源代码输入计算机并运行,然后分析其运行结果。 
main()
{ int a; long int b; float c; double d; char e;
printf(“sizeof a=%d\n”, sizeof(a));
printf(“sizeof b=%d\n”, sizeof(b));
printf(“sizeof c=%d\n”, sizeof(c));
printf(“sizeof d=%d\n”, sizeof(d));
printf(“sizeof e=%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) 解释下列语句的作用,为什么要在变量名之前加&符号?
float x;
scanf(“%f ”, &x);                       
解答:
(2) 若忘记在上文中的scanf()的语句中加入“&”符号,则输出结果将会如何?   
解答:
(3) 请将下列给出的两个程序段分别输入计算机后,分析其运行结果,并解答为什么输出如此的结果(不要求助别人,需自己查资料)。   
① main()
{ int num;
num=32767;
printf(“num=%d\n”,++num);
}
解答:
② main()
{ int a=-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-1 a数组中部分元素位置的变化
(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排序由Donald Shell开发。这种排序算法速度比较快,效率高。如果需排序列表较小,所含项目元素在10个左右时,Shell排序和冒泡排序的执行次数相当。但如果对于一个排序列表在含有100个项目元素时,则冒泡排序比Shell排序所执行的时间高出5倍;如果要是一个包含有1000个项目元素的列表而言,冒泡排序就要比Shell排序所执行的时间高出30倍。
与冒泡排序一样,Shell排序也是比较和交换元素。但不同的是,它是通过计算一系列间距(指两个项
目元素间的距离)反复比较和交换元素,直到元素按指定顺序排列为止。
本项目要求学生采用冒泡法排序方法完成上述给出的学生成绩的排序。
(2) 项目要求:① 画出程序流程图;② 根据流程图编写源程序
(3) 项目提示:① 利用一维数组与for结构
3、 按照下列要求编写一个查询
程序。
某汽车维修厂仓库存有多种型号的汽车零件,请为该仓库管理员编写一查询程序用于查询库中每种零件的库存量。
图2-2 设置的零件型号与对应的库存量
(1) 项目要求:
① 具有交互式输入(提示操作者从键盘输入要查询的零件编号);
② 具有重复查询功能;
③ 具有数据检测功能。
(2) 项目说明:
① 当程序运行时,首先在屏幕上显示“请输入要查询的零件编号:” ,例如,操作者输入了 150003 后,则在屏幕上立即显示出该零件编号及该编号所对应的库存量,如:150003 230 。
② 如果操作者输入的零件编号超出了该库中所规定的范围,则应在屏幕上显示出“您输入的是错误的零件编号,请选择:重新输入(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、 请编写一个程序,其功能是统计一个子字符串在另一个字符串中出现的次数。例如,假设输入的字符串是“This is a string”,子字符串为“is”,则输出结果是 2 。
实践3 模块化编程
一、实验学时:4
二、实验目的:
1、深刻理解模块结构化编程的概念及其优点;
2、了解如何将程序分解为一系列的独立模块;
3、学习和掌握模块结构化编程的规则与方法;
4