函数
文章目录
- 1、函数基础
- 1、概念
- 2、函数位置
- 3、基本语法
- 4、实际运用
- 5、return
- 2、ref 和 out
- 1、ref 和 out 使用
- 2、区别
- 思考 登录
- 3、变长参数和参数默认值
- 1、变长参数
- 2、参数默认值
- 4、函数重载
- 5、递归函数
- 思考1 阶乘
- 思考2 阶乘相加
- 思考3 竹竿减半
- 思考4 递归循环输出
1、函数基础
1、概念
函数(方法)
本质是一块具有名称的代码块
可以使用函数(方法)的名称来执行该代码块
函数(方法)是封装代码进行重复使用的一种机制
函数(方法)的主要作用
1、封装代码
2、提升代码复用率
3、抽象行为
2、函数位置
写在 class 或 struct 中
3、基本语法
static 返回类型 函数名(参数类型 参数名1,参数类型 参数名2){
函数的代码逻辑
return 返回值;
}
4、实际运用
1、无参无返回值函数
static void SayHellow(){
Console.WriteLine("你好,世界");
}
Console.WriteLine(SayHellow);
2、有参无返回值
static void SayYourName(string name){
Console.WriteLine("你的名字是:{0}",name);
}
string str = "魔君"
Console.WriteLine(str);
3、无参有返回值
static string WhatYourName(string name){
return "魔君";
}
SayYourName(WhatYourName());
string str = WhatYourName;
4、有参有返回值
static int Sum(int a,int b){
return a+b;
}
Console.WriteLine(Sum(3,5););
5、有参有多返回值
static int[] Cal(int a, int b){
int sum = a + b;
int avg = sum /2;
return new int[]{sum,avg};
}
int[] arr = Cal(6,8);
Console.WriteLine(arr[0]+" "+arr[1]);
5、return
return 可以提前结束函数逻辑,直接返回到函数外部
static void Speak(string str){
if (str == "结束"){
return;
}
Console.WriteLine(str);
}
2、ref 和 out
解决在函数内部改变外部传入的内容,里面变了,外面也要变
static void ChangeValue(int value){
value = 3;
}
int a = 1;
ChangValue(a);
Console.WriteLine(a);
1、ref 和 out 使用
函数参数的修饰符
当出入的值类型参数在内部修改时,或者引用类型参数在内部重新声明时,外部的值会发生变化
//ref
static void ChangeValueRef(ref int value){
value = 3;
}
int a = 1;
ChangeValueRef(ref a);
Console.WriteLine(a);
//out
static void ChangeValueRef(out int value){
value = 3;
}
int a = 1;
ChangeValueRef(out a);
Console.WriteLine(a);
2、区别
1、ref 传入的变量必须初始化, out不用
ref传入的变量必须初始化,但是在内部,可改可不改
2、out传入的变量必须在内部赋值,ref不用
out传入的变量不用初始化,但是在内部,必须赋值
思考 登录
static bool IsCom(string z, string mi, ref string info)
{
if (z == "admin")
{
if (mi == "000")
{
info = "登录成功";
}
else
{
info = "密码错误";
return false;
}
}
else
{
info = "账户错误";
return false;
}
return true;
}
Console.WriteLine("请输入账户");
string zhang = Console.ReadLine();
Console.WriteLine("请输入密码");
string miMa = Console.ReadLine();
string infos = "";
while (!IsCom(zhang, miMa, ref infos))
{
Console.WriteLine(infos);
Console.WriteLine("请输入账户");
zhang = Console.ReadLine();
Console.WriteLine("请输入密码");
miMa = Console.ReadLine();
}
Console.WriteLine(infos);
3、变长参数和参数默认值
1、变长参数
static int Sum(params int[] arr){
int sum = 0;
for(int i=0; i < arr.Length; i++){
sum += arr[i];
}
return sum;
}
1、params关键字后面必为数组
2、数组的类型可以是任意的类型
3、函数参数可以有别的参数和params关键字修饰的参数
4、函数参数中只能最多出现一个params关键字,且一定是最后一组参数
2、参数默认值
static void Speak(string str = "无话可说"){
Console.WriteLine(str);
}
Speak();
如果要混用,可选参数必须写在普通参数后面
4、函数重载
概念:同一语句块中,函数名相同,参数不同,返回值无关
作用:用来处理不同参数同一类型的逻辑处理
1、重载和返回值类型无关,只和参数类型,个数,顺序有关
2、调用时程序会自己根据传入的参数类型判断使用哪个重载
static int Cal(int a, int b){
return a+b;
}
static int Cal(int a, int b, int c){
return a+b+C;
}
static float Cal(float a, float b){
return a+b;
}
static float Cal(int a, float b){
return a+b;
}
static float Cal(float a, int b){
return a+b;
}
static float Cal(ref float a, int b){
return a+b;
}
5、递归函数
让函数自己调用自己
必须有能够结束调用的条件
//递归方式输出0~10
static void Fun(int a){
if(a > 10){
return;
}
Console.WriteLine(a);
++a;
Fun(a);
}
Fun(0);
思考1 阶乘
//传入一个值,递归求该值的阶乘,并返回
// 5!= 1 * 2 * 3 * 4 * 5
static int JieCheng(int a)
{
Console.WriteLine(a);
if (a == 1)
{
return 1;
}
return a * JieCheng(a-1);
}
Console.WriteLine(JieCheng(5));
思考2 阶乘相加
//使用递归求 1! + 2! +3! + 4! + ... + 10!
static int Fun1(int num)
{
if (num == 1)
{
return 1;
}
return num * Fun1(num - 1);
}
static int Fun2(int num)
{
Console.WriteLine(num);
if (num == 1)
{
return 1;
}
return Fun1(num) + Fun2(num - 1);
}
Console.WriteLine(Fun2(10));
思考3 竹竿减半
//一根竹竿长100m,每天砍掉一半,求第十天它的长度是多少(从第0天开始)
static void Fun(float length, int day = 0)
{
if (day == 10)
{
Console.WriteLine("第十天竹竿长{0}米", length);
return;
}
length /= 2;
++day;
Fun(length, day);
}
Fun(100);
思考4 递归循环输出
static bool Fun(int num)
{
Console.WriteLine(num);
return num == 10 || Fun(num + 1);
}
Fun(1);