C实验指导书2.0

更新时间:2024-05-06 23:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

西南科技大学计算机学院C程序设计实验指导书

《C程序设计语言》

实验指导书

信息教研室编

西南科技大学计算机科学与技术学院

2006年8月

1

西南科技大学计算机学院C程序设计实验指导书

实验一 简单的C语言程序

1.1 实验类型:验证型实验 2学时 1.2 实验目的

1、熟悉并学习使用C程序编译平台TurboC;

2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的C程序; 3、掌握C语言基础数据类型,熟悉变量定义和赋值方法; 4、学会使用C算术运算符和算术表达式;

1.3 知识点介绍

1、C程序的结构。

一个程序有多个程序单位构成,每一个程序单位作为一个文件,编译系统分别对每个程序文件分别编译,然后连接起来形成可执行程序。

在一个程序单位中包含以下几部分: 预处理命令 全局声明部分

函数(有函数首部和函数体组成),一个C必须有一个(而且只能有一个)main()函数。

2、C数据类型和表达式

C有多种数据类型,数据类型隐含着该类数据的表示、存储及处理规则。

C运算符丰富,使用十分灵活。有运算符和括号将运算对象(操作数)连接起来,构成表达式。表达式中混合运算式要注意运算符的优先级和结合性。此外,不同数据类型运算时,存在类型转换(隐式自动转换和强制转换)。

3、C程序的编写实现

用C语言编写程序——对源程序文件进行编译声称目标文件——对目标文件连接形成可执行程序——运行程序得到结果——分析结果。

1.4 实验内容

题目1 最简单的C程序

按提示的操作步骤,输入下面程序代码,编译连接并执行。

2

西南科技大学计算机学院C程序设计实验指导书

[实验提示]

按照操作步骤创建第一个应用: (1)编辑你的第一个C源程序 (2)保存你的源文件

(3)编译、连接得到可执行程序 (4)改正源程序中的错误 (5)运行你的第一个程序 [思考与扩展]

1、如果程序中大小写输入错误如main 写成Main,结果会怎样?

2、编译运行通过后,本程序输出了一行字符,如果还想输出一行字符:

\

程序代码该如何修改添加?

提示:注意使用换行控制符 ’\\n’

题目2 简单应用—求圆柱体的体积

输入下面程序代码,编译运行。

[实验提示]

按照第一题的操作步骤新建工程,输入代码,编译连接,执行程序,输入测试数据分析结果是否正确,如有错误改正后再重新编译连接,直到没有错误为止。 [测试数据]

运行时输入:

5 8

3

西南科技大学计算机学院C程序设计实验指导书

-2 1

[思考与扩展]

1、如果运行时输入 3.8 5

程序的输出结果是什么,正确吗?将程序中变量radius, high改为double类型,然后输入上面的测试数据,结果怎么样?说明原因。

2、注意输入提示和输出提示语句,尝试修改输入输出提示语句。

题目3 温度转换

输入华式温度,要求输出摄式温度。公式C=5/9*(F-32),输入输出要有文字说明,取两位小数。 [测试数据]

运行时输入:

30 17

实验二 选择结构

2.1 实验类型:验证型实验 2学时 2.2 实验目的

1、掌握C程序控制的基本结构:选择结构的实现; 2、掌握简单C程序的编写和调试

2.3 知识点介绍

1、关系运算、逻辑运算,关系表达式和逻辑表达式。 2、选择结构:if语句,switch语句的应用。

2.4 实验内容

题目1 计算员工周工资

编写一个程序,输入某雇员的每周工作时间(以小时计)和每小时的工资数,计算并输

4

西南科技大学计算机学院C程序设计实验指导书

出他的工资。若雇员周工作小时超过40小时,则超过部分按原工资的1.5倍的加班工资来计算。若雇员每周工作小时超过60小时,则超过60的部分按原工资的3 倍的加班工资来计算,而40到50小时的工资仍按照原工资的1.5倍的加班工资来计算。

