1、西南科技大学计算机学院 C 程序设计实验指导书1C 程序设计语言实验指导书信息教研室编西南科技大学计算机科学与技术学院2006 年 8 月西南科技大学计算机学院 C 程序设计实验指导书2实验一 简单的 C 语言程序1.1 实验类型:验证型实验 2 学时1.2 实验目的1、熟悉并学习使用 C 程序编译平台 TurboC;2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的 C 程序;3、掌握 C 语言基础数据类型,熟悉变量定义和赋值方法;4、学会使用 C 算术运算符和算术表达式;1.3 知识点介绍1、C 程序的结构。一个程序有多个程序单位构成,每一个程序单位作为一个文件,编译系统分别对每个程
2、序文件分别编译,然后连接起来形成可执行程序。在一个程序单位中包含以下几部分:预处理命令全局声明部分函数(有函数首部和函数体组成) ,一个 C 必须有一个(而且只能有一个)main()函数。2、C 数据类型和表达式C 有多种数据类型,数据类型隐含着该类数据的表示、存储及处理规则。C 运算符丰富,使用十分灵活。有运算符和括号将运算对象(操作数)连接起来,构成表达式。表达式中混合运算式要注意运算符的优先级和结合性。此外,不同数据类型运算时,存在类型转换(隐式自动转换和强制转换) 。3、C 程序的编写实现用 C 语言编写程序对源程序文件进行编译声称目标文件对目标文件连接形成可执行程序运行程序得到结果分
3、析结果。1.4 实验内容题目 1 最简单的 C 程序按提示的操作步骤,输入下面程序代码,编译连接并执行。西南科技大学计算机学院 C 程序设计实验指导书3实验提示 按照操作步骤创建第一个应用:(1)编辑你的第一个 C 源程序(2)保存你的源文件(3)编译、连接得到可执行程序(4)改正源程序中的错误(5)运行你的第一个程序思考与扩展1、如果程序中大小写输入错误如 main 写成 Main,结果会怎样?2、编译运行通过后,本程序输出了一行字符,如果还想输出一行字符:“its too easy! “程序代码该如何修改添加?提示:注意使用换行控制符 n 题目 2 简单应用 求圆柱体的体积输入下面程序代码
4、,编译运行。实验提示按照第一题的操作步骤文件,输入代码,编译连接,执行程序,输入测试数据分析结果是否正确,如有错误改正后再重新编译连接,直到没有错误为止。测试数据运行时输入:5 8 西南科技大学计算机学院 C 程序设计实验指导书4-2 1思考与扩展1、如果运行时输入3.8 5 程序的输出结果是什么,正确吗?将程序中变量 radius, high 改为 double 类型,然后输入上面的测试数据,结果怎么样?说明原因。2、注意 输入提示和输出提示语句,尝试修改输入数出提示语句。题目 3 温度转换输入华式温度,要求输出摄式温度。公式 C=5/9*(F-32)输入输出要有文字说明,取两位小数。测试数
5、据运行时输入:3017实验二 逻辑结构2.1 实验类型:验证型实验 2 学时2.2 实验目的1、掌握 C 程序控制的基本结构:选择结构的实现;2、掌握简单 C 程序的编写和调试2.3 知识点介绍1 关系运算、逻辑预算,关系表达式和逻辑表达式。2、选择结构:if 语句,switch 语句的应用。西南科技大学计算机学院 C 程序设计实验指导书52.4 实验内容题目 1 计算员工周工资编写一个程序,输入某雇员的每周工作时间(以小时计)和每小时的工资数,计算并输出他的工资。若雇员周工作小时超过 40 小时,则超过部分按原工资的 1.5 倍的加班工资来计算。若雇员每周工作小时超过 60 小时,则超过 6
6、0 的部分按原工资的 3 倍的加班工资来计算,而 40 到 50 小时的工资仍按照原工资的 1.5 倍的加班工资来计算。1、要求有输入提示和输出提示,如要输入雇员的工作时间和每小时的工资值时,可以提示:“Please input employees work time and wage_per_hour:”输出时,提示:“The employees wage :”。2、给你的程序加上注释,并注意排版格式,使得其清晰可读。实验提示1、从本次实验开始,我们开始编写稍微复杂的程序,涉及到一些简单的算法,请务必按实验要求养成良好编程的习惯,再次强调:代码要写整齐,注意排板规范。 。给你的变量起个好名字
7、,不要什么变量都用 a,b,c等,变量最好用英文单词或单词的缩写命名,变量名字要体现变量在程序的含义和作用。要有必要的注释!,养成这一良好的习惯很重要,请记住, “代码只被书写一次,而它被修改和阅读的次数可能是无限的”2、本程序可以使用 if 语句和 switch 语句分别实现流程图分别如下:真(1)真(1)假(0)假(0)Cinworktimewageph(worktime worktimewagephif(worktime 60 ) count=3;else count = worktime/20Wage= worktime* wageph Wage=( (worktime-40)*1.5
8、+40)*wageph Wage=( (worktime-60)*3.0+ (60-40)*1.5)+ 40)*wageph输入 coutyear monthday; /首先输入三个数: 年 月 日while(year!= 0 测试数据、1 年 1 月 1 日是星期一、2 年 1 月 1 日是星期二、用上机日期4、 2000 年 1 月 1 日是星期六思考与扩展1、 用 switch 语句实现程序。比较 if 和 switch 语句的区别。2、对输入日期和理性检验,例如月份不能大于 12,非闰年不得有 2 月 29 日,小月不得有 4 月 31 日西南科技大学计算机学院 C 程序设计实验指导书
9、10实验四 数组4. 1 实验类型:验证型实验 2 学时4.2 实验目的1、掌握一维数组和二维数组的定义、赋值和输入输出方法;2、掌握字符数组和字符串的使用;4.3 知识点介绍1、数组是有序数据的集合。特点:有序,元素必须是同一个类型,用下标标识每一个元素,数组在内存中占用一块连续的存储单元。2、数组的定义:定义时必须给出数组的大小(即数组元素的个数) 。数组使用时用下标标识特定的元素,注意使用时下标不要越界。3、经常使用 char 类型的数组来处理字符和字符串。字符数组和字符串数组的区别在于字符串数组有一个结束标志0 .4、常用的排序算法:冒泡法和选择法。4.4 实验内容题目 1 排序查找用
10、选择法对 15 个学生的成绩按从大到小的顺序排序,15 个学生的成绩整数用 scanf 输入,如果输入的成绩不在0 ,100 之间,则提示“输入错误 ”。排序完成后,输入一个成绩,要求用折半查找法找出该成绩是该组中第几个元素的值(即第几名) 。如果该成绩不在数组中,则输出“无此成绩” 。实验提示1、本题第一步首先对 15 个成绩排序,可使用冒泡法或选择法排序(冒泡排序算法见教材) 。选择法排序算法思想:n 原数组中选择最小的一个元素,把它和位于第一个位置的元素互换位置;然后,在剩下的 n-1 个元素中选择最小的一个元素,并把它和第一个位置的元素交换;不断重复这些过程,直到最后两个元素。如:设有
11、 10 个元素 a0a9,第一轮:将 a0与 a1a9比较,若 a0比 a1a9都小,则不进行交换,即无任何操作。若 a1a9中有一个以上比 a0小,则将其中最小的一个(假设为 ai)与 a0交换,此时 a0中存放了 10 个中的最小数。第二轮将 a1与 a2a9比较,将剩下的 8 个数中最小者 ai与 a1对换,此时 a1中西南科技大学计算机学院 C 程序设计实验指导书11存放的是 10 个中第二小的数。依此类推,共进行 9 轮比较,a0a9中已按由大到小的顺序存放。2、 排序完成后,这 15 个成绩按由大到小的顺序排列,此时用折半查找法查找某一个成绩效率较高。折半查找法算法思想:假如有以按
12、由小到大排好序的 9 个数,a0a8,其值分别为:1 3 5 7 9 11 13 15 17 若想查 3 是否在此数组中,可以先找出表列中居中的数,即 a4,将要找的数 3 与 a4比较,a4值是 9,发现 a43,显然 3 应当在 a0a4范围内,而不会在 a5a8范围内。这样就可以缩小查找范围,甩掉 a5a8这一部分,即将查找范围缩小为一半。再找 a0a4 中居中的数,即 a2,将要找的数与 a2 比较,a2的值是 5,发现 a23,显然 3应当在 a0a2范围内。这样又将查找范围缩小了一半。再将 3 与 a0a2范围内居中的数 a1比较,发现要找的数 3 等于 a1,查找结束。一共比较了
13、 3 次。测试数据自己选择 15 数据输入。查找某一成绩时,分别选用在 15 个中的成绩和没有在 15 成绩中的数据测试。思考与扩展1、 将选择法排序与起泡法比较,分析它们的特点和效率。2、 如果采用顺序查找的办法,即从第一个元素开始对比一直到找到与之相等的元素,和折半查找法相比,那个效率高?3、 数组名作为函数参数,形参和实参的关系?题目 2 矩阵相乘将两个给定的距阵(3X3) 相乘得到另一个距阵并将其打印出来。提示:12133aX 12133b= 1213c其中 31ijikjcab要求:1、从键盘输入两个矩阵,并输出结果矩阵。矩阵的输入输出要求行列对其。2、把矩阵相承写成函数形式,在主函
14、数中完成矩阵的输入输出。实验提示1、定义三个数组 a22,b22,c222、注意 c 数组的每一个元素西南科技大学计算机学院 C 程序设计实验指导书1231ijikjcab则应设计一个嵌套循环,一共有三个循环变量:i,j,kfor(i=0;i=1 并且 n=r;2、分别用递归和非递归两种方式完成程序设计;3、多文件结构实现将上面用非递归方式写成的程序改成用多文件结构表示。要求将 main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。测试数据 :输入:5 3输入:10 20输入:-1
15、4输入:50 3输入:0 0实验提示1、利用一个非递归函数 fn(int n)计算 n!,利用另一个函数 Cnr(int n, int r)计算 Cnr,在该函数中调用 fn(),问题:你打算用什么样的变量类型来存放 n!函数返回的值?注意各种数据类型的内存字长不同,整数能存放的数据范围有限,你如何解决?可以用 double 数据类型来存放函数的计算结果2、利用一个递归函数实现,利用公式实现递归:C(n,r) = C(n, r-1) * (n r + 1) / r注意递归结束条件:如果 r = 0 ,则 C(n, r) = 1如果 r = 1, 则 C(n, r) = n西南科技大学计算机学院
16、 C 程序设计实验指导书16思考与扩展1、设置断点观察函数的递归调用和嵌套调用的执行流程。2、递归函数的书写要点是什么?3、在递归版本中,当 n 大到什么值时系统将发生栈溢出报错?你觉得递归和非递归函数哪种好些?,4、多文件结构中头文件的作用是什么?5、将程序划分为多个文件有什么好处?1、对一种形式测试:分别在有标识符和注释掉程序中的标识符定义两种情况下编译运行。2、对第二种形式测试:分别使表达式的值为 0 和非 0 两种情况下编译运行。.实验六 指针6.1 实验类型:验证型实验 2 学时6.2 实验目的1、掌握指针的概念、学会定义和使用指针变量;2、掌握引用型变量的概念、学会定义和使用引用型
17、变量;3、学习使用指针数组和指向数组的指针;4、学习使用指向字符串的指针变量;5、学习使用指针和引用给函数传递参数;6.3 知识点介绍1、指针就是地址,一个变量的地址成为给变量的指针。指针变量就是用来专门存放另一个变量的地址。若果一个指针变量存放另一个变量的地址,我们就说指针变量指向该变量。 2、指针变量的类型是其指向变量或常量的数据类型,指针变量本身在内存中只占四个字节。3、指针作为函数参数时不会改变实参指针变量的值,但可以改变实参所指向变量的值。4、数组名代表数组的首地址,是一个指针常量。可以用一个指针变量指向一个数组,通过该指针可以对数组任意操作。5 函数指针:函数名代表函数函数的入口地
18、址,可以定义指向函数的指针变量用来指向函数。指针函数:函数返回值是指针(地址) 。6、 指针运算灵活,但容易出错。7、变量的引用就是变量的别名。引用作形参不是传值,而是传递别名,即形参是实参的别名,并没有为形参分配存储单元。 西南科技大学计算机学院 C 程序设计实验指导书176.4 实验内容题目 1 程序分析输入下列程序,运行它,分析得到的结果。要求:1、给本题代码加上适当的注释,编译调试,分析说明程序运行结果。2、如果将 swap 函数改为如下形式,程序运行结果是什么?分析说明。void swappionter(int *p1,int *p2)西南科技大学计算机学院 C 程序设计实验指导书1
19、8int * temp;temp = p1;p1 = p2;p2 = temp;3、如果将 swap 函数改为如下形式,主函数中函数调用改为:swap( iv1, iv2 );程序运行结果是什么?分析说明。void swap(int temp = p1;p1 = p2;p2 = temp;实验提示1、 注意区分指针的定义,指针的引用。 2、 注意区分指针的值和指针指向对象的值。测试数据自己修改程序中部分代码,调试运行。思考与扩展1 归纳说明普通变量作形参、指针作形参、引用作函数形参得区别。题目 2 班级课程成绩计算一个班有 5 名学生,每个学生修了五门课,1)求每个学生的平均成绩,并输出每个学
20、生的学号,每门课程的成绩及平均直。2)求某门课程的平均分;实现要求:1、分别编写 2 个函数实现以上 2 个要求。2、第 1 个函数用数组名作参数。第 2 个函数用指针用参数,并在函数体内用指针对数组操作。实验提示 1、第一种方法:(1)程序数据结构定义一个一维数组存储 5 学生学号:int num5;定义一个二维数组存储 5 学生的成绩int sco55,再定义一个一维数组存储 5 个学生的平均成绩 int avsco5;(2)函数编写求每个学生的平均成绩函数:void averscore ( int sco5 ,avsco5 ),函数体中算法是计算 sco5每一行的平均值赋给 avsco5
21、的对应元素。求某门课程的平均分函数:int avercourse( int(*psco)5, n ) ,形参中 int(*sco)5 西南科技大学计算机学院 C 程序设计实验指导书19是指向 5 个元素组成的一维数组的指针变量,n 表示要查找第 n 门课程的成绩。如函数调用:avercourse( sco, 3),sco 是二维数组名,3 表示要计算第 3 门课程的平均分。函数体中计算 psco 所指向二维数组的第 3 列的平均值; 2、第二种方法,(1)程序数据结构由于学号、成绩、平均成绩都是数值型数据,可以定义一个二维数组用来保存学生的信息学号、5 门成绩、平均成绩:int stu_inf
22、o57 数组有 5 行 7 列,5 行对应 5 个学生,7 列分别对应学生的学号、5 门成绩、平均成绩。当然没有计算平均成绩之前最后一列数据是 0;(2)函数编写求每个学生的平均成绩函数:void averscore ( int stu_info57 ),函数体中算法是计算stu_info57每一行的第 1 到 5 列元素的平均值赋给第 6 列元素(第 0 列是序号) 。求某门课程的平均分函数:int avercourse( int(*psco )7, n ) ,形参中 int(*sco)7 是指向 7 个元素组成的一维数组的指针变量,n 表示要查找第 n 门课程的成绩。如函数调用:averc
23、ourse( sco, 3),sco 是二维数组名,3 表示要计算第 3 门课程的平均分。函数体中计算 psco 所指向二维数组的第 3+1 列的平均值(第一列是学号) ; 测试数据自己选择一组数据输入。思考与扩展1、二维数组作为函数形参 int avercourse( int(*psco )5, n )中为什么要指定第二维的大小?2、 在函数体中用指针操作二维数组比如:*(*(psco +i)+j)就代表数组第 i 行 j 列的元素即 pscoij。题目 3 排序查找 (选做)用选择法对 15 个整数安从大到小的顺序排序。15 个整数用 scanf 输入。排序完成后输入一个数,要求用折半查找
24、法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数” 。要求:1、把排序算法写成函数形式,用指针变量作为排序函数的参数,在排序算法中用指针法访问数组元素。2、把查找算法写成函数形式,用指针变量作为查找函数的参数,在查找算法中用指针法访问数组元素。实验提示 排序算法和折半查找法见实验 4。西南科技大学计算机学院 C 程序设计实验指导书20测试数据自己选择一组数据输入。思考与扩展1、在调用函数时实参为什么只需给出数组名?2、指针函数和函数指针有什么区别?实验七 结构体7.1 实验类型:验证型实验 2 学时7.2 实验目的1、掌握结构体变量的定义和使用;2、掌握结构体数组的定义和使
25、用;3、了解链表的概念,学习使用指针构造和操作简单链表;4、了解堆内存分配技术;7.3 知识点介绍1、C 提供了丰富的基本数据类型,为了解决复杂的实际问题,C 允许用户自定义数据类型:结构体类型、共用体类型、枚举类型2、结构体类型:包含若干个不同数据类型的数据项。结构体类型定义(规定)了一组数据项的信息组织结构,相当于一个模型,系统并没有为其分配存储单元,只有在定义了结构体变量时,系统才按照该结构类型的数据项的信息组织结构分配相应的存储单元。3、结构体变量可以向其他数据类型一样使用。可以定义结构体类型数组,可以定义结构类型指针,也可以定义结构体类型的引用。4、malloc 和 free:动态分
26、配和撤销内存。malloc 出来的内存空间必须用一个指针来向它,使用完成之后必须用 free 撤销掉,否则会造成内存泄露。5、共用体类型:不同的几个数据项占用同一块内存。使用共用体变量的目的是希望同一段内存存放几种不同类型的数据,但每一瞬间只能存放一种,而不是同时存放。7.4 实验内容题目 1 日期计算定义一个结构体变量(包括年、月、日) ,编程序,要求输入年月日,程序能计算并输出该日在本年中第几天。注意闰年问题。西南科技大学计算机学院 C 程序设计实验指导书21实验提示 算法提示见第三次实验计算生日时星期几测试数据1、 1 年 1 月 1 日是星期一2、 2 年 1 月 1 日是星期二3、
27、用上机日期5、 2000 年 1 月 1 日是星期六。思考与扩展1、修改程序,在程序中用指针方法访问结构体变量的成员。2、结构体变量占用的存储单元字节数是多少,能不能用 sizeof()求结构体变量字节数?题目 2 学生成绩管理有 5 个学生,每个学生的数据包括学号、班级、姓名、三门课成绩。从键盘输入 5 个学生数据,要求打印出每个学生三门课的平均成绩,以及平均分最高分学生数据(包括学号、班级、姓名、三门课成绩,平均分) 。要求:1、 定义学生结构体。2、 用一个函数实现 5 个学生数据的输入,用另一个函数负责求每个学生三门课程的平均成绩,再用一个函数求出平均分最高的学生并输出该学生的数据。要
28、求平均分和平均分最高的学生数据都在主函数种输出。3、用多文件程序结构实现。实验提示1、 结构体定义struct Studentint num; /学号 char name20; /班级注意字节长度char classname20; /班级 float score3; /三门课程成绩float aver_score; /平均分2、 数据组织提示:在主函数中定义一个结构体数组。Student stu20 /定义有 20 个变量的元素的结构体数组(根据需要 /确定数组的大小)。3、 结构体数组使用(1)循环输入学生信息:西南科技大学计算机学院 C 程序设计实验指导书22int stu_number
29、= 0 ; /学生个数printf(“please enter student number:“);scanf(stu_number )for( int i = 0; i stui. num stui. name stui. classname;cin stui.score0 stui.score1 stui.score2;(2)平均分计算函数 ,以数组名作参数void averagescore(student stu, int number)for( int i = 0; i= number; i+)Stui = (stui.score0+ stui.score1+stui.score2)/
30、3.0(3)求平均分最高的学生int averagescore(student stu, int number)int k = 0;/查找最高平均分并记录在数组中的下标值for( int i = 0; i= number; i+) return k; /返回最高平均分数组元素的下标测试数据自己设计一组测试数据思考与扩展如果这样定义结构体typedef struct Studentint num; /学号 char name20; /姓名 注意字节长度char classname20; /班级 float score3; /三门课程成绩float aver_score; /平均分 STU,* p
31、STU;说明如下三条语句的含义:student stu1;STU stu2; pSTU pstu;西南科技大学计算机学院 C 程序设计实验指导书23实验 八 文件操作8.1 实验类型:验证型实验 2 学时8.2 实验目的1、理解文本文件和二进制文件格式区别;2、掌握对文本文件 I/O 操作;3、掌握对文本文件 I/O 操作;8.3 知识点介绍ASCII 文件和二进制文件区别1)对于字符信息,在内存中是以 ASCII 代码形式存放的,因此,无论用 ASCII 文件输出还是用二进制文件输出,其数据形式是一样的。2)但是对于数值数据,二者是不同的。例如有一个长整数 100000,在内存中占 4 个字
32、节,如果按内部格式直接输出,在磁盘文件中占 4 个字节,如果将它转换为 ASCII 码形式输出,则要占 6 个字节。8.4 实验内容题目 1 二进制文件操作从键盘输入字符串并保存成文件。要求:1、输入字符串中包括:大小写字母、空格、数字等字符,以“#”作为字符串输入的结束条件;2、对输入的字符进行加密并保存,以二进制文件方式保存,用户可以输入保存路径,如:C : file.txt ;3、打开文件时,对加密文件进行解密并显示在屏幕上。实验提示1、使用 scanf 获取输入字符时,遇到空格时终止读取字符,为了避免这种情况,不能简单使用 scanf 来获取输入字符;2、加密方式:将字母 A 变成 E
33、,a 变成 e,即将字母变成其后的第 4 个字母, W 变 A,X 变成 B,Y变成 C, Z 变成 D,w 变 a,x 变成 b,y 变成 c,z 变成 d。解密方式:即加密方式的逆过程。西南科技大学计算机学院 C 程序设计实验指导书24测试数据自己设计测试数据,进行测试;在实验报告中,列出自己设计的测试数据。思考与扩展题目 2 学生信息管理有 5 个学生,每个学生的数据包括学号、班级、姓名、三门课成绩。从键盘输入 5 个学生数据。要求:1 计算出每个学生三门课的平均成绩,将原有数据和计算出的数据存放在磁盘文件stud 中2 从文件 stud 中得到数据,并按平均成绩高低进行排序,将排序的学生数据放在新文件 stud_sort 中。测试数据自己设计测试数据,进行测试;在实验报告中,列出自己设计的测试数据。思考与扩展