2013级C++第12周程序阅读项目——理解函数

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759

第一部分 重重重要的技能:掌握单步执行,跟踪观察执行中变量的变化

阅读http://blog.csdn.net/sxhelijian/article/details/15026159中《CodeBlocks调试功能快捷教程》,通过运行示例,掌握CodeBlocks中调试功能。

今后在调试程序时,尽可能利用好调试功能,这是职业的要求。

第二部分 阅读代码,理解函数的用法

1、理解函数的默认参数

#include <iostream>
using namespace std;
const double pi=3.1415926;
float area(float r=6.5);//指定r的默认值为6.5
float volume(float h,float r=6.5); //指定r的默认值为6.5
int main( )
{
    cout<<area()<<endl; //相当于area(6.5);
    cout<<area(7.5)<<endl; //形参得到的值为7.5,而不是6.5
    cout<<volume(45.6)<<endl; //相当于volume(45.6,6.5)
    cout<<volume(34.2,10.4)<<endl; //h的值为34.2,r的值为10.4
    return 0;
}
float area(float r)
{
    return pi*r*r;
}
float volume(float h,float r)
{
    return pi*r*r*h;
}

① 运行程序,利用调试功能,观察变量和函数参数的值,结合课堂讲解,品味默认参数的作用。

② 去掉第4行的“=6.5”试试,出错的原因是____________________,给你的启示是_________________,若坚持这种改法,程序要做的改变是________________________。

③ 将第14行改为“float area(float r=6.5)”,出错的原因是__________________,给你的启示是____________________。

④ 将第5行“float h,float r=6.5”改为“float h=1,float r”,出错的原因是_____________,给你的启示是____________________;改为“float volume(float h=0,float r=6.5)”,结果会是_____________________,给你的启示_______________________________。

 

2、理解函数的重载

#include <iostream>
using namespace std;
int max(int a,int b,int c);           //函数声明
double max(double,double,double);    //函数声明,可以不写形参名只写形参类型
long max(long a,long b,long c);      //函数声明,形参a,b,c处可以只保留类型名
int max(int,int);                      //函数声明
int main( )
{
    int i1,i2,i3,i;
    cin>>i1>>i2>>i3;                         //输入3个整数
    i=max(i1,i2,i3);                         //求3个整数中的最大者
    cout<<"i_max="<<i<<endl;
    double d1,d2,d3,d;
    cin>>d1>>d2>>d3;                         //输入3个双精度数
    d=max(d1,d2,d3);                         //求3个双精度数中的最大者
    cout<<"d_max="<<d<<endl;
    long g1,g2,g3,g;
    cin>>g1>>g2>>g3;                         //输入3个长整数
    g=max(g1,g2,g3);                         //求3个长整数中的最大者
    cout<<"g_max="<<g<<endl;
    cin>>i1>>i2;                             //输入2个整数
    i=max(i1,i2);                            //求2个整数中的最大者
    cout<<"i_max="<<i<<endl;
    return 0;
}
int max(int a,int b,int c)                //定义求3个整数中的最大者的函数
{
    if(b>a) a=b;
    if(c>a) a=c;
    return a;
}
double max(double a,double b,double c)   //定义求3个双精度数中的最大者的函数
{
    if(b>a) a=b;
    if(c>a) a=c;
    return a;
}
long max(long a,long b,long c)           //定义求3个长整数中的最大者的函数
{
    if(b>a) a=b;
    if(c>a) a=c;
    return a;
}
int max(int a,int b)                //定义求2个整数中的最大者的函数
{
    if(b>a) a=b;
    return a;
}

① 运行程序,结合课堂讲解,品味函数重载的意义。

② 利用codeBlocks中的Debug功能,Step Into到函数内部,观察每次调用的是哪个函数,进一步理解重载中要调用的函数。

③ 将第4行加入默认参数的声明“double max(double,double,double=0.0);”,是否会出现编译错误?

④ 将第3行也加入默认参数的声明“int max(int a,int b,int c=0);”,情况又会怎样?请解释原因(仔细看书能获得答案)。

3、理解函数模板

