函数的定义和调用.docx
《函数的定义和调用.docx》由会员分享,可在线阅读,更多相关《函数的定义和调用.docx(10页珍藏版)》请在冰点文库上搜索。
![函数的定义和调用.docx](https://file1.bingdoc.com/fileroot1/2023-7/15/4f8a5f28-2989-48fc-9b6e-d6dada65903b/4f8a5f28-2989-48fc-9b6e-d6dada65903b1.gif)
函数的定义和调用
实验7函数的定义和调用
实验学时:
2学时
实验类型:
验证
实验要求:
必修
一.目的要求
(1)掌握函数的定义和调用。
(2)理解函数实参与形参的对应关系,以及“值传递”、“引用传递”的方式。
(3)掌握函数的嵌套调用和递归调用的方法。
二.实验内容
(1)编写—个函数把华氏温度转换为摄氏温度,转换公式为:
C=(F—32)+5/9。
(2)编写重载函数Max可分别求取2个整数、3个整数、2个双精度数、3个双精度数的最大值。
(3)使用系统函数pow(x,y)计算xy的值,注意包含头文件cmath,:
(4)用递归的方法编写函数求Fibonacci级数,观察递归凋用的过程:
、
(5)变量排序:
在主函数中定义三个整型变量a、b、c,并从键盘上输入三个变量的值。
再定义—个函数,实现将变量a、b、c按大小顺序排列。
三、实验原理、方法和手段
VisualC++6.0的函数调试
在实验2中提到VisualC++6.0提供两种单步调试方式:
StepOver(快捷键为F10)和Stepinto(快捷键为F11)。
StepOver在单步执行时,当函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,即将子函数整个作为一步;而StepInto在单步执行,遇到子函数就进入并且继续单步执行。
输入如下程序:
#include
intf(intn)
{returnn*n*n;}
voidmain()
{ints=0;
for(inti=0;i<=10;i++)
S+=f(i);
Cout<
}
编译通过后,按step over(F10)或stepInto(F11)进行但不跟踪。
当表示当前运行语句的箭头=>移动/A行,若按F10,则Visualc++将S+=f(i)作为一条语句运行;若按F11,则visualc++进入子函数,并进行跟踪,此时表示当前运行语句的箭头=>移动到f函数的起始位置。
此处也可以通过在函数的第一行设置断点,并采取go(F5)的方式快速进入函数进行调试。
在watch窗口变量中,也可以输入函数的调用。
程序员可根据函数调用的返回值是否正确以决定是否需要进入函数跟踪。
在watch变量窗口输入f(i),可观察到随着i的变化,其返回值跟着变化。
总之,灵活运用各种调试手段,将有助于程序员快速定位程序错误,提高程序调试的效率。
四、实验组织运行要求
本实验课以学生自主训练为主的开放模式组织教学,当老师在实验过程中发现了学生实验中存在的共同问题时,可要求学生暂停实验,对多数学生都存在的问题进行集中的讲授。
五、实验条件
软件配置:
WindowsXPProfessional、Visualc++6.0开发环境
硬件配置:
CPUP42.0G以上、内存512MB以上
六、实验步骤
(1)本程序是一段功能相对独立的程序写成一个函数,函数floatConvert(floatTempFer),参数和返回值都为float类型,实现算法C=(F-32)*5/9,在main()函数中实现输入F、输出C;main()函数调用Convert时,实参F的值传递给形参TempFer。
程序名:
lab7_1.cpp。
#include
usingnamespacestd;
floatConvert(floatTempFer){
floatF,C;
returnC=(F-32)*5/9;
}
voidmain()
{floatF,C;
cout<<"输入F:
";
cin>>F;
C=(F-32)*5/9;
cout<<"C="<}
(2)分别编写4个同名函数max,实现函数重载,在main()函数中测试函数功能。
程序名:
lab7_2.cpp。
函数的重载是以形参来区分的,形参必须不同(个数或类型不同)。
提升:
将以上函数重载用函数模板来实现。
#include
usingnamespacestd;
intmax(inta,intb){
if(a>b)
returna;
else
returnb;
}
intmax(inta1,intb1,intc1){
intm;
if(a1>b1)
m=a1;
else
m=b1;
if(c1>m)
m=c1;
else
m=m;
returnm;
}
doublemax(doublea2,doubleb2){
if(a2>b2)
returna2;
else
returnb2;
}
doublemax(doublea3,doubleb3,doublec3){
intn;
if(a3>b3)
n=a3;
else
n=b3;
if(c3>n)
n=c3;
else
n=n;
returnn;
}
voidmain(){
inta,b;
cout<<"输入两个整数:
";
cin>>a>>b;
cout<<"较大的数为"<inta1,b1,c1;
cout<<"输入3个整数:
";
cin>>a1>>b1>>c1;
cout<<"较大的数为"<doublea2,b2;
cout<<"输入2双精度数:
";
cin>>a2>>b2;
cout<<"较大的数为"<doublea3,b3,c3;
cout<<"输入3双精度数";
cin>>a3>>b3>>c3;
cout<<"较大的数为"<}
(3)在main()函数中提示输入两个整数x、y,cin语句得到x、y的值,调用pow(x,y)函数计算x的y次幂的结果,再显示㈩来、,程序名:
lab7_3.cpp。
#include
#include
intpower(intx,inty){
intval=1;
while(y--)
val*=x;
returnval;
}
voidmain(){
intx,y;
cout<<"输入两个数:
";
cin>>x>>y;
cout<<"x的y次方为:
"<}
(4)编写递归函数intfib(intn),在主程序输入n的值,调用fib函数汁算Fibonacci级数,,公式为fib(n)=fib(n-1)+fib(n-2),n>2;fib
(1)=fib
(2)=1;使用if语句判断函数的出口,在程序中用cout语句输出提示信息。
程序名:
lab7_4.cpp。
分析:
递归算法是一种非常简洁高效的算法,在利用调试功能跟踪递归程序的执行过程时,记录下递归过程中各个变量的值,会有助于对递归算法的理解。
使用Debug中的StepInto追踪别函数内部,观察函数的调用过程,参考程序
//lab7_4
#include
usingnamespacestd;
intfib(intn);
intmain()
{
intn,answer;
cout<<"Enternumber:
";
cin>>n;
cout<<"\n\n";
answer=fib(n);
cout<return0;
}
intfib(intn)
{
cout<<"Processingfib("<if(n<3)
{
cout<<"Return1!
\n";
return
(1);
}
else
{
cout<<"Callfib("<return(fib(n-2)+fib(n-1));
}
}
调试操作步骤如下:
选择菜单命令Build-StartDebug-Stepin,或按下快捷键F11,系统进入单步执行状态,程序开始运行,并出现—个DOS窗口,此时VisualStudio中光标停在main()函数的入口处。
把光标移到沿句“answer=fib(n)”前,从Debug菜单或Debug工具栏中单击RuntoCursor,在程序运行的DOS窗口,或按提示输入数字10,这时回到VisualStudio中,光标停在第11行,观察一下n的值(观察方法见实验二)。
从Debug菜单或Debug工具栏中单击StepInto,程序进入fib函数,观察—下n的值,把光标移到语句“return(fib(n-2)+fib(n-1))”前,从Debug菜单或Debug工具栏中单击RuntoCursor,在单击StepInto,程序递归调用fib函数,再进入fib函数,观察一下n的值。
继续执行程序。
参照上述的方法,观察程序的执行,加深对函数调用和递归调用的理解。
再试试Debug菜单栏中别的菜单项,熟悉Debug的各种方法。
#include
#include
usingnamespacestd;
intfib(intn){
if(n<3)
{
return1;
}
else
returnfib(n-2)+fib(n-1);
}
voidmain()
{
intn;
cout<<"输入一个数:
"<cin>>n;
cout<<"级数是"<}
(5)变量排序
分析:
排序可用关系运算来实现。
需要注意的是,普通的函数实参与形参之间采用值传递,也即在函数中对形参的值进行排序,对实参无影响,因此本题应采用引用传递。
#include
#include
usingnamespacestd;
intfib(intn){
if(n<3)
{
return1;
}
else
returnfib(n-2)+fib(n-1);
}
voidmain()
{
intn;
cout<<"输入一个数:
"<cin>>n;
cout<<"级数是"<}
七、思考题
在第
(1)题中在main()函数不写语句cout<<”TempFer=”<在第(5)题中请读者总结引用传递的特点及其适用场合。
八、实验报告
要求实验报告的内容包括实验目的、实验设备、实验内容、实验结果、思考题五个部分。
九、其它说明