1、要求有输入提示和输出提示,如要输入雇员的工作时间和每小时的工资值时,可以提示:

“Please input employee’s work time and wage_per_hour:” 输出时,提示:

“The employee’s wage :”。

2、给你的程序加上注释,并注意排版格式,使得其清晰可读。 [实验提示]

1、从本次实验开始,我们开始编写稍微复杂的程序,涉及到一些简单的算法,请务必按实验要求养成良好编程的习惯,再次强调:

代码要写整齐,注意排板规范。。

给你的变量起个好名字,不要什么变量都用a,b,c?等,变量最好用英文单词或单词的缩写命名,变量名字要体现变量在程序的含义和作用。

要有必要的注释!!,养成这一良好的习惯很重要,请记住,“代码只被书写一次,而它被修改和阅读的次数可能是无限的”

2、本程序可以使用if语句和switch语句分别实现流程图分别如下: Cin>>worktime>>wageph (worktime <=40) 假(0) 真(1) (worktime <=60) 真(1) 假(0) Wage= worktime* wageph Wage=( (worktime-40)*1.5+40) *wageph Wage=( (worktime-60)*3.0+ (60-40)*1.5)+ 40) *wageph 输入 cout<

5

西南科技大学计算机学院C程序设计实验指导书

依此类推,共进行9轮比较,a[0]~a[9]中已按由大到小的顺序存放。

2、 排序完成后,这15个成绩按由大到小的顺序排列,此时用折半查找法查找某一个成绩效率较高。

折半查找法算法思想:假如有以按由小到大排好序的9个数,a[0]~a[8],其值分别为:1 3 5 7 9 11 13 15 17 若想查3是否在此数组中,可以先找出表列中居中的数,即a[4],将要找的数3与a[4]比较,a[4]值是9,发现a[4]>3,显然3应当在a[0]~a[4]范围内,而不会在a[5]~a[8]范围内。这样就可以缩小查找范围,甩掉a[5]~a[8]这一部分,即将查找范围缩小为一半。再找a[0]~a[4] 中居中的数,即a[2],将要找的数与a[2] 比较,a[2]的值是5,发现a[2]>3,显然3应当在a[0]~a[2]范围内。这样又将查找范围缩小了一半。再将3与a[0]~a[2]范围内居中的数a[1]比较,发现要找的数3等于a[1],查找结束。一共比较了3次。 [测试数据]

自己选择15数据输入。查找某一成绩时,分别选用在15个中的成绩和没有在15成绩中的数据测试。 [思考与扩展]

1、 将选择法排序与起泡法比较,分析它们的特点和效率。

2、 如果采用顺序查找的办法,即从第一个元素开始对比一直到找到与之相等的元素,和折半查找法相比,那个效率高?

3、 数组名作为函数参数,形参和实参的关系?

题目2 矩阵相乘

将两个给定的距阵(3X3)相乘得到另一个距阵并将其打印出来。提示:

?a11??a21?a ?31a12a?13?a22a?23a32a?33?3?b11b12??b21b22?bb32 X ?31b13??b23?b33?? =

?c11??c21?c?31c12c22c32c13??c23?c33??

k?1其中

要求:

1、从键盘输入两个矩阵,并输出结果矩阵。矩阵的输入输出要求行列对齐。 2、把矩阵相乘写成函数形式,在主函数中完成矩阵的输入输出。

cij??aikbkj

[实验提示]

1、定义三个数组a[2][2],b[2][2],c[2][2] 2、注意c数组的每一个元素

cij??aikbkjk?13

11

西南科技大学计算机学院C程序设计实验指导书

则应设计一个嵌套循环,一共有三个循环变量:i,j,k

for(i=0;i<3;i++;) {

for(j=0;j<3;j++;)

{

for(k=0;k<3;k++;) {

c[i][j] += a[i][k]*b[k][j]

} } } [测试数据]

自己选择一组数据输入。

题目3 字符串连接

编一程序,将两个字符串连接起来。结果取代第一个字符串。 要求

1、用字符数组,不用strcat函数; 2、用C标准中的strcat函数; [实验提示]

