摄影网站的市场可行性,广州网站制作开发公司哪家好,muiteer主题 wordpress,大型网站开发企业新手注意#xff1a;代码部分是用AI#xff08;豆包#xff09;生成的#xff0c;所以写成了依托达芬#xff0c;请见谅#xff0c;别被误导了#xff01;#xff01;#xff01;前言#xff1a;为什么需要自定义函数#xff1f;在前一篇中#xff0c;我们学会了…新手注意代码部分是用AI豆包生成的所以写成了依托达芬请见谅别被误导了前言为什么需要自定义函数在前一篇中我们学会了调用系统自带的函数比如 sort 排序、sqrt 求平方根不用自己写复杂逻辑。但实际编程中很多需求是系统函数覆盖不到的 —— 比如 “计算一个学生的总分”“判断一个数是否为质数”“打印指定格式的分隔线”这些重复出现的逻辑如果每次都写一遍代码会又长又难维护。这时候就需要 “自定义函数”把重复的逻辑封装成一个 “自己的工具”像调用系统函数一样用一句代码就能重复使用。比如把 “判断质数” 的逻辑写成函数 is_prime (n)之后不管是判断 17、23 还是 1009直接调用 is_prime (17) 就行不用再写一遍判断逻辑。简单说系统函数是别人做好的工具自定义函数是自己做的专属工具学会它能让你的代码更简洁、更易复用、更易调试。一、先搞懂自定义函数的核心结构自定义函数就像 “一个有名字的代码模块”有固定的格式必须包含 “函数头” 和 “函数体”缺一不可。我们先看一个最简单的例子计算两个整数的和。// 自定义函数计算两个int类型的和 int add(int a, int b) { // 函数头 int result a b; // 函数体具体逻辑 return result; // 返回结果和的类型与函数返回值类型一致 }拆解函数的 4 个核心部分新手必记返回值类型函数执行后要返回的数据类型比如上面的 int表示返回整数。如果函数不需要返回值用void表示后面会讲。函数名自己起的名字比如 add遵循 “见名知义” 原则最好能一眼看出函数功能比如 is_prime 表示 “是否为质数”print_line 表示 “打印分隔线”。参数列表函数需要的 “输入数据”格式是类型 参数名多个参数用逗号分隔比如 add 的 int a, int b。参数就像函数的 “原材料”调用时必须传入对应类型的值。函数体用 {} 包裹的具体逻辑包括变量定义、计算、判断等。如果函数有返回值必须用return 结果;语句返回结果类型要和返回值类型匹配。新手易混点函数声明 vs 函数定义如果函数定义在main函数后面编译器会找不到函数因为 C 是从上到下编译的这时候需要在main前加 “函数声明”—— 告诉编译器 “有这个函数具体实现后面再写”。格式返回值类型 函数名(参数类型列表);注意末尾有分号示例#include namespace std; // 函数声明告诉编译器有一个add函数 int add(int, int); // 参数名可以省略只写类型 int main() { int x 5, y 3; int sum add(x, y); // 调用函数传入x和y的值 cout 3 sum endl; // 输出538 return 0; } // 函数定义具体实现要和声明的格式一致 int add(int a, int b) { return a b; // 简化写法直接返回结果不用临时变量 }二、3 类常用自定义函数实战案例 代码根据返回值和参数的不同新手最常用的自定义函数有 3 类每类都配 “可直接运行的代码”复制就能练。1. 有参数、有返回值最常用功能需要输入数据执行后返回结果比如计算、判断、查找。案例 1判断一个数是否为质数返回 bool 类型#include iostream #include cmath // 用到sqrt函数 using namespace std; // 函数声明判断n是否为质数是返回true否返回false bool is_prime(int n); int main() { int num; cout 请输入一个正整数; cin num; if (is_prime(num)) { cout num 是质数 ; } else { cout num 不是质数 ; } return 0; } // 函数定义判断质数的逻辑 bool is_prime(int n) { if (n ; // 1及以下不是质数 if (n 2) return true; // 2是唯一的偶数质数 if (n % 2 0) return false; // 偶数除2外不是质数 // 只需判断到sqrt(n)优化效率 for (int i 3; i i 2) { if (n % i 0) return false; // 能被整除不是质数 } return true; // 遍历结束没找到除数是质数 }运行结果请输入一个正整数17 17是质数案例 2计算 n 的阶乘n! 1×2×...×n#include using namespace std; int factorial(int n); // 函数声明 int main() { int n; cout 非负整数; cin n; if (n 0) { cout 负数 return 1; // 异常退出 } cout ) return 0; } // 函数定义计算阶乘 int factorial(int n) { int res 1; for (int i 1; i res * i; } return res; }运行结果请输入一个非负整数5 5的阶乘是1202. 有参数、无返回值void 类型功能需要输入数据执行一个操作比如打印、修改数组不需要返回结果用void表示返回值类型。案例打印指定长度和字符的分隔线#include std; // 函数声明打印分隔线length长度ch字符 void print_line(int length, char ch); int main() { cout 内容 print_line(20, -); // 调用函数打印20个- cout _line(15, *); // 调用函数打印15个* return 0; } // 函数定义打印分隔线 void print_line(int length, char ch) { for (int i 0; i length; i) { cout } cout endl; // 换行 }运行结果第一部分内容 -------------------- 第二部分内容 ***************3. 无参数、有返回值功能不需要输入数据执行后返回一个固定或动态的结果比如获取随机数、获取当前时间。案例生成 1-100 的随机数#include #include // rand()函数 #include time()函数设置随机数种子 using namespace std; // 函数声明返回1-100的随机数 int get_random(); int main() { // 设置随机数种子确保每次运行结果不同 srand((unsigned int)time(NULL)); cout 1-100的随机数 ; for (int i 0; i { cout _random() } cout endl; return 0; } // 函数定义生成1-100的随机数 int get_random() { // rand()返回0~RAND_MAX的随机数取模100得0~99加1得1~100 return rand() % 100 1; }运行结果每次不同生成5个1-100的随机数 45 68 23 90 12三、关键知识点参数传递的 2 种方式新手必懂调用函数时参数传递有两种核心方式值传递和引用传递新手容易混淆直接看对比表 案例更清晰。传递方式核心特点适用场景值传递函数接收参数的 “副本”修改副本不影响原变量不需要修改原变量比如计算、判断引用传递函数接收参数的 “内存地址”修改会影响原变量需要修改原变量比如交换两个数、修改数组元素1. 值传递默认方式示例试图交换两个数但失败因为修改的是副本#include namespace std; // 值传递x和y是a和b的副本 void swap_value(int x, int y) { int temp x; x y; y temp; cout x x y y ; // 函数内交换成功 } int main() { int a 3, b 5; cout a b // 交换前a3, b5 swap_value(a, b); // 传入a和b的值副本 cout 交换后a , b 交换后a3, b5原变量未变 return 0; }运行结果交换前a3, b5 函数内x5, y3 交换后a3, b52. 引用传递参数前加 示例成功交换两个数修改的是原变量#include using namespace std; // 引用传递x是a的别名y是b的别名指向同一内存 void swap_ref(int x, int y) { int temp x; x y; y temp; } int main() { int a 3, b 5; cout 前a a , b b endl; // 交换前a3, b5 swap_ref(a, b); // 传入a和b的引用 cout 交换后a , b 交换后a5, b3原变量已变 return 0; }运行结果交换前a3, b5 交换后a5, b3新手记住如果想让函数修改原变量就用引用传递参数前加 否则用值传递默认。四、综合实战用自定义函数实现 “学生成绩管理”结合前一篇的系统函数和本篇的自定义函数实现一个更完整的成绩管理工具功能包括输入 n 名学生的成绩自定义函数 input_scores计算平均分自定义函数 calc_average找出最高分自定义函数 find_max按降序排序系统函数 sort输出结果自定义函数 print_result。完整代码#include 函数 using namespace std; const int MAX_STUDENT 100; // 最大学生数 // 函数声明 void input_scores(double scores[], int n); // 输入成绩引用传递n因为要修改它 double calc_average(double scores[], int n); // 计算平均分 double find_max(double scores[], int n); // 找最高分 void print_result(double scores[], int n); // 输出结果 int main() { double scores[MAX_STUDENT]; int n; // 实际学生数 // 调用自定义函数完成各功能 input_scores(scores, n); if (n 0) { cout 输入成绩 ; return 1; } print_result(scores, n); return 0; } // 函数定义1输入成绩 void input_scores(double scores[], int n) { cout 输入学生人数不超过 cin n; if (n 1 || n MAX_STUDENT) { n 0; return; // 非法输入返回0人 } cout 请输入 n 成绩 for (int i 0; i n; i) { cout ; cin scores[i]; } } // 函数定义2计算平均分 double calc_average(double scores[], int n) { double total 0; for (int i 0; i n; i) { total scores[i]; } return total / n; } // 函数定义3找最高分 double find_max(double scores[], int n) { double max_score scores[0]; for (int i 1; i n; i) { if (scores[i] max_score) { max_score scores[i]; } } return max_score; } // 函数定义4输出结果 void print_result(double scores[], int n) { // 调用系统函数sort按降序排序 sort(scores, scores n, greater()); double average calc_average(scores, n); double max_score find_max(scores, n); cout 成绩统计结果 endl; cout 降序排序后的成绩; for (int i 0; i { cout [i] } cout \n最高分 max_score 平均分 average 分 endl; }运行结果请输入学生人数不超过1005 请输入5名学生的成绩 第1名学生成绩85.5 第2名学生成绩92.0 第3名学生成绩78.5 第4名学生成绩90.0 第5名学生成绩88.0 成绩统计结果 降序排序后的成绩92 90 88 85.5 78.5 最高分92分 平均分86.8分五、新手自定义函数的 4 个常见坑点与解决方案函数声明和定义的格式不一致错误现象编译器报错 “conflicting declaration”冲突声明例子声明是int add(int a, double b)定义是int add(int x, int y)参数类型不一致解决方案声明和定义的 “返回值类型、函数名、参数类型 顺序” 必须完全一致。返回值类型和 return 语句不匹配错误现象编译器报错 “return type mismatch”返回类型不匹配例子函数返回值类型是 int却 return 3.14double 类型解决方案return 的结果类型必须和函数头的返回值类型一致必要时用强制类型转换比如return (int)3.14;。引用传递误用修改了不该改的变量错误现象原变量被函数意外修改原因不需要