寒假集训一期(3)——函数


函数

这里所讲的函数虽然不是数学里常见的函数,但与我们常见的函数有着异曲同工之妙,同样都是去调用一个表达式,今天我们就来讲讲调用函数的事情。

函数的类型

函数也是有类型的,也就是我们所说的返回值类型,当返回值是整数时,我们就把函数定义为int类型,另外还有两个比较特殊的类型,bool和void,bool类型既可以返回直接的0或1,也可以返回一串表达式,编译器会自己根据函数里的代码来返回true或false;void类型也就是无类型,它通常情况下不会有返回值,一般来说,会直接在函数里输出,当编译器遇到函数结束的右括号时,就会自动回到主函数。

函数的基本格式

函数的基本格式如下:

在这里插入图片描述

例如:

int a(){
	return a*a;
}

函数的初始化

函数的初始化格式如上,一般被写在主函数的前面,但也有些人会习惯写在主函数的后面,但这时,一定要在主函数前加上

int a();

加上函数类型与函数名,这样程序也同样可以正常运行。

函数的参数

无参函数

无参函数顾名思义就是不用向函数内传递参数的函数,也就是因为,这种函数里的代码块不会因为主函数里的情况而变化,我们把它称作无参函数,一般形式如下:

int a(){
	return ...;
}

有参函数

有参函数就是指主函数会向函数内传参的函数,这个参数是会变化的,所以需要传参,在传参的过程中,有很多情况极其复杂,如下面这个例子:

第一个实验
#include<bits/stdc++.h>
using namespace std;
int a(int x,int s){
	x=s*s;
	s=x+1;
	return x;
}
int main(){
	int s=0,x=0;
	cin>>s>>x;
	x=a(x,s);
	cout<<s<<" "<<x;
}

这是一个关于局部变量和全局变量的小实验,在这个程序里,我们输入1,5,将输出1,1
在这里插入图片描述
在这个代码里,我们向a函数传了2个参数,其中x被返回,而s不被返回,所以这个a函数里的s为局部变量,不适用于主函数,换句话说,a函数里的s并非主函数里的s,所以s并未被改变,从而输出了1,同理,在这个主函数中的x被赋值了,它的值就是函数的返回值,返回值为1,所以x=1;

第二个实验
#include<bits/stdc++.h>
using namespace std;
int a(int x,int s){
	x+=s*s;
	s=x+1;
	return x;
}
int main(){
	int s=0,x=0;
	cin>>s>>x;
	x=a(x,s);
	cout<<s<<" "<<x;
}

在这个代码了,我们把第4行的=改为了+=,代码就会输出1,6,是因为这个函数里的局部变量x被返回给了全局变量x,而s依然不会变。

第三个实验

在这里插入图片描述
这一次,我们没有给全局变量x赋值,所以我们输入什么就会输出什么,因为函数里的局部变量x,s并非主函数里的全局变量,所以不管你在函数里做了些什么,只要不赋值,两个变量根本不同,所以输出和输入一样。

传地址参数

传地址参数也就是把一个参数的地址传入函数,因为传入的是地址,所以这时候局部变量和全局变量就是一样的了,有时候,转地址参数根本不用返回,在函数里做了什么运算,全局变量相关的值也会随之改变,具体如下:

第四个实验

在这里插入图片描述
同样是刚刚那个代码,只不过我们把参数改成了传地址的方式,这样的话,全局变量的值也会随之改变,就不用另赋值了,按照函数里的运算,s,x分别为7,6所以输出也就是7,6了。

函数练习题解析

复杂的函数知识我们就讲完了,接下来我们来介绍一下关于函数的例题:

A. 函数大聚会

内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较

题目描述

输入一个整数n。 1、判断它是否为素数,是输出“Y’,不是输出“N”. 2、输出这个数的各位数字之和。 3、求出这个数所有约数的和。 4、求出1到n的和。 5、输出这个数的倒序数。

输入格式

一行一个整数。

输出格式

五行; 第一行“Y’或“N”. 第二行,一个整数。 第三行,一个整数。 第四行,一个整数. 第五行,一个整数.

样例
样例输入

65

样例输出

N
11
84
2145
56
数据范围与提示
数据范围:

1 <=n <= 1000

分析

这道题别无他意,纯粹就是考验我们的函数功底,首先第一个问题我们可以用一个bool类型的变量,因为他只需要一个是或者否,判断质数的代码如下:

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

第二个问题要求的是我们输出这个数字的各个数位之和,因为范围较小,我们完全可以分类讨论,函数如下:

int sum(int n){
	if(n<10) return n;
	if(n>=10&&n<100) return n%10+n/10;
	if(n!=1000) return n%10+n/10%10+n/100;
	else return 1;
}

第三个问题求的是约数和,需要返回的是一个整数,所以我们定义整形函数,具体如下:

int yueshu(int n){
	for(i=1;i<=n;i++)
		if(n%i==0)
			s+=i;
	return s;
}

第四个问题就简单了,直接用高斯求和法做就可以了

int sum2(int n){
	return ((1+n)*n)/2;
}

第五的问题稍微有一点费脑筋,但我们把数拆开再合并就好啦,代码如下;

int daoxu(int n){
	if(n<10) return n;
	if(n>=10&&n<100) {
		a=n%10,b=n/10;
		return a*10+b;
	}
	if(n==1000) return 	1;
	a=n%10,b=n/10%10,c=n/100;
	return a*100+b*10+c;//思路就是手动交换个位,十位,百位
}

主函数内就只管调用和输出就可以了

int main(){
	cin>>n;
	if(zhishu(n))
		cout<<"Y";
	else cout<<"N";
	cout<<endl;
	cout<<sum(n)<<endl;
	cout<<yueshu(n)<<endl;
	cout<<sum2(n)<<endl;
	cout<<daoxu(n)<<endl;
}

函数刚开始会觉得很复杂,但多做题熟悉了就简单了,当你第一次用函数做对题一定会很有成就感的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值