{C++利用函数实现指定的功能(3)}菜大学生C++笔记12

第4章 利用函数实现指定的功能


例题
1、判断一个年份是否为闰年。
判断一个数是否为素数。
返回值类型bool 函数名 isPrime 参数 1个整数
#include < iostream>
using namespace std;
bool isPrime(int n)
{
int i;
if(n<2)
return 0;
for(i=2;i<=n/2;i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
int main()
{
int m;
cin>>m;
cout<<isPrime(m)<<endl;
return 0;
}

2、打印某个范围内所有的素数。
#include < iostream>
#include < cmath>
using namespace std;
bool isPrime(int n);
int main()
{
int n,count=0;
for(n=100; n<=200; n++)
{
if(isPrime(n))
{
cout<<n<<" ";
count++;
if(count%5= =0)
cout<<endl;
}
}
cout<<endl;
return 0;
}
//判断素数
bool isPrime(int n)
{
int i;
int t=sqrt(n);
for(i=2; i<=t; i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}

4.5 、 函数的嵌套调用 (除了main其他函数内部可以调用其他函数)
1 除了老大(main)其他都平等。(公司内部除了老板互相合作)
2 函数执行结束后,回到哪里?
在这里插入图片描述
函数执行结束后,回到它的直接调用者。

3、 有了两个数的最大值函数。再写个求4个数的最大值函数。
#include < iostream>
#include < cmath>
using namespace std;
int max2(int x,int y)
{
return x>y?x:y;
}
int max4(int a,int b,int c,int d)
{
int m;
m=max2(a,b);
m=max2(m,c);
m=max2(m,d);
return m;
}
int main()
{
cout<<max4(3,9,7,6) <<endl;
return 0;
}
4 写两个函数,求两个正整数的最大公约数和最小公倍数。
#include < iostream>
#include < cmath>
using namespace std;
int gcd(int m,int n);
int lcm(int m,int n);
int main()
{
cout<<gcd(12,8)<<endl;
cout<<lcm(12,8)<<endl;
return 0;
}
//求最小公倍数
int lcm(int m,int n)
{
return mn/gcd(m,n) ;
}
//求最大公约数
int gcd(int m,int n)
{
int t;
t=m%n;
while(t)//while(t!=0)
{
m=n;
n=t;
t=m%n;
}
return n;
}
4.6 、 函数的递归调用(函数之间可互相调用 。如果自己调用自己称为递归)
1 从前有座山,山上有座庙。。。。
2 直接或间接地调用该函数本身,称为函数的递归(recursive)调用
直接递归更多一些。
在递归中调用的是同一个函数,但是参数有变化。
能够把一个程序描述成与自己类似但规模更小。
递归分为两部分:1)递归项2)递归终止项。
1)递归项:描述成类似情况,参数有变化。向递归终止项方向变化。
2)递归终止项:已知情况,不需要再递归。
3 【例4.5】有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。请问第5个人多少岁?
在这里插入图片描述
在这里插入图片描述
4 用递归方法求n!(把自己调用自己看成调用其他函数)
#include < iostream>
using namespace std;
int fac(int n)
{
int s=1,i;
for(i=1;i<=n;i++)
{
s=s
i;
}
return s;
}
int main()
{
cout<<fac(5) <<endl;
return 0;
}

#include < iostream>
using namespace std;
int fac(int n)
{
if(n= =1 || n= =0)
{
return 1;
}
else
{
return n*fac(n-1);
}
}
int main()
{
cout<<fac(5) <<endl;
return 0;
}

#include < iostream>
using namespace std;
int fac(int);//函数声明
int main()
{
int n;//n为需要求阶乘的整数
int y;//y为存放n!的变量
cout<<“please input an integer :”;//输入的提示
cin>>n;//输入n
y=fac(n);//调用fac函数以求n!
cout<<n<<“!=”<<y<<endl;//输出n!的值
return 0;
}
int fac(int n)//递归函数
{
int f;
if(n<0)
{
cout<<“n<0,data error!”<<endl;//如果输入负数,报错并以-1作为返回值
f=-1;
}
else if (n= =0||n= =1) f=1;// 0!和1!的值为1
else f=fac(n-1)*n;// n>1时,进行递归调用
return f;// 将f的值作为函数值返回
}
在这里插入图片描述在这里插入图片描述
4.7 、 内置函数
inline (执行时效率高)
只将规模很小(一般为5个语句以下)而使用频繁的函数(如定时采集数据的函数)声明为内置函数。
内置函数中不能包括复杂的控制语句,如循环语句和switch语句。
内置函数只是对编译的一个建议。
4.8、 函数的重载
1、求2个数的和,求3个数的和,用两个不同名函数实现。
#include < iostream>
using namespace std;
int sum2(int a,int b)
{
return a+b;
}
int sum3(int a,int b,int c)
{
return a+b+c;
}
int main()
{
int x,y,z;
x=5;y=7;z=10;
cout<<sum2(x,y)<<endl;
cout<<sum3(x,y,z)<<endl;
return 0;
}

2 、2个数的和,求3个数的和,用2个同名函数实现。
#include < iostream>
using namespace std;
int sum(int a,int b)
{
return a+b;
}
int sum(int a,int b,int c)
{
return a+b+c;
}
double sum(double d1,double d2)
{
return d1+d2;
}
int main()
{
int x,y,z;
x=5;y=7;z=10;
cout<<sum(x,y)<<endl;
cout<<sum(x,y,z)<<endl;
cout<<sum(3.5,2.9)<<endl;
return 0;
}