1、采用字符数组的方法。算法:定义的两个字符数组,第一个数组的大小应大于两个字符数组的有效大小。在串接时要注意字符处结束标志:如下图所示:

Str1[20]

I L O V E \\0 [实验提示]

1、采用字符数组的方法。算法:定义的两个字符数组,第一个数组的大小应大于两个字符数组的有效大小。在串接时要注意字符处结束标志:如下图所示:

Str1[20]

I L O V E \\0

Str2[10]

C + + \\0

串接后:str1[20]

I L O V E C + + \\0 串接过程:

1)首先找到第一个字符串的结束标志即末尾str1[5]。 2)执行str1[5+i] = str[i] 直到str[i] != ‘\\0’

12

西南科技大学计算机学院C程序设计实验指导书

3)给字符串str1末尾添加‘\\0’ 2、函数原形 strcat(char[],const char[])使用时实参只需给出数组名,如 strcat(str1,str2)使用时要确保str1数组不会溢出。 [测试数据]

自己选择一组数据输入。 [思考与扩展]

字符数组和字符串数组有什么联系或区别?

实验五 函数

5.1 实验类型:验证型实验 2学时 5.2 实验目的

1、掌握函数声明、定义和使用的方法; 2、掌握函数递归调用的方法;

3、掌握全局变量、局部变量、静态局部变量的概念和使用方法; 4、掌握定义头文件的方法,学会建立和调试多文件程序; 5、学习函数重载的实现;

3.3.3 知识点介绍

1、一个函数就是一个功能,在面向过程的结构化程序设计中,函数是程序的基本模块。 2、函数的定义:类型 函数名(参数表){}。

3、函数调用过程:程序先执行函数调用之前的语句,流程的控制转移到被调函数入口处,同时进行参数传递;执行被调函数种函数体的语句;流程返回调用函数的下一条指令处,将函数的返回值带回;接着执行主调函数中未执行的语句。

4、函数的嵌套调用:被调函数中又调用另一个函数。

5、函数的递归调用:一个函数直接或间接的调用自己,在实现递归时,再时间和空间上的开销比较大,但递归调用符合人们的思维,程序容易理解。

6、变量的作用域:全局变量和局部变量 变量的生存期:动态存储期,静态存储期

变量存储位置:内存中的静态区,内存中的动态区。寄存器存储。

13

西南科技大学计算机学院C程序设计实验指导书

3.3.4 实验内容

题目1 分析程序运行结果

输入下列程序,运行它,分析得到的结果。

要求:

1、阅读分析程序,给程序加上必要的注释 2、分析何以得出运行结果的原因

3、区分程序中那些是全局变量、局部变量、局部静态变量?这些变量的差别是什么? 4、说明函数调用时实参和形参对应关系及值传递方式? [实验提示]

运行时在程序中设置断点调试,观察各个变量值的变化以及函数的调用过程。 1、 设置断点调试你的程序观察函数调用的执行流程。具体做法是在函数调用语句处设置断点,再在该被调函数的函数体语句部分设置断点。

2、单步执行程序,观察程序的执行流程:函数调用时实参和形参的结合情况;程序从main函数转移到被调函数代码执行的及返回的流程,注意观察形参变量值的变化及形参变量的生存期。

14

西南科技大学计算机学院C程序设计实验指导书

[测试数据]

改变main( )函数中a的值令a = 10,改变func()函数中b的值令static int b=10;程序运行结果? [思考与扩展]

1、 将函数func()中的变量static int b=10;改为 int b,程序运行结果有什么变化。 2、 如果将main()函数中定义变量的语句 int a,b;移到程序第三行?程序运行结果有没有变化,为什么。

题目2 函数的递归调用和多文件结构

编写一个函数,求从n个不同的数中取r个数的所有选择的个数。其个数值为: 其中: n! = n*(n-1)*(n-2)*...*1。 1、基本要求:

主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0 0时,程序结束;

