一、函数概念
/*函数返回类型 函数名(参数){
语句
}
*/
int add(int x,int y){
return x+y;
}
调用这个函数add
int main(){
int x,y,z;
scanf("%d%d",&x,&y);
z=add(x,y);
printf("%d",z);
}
二、变量作用域
main函数的z只作用于第二个for语句,
出了这个大括号就找不到了,所以电脑在编译printf语句会报错
例题:阶乘
方法一
#include<bits/stdc++.h>
using namespace std;
int fac(int n){
int ans=1;
for(int i=n;i>=1;i--){
ans*=i;
}
return ans;
}
int main(){
int n;
scanf("%d",&n);
int ans=fac(n);
printf("%d",ans);
return 0;
}
方法二
#include<bits/stdc++.h>
using namespace std;
int fac(int n){
if(n==1) return 1;
else return fac(n-1)*n;
}
int main(){
int n;
scanf("%d",&n);
int ans=fac(n);
printf("%d",ans);
return 0;
}
例题:加减乘除
#include<bits/stdc++.h>
using namespace std;
//加
int jia(int a,int b){
return a+b;
}
//减
int jian(int a,int b){
return a-b;
}
//乘
int cheng(int a,int b){
return a*b;
}
//除
int chu(int a,int b){
return a/b;
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",jia(a,b));
printf("%d\n",jian(a,b));
printf("%d\n",cheng(a,b));
printf("%d\n",chu(a,b));
return 0;
}
三、函数声明
四、参数传递
1、值传递
#include<bits/stdc++.h>
using namespace std;
void work(int x,int y){
x+=1;
y+=2;
printf("work:x=%d,y=%d\n",x,y);
}
int main(){
int x=0,y=1;
printf("before work:x=%d,y=%d\n",x,y);
work(x,y);
printf("after work:x=%d,y=%d\n",x,y);
return 0;
}
2、引用传递
#include<bits/stdc++.h>
using namespace std;
void work(int &x,int &y){
x+=1;
y+=2;
printf("work:x=%d,y=%d\n",x,y);
}
int main(){
int x=0,y=1;
printf("before work:x=%d,y=%d\n",x,y);
work(x,y);
printf("after work:x=%d,y=%d\n",x,y);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
void my_swap(int &x,int &y)
{
int t;
t=x;
x=y;
y=t;
}
int main(){
int x=0,y=1;
printf("before swap:x=%d,y=%d\n",x,y);
my_swap(x,y);
printf("after swap:x=%d,y=%d\n",x,y);
return 0;
}
3、指针传递
(1)一维数组传参
使用这种数组的指针传参,在函数内部修改数组内容,外部的值也会改变
#include<bits/stdc++.h>
using namespace std;
int a[100],b[100];
int n,m;
void print(int a[],int n){
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);
}
print(a,n);
print(b,m);
}
(2)二维数组传参
注意一定要指定二维数组的大小,与传入的数组一致
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100][100];
void print(int a[][100]) {
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
print(a);
return 0;
}
例题:统计“a”的个数2
方法一:
#include<bits/stdc++.h>
using namespace std;
char s[20];
int jisuan(){
scanf("%s",s+1);
int len=strlen(s+1);
int ans=0;
for(int i=0;i<=len;i++){
if(s[i]=='a') ans++;
}
return ans;
}
int main(){
for(int i=1;i<=3;i++){
printf("%d\n",jisuan());
}
return 0;
}
方法二:
#include<bits/stdc++.h>
using namespace std;
char s[20];
//统计a的个数
int jisuan(char s[]){
int len=strlen(s+1);
int ans=0;
for(int i=0;i<=len;i++){
if(s[i]=='a') ans++;
}
return ans;
}
int main(){
for(int i=1;i<=3;i++){
scanf("%s",s+1);
printf("%d\n",jisuan(s));
}
return 0;
}
练习题:排排队
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1010][1010];
//声明输出
void print(int a[][1010]);
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
print(a);//调用输出
return 0;
}
//定义输出
void print(int a[][1010]){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
练习题:询问区间
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[110];
int flag,l,r;//通过flag判定是输出最大值还是最小值,l和r是区间
int res(int flag ,int l,int r){
//区间排序,从小到大
for(int i=l;i<r;i++){
int mina=i;
for(int j=l+1;j<=r;j++){
if(a[j]<a[mina]) mina=j;
}
swap(a[i],a[mina]);
}
for(int i=l;i<=r;i++)
printf("%d ",a[i]);
if(flag==1) return a[l];
else return a[r];
}
int main(){
//输入
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&flag,&l,&r);
printf("%d",res(flag,l,r));
}
return 0;
}
练习题:a到b的质数
#include<bits/stdc++.h>
using namespace std;
int a,b;
//判定是否是质数
bool isprime(int x){
for(int i=2;i<=x-1;i++){
if(x%i==0) return false;
}
return true;
}
int main(){
scanf("%d%d",&a,&b);
for(int i=a;i<=b;i++){
if(isprime(i)&&(i !=1)) printf("%d\n",i);
}
return 0;
}
练习:幂和
#include<bits/stdc++.h>
using namespace std;
int m,n;
//求每个值的幂
int mi(int x){
int base=x;
for(int j=1;j<n;j++){
x*=base;
}
return x;
}
int main(){
scanf("%d%d",&m,&n);
int res=0;
for(int i=1;i<=m;i++){
res+=mi(i);
}
printf("%d",res);
}
五、C++常用的函数
练习题:最大值
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main(){
scanf("%d%d%d",&a,&b,&c);
int max1=max(a,b);
int max2=max(max1,c);
printf("%d",max2);
return 0;
}
练习题:排序
#include<bits/stdc++.h>
using namespace std;
int n,a[110];
void print(int a[],int n){
for(int i=1;i<n;i++){
int minid=i;
for(int j=i+1;j<=n;j++){
if(a[j]<a[minid]) minid=j;
}
swap(a[i],a[minid]);
}
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
}
int main(){
//输入
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
//输出
print(a,n);
return 0;
}