#include <iostream>
using namespace std;
template<typename T>        //模板声明,其中T为类型参数
T max(T a,T b,T c)          //定义一个通用函数,用T作虚拟的类型名
{
    if(b>a) a=b;
    if(c>a) a=c;
    return a;
}
int main( )
{
    int i1=185,i2=-76,i3=567;
    double d1=56.87,d2=90.23,d3=-3214.78;
    long g1=67854,g2=-912456,g3=673456;
    cout<<"i_max="<<max(i1,i2,i3)<<endl; //调用模板函数,此时T被int取代
    cout<<"f_max="<<max(d1,d2,d3)<<endl; //调用模板函数,此时T被double取代
    cout<<"g_max="<<max(g1,g2,g3)<<endl; //调用模板函数,此时T被long取代
    cout<<"c_max="<<max('1','a','A')<<endl; //调用模板函数,此时T被long取代
    return 0;
}

① 运行程序,结合课堂讲解,品味函数模板的意义。

② 利用codeBlocks中的Debug功能,Step Into到函数内部,观察每次调用时函数的参数值,体会类型参数T每次调用时被不同实际类型替代。

时间: 2024-11-18 06:08:17

2013级C++第12周程序阅读项目——理解函数的相关文章

2013级C++第14周程序阅读

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 1.阅读下面筛法求素数的程序,理解其算法.代码请从CSDN博客的课程主页上下载.如果对运行结果和其背后的原理仍不理解,请通过单步执行的手段跟踪理解,学会观察数组在运行过程中的变化. #include <iostream> #include <iomanip> using namespace std; int main() { const int M=200;

2013级C++第12周(春)项目——成员的访问属性、多重继承

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读  1.阅读程序,分析类中成员的访问属性 #include <iostream> using namespace std; class A //A为基类 { public: void f1( ); int i; protected: void f2(); int j; private: int k; }; class B:

2013级C++第12周项目——函数应用

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-当年第几天] 定义一个函数,其参数为年.月.日的值,返回这一天为该年的第几天.要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果. [项目2-太乐了]先听故事,再编程序. 故事是这样的:话说sin和cos是一对夫妇.一天,sin去听相声了,cos在家.过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数.cos问:你是谁啊?

2015级C++第16周程序阅读 文件操作

1.请写出下面程序的输出结果 (1) #include <iostream> #include <fstream> using namespace std; int main() { fstream outfile,infile; outfile.open("data.dat",ios::out); outfile<<"1111111111"<<endl; outfile<<"aaaaaaaaaa

2015级C++第9周程序阅读 类和指针

阅读程序,写出程序的运行结果并理解其运行机制. (1) #include <iostream> using namespace std; class A { public: A(){cout<<"A";} ~A(){cout<<"~A";} }; class B { A *p; public: B() { cout<<"B"; p=new A(); } ~B() { cout<<&quo

2015级C++第14周程序阅读 STL中的简单容器和迭代器

阅读并运行程序,解释程序执行得到的结果 (1) #include<iostream> #include<vector> #include<iterator> using namespace std; int main() { vector<int> ivec; int i; for(i = 0; i < 5; i++ ) ivec.push_back(i); for(i = 0; i < 5; i++) cout<<ivec[i]&l

2013级C++第2周(春)项目——结构体应用大体验

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759,由课程主页,可以看到完整教学方案,所有参考解答 第一部分 结构体应用 [项目1-学生成绩统计]   每位同学的信息学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[12]).姓名(name).三门课的成绩(grade).总分(score).均分(average)). (1)从键盘上输入N名学生的信息(N定义为常变量

2013级C++第15周项目——二维数组

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-折腾二维数组]创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中.输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"),再将数组"倒"着输出(即最后一行最后一列的最先输

2013级C++第17周项目——字符串、指针应用

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-体会函数参数传递] 1.下面三段程序都试图通过定义函数,实现实际参数在必要时的交换,哪些能够实现,哪些不能实现?通过运行程序和单步执行,让自己对这一过程更加清楚,然后请在博文中给出明确的回答,并用你自己的话展开描述.) (1) #include <iostream> using namespace std; void jiaohuan(int x, int y