能检查输入数据的合法性,要求n>=1并且n>=r; 2、分别用递归和非递归两种方式完成程序设计; 3、多文件结构实现

将上面用非递归方式写成的程序改成用多文件结构表示。要求将main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。 [测试数据]:

输入:5 3 输入:10 20 输入:-1 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

15

西南科技大学计算机学院C程序设计实验指导书

[思考与扩展]

1、设置断点观察函数的递归调用和嵌套调用的执行流程。 2、递归函数的书写要点是什么?

3、在递归版本中,当n大到什么值时系统将发生栈溢出报错?你觉得递归和非递归函数哪种好些?,

4、多文件结构中头文件的作用是什么? 5、将程序划分为多个文件有什么好处?

1、对一种形式测试:分别在有标识符和注释掉程序中的标识符定义两种情况下编译运行。

2、对第二种形式测试:分别使表达式的值为0和非0两种情况下编译运行。 .

实验六 指针

6.1 实验类型:验证型实验 2学时 6.2 实验目的

1、掌握指针的概念、学会定义和使用指针变量;

2、掌握引用型变量的概念、学会定义和使用引用型变量; 3、学习使用指针数组和指向数组的指针; 4、学习使用指向字符串的指针变量; 5、学习使用指针和引用给函数传递参数;

6.3 知识点介绍

1、指针就是地址,一个变量的地址成为给变量的指针。指针变量就是用来专门存放另一个变量的地址。若果一个指针变量存放另一个变量的地址,我们就说指针变量指向该变量。

2、指针变量的类型是其指向变量或常量的数据类型,指针变量本身在内存中只占四个字节。

3、指针作为函数参数时不会改变实参指针变量的值,但可以改变实参所指向变量的值。 4、数组名代表数组的首地址,是一个指针常量。可以用一个指针变量指向一个数组,通过该指针可以对数组任意操作。

5 函数指针:函数名代表函数函数的入口地址,可以定义指向函数的指针变量用来指向函数。指针函数:函数返回值是指针(地址)。

6、 指针运算灵活,但容易出错。

7、变量的引用就是变量的别名。引用作形参不是传值,而是传递别名,即形参是实参的别名,并没有为形参分配存储单元。

16

西南科技大学计算机学院C程序设计实验指导书

6.4 实验内容 题目1 程序分析

输入下列程序,运行它,分析得到的结果。

要求:

1、给本题代码加上适当的注释,编译调试,分析说明程序运行结果。 2、如果将swap函数改为如下形式,程序运行结果是什么?分析说明。 void swappionter(int *p1,int *p2)

17

西南科技大学计算机学院C程序设计实验指导书

{ int * temp; temp = p1; p1 = p2; p2 = temp; }

3、如果将swap函数改为如下形式,主函数中函数调用改为:swap( iv1, iv2 ); 程序运行结果是什么?分析说明。 void swap(int &p1,int &p2) { int temp; temp = p1; p1 = p2; p2 = temp; } [实验提示]

1、 注意区分指针的定义,指针的引用。 2、 注意区分指针的值和指针指向对象的值。 [测试数据]

自己修改程序中部分代码,调试运行。 [思考与扩展]

1 归纳说明普通变量作形参、指针作形参、引用作函数形参得区别。

题目2 班级课程成绩计算

一个班有5名学生,每个学生修了五门课,1)求每个学生的平均成绩,并输出每个学生的学号,每门课程的成绩及平均直。2)求某门课程的平均分;

实现要求:

1、分别编写2个函数实现以上2个要求。

2、第1个函数用数组名作参数。第2个函数用指针用参数,并在函数体内用指针对数组操作。 [实验提示]

1、第一种方法: (1)程序数据结构

定义一个一维数组存储5学生学号:int num[5];定义一个二维数组存储5学生的成绩int sco[5][5],再定义一个一维数组存储5个学生的平均成绩int avsco[5];

(2)函数编写

求每个学生的平均成绩函数:void averscore ( int sco[][5] ,avsco[5] ),函数体中算法是计算sco[][5]每一行的平均值赋给avsco[5]的对应元素。

