函数的定义
函数定义的语法格式
数据类型 函数名(形式参数表){
函数体
}
- 函数的数据类型是函数的返回值类型(如数据类型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的素数对。