NOIP,CSP-J,CSP-S——函数

一、函数概念

/*函数返回类型 函数名(参数){
      语句
}
*/
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;
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值