9.函数-函数基础
9.1 知识点
函数基本概念
- 函数(方法):
- 本质是一块具有名称的代码块。
- 使用函数(方法)的名称来执行该代码块。
- 函数(方法)是封装代码进行重复使用的一种机制。
- 主要作用:
- 封装代码。
- 提升代码复用率(少写点代码)。
- 抽象行为。
函数的声明写在哪里
- class语句块中。
- struct语句块中。
- 注意:不能再函数中再写函数的声明。
函数的声明的基本语法
- 函数的语法结构:
static 返回类型 函数名(参数类型 参数名1, 参数类型 参数名2, .......) { 函数的代码逻辑; 函数的代码逻辑; 函数的代码逻辑; ............. return 返回值; // 如果有返回类型才返回 }
static
: 函数是静态函数,不是必须,在没有学习类和结构体之前都是必须写的。- 返回类型: 可以是任意的变量类型。
- 函数名: 使用帕斯卡命名法(MyName)。
- 参数类型 参数名: 参数不是必须,可以有0~n个参数,参数的类型也是可以是任意类型的。
- return 返回值: 当返回值类型不为
void
时,必须通过return
返回对应类型的内容。
函数的实际运用
主函数外 class语句块内声明不同参数不同返回值的函数
无参无返回值函数
static void SayHello() { Console.WriteLine("Hello, World!"); }
有参无返回值函数
static void Greet(string name) { Console.WriteLine("Hello, " + name + "!"); }
有参有返回值函数
static int Add(int a, int b) { return a + b; }
有参有多返回值函数
static int[] Calculate(int a, int b) { int sum = a + b; int avg = sum / 2; return new int[] { sum, avg }; }
主函数内进行函数的调用
无参无返回值函数
SayHello(); // Outputs: Hello, World!
有参无返回值函数
Greet("Alice"); // Outputs: Hello, Alice!
无参有返回值函数
int result = Add(5, 7); Console.WriteLine(result); // Outputs: 12
有参有多返回值函数
int[] values = Calculate(5, 7); Console.WriteLine("Sum: " + values[0] + ", Average: " + values[1]); // Outputs: Sum: 12, Average: 6
关于return
主函数外 class语句块内声明不同参数不同返回值的函数
static void Speak(string str) { if (str == "bad") { return; } Console.WriteLine(str); }
主函数内进行函数的调用
Speak("bad"); // Does not output anything Speak("good"); // Outputs: good
总结
- 函数基本概念
- 函数写在哪里 —— class 或者 struct 中
- 函数基本语法
return
可以提前结束函数逻辑,程序是线性执行的,从上到下执行
9.2 知识点代码
using System;
namespace Lesson07_函数基础
{
class Program
{
#region 知识点一 基本概念
//函数(方法)
//本质是一块具有名称的代码块
//可以使用函数(方法)的名称来执行该代码块
//函数(方法)是封装代码进行重复使用的一种机制
//函数(方法)的主要作用
//1.封装代码
//2.提升代码复用率(少写点代码)
//3.抽象行为
//例如 Console.WriteLine()就是一个函数 它把输出要用的代码封装到函数内部 想要打印输出时调用即可
#endregion
#region 知识点二 函数的声明写在哪里
//1.class语句块中
//2.struct语句块中
//注意:不能再函数中再写函数的声明
#endregion
#region 知识点三 函数的声明的基本语法
// 1 2 3 4
// static 返回类型 函数名(参数类型 参数名1, 参数类型 参数名2, .......)
//{
// 函数的代码逻辑;
// 函数的代码逻辑;
// 函数的代码逻辑;
// .............
// 5
// return 返回值;(如果有返回类型才返回)
//}
//1.static
//关于static 代表函数是静态函数 不是必须的 在没有学习类和结构体之前 都是必须写的
//2.返回类型
//2-1. 关于返回类型 引出一个新的关键字 void(表示没有返回值)
//2-2. 返回类型 可以写任意的变量类型 14种变量类型 + 复杂数据类型(数组、枚举、结构体、类class)
//3.函数名
//关于函数名 使用帕斯卡命名法命名 myName(驼峰命名法) MyName(帕斯卡命名法)
//4.参数类型 参数名
//4-1. 参数不是必须的,可以有0~n个参数 参数的类型也是可以是任意类型的 14种变量类型 + 复杂数据类型(数组、枚举、结构体、类class)
// 多个参数的时候 需要用 逗号隔开
//4-2. 参数名 驼峰命名法
//5.return 返回值
//当返回值类型不为void时 必须通过新的关键词 return返回对应类型的内容 (注意:即使是void也可以选择性使用return)
#endregion
#region 知识点四 函数的实际运用
// 主函数外 class语句块内声明不同参数不同返回值的函数
//1.无参无返回值函数
//1 2 3 4
static void SayHellow()
{
Console.WriteLine("你好世界");
// 5 在没有返回值时 也就是返回值类型是void 可以省略 加了也不会报错
//return;
}
//2.有参无返回值函数
// 1 2 3 4
static void SayYourName(string name)
{
Console.WriteLine("你的名字是:{0}", name);
// 5
// return;省略了
}
//3.无参有返回值函数
//1 2 3 4
static string WhatYourName()
{
// 5 对应返回值类型的 内容 返回出去
return "韬老狮";
}
//4.有参有返回值函数
// 1 2 3 4
static int Sum(int a, int b)
{
//int c = a + b;
//return c;
// 5 retrun后面可以写一个表达式 只要这个表达式的结果和返回值类型是一致的就行
return a + b;
}
//5.有参有多返回值函数
// 传入两个数 然后计算两个数的和 以及他们两的平均数 得出结果返回出来
// 函数的返回值 一定是一个类型 只能是一个内容
//1 2 3 4
static int[] Calc(int a, int b)
{
int sum = a + b;
int avg = sum / 2;
//int[] arr = { sum, avg };
//return arr;
// 5
// 如果用数组作为返回值出去 那么前提是 使用者 知道这个数组的规则
return new int[] { sum, avg};
}
#endregion
#region 知识点五 关于return
// 主函数外 class语句块内声明不同参数不同返回值的函数
//即使函数没有返回值,我们也可以使用return,
//return可以直接不执行之后的代码,直接返回到函数外部
static void Speak(string str)
{
if( str == "混蛋" )
{
return;
}
Console.WriteLine(str);
}
#endregion
//总结
//1.基本概念
//2.函数写在哪里 —— class 或者 struct中
//3.基本语法 1 2 3 4 5
//4. return 可以提前结束函数逻辑 程序是线性执行的 从上到下执行
static void Main(string[] args)
{
Console.WriteLine("函数基础");
#region 知识点四 函数的实际运用
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
//调用函数 直接 写函数名(参数) 即可
//1.无参无返回值函数
SayHellow();//会输出"你好世界"
//2.有参无返回值函数
// 参数可以是 常量 变量 函数都可以
// 参数 一定是传一个 能得到对应类型的表达式
//传入一个string变量
string str = "韬老狮";
SayYourName(str);
//传入一个string 常量
SayYourName("韬老师2");
//3.无参有返回值函数
//可以在 有参无返回值函数中 传入一个无参有返回值函数 充当 有参无返回值函数的参数
//只要 无参有返回值函数的返回值和有参无返回值函数的参数的类型对应即可
SayYourName(WhatYourName());
//有返回值的函数 要不直接拿返回值来用
//要不就是拿变量 接收它的结果
string str2 = WhatYourName();
//也可以直接调用 但是 返回值 对我们来说就没用了
WhatYourName();
//4.有参有返回值函数
//会输出Sum(100, 200)的返回值
Console.WriteLine(Sum(100, 200));//300
//5.有参有多返回值函数
//Calc(5, 7)会返回一个int数组 需要拿一个数组来接
//之后甚至可以拿自己写的class或struct来接返回值是自己写的class或struct的函数
int[] arr = Calc(5, 7);
Console.WriteLine("总和是:" + arr[0] + " 平均数是:" + arr[1]);
//总和是:12 平均数是:6
#endregion
#region 知识点五 关于return
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
Speak("混蛋");//Speak函数内部有判断 不会输出"混蛋"
Speak("混蛋123");//输出 "混蛋123"
#endregion
}
}
}
9.3 练习题
写一个函数,比较两个数字的大小,返回最大值
主函数外 class 语句块内声明不同参数不同返回值的函数
// 2个参数 一个返回值
static int CheckMax(int a, int b)
{
// 使用条件运算符简化
return a > b ? a : b;
}
主函数内进行函数的调用
Console.WriteLine(CheckMax(3, 99)); // 输出:99
写一个函数,用于计算一个圆的面积和周长,并返回打印
主函数外 class 语句块内声明不同参数不同返回值的函数
// 面积:πr² 周长:2πr
// 多返回值 : 通过数组的形式 自己定义个返回的顺序
static float[] CalcCirc(float r)
{
// 使用数组直接返回
return new float[] { 3.14f * r * r, 2 * 3.14f * r };
}
主函数内进行函数的调用
float[] f = CalcCirc(3);
Console.WriteLine("半径{0},面积{1},周长{2}", 3, f[0], f[1]); // 输出:半径3,面积28.26,周长18.84
写一个函数,求一个数组的总合、最大值、最小值、平均值
主函数外 class 语句块内声明不同参数不同返回值的函数
// 参数:传一个数组 返回值:可以用数组返回值 把这些都返回回去
static void Calc(int[] arr)
{
if (arr.Length == 0)
{
Console.WriteLine("数组不能为空");
return;
}
int sum = 0;
int avg = 0;
int max = arr[0];
int min = arr[0];
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
if (max < arr[i])
{
max = arr[i];
}
if (min > arr[i])
{
min = arr[i];
}
}
avg = sum / arr.Length;
Console.WriteLine("最大值{0}最小值{1}总合{2}平均数{3}", max, min, sum, avg);
}
主函数内进行函数的调用
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
Calc(arr); // 输出:最大值8最小值1总合36平均数4
Calc(new int[] { 1, 2, 3 }); // 输出:最大值3最小值1总合6平均数2
写一个函数,判断你传入的参数是不是质数
主函数外 class 语句块内声明不同参数不同返回值的函数
// 质数:一个只能被1和自己整除的数
// 是不是:bool类型的返回值 true是是 false是不是
static bool IsPrime(int num)
{
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
return false;
}
}
return true;
}
主函数内进行函数的调用
Console.WriteLine("{0}{1}质数", 6, IsPrime(6) ? "是" : "不是"); // 输出:6不是质数
写一个函数,判断你输入的年份是否是闰年
主函数外 class 语句块内声明不同参数不同返回值的函数
static bool IsLeapYear(int year)
{
// year % 400 == 0 || year % 4 == 0 && year % 100 != 0
// 满足闰年条件 那就是闰年
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
{
return true;
}
// 默认不是闰年
return false;
}
主函数内进行函数的调用
csharp Console.WriteLine("{0}{1}闰年", 2010, IsLeapYear(2010) ? "是" : "不是"); // 输出:2010不是闰年
9.4 练习题代码
using System;
namespace Lesson07_练习题
{
class Program
{
#region 练习题一
//写一个函数,比较两个数字的大小,返回最大值
// 主函数外 class语句块内声明不同参数不同返回值的函数
// 2个参数 一个返回值
static int CheckMax(int a, int b)
{
//1
//if (a > b)
//{
// return a;
//}
//else
//{
// return b;
//}
//2
//if( a > b )
//{
// return a;
//}
//return b;
//3
return a > b ? a : b;
}
#endregion
#region 练习题二
//写一个函数,用于计算一个圆的面积和周长,并返回打印
// 主函数外 class语句块内声明不同参数不同返回值的函数
// 面积:πr² 周长:2πr 函数肯定有一个半径的参数传入
// 多返回值 : 通过数组的形式 自己定义个返回的顺序
static float[] CalcCirc(float r)
{
//1
//float[] f = new float[2];
//f[0] = 3.14f * r * r;
//f[1] = 2 * 3.14f * r;
//return f;
//2
return new float[] { 3.14f * r * r, 2 * 3.14f * r };
}
#endregion
#region 练习题三
//写一个函数,求一个数组的总合、最大值、最小值、平均值
// 主函数外 class语句块内声明不同参数不同返回值的函数
// 参数:传一个数组 返回值:可以用数组返回值 把这些都返回回去 你也可以没有返回值 直接在函数内部打印
static void Calc( int[] arr )
{
if( arr.Length == 0 )
{
Console.WriteLine("数组不能为空");
return;
}
int sum = 0;
int avg = 0;
int max = arr[0];
int min = arr[0];
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
//当前的元素 比最大数还大 那当前的元素 就是最大值
if( max < arr[i] )
{
max = arr[i];
}
//当前的元素 比最小值还小 那当前的元素 就是最小值
if( min > arr[i] )
{
min = arr[i];
}
}
avg = sum / arr.Length;
Console.WriteLine("最大值{0}最小值{1}总合{2}平均数{3}", max, min, sum, avg);
}
#endregion
#region 练习题四
// 写一个函数,判断你传入的参数是不是质数
// 主函数外 class语句块内声明不同参数不同返回值的函数
// 质数:一个只能被1和自己整除的数
// 是不是:bool类型的返回值 true是是 false是不是
// 参数:int
static bool IsPrime(int num)
{
//判断质数的逻辑
for (int i = 2; i < num; i++)
{
//得到从2到 num-1之间的数
if( num % i == 0 )
{
// 之前和循环配合使用 break continue
return false;
}
}
//默认就认为它是质数
return true;
}
#endregion
#region 练习题五
//写一个函数,判断你输入的年份是否是闰年
//闰年判断条件:
//年份能被400整除(2000)
//或者
//年份能被4整除,但是不能被100整除(2008)
// 主函数外 class语句块内声明不同参数不同返回值的函数
static bool IsLeapYear(int year)
{
// year % 400 == 0
// ||
// year % 4 == 0 && year % 100 != 0
//满足闰年条件 那就是闰年
if( year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 ) )
{
return true;
}
//默认不是闰年
return false;
}
#endregion
static void Main(string[] args)
{
Console.WriteLine("函数练习题");
#region 练习题一
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
Console.WriteLine(CheckMax(3, 99));//99
#endregion
#region 练习题二
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
float[] f = CalcCirc(3);
Console.WriteLine("半径{0},面积{1},周长{2}", 2, f[0], f[1]);//半径2,面积28.26,周长18.84
#endregion
#region 练习题三
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
Calc(arr); //最大值8最小值1总合36平均数4
Calc(new int[] { 1, 2, 3 });//最大值3最小值1总合6平均数2 不能直接写进去 一定要把数组new出来
#endregion
#region 练习题四
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
Console.WriteLine("{0}{1}质数", 6, IsPrime(6) ? "是" : "不是");//6不是质数
#endregion
#region 练习题五
//主函数内 进行函数的调用 也可以在别的函数中调用其他函数
Console.WriteLine("{0}{1}闰年", 2010, IsLeapYear(2010) ? "是" : "不是");//2010不是闰年
#endregion
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com