求某门课程的平均分函数:int avercourse( int(*psco)[5], n ) ,形参中int(*sco)[5]

18

西南科技大学计算机学院C程序设计实验指导书

是指向5个元素组成的一维数组的指针变量,n表示要查找第n门课程的成绩。如函数调用:avercourse( sco, 3),sco是二维数组名,3表示要计算第3门课程的平均分。函数体中计算psco所指向二维数组的第3列的平均值;

2、第二种方法, (1)程序数据结构

由于学号、成绩、平均成绩都是数值型数据,可以定义一个二维数组用来保存学生的信息——学号、5门成绩、平均成绩:int stu_info[5][7] 数组有5行7列,5行对应5个学生,7列分别对应学生的学号、5门成绩、平均成绩。当然没有计算平均成绩之前最后一列数据是0;

(2)函数编写

求每个学生的平均成绩函数:void averscore ( int stu_info[5][7] ),函数体中算法是计算stu_info[5][7]]每一行的第1到5列元素的平均值赋给第6列元素(第0列是序号)。

求某门课程的平均分函数:int avercourse( int(*psco)[7], n ) ,形参中int(*sco)[7] 是指向7个元素组成的一维数组的指针变量,n表示要查找第n门课程的成绩。如函数调用:avercourse( sco, 3),sco是二维数组名,3表示要计算第3门课程的平均分。函数体中计算psco所指向二维数组的第3+1列的平均值(第一列是学号); [测试数据]

自己选择一组数据输入。 [思考与扩展]

1、二维数组作为函数形参int avercourse( int(*psco)[5], n )中为什么要指定第二维的大小?

2、 在函数体中用指针操作二维数组比如:*(*(psco +i)+j)就代表数组第i行j列的元素即psco[i][j]。

题目3 排序查找(选做)

用选择法对15个整数安从大到小的顺序排序。15个整数用scanf 输入。 排序完成后输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。

要求:

1、把排序算法写成函数形式,用指针变量作为排序函数的参数,在排序算法中用指针法访问数组元素。

2、把查找算法写成函数形式,用指针变量作为查找函数的参数,在查找算法中用指针法访问数组元素。 [实验提示]

排序算法和折半查找法见实验4。

19

西南科技大学计算机学院C程序设计实验指导书

[测试数据]

自己选择一组数据输入。 [思考与扩展]

1、在调用函数时实参为什么只需给出数组名? 2、指针函数和函数指针有什么区别?

实验七 结构体

7.1 实验类型:验证型实验 2学时 7.2 实验目的

1、掌握结构体变量的定义和使用; 2、掌握结构体数组的定义和使用;

3、了解链表的概念,学习使用指针构造和操作简单链表; 4、了解堆内存分配技术;

7.3 知识点介绍

1、C提供了丰富的基本数据类型,为了解决复杂的实际问题,C允许用户自定义数据类型:结构体类型、共用体类型、枚举类型

2、结构体类型:包含若干个不同数据类型的数据项。结构体类型定义(规定)了一组数据项的信息组织结构,相当于一个模型,系统并没有为其分配存储单元,只有在定义了结构体变量时,系统才按照该结构类型的数据项的信息组织结构分配相应的存储单元。

3、结构体变量可以向其他数据类型一样使用。可以定义结构体类型数组,可以定义结构类型指针,也可以定义结构体类型的引用。

4、malloc和free:动态分配和撤销内存。malloc出来的内存空间必须用一个指针来向它,使用完成之后必须用free撤销掉,否则会造成内存泄露。

5、共用体类型:不同的几个数据项占用同一块内存。使用共用体变量的目的是希望同一段内存存放几种不同类型的数据,但每一瞬间只能存放一种,而不是同时存放。

7.4 实验内容 题目1 日期计算

定义一个结构体变量(包括年、月、日),编程序,要求输入年月日,程序能计算并输出该日在本年中第几天。注意闰年问题。

20

本文来源:https://www.bwwdw.com/article/395g.html

Top