3 构成重载的条件(参数不同:个数不同或者类型不同或者 个数与类型都不相同)
在调用函数时,系统会根据参数的个数与类型调用相应的函数。
4 参数类型个数都相同。但返回值类型不同也是重载吗?
不是,在系统中也不允许有这类的同名函数存在。
函数中的形参变量名与重载无关。
在这里插入图片描述
这几个函数都不是重载函数。
以下求平均值为两
#include < iostream>
using namespace std;
int ave(int a,int b)
{
return (a+b)/2;
}
double ave(double x,double y)
{
return (x+y)/2;
}
int main()
{
cout<<ave(3,8)<<endl;
cout<<ave(3.0,8.0)<<endl;
return 0;
}

4.9 、 函数模板(数据结构中要用)
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
#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,i;
double d1=56.87,d2=90.23,d3=-3214.78,d;
long g1=67854,g2=-912456,g3=673456,g;
i=max(i1,i2,i3);//调用模板函数,此时T被int取代
d=max(d1,d2,d3);//调用模板函数,此时T被double取代
g=max(g1,g2,g3);//用模板函数,此时T被long取代
cout<<“i_max=”<<i<<endl;
cout<<“d_max=”<<d<<endl;//(书中此处有误,改一下)
cout<<“g_max=”<<g<<endl;
return 0;
}

类型可变,个数不可变。
求两个整数的平均值,两个小数的平均值。
#include < iostream>
using namespace std;
int average(int x, int y)
{
return (x+y)/2;
}
double average(double x, double y)
{
return (x+y)/2;
}
int main()
{
cout<<average(3,4)<<endl;
cout<<average(3.5,4.7)<<endl;
return 0;
}
using namespace std;
template
T average(T x,T y)
{
return (x+y)/2;
}
int main()
{
cout<<average(3.5,4.7)<<endl;
cout<<average(3,4)<<endl;
return 0;
}

4.10 、有默认参数的函数
#include < iostream>
using namespace std;
double area(double r=1.0)
{
return 3.14159rr;
}
int main()
{
cout<<area()<<endl;
cout<<area(3)<<endl;
return 0;
}
如果一个函数有多个参数,其中有默认参数。把默认参数放到最后,不能放在中间。
void f1(float a,int b=0,int c,char d=‘a’); //不正确
void f2(float a,int c,int b=0, char d=‘a’);//正确

4.11 、局部变量和全局变量
1 变量只能定义在函数内吗?
不是,变量可以定义在函数外,函数内,复合语句中。
2 变量定义的位置不同作用域也不同。
函数外,函数内(最前面,复合语句中),如果同名,采用就近原则。
#include < iostream>
using namespace std;
int a=3;
int main()
{
cout<<a<<endl;
float a=5.5;
cout<<a<<endl;
{
char a=‘A’;
cout<<a<<endl;
}
cout<<a<<endl;
return 0;
}
在这里插入图片描述
3 函数的参数也是局部变量
4 在老大(main)中定义的变量也只能在main中使用。
在这里插入图片描述
5 同一个函数中不允许定义同名变量。那么不同函数中定义变量需要考虑是否与其他函数中的变量重名吗?
在不同的函数中可以定义同名变量,即使是同名变量,占用的也是不同的内存空间。互不影响。
6 全局变量定义在哪里?作用域有多大?
#include
using namespace std;
int a=3;
void f1();
int main()
{
cout<<“main:a=”<<a<<endl;
f1( );
cout<<“main:b=”<<b<<endl;//此处会出错吗?
return 0;
}
int b=10;
void f1()
{
cout<<“f1:a=”<<a<<endl;
cout<<“f1:b=”<<b<<endl;
}
4.12 、 关于变量的声明和定义(扩展变量的作用域)
#include < iostream>
using namespace std;
int a=3;
extern int b;
void f1();
int main()
{
cout<<“main:a=”<<a<<endl;
f1( );
cout<<“main:b=”<<b<<endl;
return 0;
}
int b=10;
void f1()
{
cout<<“f1:a=”<<a<<endl;
cout<<“f1:b=”<<b<<endl;
}
4.13 、 内部函数和外部函数
1 内部函数:如果一个函数只能被本文件中其他函数所调用,则称为内部函数。
2 外部函数:可以被其他文件的函数调用的称为外部函数(默认是外部,如果不想被其他文件中的函数调用,加static)
使用其他文件中的函数与变量。两个文件合作(把其他自定义函数放入另一个文件中)
步骤
1先创建只有一个文件的项目
2添加一个源文件
3在新建的文件中写源代码(#include,using。。。)
4在有main的文件中添加变量声明(extern,不可省略)
5在有main的文件中添加函数声明(extern,可以省略)
6在main中使用。
4.14、 头文件
头文件包含:对类型的声明,函数声明,内置函数的定义,宏定义,全局变量,外部变量声明。其他头文件。

静态变量 static
当一个变量申请为静态变量后,其所占内存空间在程序结束后才释放。第二次使用时保留上一次的值不变。
#include < iostream>
using namespace std;
void f()
{
static int i=1;
int j=1;
i++;
j++;
cout<<“i=”<<i<<endl;
cout<<“j=”<<j<<endl;
}
int main ( )
{
f();
f();
return 0;
}
作业:验证哥德巴赫猜想
#include
#include
using namespace std;
bool isPrime(int num)
{
for(int i=2; i<=sqrt(num); i++)
{
if(num%i==0)
{
return false;
}
}
return true;
} //判断i是否为num中的素数
int main()
{
cout<<“输入一个大于2的偶数”;
int num;
cin>>num;
int i=2;
while(!isPrime(i)||!isPrime(num-i))//i为第一个素数 num-i为第二个素数 当i或num-i不等于素数时i++
{
i++;
}
cout<<num<<“=”<<i<<“+”<<num-i;
return 0;
}
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C0ntr01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值