C实验指导书10.docx

上传人:b****3 文档编号:4977771 上传时间:2022-12-12 格式:DOCX 页数:25 大小:184.41KB
下载 相关 举报
C实验指导书10.docx_第1页
第1页 / 共25页
C实验指导书10.docx_第2页
第2页 / 共25页
C实验指导书10.docx_第3页
第3页 / 共25页
C实验指导书10.docx_第4页
第4页 / 共25页
C实验指导书10.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C实验指导书10.docx

《C实验指导书10.docx》由会员分享,可在线阅读,更多相关《C实验指导书10.docx(25页珍藏版)》请在冰豆网上搜索。

C实验指导书10.docx

C实验指导书10

《C程序设计语言》

实验指导书

信息教研室编

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

2006年8月

实验一简单的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程序

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

[实验提示]

按照操作步骤创建第一个应用:

(1)编辑你的第一个C源程序

(2)保存你的源文件

(3)编译、连接得到可执行程序

(4)改正源程序中的错误

(5)运行你的第一个程序

[思考与扩展]

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

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

"it’stooeasy!

"

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

提示:

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

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

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

[实验提示]

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

[测试数据]

运行时输入:

58

-21

[思考与扩展]

1、如果运行时输入

3.85

程序的输出结果是什么,正确吗?

将程序中变量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计算员工周工资

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

若雇员周工作小时超过40小时,则超过部分按原工资的1.5倍的加班工资来计算。

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

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

“Pleaseinputemployee’sworktimeandwage_per_hour:

输出时,提示:

“Theemployee’swage:

”。

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

[实验提示]

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

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

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

要有必要的注释!

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

2、本程序可以使用if语句和switch语句分别实现流程图分别如下:

(1)

(1)

假(0)

假(0)

Cin>>worktime>>wageph

(worktime<=40)

(worktime<=60)

Wage=worktime*wageph

Wage=((worktime-40)*1.5+40)

*wageph

Wage=((worktime-60)*3.0+(60-40)*1.5)+40)

*wageph

输入cout<

if—elseif语句实现流程图

Switch语句实现流程图

[测试数据]

输入:

304

输入:

454.5

输入:

605

[思考与扩展]

1、尝试分别用if和switch语句实现选择结构语句

2、测试数据的选择应该考虑选择结构中的每一种情况都被执行一次,也就是选择的测试数据应该具有代表性,对本题来说,选择的数据因该分几种情况:

1)小于40的数据 2)大于40而小于50的数据,3)大于50的数据,4)不合理的数据比如负数或大于7*24的数,(注意一周最多只有7*24小时),设计一组你的测试数据。

题目2设计一个计算+、-、*、/的程序

程序从标准输入读入表达式:

输入:

4+2回车

则输出:

4+2=6

输入:

4*2回车

则输出:

4*2=8

实现要求:

1、有输入提示和输出提示,如要输入表达式时,可以提示:

  "pealseintputarithmeticexpression:

"

 输出时,提示:

 "4+2=6"。

 计算在用户输入的非政策表达式时程序结束并提示输入错误。

2、为你的程序加上注释,使得其清晰可读。

3、尝试利用调试程序来修改你程序的逻辑错误。

[实验提示]

具体计算可采用switch语句实现

switch(operator)  //判断运算符

{

case'+':

result=operand1+operand2;

cout<

break;

case'-':

……

default:

……

}

[测试数据]

自己设计一组测试数据,要求覆盖switch选择结构的中所有路径即每条case语句都被执行一次。

[思考与扩展]

1、使用switch语句中的break起什么作用?

2、你还有更好的实现方法么?

 

实验三循环控制

题目1下面程序计算n!

要求:

1、看懂代码,添加必要的注释。

2、分别用fordo-while语句改写程序。

3、当程序运行时输入20,会遇到困难,请改写程序?

4、计算-1!

+2!

-3!

-…+20!

要求1)分别采用从左到右相加和从右到左相加的计算顺序;2)采用所有负项和所有正项分别相加

[实验提示]

1、设置断点调试程序。

在循环体语句部分设置几个断点,单步执行,观察需循环体语句的执行流程,即循环控制变量的变化,观察执行过程中个变量的值。

2、如果循环次数太大时,。

