函数的定义

函数定义的语法格式

数据类型 函数名(形式参数表){
  函数体
}
  • 函数的数据类型是函数的返回值类型(如数据类型void,则无返回值)
  • 函数名是标识符,符合标识符的规则,不能与main函数重名
  • 形式参数表可以是空的,也可以有多个参数
  • 函数不允许嵌套定义。

函数定义的例子

定义一个函数,返回两个数中的较大数

int max(int x,int y){
  return x>y?x:y;
}

函数的形式

函数的形式从结构上说可以分为三种:无参数函数、有参函数和空函数。

  • 无参函数是没有参数的函数,函数的数据类型为void
  • 有参函数是有参数传递的函数,一般需要带回函数值
  • 空函数是只有一对花括号,花括号内没有任何语句的函数
函数名(){}

函数的声明和调用

函数的声明

调用函数之前先要声明函数原型。在主调函数中或所有函数定义之前,按如下形式声明:

类型说明符 被调函数名(含类型说明的形参表)
int js(int n);

int js(int);

函数的调用

声明了函数原型之后,便可以按如下形式调用函数

函数名(实参列表)

实参列表中应给出与函数原型形参个数相同、类型相符的实参


函数的返回值

在组成函数体的各类语句中,值得注意的是返回语句return。它的一般形式是:

return (表达式);

//作为没有返回值的函数的返回值
return;

函数的传值调用

在cpp语言中,函数调用方式分传值调用传调用

  • 传值调用

即将实参值拷贝一个副本存放在被调用函数的栈区中。在被调用函数中,形参值可以改变,但不影响主调函数的实参值。参数传递方向只是从实参到形参,简称单向值传递

#include <iostream>

using namespace std;

void swap(int a,int b){
  int temp = a;a=b;b=temp;
}

int main(){
  int c = 1,d = 2;
  swap(c,d);
  cout << c << " "<< d << endl;
}


  • 传址调用

这种调用方式是将实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,不是传递副本,而且让形参直接指向实参

#include <iostream>

using namespace std;

void swap(int &a,int &b){
  int temp = a;a=b;b=temp;
}

int main(){
  int c = 1,d = 2;
  swap(c,d);
  cout << c << " "<< d << endl;
}

全局变量与局部变量

全局变量

定义在函数外部没有被花括号括起来的变量称为全局变量,全局变量的作用域是从变量定义的位置开始到文件结束。由于全局变量是在函数外部定义的,因此对所有函数而言都时外部的,可以在文件中位于全局变量定义后面的任何函数中的使用。

#include <iostream>

using namespace std;
int x;
int main(){
}

局部变量

  • 局部变量的作用域是在定义该变量的函数内部。
  • 由于局部变量的作用域仅局限于本函数内部。
  • 一个局部变量和一个全局变量是可以重名的,在相同的作用域内局部变量有效时全局变量无效。
  • 主函数main中定义的变量也是局部变量
  • 全局变量数组初始全部为0

函数应用示例

计算组合数C(m,n)的值

组合数C(m,n)可以理解为从m个数中任意取出n个数的所有情况数。求这个数值,有一个经典的计算方法:C(m,n)=m!/((m-n)!n!)


  • 代码

    #include <iostream>
    
    using namespace std;
    
    int fac(int n);
    
    int main(){
      int m,n;
      scanf("%d%d",&m,&n);
      printf("%d",fac(m)/(fac(m-n)*fac(n)));
    }
    
    int fac(int n){
      int s = 1;
      for(int i=1;i<=n;i++){
        s *= i;
      }
      return s;
    }
    

练习:1152:最大数max(x,y,z)


#include <iostream>
#include <iomanip>

using namespace std;

float max_(float a,float b,float c){
  if (a <= b) swap(a,b);
  if (a <= c) swap(a,c);
  if (b <= c) swap(b,c);
  return a;
}

int main(){
  float a,b,c;
  cin >> a >> b >> c;
  
  cout << fixed << setprecision(3);
  cout << max_(a,b,c)/(max_(a+b,b,c) * max_(a,b,b+c));
}

布尔类型操作

定义一个函数check(n,d),让它返回一个布尔值。如果数值d在正整数n的某一位中出现则返回true,否则返回false


  • 代码

    #include <iostream>
    
    using namespace std;
    
    bool check(int n,int d){
      while (n){
        int e = n % 10;
        n /= 10;
        if (e == d) return true;
      }
      return false;
    }
    
    int main(){
      int a,b;
      cin >> a >> b;
      cout << check(a,b);
      return 0;
    }
    

练习:1155:回文三位数


#include <iostream>
#include <iomanip>

using namespace std;

bool is_palindrome(int n){
  return n%10 == n/100;
}

bool is_prime(int n){
  for(int i=2;i<n;i++){
    if (n % i == 0) return false;
  }
  return true;
}

int main(){
  for(int i=1;i<=999;i++){
    if (is_prime(i) and is_palindrome(i)) cout << i << endl;
  }
}

冒泡排序

使用函数来实现冒泡排序算法,对数组中进行原地排序


  • 代码

    #include <iostream>
    
    using namespace std;
    
    //排序算法实现
    void bubbleSort(int a[],int size){
      for (int j = 1;j < size;j++)
      for(int i=0;i< size - j;i++){
        if (a[i] > a[i+1]){
          int temp = a[i];
          a[i] = a[i+1];
          a[i+1] = temp;
        }
      }
    }
    
    int main(){
      int arr[] = {12,32,3490,45,8923,89,4};
      int size = sizeof arr/sizeof arr[0];
      
      bubbleSort(arr,size);
      
      for(int i=0;i<size;i++){
        cout << arr[i] << " ";
      }
    }
    

课后练习

1398:短信计费

用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送的短信的字数,试统计一下你当月短信的总资费。

1403:素数对

两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。

最后修改:2024 年 06 月 01 日
如果觉得我的文章对你有用,请随意赞赏