文件作用域
在函数外定义的变量称为全局变量。
全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。
当在块作用域内的变量与全局变量同名时,局部变量优先。
在块作用域内可通过作用域运算符“::”来引用与局部变量同名的全局变量。
示例C++代码如下:
#include<iostream>
using namespace std;
int i = 100;
int main()
{
int i, j = 50;
i = 18;
::i = ::i + 4; //访问全局变量
j = ::i + i;
cout << "::i = " << ::i << endl;
cout << "i = " << i << endl;
cout << "j = " << j << endl;
return 0;
}
运行结果如下:
存储类
Attention!!!
由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为0。
全局变量的存储方式(extern static)
全局变量是在函数的外部定义的,编译时分配在静态存储区,如果未赋初值,其值为0
1、extern 存储类别
全局变量的默认方式,当在一个文件中要引用另一个文件中的全局变量或在全局变量定义之前要引用它时,可用extern作说明,相当于扩大全局变量的作用域。
2、静态(static)存储类别
它仅能在本文件中引用,即使在其它文件中用extern说明也不能使用。相当于限制了全局变量的作用域范围。
如何让extern引用的文件在本文件中生效?建项目project
运行结果如下:
全局静态变量
就如上例中的变量a,extern引用的文件中也调用了变量a
内联函数
使用内联函数时应注意以下几点:
1、C++中,除在函数体内含有循环、switch分支及复杂嵌套的if语句外,所有的函数均可定义为内联函数。
2、内联函数也要定义在前,调用在后。形参与实参之间的关系与一般的函数相同。
3、对于用户指定的内联函数,编译器是否作为内联函数来处理由编译器自行决定。声明内联函数时,只是请求编译器当出现这种函数调用时,作为内联函数的扩展来实现,而不是命令编译器要这样去做。
4、内联函数的实质是采用空间换取时间,即可加速程序的执行,当出现多次调用同一内联函数时,程序本身占用的空间将有所增加。如上例中,内联函数仅调用一次时,并不增加程序占用的存储空间。
具有缺省参数值的函数
Attention!!!
使用具有缺省参数的函数时,应注意以下几点:
- 1、不可以靠左边缺省
- 2、函数原型说明时可以不加变量名
float v(float,float=10,float=20);
- 3、只能在前面定义一次缺省值,即原型说明时定义了缺省值,后面函数的定义不可有缺省值。
函数的重载
所谓函数的重载是指完成不同功能的函数可以具有相同的函数名。 C++的编译器是根据函数的实参来确定应该调用哪一个函数的。
函数重载的条件
- 1、定义的重载函数必须具有不同的参数个数,或不同的参数类型。只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。
- 2、仅返回值不同时,不能定义为重载函数。即仅函数的类型不同,不能定义为重载函数
(1)利用递归实现n!
#include<iostream>
using namespace std;
int f(int n)
{
if(n == 1 || n == 0)
return 1;
else
return f(n - 1) * n; //不加return只返回1
}
int main()
{
int n;
cin >> n;
if(n >= 0)
cout << "n! = " << f(n) << endl;
else
cerr << "Input Error!" << endl;
return 0;
}
测试运行结果如下:
(2)编写一个函数px(float x,int n)用递归的方法求下列级数前n项的和s。
详细C++代码如下:
#include<iostream>
using namespace std;
float power(float x, int n)
{
float m = x;
for(int i = 1; i < n; i++)
{
m *= x;
}
return m;
}
float px(float x, int n)
{
float S = 0.0;
for(int i = 1; i <= n; i++)
{
if(i % 2 == 0)
{
S -= power(i, n);
}
else
{
S += power(i, n);
}
}
}
int main()
{
float x;
int n;
cin >> x >> n;
cout << px(x, n);
return 0;
}
测试运行结果如下:
(3)输入一个整数,用递归算法将整数倒序输出。
#include<iostream>
using namespace std;
void reverse(int n)
{
if(n == 0)
return;
cout << n % 10;
reverse(n / 10);
}
int main()
{
int n;
cin >> n;
reverse(n);
return 0;
}
测试运行结果如下:
(4)编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积,并计算边长为1的正方形、及其内切圆、内接等腰三角形(地边与正方形一条边重合)和等腰梯形(下底边与正方形一条边重合,上底边长度为正方形边长的一半)的面积。
#include<iostream>
using namespace std;
#define PI 3.1415926
float Circle(float r)
{
return r * r * PI;
}
float Rectangle(float w, float h)
{
return w * h;
}
float Trapezoid(float up, float down, float h)
{
return (up + down) * h / 2;
}
float Triangle(float down, float h)
{
return h * down / 2;
}
int main()
{
cout << Rectangle(1, 1) << endl;
cout << Circle(0.5) << endl;
cout << Triangle(1, 1) << endl;
cout << Trapezoid(0.5, 1, 1);
return 0;
}
运行结果如下:
(5)设计函数,根据三角形的三边长求面积。如果不能构成三角形,给出提示信息。
#include<iostream>
#include<math.h>
using namespace std;
float Area(float a, float b, float c)
{ //用海伦公式
float p = (a + b + c) / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
int Judge(float a, float b, float c)
{
int num = 0; //满足条件的次数
//两边之和大于第三边&&两边之差小于第三边
if(a + b > c && fabs(a - b) < c)
num++;
if(a + c > b && fabs(a - c) < b)
num++;
if(b + c > a && fabs(b - c) < a)
num++;
if(num != 3) //不可构成三角形
return 0;
else
return 1;
}
int main()
{
float a, b, c;
cin >> a >> b >> c;
while(!Judge(a, b, c))
{
cout << "Not Triangle!!! Please Input again!" << endl;
cin >> a >> b >> c;
}
cout << Area(a, b, c) << endl;
return 0;
}
运行结果如下:
(6)编写计算组合数的函数cmn(int n,int m),实现如下杨辉三角形的输出。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
组合数公式如下:
#include<bits/stdc++.h>
using namespace std;
int cmn(int n, int m)
{
if(m == n)
return 1;
if(m == 0 || n == 0)
return 1;
if(m == 1 && m != n)
return n;
return cmn(n - 1, m - 1) + cmn(n - 1, m);
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= i; j++)
{
cout << setw(6) << cmn(i, j) << " ";
}
cout << endl;
}
return 0;
}
样例运行结果如下: