第6章 - 函数基础
嗨,朋友!我是长安。
你有没有发现,如果同一段代码需要在不同地方使用,我们就得复制粘贴好多遍?这样不仅麻烦,而且容易出错。
这一章,我要教你一个编程中最重要的概念——函数。它就像一个工具箱,把常用的代码打包起来,需要时直接调用!
🤔 什么是函数?
生活中的例子
想象你在厨房做饭:
- 切菜 - 把食材切碎的过程
- 炒菜 - 把食材放锅里翻炒的过程
- 装盘 - 把菜盛到盘子里的过程
每个步骤都是一个"功能模块",你可以重复使用:
- 做西红柿炒蛋时,需要"切菜"
- 做青椒肉丝时,也需要"切菜"
编程中的函数
函数就是把一段代码打包起来,给它起个名字,需要时直接调用。
好处:
- ✅ 代码复用 - 写一次,到处用
- ✅ 便于维护 - 修改一处,全部生效
- ✅ 提高可读性 - 代码结构清晰
- ✅ 降低复杂度 - 把大问题分解成小问题
📝 定义函数
基本格式
返回类型 函数名(参数列表) {
// 函数体:要执行的代码
return 返回值;
}
第一个函数
#include <iostream>
using namespace std;
// 定义一个打招呼的函数
void sayHello() {
cout << "Hello, World!" << endl;
}
int main() {
sayHello(); // 调用函数
sayHello(); // 再次调用
sayHello(); // 又调用一次
return 0;
}
输出:
Hello, World!
Hello, World!
Hello, World!
解释:
void- 函数不返回任何值sayHello- 函数名()- 参数列表(这里是空的)- 调用函数时,只需写
函数名();
🎁 带参数的函数
函数可以接收参数(输入数据)。
示例1:带一个参数
#include <iostream>
#include <string>
using namespace std;
// 定义一个带参数的函数
void greet(string name) {
cout << "你好," << name << "!" << endl;
}
int main() {
greet("张三");
greet("李四");
greet("王五");
return 0;
}
输出:
你好,张三!
你好,李四!
你好,王五!
示例2:带多个参数
#include <iostream>
using namespace std;
// 定义一个计算两数之和的函数
void printSum(int a, int b) {
int sum = a + b;
cout << a << " + " << b << " = " << sum << endl;
}
int main() {
printSum(3, 5);
printSum(10, 20);
printSum(100, 200);
return 0;
}
输出:
3 + 5 = 8
10 + 20 = 30
100 + 200 = 300
📤 有返回值的函数
函数可以返回一个结果给调用者。
示例1:返回两数之和
#include <iostream>
using namespace std;
// 定义一个返回值的函数
int add(int a, int b) {
int sum = a + b;
return sum; // 返回结果
}
int main() {
int result1 = add(3, 5);
int result2 = add(10, 20);
cout << "3 + 5 = " << result1 << endl;
cout << "10 + 20 = " << result2 << endl;
return 0;
}
输出:
3 + 5 = 8
10 + 20 = 30
解释:
int add(int a, int b)- 函数返回类型是intreturn sum;- 返回计算结果- 调用时可以把返回值赋给变量:
int result = add(3, 5);
示例2:判断奇偶数
#include <iostream>
using namespace std;
// 判断是否是偶数
bool isEven(int num) {
return (num % 2 == 0);
}
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
if (isEven(num)) {
cout << num << " 是偶数" << endl;
} else {
cout << num << " 是奇数" << endl;
}
return 0;
}
示例3:获取最大值
#include <iostream>
using namespace std;
// 返回两个数中的最大值
int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
int main() {
int num1, num2;
cout << "请输入两个数:";
cin >> num1 >> num2;
int maxNum = getMax(num1, num2);
cout << "最大值是:" << maxNum << endl;
return 0;
}
🔍 函数的四种类型
根据是否有参数和是否有返回值,函数可以分为四种:
| 类型 | 说明 | 示例 |
|---|---|---|
| 无参无返回值 | 不接收参数,不返回值 | void sayHello() |
| 有参无返回值 | 接收参数,不返回值 | void greet(string name) |
| 无参有返回值 | 不接收参数,返回值 | int getRandom() |
| 有参有返回值 | 接收参数,返回值 | int add(int a, int b) |
完整示例
#include <iostream>
#include <string>
using namespace std;
// 1. 无参无返回值
void printLine() {
cout << "==================" << endl;
}
// 2. 有参无返回值
void printMessage(string msg) {
cout << msg << endl;
}
// 3. 无参有返回值
int getRandomNumber() {
return 42; // 简化示例
}
// 4. 有参有返回值
double calculateAverage(double a, double b, double c) {
return (a + b + c) / 3;
}
int main() {
// 调用无参无返回值函数
printLine();
// 调用有参无返回值函数
printMessage("欢迎来到 C++ 世界!");
// 调用无参有返回值函数
int num = getRandomNumber();
cout << "随机数:" << num << endl;
// 调用有参有返回值函数
double avg = calculateAverage(80, 90, 85);
cout << "平均分:" << avg << endl;
printLine();
return 0;
}
🌟 实战案例
案例1:计算器(函数版)
#include <iostream>
using namespace std;
// 加法
double add(double a, double b) {
return a + b;
}
// 减法
double subtract(double a, double b) {
return a - b;
}
// 乘法
double multiply(double a, double b) {
return a * b;
}
// 除法
double divide(double a, double b) {
if (b != 0) {
return a / b;
} else {
cout << "错误:除数不能为0!" << endl;
return 0;
}
}
int main() {
double num1, num2;
char op;
cout << "===== 计算器 =====" << endl;
cout << "请输入第一个数:";
cin >> num1;
cout << "请输入运算符(+、-、*、/):";
cin >> op;
cout << "请输入第二个数:";
cin >> num2;
double result;
switch (op) {
case '+':
result = add(num1, num2);
break;
case '-':
result = subtract(num1, num2);
break;
case '*':
result = multiply(num1, num2);
break;
case '/':
result = divide(num1, num2);
break;
default:
cout << "无效运算符!" << endl;
return 1;
}
cout << num1 << " " << op << " " << num2 << " = " << result << endl;
return 0;
}
案例2:温度转换器
#include <iostream>
using namespace std;
// 摄氏度转华氏度
double celsiusToFahrenheit(double celsius) {
return celsius * 9.0 / 5.0 + 32;
}
// 华氏度转摄氏度
double fahrenheitToCelsius(double fahrenheit) {
return (fahrenheit - 32) * 5.0 / 9.0;
}
int main() {
int choice;
double temp, result;
cout << "===== 温度转换器 =====" << endl;
cout << "1. 摄氏度 → 华氏度" << endl;
cout << "2. 华氏度 → 摄氏度" << endl;
cout << "请选择(1或2):";
cin >> choice;
if (choice == 1) {
cout << "请输入摄氏温度:";
cin >> temp;
result = celsiusToFahrenheit(temp);
cout << temp << "°C = " << result << "°F" << endl;
} else if (choice == 2) {
cout << "请输入华氏温度:";
cin >> temp;
result = fahrenheitToCelsius(temp);
cout << temp << "°F = " << result << "°C" << endl;
} else {
cout << "无效选择!" << endl;
}
return 0;
}
案例3:成绩管理系统
#include <iostream>
using namespace std;
// 计算平均分
double calculateAverage(double math, double english, double chinese) {
return (math + english + chinese) / 3;
}
// 判断是否及格
bool isPassed(double score) {
return score >= 60;
}
// 获取等级
char getGrade(double score) {
if (score >= 90) {
return 'A';
} else if (score >= 80) {
return 'B';
} else if (score >= 70) {
return 'C';
} else if (score >= 60) {
return 'D';
} else {
return 'F';
}
}
// 打印成绩单
void printReport(string name, double math, double english, double chinese) {
double avg = calculateAverage(math, english, chinese);
cout << "\n===== 成绩单 =====" << endl;
cout << "姓名:" << name << endl;
cout << "数学:" << math << " 分" << endl;
cout << "英语:" << english << " 分" << endl;
cout << "语文:" << chinese << " 分" << endl;
cout << "平均分:" << avg << " 分" << endl;
cout << "等级:" << getGrade(avg) << endl;
if (isPassed(avg)) {
cout << "结果:通过 ✓" << endl;
} else {
cout << "结果:未通过 ✗" << endl;
}
}
int main() {
string studentName;
double mathScore, englishScore, chineseScore;
cout << "请输入学生姓名:";
cin >> studentName;
cout << "请输入数学成绩:";
cin >> mathScore;
cout << "请输入英语成绩:";
cin >> englishScore;
cout << "请输入语文成绩:";
cin >> chineseScore;
printReport(studentName, mathScore, englishScore, chineseScore);
return 0;
}
案例4:数学工具箱
#include <iostream>
using namespace std;
// 计算阶乘
long long factorial(int n) {
long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 判断是否是素数
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
// 计算幂
double power(double base, int exponent) {
double result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
// 求绝对值
double absolute(double num) {
if (num < 0) {
return -num;
}
return num;
}
int main() {
cout << "===== 数学工具箱 =====" << endl;
// 测试阶乘
cout << "5! = " << factorial(5) << endl;
// 测试素数判断
cout << "7 是素数吗?" << (isPrime(7) ? "是" : "否") << endl;
cout << "10 是素数吗?" << (isPrime(10) ? "是" : "否") << endl;
// 测试幂运算
cout << "2^10 = " << power(2, 10) << endl;
// 测试绝对值
cout << "|-5| = " << absolute(-5) << endl;
return 0;
}
案例5:打印图案(函数版)
#include <iostream>
using namespace std;
// 打印一行星号
void printStars(int count) {
for (int i = 0; i < count; i++) {
cout << "* ";
}
cout << endl;
}
// 打印空格
void printSpaces(int count) {
for (int i = 0; i < count; i++) {
cout << " ";
}
}
// 打印三角形
void printTriangle(int height) {
for (int i = 1; i <= height; i++) {
printStars(i);
}
}
// 打印倒三角形
void printInvertedTriangle(int height) {
for (int i = height; i >= 1; i--) {
printStars(i);
}
}
// 打印金字塔
void printPyramid(int height) {
for (int i = 1; i <= height; i++) {
printSpaces(height - i);
printStars(i);
}
}
int main() {
int size;
cout << "请输入图案大小:";
cin >> size;
cout << "\n三角形:" << endl;
printTriangle(size);
cout << "\n倒三角形:" << endl;
printInvertedTriangle(size);
cout << "\n金字塔:" << endl;
printPyramid(size);
return 0;
}
🎯 小结
这一章我们学习了函数的基础知识:
| 概念 | 说明 |
|---|---|
| 函数定义 | 返回类型 函数名(参数列表) { 函数体 } |
| 函数调用 | 函数名(参数); |
| 参数 | 函数的输入数据 |
| 返回值 | 函数的输出结果 |
| void | 无返回值类型 |
| return | 返回结果并结束函数 |
函数的好处:
- ✅ 代码复用,提高效率
- ✅ 降低复杂度,易于维护
- ✅ 提高可读性,结构清晰
💪 练习题
动手练习巩固知识:
- 写一个函数
printRectangle(int width, int height),打印一个矩形 - 写一个函数
getMin(int a, int b),返回两个数中较小的那个 - 写一个函数
isLeapYear(int year),判断某年是否是闰年 - 写一个函数
sumRange(int start, int end),计算从start到end的所有整数之和 - 写一个函数
reverseNumber(int num),返回一个数字的反转(如123返回321)
点击查看参考答案
题目2 参考答案:
#include <iostream>
using namespace std;
int getMin(int a, int b) {
if (a < b) {
return a;
} else {
return b;
}
}
int main() {
cout << "10 和 20 中较小的是:" << getMin(10, 20) << endl;
cout << "50 和 30 中较小的是:" << getMin(50, 30) << endl;
return 0;
}
题目3 参考答案:
#include <iostream>
using namespace std;
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int year;
cout << "请输入年份:";
cin >> year;
if (isLeapYear(year)) {
cout << year << " 是闰年" << endl;
} else {
cout << year << " 不是闰年" << endl;
}
return 0;
}
🚀 下一步
太棒了!你已经掌握了函数的基础用法!
下一章,我们要学习数组和字符串,学会如何处理一组数据和文本!
➡️ 第7章 - 数组和字符串
