2.函数-函数基础
2.1 知识点
基本概念
函数(方法)本质是一块具有名称的代码块。可以使用函数(方法)的名称来执行该代码块。函数(方法)是封装代码进行重复使用的一种机制。
函数(方法)的主要作用:
- 封装代码
- 提升代码复用率(少写点代码)
- 抽象行为
函数在哪里声明
标准的做法是:
- 函数的声明一般在头文件(.h)中
- 函数的定义一般在源文件(.cpp)中
目前,我们还没有学习头文件和源文件的知识,因此我们直接将函数声明和定义放在源文件(.cpp)中。
注意:如果在源文件中声明和定义函数,我们需要确保在使用之前函数已经被声明。
头文件(.h)声明和源文件(.cpp)定义示例
基本语法
// 返回类型 函数名(参数类型 参数名1, 参数类型 参数名2, .......)
{
函数的代码逻辑;
函数的代码逻辑;
函数的代码逻辑;
.............
return 返回值;(如果有返回类型才返回)
}
- 返回类型:可以写任意的变量类型(例如:int、float、double、char、bool、string等)以及复杂数据类型(数组、枚举、结构体、类、指针)。
- void:代表没有任何返回值。当函数不返回信息,仅处理逻辑时,可以写
void
来表示没有返回值。 - 函数名:可以使用帕斯卡命名法(Pascal Case)或驼峰命名法(Camel Case)进行命名。例如:
MyName
(帕斯卡命名法),myName
(驼峰命名法)。 - 参数:参数不是必须的,可以有0~n个参数,参数的类型可以是任意类型。多个参数之间用逗号隔开。参数名一般使用驼峰命名法。
- 返回值:当返回值不为
void
时,必须使用return
关键字返回对应类型的内容。即使使用了void
代表没有返回值,我们也可以通过return
语句提前结束函数。
实际运用
函数声明
// 函数声明
// 保证之后要使用的函数在此处声明
// 1. 只进行函数声明,只包括返回值、函数名、参数,不包含方法体,逗号隔开
void sayHellow();
void sayYourName(string name);
string whatYourName();
int sum(int a, int b);
// 2. 进行函数声明时,同时定义,包括方法体和函数逻辑
void sayHello2()
{
// 函数逻辑
cout << "你好世界" << endl;
cout << "韬老狮" << endl;
cout << "123" << endl;
int i = 4 + 5;
cout << i << endl;
// return 返回值;
}
函数定义
- 无参无返回值函数
void sayHellow()
{
// 函数逻辑
cout << "你好世界" << endl;
cout << "韬老狮" << endl;
cout << "123" << endl;
int i = 4 + 5;
cout << i << endl;
// return 返回值;
}
- 有参无返回值函数
void sayYourName(string name)
{
cout << "你的名字是" << name << endl;
// return 返回值;
}
- 无参有返回值函数
string whatYourName()
{
string str = "韬老狮";
// return 返回值;
return str;
}
- 有参有返回值函数
int sum(int a, int b)
{
return a + b;
}
函数使用
无参无返回值函数的调用
sayHellow(); // 你好世界 // 韬老狮 // 123 // 9 sayHello2(); // 你好世界 // 韬老狮 // 123 // 9
有参无返回值函数的调用
sayYourName("韬老狮"); // 你的名字是韬老狮 string str = "韬老狮2"; sayYourName(str); // 你的名字是韬老狮2 sayYourName(whatYourName()); // 你的名字是韬老狮
调用一个无参有返回值的函数
string name = whatYourName(); cout << name << endl; // 韬老狮 cout << sum(5, 5) << endl; // 10 cout << sum(3, 2) << endl; // 5 cout << sum(123, 9999) << endl; // 10122
关于 return
即使函数没有返回值,我们也可以使用return
。return
可以直接不执行之后的代码,直接返回到函数外部。
函数声明
void speak(string str);
函数定义
void speak(string str)
{
if (str == "混蛋")
return;
cout << str << endl;
}
函数使用
speak("混蛋"); // 不会输出混蛋
speak("韬老狮,我爱你"); // 韬老狮,我爱你
总结
- 基本概念:函数(方法)是封装代码进行重复使用的一种机制。
- 函数声明和定义:标准做法是函数声明在头文件(.h)中,定义在源文件(.cpp)中。但目前我们可以在源文件(.cpp)中声明和定义函数。
- 基本语法:返回类型、函数名、参数、方法体以及
return
的使用。 - return的作用:
return
不仅用于返回值,也可用于提前结束函数逻辑,程序是从上往下执行的。
2.2 知识点代码
Lesson02_函数_函数基础.cpp
#include <iostream>
#include "CustomConsole.h"
using namespace std;
//函数声明
//保证之后要使用的函数在此处声明
//1.只进行函数声明 只包括 返回值 函数名 参数 不包含方法体 逗号隔开
void sayHellow();
void sayYourName(string name);
string whatYourName();
int sum(int a, int b);
void speak(string str);
//2. 进行函数声明时 同时定义 包括方法体和函数逻辑
void sayHello2()
{
//函数逻辑
cout << "你好世界" << endl;
cout << "韬老狮" << endl;
cout << "123" << endl;
int i = 4 + 5;
cout << i << endl;
//4
//return 返回值;
}
int main()
{
std::cout << "函数基础\n";
//无参无返回值函数的调用
sayHellow();
//你好世界
//韬老狮
//123
//9
sayHello2();
//你好世界
//韬老狮
//123
//9
//有参无返回值函数的调用
//1.常量
//2.变量
//3.返回对应值的表达式(函数、一些拼接或者计算结果)
sayYourName("韬老狮");//你的名字是韬老狮
string str = "韬老狮2";
sayYourName(str);//你的名字是韬老狮2
sayYourName(whatYourName());//你的名字是韬老狮
//调用一个无参有返回值的函数
//一般很少这样写 因为我们并没有使用它的返回值
//whatYourName();
//一般有返回值的函数 都会使用它的返回值
string name = whatYourName();
cout << name << endl;//韬老狮
cout << sum(5, 5) << endl;//10
cout << sum(3, 2) << endl;//5
cout << sum(123, 9999) << endl;//10122
speak("混蛋");//不会输出混蛋
speak("韬老狮,我爱你");//韬老狮,我爱你
}
#pragma region 知识点一 基本概念
//函数(方法)
//本质是一块具有名称的代码块
//可以使用函数(方法)的名称来执行该代码块
//函数(方法)是封装代码进行重复使用的一种机制
//函数(方法)的主要作用
//1.封装代码
//2.提升代码复用率(少写点代码)
//3.抽象行为
#pragma endregion
#pragma region 知识点二 函数在哪里声明
//标准的做法是
//函数的声明一般在头文件(.h)
//函数的定义一般在源文件(.cpp)
//我们目前还没有学习头文件和源文件的知识
//因此我们直接将函数声明和定义在源文件(.cpp)中
//注意:
//如果在源文件中声明和定义函数,我们需要确保在使用之前函数已经被声明
#pragma endregion
#pragma region 知识点三 基本语法
// 1 2 3
// 返回类型 函数名(参数类型 参数名1, 参数类型 参数名2, .......)
//{
// 函数的代码逻辑;
// 函数的代码逻辑;
// 函数的代码逻辑;
// .............
// 4
// return 返回值;(如果有返回类型才返回)
//}
//1-1.返回类型 可以写任意的变量类型
// 14种变量类型(int、float、double、char、bool、string) + 复杂数据类型(数组、枚举、结构体、类、指针)
//1-2.void关键字 代表没有任何返回值 当函数不返回信息时 只是处理逻辑时 就可以写void代表没有返回值
//2.关于函数名 可以使用帕斯卡命名法 或者 驼峰命名法 来进行函数命名(根据公司团队来定)
// MyName(帕斯卡命名法) myName(驼峰命名法)
//3-1.参数不是必须的,可以有0~n个参数 参数的类型也是可以是任意的类型
// 14种变量类型(int、float、double、char、bool、string) + 复杂数据类型(数组、枚举、结构体、类、指针)
// 多个参数之间 用逗号隔开
//3-2.参数名一般使用驼峰命名法
//4.当返回值不为void时 那么就必须通过新的关键字 return返回对应类型的内容
// 注意:即使我们使用了void代表没有返回值 我们也是可以通过return返回的
#pragma endregion
#pragma region 知识点四 实际运用
//1.无参无返回值函数
//1 2 3
void sayHellow()
{
//函数逻辑
cout << "你好世界" << endl;
cout << "韬老狮" << endl;
cout << "123" << endl;
int i = 4 + 5;
cout << i << endl;
//4
//return 返回值;
}
//2.有参无返回值函数
//1 2 3
void sayYourName(string name)
{
cout << "你的名字是" << name << endl;
//4
//return 返回值;
}
//3.无参有返回值函数
//1 2 3
string whatYourName()
{
string str = "韬老狮";
//4
return str;
//return "韬老狮";
//如果函数其中存在条件分支语句 那么一定要保证每种情况都有返回值
//目的就是让函数 一定得返回内容
/*int i = 10;
if (i < 10)
return "韬老狮10";
else
return "";*/
}
//4.有参有返回值函数
//1 2 3
int sum(int a, int b)
{
//int c = a + b;
//4 return
//return c;
// return 后面可以写一个表达式 只要这个表达式的结果和返回类型一致即可
return a + b;
}
#pragma endregion
#pragma region 知识点五 关于return
//即使函数没有返回值,我们也可以使用return,
//return可以直接不执行之后的代码,直接返回到函数外部
void speak(string str)
{
if (str == "混蛋")
return;
cout << str << endl;
}
#pragma endregion
#pragma region 总结
//1.基本概念
//2.函数写在哪里 .h声明.cpp中定义 但是我们目前学习 声明和定义都可以在.cpp当中完成
//3.基本语法 1 2 3 4
//4.return 可以提前结束函数逻辑 程序是线性执行的 从上往下执行的
#pragma endregion
2.3 练习题
写一个函数,比较两个数字的大小,返回最大值
函数声明
// 函数声明
int checkMax(int a, int b);
函数定义
int checkMax(int a, int b)
{
// 第一种写法
/*if (a > b)
return a;
else
return b;*/
// 第二种写法
/*if (a > b)
return a;
return b;*/
// 第三种写法
return a > b ? a : b;
}
函数使用
int result = checkMax(5, 4);
cout << result << endl; // 5
int a = 99;
int b = 188;
result = checkMax(a, b);
cout << result << endl; // 188
写一个函数,用于计算一个圆的面积和周长,并打印
函数声明
// 函数声明
void calcCirc(float r);
函数定义
// 面积:πr² 周长:2πr
// 需要传入一个参数 (圆的半径)
void calcCirc(float r)
{
// 面积
float m = 3.14f * r * r;
// 周长
float z = 2 * 3.14f * r;
cout << "半径为" << r << "的圆,其面积是:" << m << ",周长是:" << z << endl;
}
函数使用
calcCirc(5);
// 该圆的面积是:78.5,周长是:31.4
calcCirc(2.5f);
// 该圆的面积是:19.625,周长是:15.7
写一个函数,判断你传入的参数是不是质数
函数声明
// 函数声明
bool isPrime(unsigned num);
函数定义
// 质数:一个只能被1和自己整除的数 大于1的自然数
// 是不是 - bool类型作为函数返回值 true代表是 false代表不是
// 参数类型:unsigned
bool isPrime(unsigned num)
{
// 前面去判断这个数 是不是质数
// 得到2到num-1之间的数
for (int i = 2; i < num; i++)
{
// 用得到的数去和原本的数取余
// 如果==0,证明它能够被之间的数整除
if (num % i == 0)
return false;
}
// 默认传入的数就是质数
return true;
}
函数使用
bool bo = isPrime(17);
if (bo)
cout << "17是质数" << endl; // 输出:17是质数
else
cout << "17不是质数" << endl;
写一个函数,判断你输入的年份是否是闰年
闰年判断条件:
- 年份能被400整除(2000)
- 或者年份能被4整除,但是不能被100整除(2008)
函数声明
// 函数声明
bool isLeapYear(unsigned year);
函数定义
bool isLeapYear(unsigned year)
{
// 只有满足了一定得条件才是闰年
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
return true;
// 默认不是闰年
return false;
}
函数使用
bo = isLeapYear(2007);
if (bo)
cout << "2007是闰年" << endl;
else
cout << "2007不是闰年" << endl; // 输出:2007不是闰年
2.4 练习题代码
Lesson02_练习题.cpp
#include <iostream>
using namespace std;
#pragma region 练习题一
// 函数声明
int checkMax(int a, int b);
#pragma endregion
#pragma region 练习题二
// 函数声明
void calcCirc(float r);
#pragma endregion
#pragma region 练习题三
// 函数声明
bool isPrime(unsigned num);
#pragma endregion
#pragma region 练习题四
// 函数声明
bool isLeapYear(unsigned year);
#pragma endregion
int main()
{
std::cout << "函数 练习题\n";
// 练习题一
#pragma region 练习题一
int result = checkMax(5, 4);
cout << result << endl; // 5
int a = 99;
int b = 188;
result = checkMax(a, b);
cout << result << endl; // 188
#pragma endregion
// 练习题二
#pragma region 练习题二
calcCirc(5);
// 该圆的面积是:78.5,周长是:31.4
calcCirc(2.5f);
// 该圆的面积是:19.625,周长是:15.7
#pragma endregion
// 练习题三
#pragma region 练习题三
bool bo = isPrime(17);
if (bo)
cout << "17是质数" << endl; // 输出:17是质数
else
cout << "17不是质数" << endl;
#pragma endregion
// 练习题四
#pragma region 练习题四
bo = isLeapYear(2007);
if (bo)
cout << "2007是闰年" << endl;
else
cout << "2007不是闰年" << endl; // 输出:2007不是闰年
#pragma endregion
}
// 练习题一
#pragma region 练习题一
// 写一个函数,比较两个数字的大小,返回最大值
int checkMax(int a, int b)
{
// 第一种写法
/*if (a > b)
return a;
else
return b;*/
// 第二种写法
/*if (a > b)
return a;
return b;*/
// 第三种写法
return a > b ? a : b;
}
#pragma endregion
// 练习题二
#pragma region 练习题二
// 写一个函数,用于计算一个圆的面积和周长,并打印
// 面积:πr² 周长:2πr
// 需要传入一个参数 (圆的半径)
void calcCirc(float r)
{
// 面积
float m = 3.14f * r * r;
// 周长
float z = 2 * 3.14f * r;
cout << "半径为" << r << "的圆,其面积是:" << m << ",周长是:" << z << endl;
}
#pragma endregion
// 练习题三
#pragma region 练习题三
// 写一个函数,判断你传入的参数是不是质数
// 质数:一个只能被1和自己整除的数 大于1的自然数
// 是不是 - bool类型作为函数返回值 true代表是 false代表不是
// 参数类型:unsigned
bool isPrime(unsigned num)
{
// 前面去判断这个数 是不是质数
// 得到2到num-1之间的数
for (int i = 2; i < num; i++)
{
// 用得到的数去和原本的数取余
// 如果==0,证明它能够被之间的数整除
if (num % i == 0)
return false;
}
// 默认传入的数就是质数
return true;
}
#pragma endregion
// 练习题四
#pragma region 练习题四
// 写一个函数,判断你输入的年份是否是闰年
// 闰年判断条件:
// 年份能被400整除(2000)
// 或者
// 年份能被4整除,但是不能被100整除(2008)
// 通过是否 可以分析出 我们的返回值 可以使使用 bool true是闰年 false 就不是闰年
// 参数类型因为不会是负数 unsigned
bool isLeapYear(unsigned year)
{
// 只有满足了一定得条件才是闰年
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
return true;
// 默认不是闰年
return false;
}
#pragma endregion
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com