23C++函数(1)
一、认识函数
(第71课 一见如故)
有些问题的程序太长或太复杂,编写起来就会很困难,如果我们将一个复杂的问题分解成多个较小、较简单的子问题,就会比较容易解决。在C++中可以利用函数来实现一些小功能,一个函数就是一个功能。
一个程序文件中可以包含若干个函数。无论把一个程序划分为多少个程序模块,有且只有一个main函数。程序总是从main函数开始执行,在程序执行时main函数可以调用其他函数,其他函数也可以互相调用,但其他函数不能调用main函数。
示例1:狐狸老师,您先定义一个输出三个“*”号的函数,让我们学习一下吧。
#include <iostream>
using namespace std;
void show(void)
{
cout<<"***";
}
int main()
{
show();
return 0;
}
本程序执行过程如下图:

函数有两种,一种是库函数,也称为系统函数,如随机函数rand()。另一种就是用户自己编写程序时根据需要定义的函数,称为自定义函数,如show()。show()函数的类型是void,表示无返回值,其参数类型为void,表示没有参数,调用时不必也不能给出参数,如图:

大多数情况下,函数是带有参数的,主函数和被调用的函数之间有数据传递关系。在定义函数时,函数名后面括号中的变量名称为形式参数(简称“形参”),在调用函数时,函数名后面括号中的参数称为实际参数(简称“实参”)
示例2:老师,您再定义一个输出n个“”号的函数,利用它输出三角形的“”号图吧。

在定义函数时,必须在函数首部指定形参的数据类型,实参变量对形参变量的数据传递是“值传递”,即单向传递,只能由实参传给形参,不能由形参传回实参。有时候,实参的变量名和形参的变量名一样,但它们是两个不同的变量,有自己不同的存储单元。
定义一个输出n个“”的函数,利用它输出三角形的“”号图,其中输出的行数在程序运行时输入。
#include <iostream>
using namespace std;
void show(int geshu)
{
int i;
for(i=1;i<=geshu;i++)
cout<<"*";
cout<<endl;
}
int main()
{
int i, n;
cout<<"行数:";
cin>>n;
for(i=1;i<=n;i++)
show(i);
return 0;
}
英汉小词典
void[void]无参数;无返回值;无类型
练习
(1)解释程序与编译程序的区别是()。
A.解释程序是应用软件,而编译程序是系统软件
B.解释程序将源程序翻译成目标程序,而编译程序是逐条解释执行源程序语句
C.编译程序将源程序翻译成目标程序,而解释程序是逐条解释执行源程序语句
D.解释程序解释执行汇编语言程序,编译程序解释执行源程序
(2)阅读程序写结果。
#include <iostream>
using namespace std;
void fun(int n)
{
for(int i=l; i<n; i++)
cout<<i;
}
int main()
{
int x;
cin>>x;
fun(x);
return 0;
}
输入:5
输出:
(3)完善程序。
运用自定义函数输出图形,运行时输入几个数,第1个数,表示行数(100以内),后面的数表示每行“”号的个数。如输入3 4 7 12,其中3表示一共有3行,4表示第1行中“”号的个数,7表示第2行中“”号的个数,12表示第3行中“”号的个数。
#include <iostream>
using namespace std;
void show(int geshu)
{
int i;
for(i=l;i<=geshu;i++)
cout <<"*";
cout <<endl;
}
int main()
{
int i,hangshu,a[101];
cout<<"行数:";
__________;
for(i=1;ic=hangshu; i++)
{
cout<"第"<<i<<"行个数:";
cin>>a[i];
}
for(i=1; i<=hangshu;i++)
__________;
return 0;
}
二、局部变量与全局变量
(第72课 函数与最大值)
定义一个求两个整数最大值的函数,利用它求出5个整数的最大值。
编程思路,定义一个求两个整数最大值的函数,先求出前两个数的最大值,然后将求出的最大值和第3个数进行比较,求前3个数的最大值,以此类推,求出5个数的最大值。
#include <iostream>
using namespace std;
int max(int x, int y)
{
int ans;
if(x>y)ans=x;
else ans=y;
retum ans;
}
int main()
{
int i, ans, a[5];
for(i=0;i<5;i++)
cin>>a[i];
ans=a[0];
ans=max(ans, a[1]);
ans=max(ans,a[2]);
ans=max(ans, a[3]);
ans=max(ans, a[4]);
cout << ans << endl;
return 0;
}
在本程序中,main函数和max函数内都定义了变量ans,名字相同,这样可以吗?这是可以的,在前一课中我们已学过,虽然名字相同,却在两个不同的函数内被定义,它俩只存在于自己的函数内,属于两个不同的变量,是局部变量。
在函数内部定义的变量,是局部变量,它只在本函数范围内有效,也就是说,只有在本函数内才能使用它们,在此函数以外是不能使用的。
定义在所有函数外部的变量是全局变量,可以为本程序中程序中全局变量定义语句后面的其他函数所共用,即它的有效范围为从定义变量的位置开始到本程序结束。
#include <iostream>
using namespace std;
int ans,a[5]; //全局变量,此位置后面的函数都可以使用它
int max(int x,int y)
{
if(x>y) return x;
else return y;
}
void fun1(void)
{
int i;
for(i=0;i<5;i++)
cin>>a[i];
ans=a[0];
for(i=1;i<5;i++)
ans=max(ans,a[i]);
}
int main()
{
fun1();
cout<<ans<<endl;
return 0;
}