你应该设置合适的循环条件,使循环次数减少,否则单步执行完所有的循环次数太费时间,如某个循环共1000次,在调试时可以设置较小的循环次数10,待调试完毕再设置为1000。

[思考与扩展]

1、计算n!

时,当程序运行时输入20,会遇到困难,如何改写程序?

2、计算-1!

+2!

-3!

-…+20!

程序中使用的循环嵌套,可以用forwhiledo-while结构进行组合,有几种组合方式?

题目2计算生日时星期几

编写一个程序,只要输入年月日,就能回答那天是星期几。

[实验提示]

1、已知公元1年1月1日是星期一

2、算法提示:

如果输入的是2006年3月12日,计算方法是

(1)先计算从公元0001年初(0001-1-1)到2005年末(2005-12-31)共多少天,注意其中有闰年,闰年是366天,平年是365天。

闰年的判断条件满足(见教材例3.8题):

((year%4==0&&year%100!

=0)!

!

(year%400==0))

(2)然后再计算2006年1月1日到2006-3-12是多少天。

注意同样判断本年度是否闰年,即二月份是28天还是29天。

(3)上述两部分相加即从公元0001年初(0001-1-1)到2006年末(2006-3-12)的天数,用该天数模7(total%7)即得到星期数。

2、用户多次循环输入数据并计算可采用while语句实现:

//首先输入三个数据:

cout<<"pleaseenteryearmonthday:

"

cin>>year>>month>>day; //首先输入三个数:

年月日

while(year!

=0&&month!

=0&&month!

=0)

{

……//具体计算语句

//本次循环结束前再次输入三个数据(年月日),为下次循环计算做准备

cout<<"pleaseenteryearmonthday:

"

cin>>year>>month>>day;

}

[测试数据]

1、1年1月1日是星期一

2、2年1月1日是星期二

3、用上机日期

4、2000年1月1日是星期六

[思考与扩展]

1、用switch语句实现程序。

比较if和switch语句的区别。

2、对输入日期和理性检验,例如月份不能大于12,非闰年不得有2月29日,小月不得有4月31日

 

实验四数组

4.1实验类型:

验证型实验2学时

4.2实验目的

1、掌握一维数组和二维数组的定义、赋值和输入输出方法;

2、掌握字符数组和字符串的使用;

4.3知识点介绍

1、数组是有序数据的集合。

特点:

有序,元素必须是同一个类型,用下标标识每一个元素,数组在内存中占用一块连续的存储单元。

2、数组的定义:

定义时必须给出数组的大小(即数组元素的个数)。

数组使用时用下标标识特定的元素,注意使用时下标不要越界。

3、经常使用char类型的数组来处理字符和字符串。

字符数组和字符串数组的区别在于字符串数组有一个结束标志‘\0’.

4、常用的排序算法:

冒泡法和选择法。

4.4实验内容

题目1排序查找

用选择法对15个学生的成绩按从大到小的顺序排序,15个学生的成绩整数用scanf输入,如果输入的成绩不在[0,100]之间,则提示“输入错误”。

排序完成后,输入一个成绩,要求用折半查找法找出该成绩是该组中第几个元素的值(即第几名)。

如果该成绩不在数组中,则输出“无此成绩”。

[实验提示]

1、本题第一步首先对15个成绩排序,可使用冒泡法或选择法排序(冒泡排序算法见教材)。

选择法排序算法思想:

n原数组中选择最小的一个元素,把它和位于第一个位置的元素互换位置;然后,在剩下的n-1个元素中选择最小的一个元素,并把它和第一个位置的元素交换;不断重复这些过程,直到最后两个元素。

如:

设有10个元素a[0]~a[9],

第一轮:

将a[0]与a[1]~a[9]比较,若a[0]比a[1]~a[9]都小,则不进行交换,即无任何操作。

若a[1]~a[9]中有一个以上比a[0]小,则将其中最小的一个(假设为a[i])与a[0]交换,此时a[0]中存放了10个中的最小数。

第二轮将a[1]与a[2]~a[9]比较,将剩下的8个数中最小者a[i]与a[1]对换,此时a[1]中存放的是10个中第二小的数。

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

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

折半查找法算法思想:

假如有以按由小到大排好序的9个数,a[0]~a[8],其值分别为:

1357911131517

若想查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)相乘得到另一个距阵并将其打印出来。

提示:

X

=

其中

要求:

1、从键盘输入两个矩阵,并输出结果矩阵。

矩阵的输入输出要求行列对其。

2、把矩阵相承写成函数形式,在主函数中完成矩阵的输入输出。

[实验提示]

1、定义三个数组a[2][2],b[2][2],c[2][2]

2、注意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’

3)给字符串str1末尾添加‘\0’

2、函数原形strcat(char[],constchar[])使用时实参只需给出数组名,如strcat(str1,str2)使用时要确保str1数组不会溢出。

[测试数据]

自己选择一组数据输入。

[思考与扩展]

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

实验五函数

5.1实验类型:

验证型实验2学时

5.2实验目的

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

2、掌握函数递归调用的方法;

3、掌握全局变量、局部变量、静态局部变量的概念和使用方法;

4、掌握定义头文件的方法,学会建立和调试多文件程序;

5、学习函数重载的实现;

3.3.3知识点介绍

1、一个函数就是一个功能,在面向过程的结构化程序设计中,函数是程序的基本模块。

2、函数的定义:

类型 函数名(参数表){}。

3、函数调用过程:

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

4、函数的嵌套调用:

被调函数中又调用另一个函数。

5、函数的递归调用:

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

6、变量的作用域:

全局变量和局部变量

变量的生存期:

动态存储期,静态存储期

变量存储位置:

内存中的静态区,内存中的动态区。

寄存器存储。

3.3.4实验内容

题目1分析程序运行结果

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

要求:

1、阅读分析程序,给程序加上必要的注释

2、分析何以得出运行结果的原因

3、区分程序中那些是全局变量、局部变量、局部静态变量?

这些变量的差别是什么?

4、说明函数调用时实参和形参对应关系及值传递方式?

[实验提示]

运行时在程序中设置断点调试,观察各个变量值的变化以及函数的调用过程。

1、设置断点调试你的程序观察函数调用的执行流程。

具体做法是在函数调用语句处设置断点,再在该被调函数的函数体语句部分设置断点。

2、单步执行程序,观察程序的执行流程:

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

[测试数据]

改变main()函数中a的值令a=10,改变func()函数中b的值令staticintb=10;程序运行结果?

[思考与扩展]

1、将函数func()中的变量staticintb=10;改为intb,程序运行结果有什么变化。

2、如果将main()函数中定义变量的语句inta,b;移到程序第三行?

程序运行结果有没有变化,为什么。

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

编写一个函数,求从n个不同的数中取r个数的所有选择的个数。

其个数值为:

其中:

n!

=n*(n-1)*(n-2)*...*1。

1、基本要求:

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

能检查输入数据的合法性,要求n>=1并且n>=r;

2、分别用递归和非递归两种方式完成程序设计;

3、多文件结构实现

将上面用非递归方式写成的程序改成用多文件结构表示。

要求将main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。

建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。

[测试数据]:

输入:

53

输入:

1020

输入:

-14

输入:

503

输入:

00

[实验提示]

1、利用一个非递归函数fn(intn)计算n!

,利用另一个函数Cnr(intn,intr)计算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

[思考与扩展]

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、变量的引用就是变量的别名。

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

6.4实验内容

题目1程序分析

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

 

要求:

1、给本题代码加上适当的注释,编译调试,分析说明程序运行结果。

2、如果将swap函数改为如下形式,程序运行结果是什么?

分析说明。

voidswappionter(int*p1,int*p2)

{

int*temp;

temp=p1;

p1=p2;

p2=temp;

}

3、如果将swap函数改为如下形式,主函数中函数调用改为:

swap(iv1,iv2);

程序运行结果是什么?

分析说明。

voidswap(int&p1,int&p2)

{

inttemp;

temp=p1;

p1=p2;

p2=temp;

}

[实验提示]

1、注意区分指针的定义,指针的引用。

2、注意区分指针的值和指针指向对象的值。

[测试数据]

自己修改程序中部分代码,调试运行。

[思考与扩展]

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

题目2班级课程成绩计算

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

2)求某门课程的平均分

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1