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;
}
posted @ 2025-06-04 21:25  gdyyx  阅读(33)  评论(0)    收藏  举报