小提示:
全局变量在定义时若没有赋初值,其默认值为0,而局部变量在定义时若没有赋初值,其默认值是随机的。全局变量在程序执行的全过程中一直占用内存单元,而局部变量的内存单元是临时分配的,当函数(或程序块)执行完毕,局部变量的内存单元就被释放,其值无法保留到下次使用。
练习
(1)算法与程序的关系()。
A.算法决定程序,是程序设计的核心
B.算法是对程序的描述
C.算法与程序之间无关系
D.程序决定算法,是算法设计的核心
(2)阅读程序写结果
#include <iostream>
using namespace std;
int fun(int a)
{
int sum=1;
for(int i=1;i<a;i++)
sum*=a;
returm sum;
}
int main()
{
int n, ans;
cin>>n;
ans=fun(n);
cout << ans << endl;
return 0;
}
输入:4
输出:
(3)完善程序。
对于自然数a,它的约数个数用函数fm(a)表示。请输出从1~100中约数个数为3的所有自然数。如4,它的约数有1、2、4,其约数个数就是3。
#include <iostream>
using namespace std;
int fun(int a)
{
int num=0;
for(int i=l;i<=a;i++)
if(_______) num++;
retum num;
}
int main()
{
int a;
for(a=l;a<=100;a++)
if(____)cout<<a<<endl;
return 0;
}
三、函数应用之找丑数
(第73课 丑数_函数应用)
我们把只包含2、3、5这三个质因子的自然数称为丑数。例如6、8都是丑数,但14不是,因为它包含质因子7。习惯上,我们把1当作是第一个丑数。先定义一个判断丑数的函数,利用它输出1~100之间所有的丑数,并统计出个数。
根据丑数的定义,丑数只能被2、3和5整除。也就是说一个数如果能被2整除,就连续除以2:如果能被3整除,就连续除以3;如果能被5整除,就连续除以5。如果最后我们得到的数是1,那么这个数就是丑数,否则不是。
#include <iostream>
#include <iomanip>
using namespace std;
bool choushu(int n)
{
while(n%2==0)
n/=2;
while(n%3==0)
n/=3;
while(n%5==0)
n/=5;
return (n==1);
}
int main()
{
int num=0;
for(int i=1;i<=100;i++)
if(choushu(i))
{
cout<<setw(6)<<i;
num++;
if(!(num%10)) cout<<endl;
}
cout<<endl;
cout<<"个数:"<<num<<endl;
return 0;
}
练习

(2)阅读程序写结果。
#include <iostream>
using namespace std;
int wanshu(int n)
{
int sum=0;
for(int i=l;i<n;i++)
if(n%i==0)sum+=i;
return(sum==n);
}
int main()
{
int ans=0;
for(int i=4;i<8;i++)
if(wanshu(i)) ans++;
cout << ans << endl;
return 0;
}
输出:__________
(3)完善程序。
定义一个判断回文数的函数,利用它输出100~10000所有的回文数,并统计出个数。
#include <iostream>
#include <ipmanip>
using namespace std;
bool huiwen(int m)
{
int temp=m,n=0;
while(temp)
{
n=n*10+temp%10;
_____________;
}
return (m==n);
}
int main()
{
int num=0;
for(int i=100; i<=10000; i++)
if(____)
{
cout << setw(6)<<i;
num++;
if(!(num%10)cout<<endl;
}
cout<<"个数: "<<num<<endl;
return 0;
}

浙公网安备 33010602011771号