网站html模板,如何利用dw建设网站,企业在线培训系统,建设银行园区公积金管理中心网站课程目标
理解函数的概念和优势掌握函数的定义、声明和调用理解参数传递#xff08;值传递#xff09;的机制理解返回值的意义和使用初步了解递归的概念学会将复杂问题模块化第一部分#xff1a;函数的基本概念#xff08;40分钟#xff09;
1.1 什么是函数#xff1f;
生…课程目标理解函数的概念和优势掌握函数的定义、声明和调用理解参数传递值传递的机制理解返回值的意义和使用初步了解递归的概念学会将复杂问题模块化第一部分函数的基本概念40分钟1.1 什么是函数生活比喻厨房电器微波炉、烤箱 - 输入食材输出熟食我们不需要知道内部原理快递员把包裹参数交给快递员他负责送到目的地返回值工厂生产线每个工人函数负责特定的工序1.2 为什么需要函数没有函数的困境#includeiostreamusingnamespacestd;intmain(){// 计算圆的面积重复代码doubleradius15.0;doublearea13.14159*radius1*radius1;cout圆1的面积: area1endl;doubleradius23.0;doublearea23.14159*radius2*radius2;cout圆2的面积: area2endl;doubleradius37.0;doublearea33.14159*radius3*radius3;cout圆3的面积: area3endl;return0;}使用函数的便利#includeiostreamusingnamespacestd;// 定义计算圆面积的函数doublecalculateCircleArea(doubleradius){return3.14159*radius*radius;}intmain(){// 使用函数计算圆的面积cout圆1的面积: calculateCircleArea(5.0)endl;cout圆2的面积: calculateCircleArea(3.0)endl;cout圆3的面积: calculateCircleArea(7.0)endl;return0;}1.3 函数的优势代码复用避免重复编写相同代码模块化将复杂问题分解为小问题可读性函数名可以描述功能代码更易理解易于维护修改功能只需修改一个地方团队协作不同程序员可以负责不同函数第二部分函数的定义和调用60分钟2.1 函数的组成部分函数定义语法返回类型 函数名(参数列表){// 函数体return返回值;// 如果返回类型不是void}2.2 无参数无返回值的函数#includeiostreamusingnamespacestd;// 函数定义显示欢迎信息voidshowWelcome(){cout****************endl;cout* 欢迎使用 *endl;cout****************endl;}// 函数定义显示菜单voidshowMenu(){cout\n 菜单 endl;cout1. 开始游戏endl;cout2. 设置endl;cout3. 退出endl;coutendl;}intmain(){// 函数调用showWelcome();showMenu();cout程序继续执行...endl;// 可以多次调用同一个函数showMenu();return0;}2.3 带参数无返回值的函数#includeiostreamusingnamespacestd;// 函数定义显示指定次数的消息voidshowMessage(string message,inttimes){for(inti0;itimes;i){coutmessageendl;}}// 函数定义显示个人信息voidshowPersonInfo(string name,intage,doubleheight){cout\n 个人信息 endl;cout姓名: nameendl;cout年龄: age岁endl;cout身高: height米endl;}// 函数定义打印指定行数和列数的图案voidprintPattern(charsymbol,introws,intcols){for(inti0;irows;i){for(intj0;jcols;j){coutsymbol ;}coutendl;}}intmain(){// 调用带参数的函数showMessage(Hello, Function!,3);showPersonInfo(小明,12,1.65);printPattern(*,4,6);return0;}2.4 带返回值的函数#includeiostreamusingnamespacestd;// 函数定义计算两个数的和intadd(inta,intb){intresultab;returnresult;// 返回计算结果}// 函数定义判断一个数是否为偶数boolisEven(intnumber){returnnumber%20;// 直接返回布尔表达式的结果}// 函数定义计算阶乘intfactorial(intn){intresult1;for(inti1;in;i){result*i;}returnresult;}// 函数定义获取成绩等级chargetGrade(intscore){if(score90)returnA;elseif(score80)returnB;elseif(score70)returnC;elseif(score60)returnD;elsereturnE;}intmain(){// 使用带返回值的函数intsumadd(5,3);cout5 3 sumendl;// 直接在表达式中使用函数调用cout10 15 add(10,15)endl;// 使用判断函数intnum7;if(isEven(num)){coutnum 是偶数endl;}else{coutnum 是奇数endl;}// 使用计算函数cout5的阶乘 factorial(5)endl;// 使用等级函数intscore85;cout成绩 score 的等级是: getGrade(score)endl;return0;}第三部分参数传递机制50分钟3.1 值传递Pass by Value值传递的特点函数接收参数的副本不是原始变量在函数内修改参数不会影响原始变量就像复印文件修改复印件不影响原件#includeiostreamusingnamespacestd;// 值传递示例voidmodifyValue(intx){cout函数内修改前: x xendl;xx*2;// 修改参数的值cout函数内修改后: x xendl;}// 交换两个数的值错误版本voidswapWrong(inta,intb){inttempa;ab;btemp;cout函数内: a a, b bendl;}// 计算矩形面积和周长voidcalculateRectangle(doublelength,doublewidth,doublearea,doubleperimeter){arealength*width;perimeter2*(lengthwidth);}intmain(){// 值传递示例intnum5;cout调用函数前: num numendl;modifyValue(num);cout调用函数后: num numendl;cout注意num的值没有改变endl;cout\n--- 交换函数测试 ---endl;intx10,y20;cout交换前: x x, y yendl;swapWrong(x,y);cout交换后: x x, y yendl;cout注意x和y的值没有交换endl;return0;}3.2 多返回值问题#includeiostreamusingnamespacestd;// 方法1使用多个函数不推荐doublecalculateArea(doublelength,doublewidth){returnlength*width;}doublecalculatePerimeter(doublelength,doublewidth){return2*(lengthwidth);}// 方法2使用引用参数后续课程详细讲解voidcalculateRectangle(doublelength,doublewidth,doublearea,doubleperimeter){arealength*width;perimeter2*(lengthwidth);}// 方法3使用数组或结构体后续课程学习intmain(){doublelen5.0,wid3.0;// 方法1调用多个函数doublearea1calculateArea(len,wid);doubleperimeter1calculatePerimeter(len,wid);cout方法1 - 面积: area1, 周长: perimeter1endl;// 方法2使用引用参数doublearea2,perimeter2;calculateRectangle(len,wid,area2,perimeter2);cout方法2 - 面积: area2, 周长: perimeter2endl;return0;}第四部分函数声明和定义分离30分钟4.1 为什么需要函数声明问题场景#includeiostreamusingnamespacestd;intmain(){// 错误函数在调用之后定义intresultmultiply(5,3);// 编译错误cout结果: resultendl;return0;}// 函数定义在main之后intmultiply(inta,intb){returna*b;}4.2 函数声明函数原型解决方案函数声明 函数定义#includeiostreamusingnamespacestd;// 函数声明函数原型intmultiply(inta,intb);voidshowInfo(string name,intage);doublecalculateBMI(doubleweight,doubleheight);boolisPrime(intnumber);intmain(){// 现在可以正确调用函数了cout5 × 3 multiply(5,3)endl;showInfo(小明,12);doublebmicalculateBMI(45.0,1.65);coutBMI: bmiendl;intnum17;if(isPrime(num)){coutnum 是质数endl;}else{coutnum 不是质数endl;}return0;}// 函数定义intmultiply(inta,intb){returna*b;}voidshowInfo(string name,intage){cout姓名: name, 年龄: ageendl;}doublecalculateBMI(doubleweight,doubleheight){returnweight/(height*height);}boolisPrime(intnumber){if(number1)returnfalse;for(inti2;i*inumber;i){if(number%i0)returnfalse;}returntrue;}4.3 多文件组织了解概念// math_functions.h - 头文件函数声明#ifndefMATH_FUNCTIONS_H#defineMATH_FUNCTIONS_Hintadd(inta,intb);intmultiply(inta,intb);doubledivide(doublea,doubleb);#endif// math_functions.cpp - 源文件函数定义#includemath_functions.hintadd(inta,intb){returnab;}intmultiply(inta,intb){returna*b;}doubledivide(doublea,doubleb){if(b!0)returna/b;elsereturn0;}// main.cpp - 主程序#includeiostream#includemath_functions.husingnamespacestd;intmain(){cout5 3 add(5,3)endl;cout5 × 3 multiply(5,3)endl;cout10 ÷ 3 divide(10,3)endl;return0;}第五部分递归初步50分钟5.1 什么是递归递归的概念函数直接或间接调用自身像俄罗斯套娃大娃娃里面有小娃娃像镜子对着镜子无限反射生活比喻讲故事“从前有座山山里有座庙庙里有个老和尚在讲故事从前有座山…”查字典查一个词解释中又有不认识的词继续查…5.2 递归的基本结构递归三要素基准情况递归结束的条件递归调用函数调用自身向基准情况推进每次调用都更接近结束条件5.3 递归示例阶乘计算数学定义0! 1基准情况n! n × (n-1)!递归关系#includeiostreamusingnamespacestd;// 递归函数计算阶乘intfactorial(intn){// 基准情况if(n0||n1){cout到达基准情况: factorial(n) 1endl;return1;}// 递归调用cout计算 factorial(n) n × factorial(n-1)endl;intresultn*factorial(n-1);cout返回 factorial(n) resultendl;returnresult;}intmain(){intnumber5;cout计算 number 的阶乘:endl;intresultfactorial(number);coutnumber! resultendl;return0;}5.4 递归示例斐波那契数列数学定义F(0) 0F(1) 1F(n) F(n-1) F(n-2)#includeiostreamusingnamespacestd;// 递归函数计算斐波那契数列intfibonacci(intn){// 基准情况if(n0)return0;if(n1)return1;// 递归调用returnfibonacci(n-1)fibonacci(n-2);}// 显示斐波那契数列voidshowFibonacci(intcount){cout斐波那契数列前count项: ;for(inti0;icount;i){coutfibonacci(i) ;}coutendl;}intmain(){showFibonacci(10);// 计算单个斐波那契数intn6;cout斐波那契数列第n项: fibonacci(n)endl;return0;}5.5 递归的优缺点优点代码简洁表达力强适合解决分治问题符合数学定义缺点可能效率较低重复计算可能栈溢出递归深度太大可能难以理解第六部分综合应用示例60分钟6.1 数学工具包#includeiostream#includecmathusingnamespacestd;// 函数声明voidshowMenu();intadd(inta,intb);intsubtract(inta,intb);intmultiply(inta,intb);doubledivide(inta,intb);intpower(intbase,intexponent);intfactorial(intn);intgcd(inta,intb);// 最大公约数boolisPrime(intnumber);intmain(){intchoice;do{showMenu();cout请选择操作: ;cinchoice;if(choice1choice4){inta,b;cout请输入第一个数字: ;cina;cout请输入第二个数字: ;cinb;switch(choice){case1:couta b add(a,b)endl;break;case2:couta - b subtract(a,b)endl;break;case3:couta × b multiply(a,b)endl;break;case4:if(b!0){couta ÷ b divide(a,b)endl;}else{cout错误除数不能为0endl;}break;}}elseif(choice5){intbase,exp;cout请输入底数: ;cinbase;cout请输入指数: ;cinexp;coutbase^exp power(base,exp)endl;}elseif(choice6){intn;cout请输入要计算阶乘的数: ;cinn;if(n0){coutn! factorial(n)endl;}else{cout错误阶乘只能计算非负整数endl;}}elseif(choice7){inta,b;cout请输入第一个数: ;cina;cout请输入第二个数: ;cinb;couta和b的最大公约数是: gcd(a,b)endl;}elseif(choice8){intnumber;cout请输入要检查的数: ;cinnumber;if(isPrime(number)){coutnumber 是质数endl;}else{coutnumber 不是质数endl;}}elseif(choice!0){cout无效选择endl;}}while(choice!0);cout感谢使用数学工具包endl;return0;}// 函数定义voidshowMenu(){cout\n 数学工具包 endl;cout1. 加法endl;cout2. 减法endl;cout3. 乘法endl;cout4. 除法endl;cout5. 幂运算endl;cout6. 阶乘endl;cout7. 最大公约数endl;cout8. 质数判断endl;cout0. 退出endl;}intadd(inta,intb){returnab;}intsubtract(inta,intb){returna-b;}intmultiply(inta,intb){returna*b;}doubledivide(inta,intb){returnstatic_castdouble(a)/b;}intpower(intbase,intexponent){intresult1;for(inti0;iexponent;i){result*base;}returnresult;}intfactorial(intn){if(n0||n1)return1;returnn*factorial(n-1);}intgcd(inta,intb){if(b0)returna;returngcd(b,a%b);}boolisPrime(intnumber){if(number1)returnfalse;for(inti2;i*inumber;i){if(number%i0)returnfalse;}returntrue;}6.2 图形绘制工具#includeiostreamusingnamespacestd;// 函数声明voiddrawRectangle(intwidth,intheight,charsymbol);voiddrawTriangle(intheight,charsymbol);voiddrawDiamond(intsize,charsymbol);voiddrawChristmasTree(intlevels);intmain(){intchoice;cout 图形绘制工具 endl;// 绘制矩形cout\n1. 绘制矩形:endl;drawRectangle(8,4,*);// 绘制三角形cout\n2. 绘制三角形:endl;drawTriangle(5,#);// 绘制菱形cout\n3. 绘制菱形:endl;drawDiamond(5,);// 绘制圣诞树cout\n4. 绘制圣诞树:endl;drawChristmasTree(4);return0;}// 函数定义绘制矩形voiddrawRectangle(intwidth,intheight,charsymbol){for(inti0;iheight;i){for(intj0;jwidth;j){coutsymbol;}coutendl;}}// 函数定义绘制三角形voiddrawTriangle(intheight,charsymbol){for(inti1;iheight;i){// 打印空格for(intj1;jheight-i;j){cout ;}// 打印符号for(intj1;j2*i-1;j){coutsymbol;}coutendl;}}// 函数定义绘制菱形voiddrawDiamond(intsize,charsymbol){// 上半部分for(inti1;isize;i){for(intj1;jsize-i;j)cout ;for(intj1;j2*i-1;j)coutsymbol;coutendl;}// 下半部分for(intisize-1;i1;i--){for(intj1;jsize-i;j)cout ;for(intj1;j2*i-1;j)coutsymbol;coutendl;}}// 函数定义绘制圣诞树voiddrawChristmasTree(intlevels){for(intlevel1;levellevels;level){intheightlevel1;for(inti1;iheight;i){// 打印空格for(intj1;jlevels-i1;j){cout ;}// 打印星号for(intj1;j2*i-1;j){cout*;}coutendl;}}// 树干for(inti0;i2;i){for(intj1;jlevels;j){cout ;}cout|endl;}}练习与作业基础练习必做练习1数学函数库创建以下数学函数square(int n)- 返回n的平方cube(int n)- 返回n的立方isEven(int n)- 判断n是否为偶数isPositive(int n)- 判断n是否为正数max(int a, int b)- 返回a和b中的较大值练习2温度转换器编写温度转换函数celsiusToFahrenheit(double celsius)- 摄氏转华氏fahrenheitToCelsius(double fahrenheit)- 华氏转摄氏编写主程序让用户选择转换方向并输入温度练习3字符串处理函数创建字符串处理函数stringLength(string str)- 返回字符串长度不用内置函数countVowels(string str)- 统计元音字母个数reverseString(string str)- 返回反转后的字符串挑战练习选做挑战1递归深度探索编写递归函数计算数字的各位数之和编写递归函数判断字符串是否是回文测试递归深度限制找出你的计算机最多支持多深的递归挑战2函数组合应用创建一个数字分析器程序包含以下功能判断质数计算所有因数判断完美数等于其所有真因数之和的数判断阿姆斯特朗数各位数字立方和等于自身的数挑战3模块化游戏将之前学过的猜数字游戏重构为模块化程序generateRandomNumber()- 生成随机数getUserGuess()- 获取用户猜测giveHint(int guess, int target)- 给出提示playGame()- 游戏主逻辑实验任务任务1函数调用栈实验通过调试或输出语句跟踪以下递归函数的执行过程voidcountDown(intn){if(n0)return;cout进入: countDown(n)endl;countDown(n-1);cout离开: countDown(n)endl;}任务2值传递验证设计实验验证值传递机制voidtestValuePassing(intx){x100;cout函数内: x xendl;}// 调用后检查原始变量是否改变任务3函数性能测试比较递归和迭代版本的阶乘函数测试计算20!的时间测试能计算的最大阶乘值分析两种方法的优缺点学习总结今天学到了✅函数概念模块化编程的基本单元✅函数定义返回类型、函数名、参数列表、函数体✅函数调用使用函数执行特定任务✅参数传递值传递机制和特点✅返回值函数执行结果的返回✅函数声明提前声明函数原型✅递归初步函数调用自身的编程技巧关键技能模块化设计将复杂问题分解为函数接口设计设计合理的函数参数和返回值代码复用通过函数避免重复代码递归思维用递归方式解决自相似问题下一课预告下一节课我们将学习排序与查找算法包括选择排序、冒泡排序、顺序查找和二分查找这是算法学习的重要基础