第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课

2026-04-30
| 54页
| 45人阅读
| 0人下载
精品

内容正文:

7.9、7.10节:函数的应用实例 C语言程序设计 电子工业出版社 掌握使用穷举法解决逻辑问题的思想 熟练掌握函数的定义、声明与调用 能够分析复杂逻辑问题并转化为代码 能够运用函数思想独立开发小型项目 深度培养逻辑思维与问题解决能力 树立规范编程习惯与团队协作意识 知识目标 能力目标 素养目标 01 01 01 学习目标 目录 Part 01 教学导入 Part 02 知识讲授 Part 03 师生互动 Part 04 课堂练习 Part 05 课堂小结 教学导入:一个神秘的岛屿 传说在遥远的海域,有一个名为“逻辑岛”的神秘地方。岛上居住着三个性格迥异、奇特的民族,让我们一起来认识他们: 诚实族 性格最纯粹的族群,永远只说真话。他们的话语如同镜子般,真实反映客观发生的一切。 说谎族 与诚实族完全相反,永远只说假话。无论事实真相如何,他们的陈述必定与真实情况背道而驰。 两面族 最难以捉摸的族群,说话真假交替。如果这次说了真话,那么下一次必定说假话,反之亦然。 教学导入:他们是谁? 探险家在旅途中偶遇了三位神秘居民:张三、李四和王五。他们只留下了几句简短的陈述,暗藏着身份的线索。 张三:“我是诚实族的,从不说谎。” 李四:“没错,张三说的是实话,他确实是诚实族的。” 王五:“我可以保证,我绝对不是两面族的成员。” 💡 提问:根据线索,你能推断他们的身份吗? 教学导入:用C语言解开谜题 人脑的局限 面对复杂的逻辑推理,人脑容易因疲劳或疏漏而出错,且处理大量重复计算时效率十分低下。 计算机的强项 计算机拥有强大且稳定的算力,最擅长不知疲倦地处理海量的逻辑判断,以及枯燥的重复性计算任务。 C语言解题之道 本节课将利用函数封装与穷举算法,编写程序让计算机代劳,快速准确地解开谜题,迈出解决实际问题的关键一步。 知识讲授 函数应用实例 C语言趣味程序实例7 项目开发实例 第一部分 C语言趣味程序实例7 知识讲授 知识讲授:谜语博士的难题 🔍 三大民族特性定义 诚实族:永远只说真话,陈述内容绝对属实。 说谎族:永远只说假话,陈述内容与事实完全相反。 两面族:说话真假交替,没有固定的真假规律。 🗣️ 现场陈述线索 A 陈述:“我是诚实族的,我从不说谎。” B 陈述:“A说的是真话,他确实是诚实族。” C 陈述:“我不是两面族的,我是诚实的。” 🎯 核心编程求解目标 根据上述人物陈述线索与民族特性规则,使用 C 语言编写逻辑判断程序,推导出 A、B、C 三人具体分别属于哪个民族(诚实族 / 说谎族 / 两面族)。 问题分析:穷举所有可能性 核心思想:穷举法 这是一种简单直接的算法,其核心思想是:列出所有可能的候选解,并逐一验证每个解是否满足问题的条件。 身份可能性定义 每人有3种身份:诚实族(1) / 说谎族(2) / 两面族(3) 穷举空间计算 三人身份组合共有 3 × 3 × 3 =27种可能性 程序执行逻辑 循环生成所有组合 → 条件判断筛选唯一解 问题分析:将语言转化为逻辑表达式 核心变量定义模型 变量定义: • a=1: 左边的人是诚实族的 • b=1: 中间的人是诚实族的 • c=1: 右边的人是诚实族的 • aa=1: 左边的人是两面族的 • bb=1: 中间的人是两面族的 • cc=1: 右边的人是两面族的 说谎族表示: • 左边说谎: !a && !aa • 中间说谎: !b && !bb • 右边说谎: !c && !cc 核心约束条件推导 条件1:三人来自三个不同民族 • 每人仅属一个民族:a+aa≠2, b+bb≠2, c+cc≠2 • 三民族各有一人:a+b+c=1 && aa+bb+cc=1 条件2:根据左边人的回答推导 • 陈述:“中间的人是诚实族的” • 逻辑表示:a&&!aa&&b&&!bb||!a&&!b • 解释:若他诚实则中间诚实;若他不诚实则中间不诚实。 问题分析:构建判断条件 核心约束条件推导 条件3:根据中间人的回答推导 中间人说:“我是两面族的”。 逻辑表示:!b。 解释:他不是诚实族的人。 条件4:根据右边人的回答推导 右边人说:“中间的人是说谎族的”。 逻辑表示:c&&!b&&!bb||(!c&&!cc)&&(b||bb)||!c&&cc 解释:如果他是诚实族,则中间人是说谎族;如果他是说谎族,则中间人不是说谎族;如果他是两面族,则他的回答无关紧要。 综合逻辑条件 将所有逻辑条件联合在一起,利用穷举法求解。凡是使上述条件同时成立的变量取值就是题目的答案。 完整逻辑表达式: a+aa!=2&&b+bb!=2&&c+cc!=2&&a+b+c==1&&aa+bb+cc==1 &&(a&&!aa&&b&&!bb||!a&&!b)&&!b &&(c&&!b&&!bb||(!c&&!cc)&&(b||bb)||!c&&cc) 代码解析:变量定义 #include <stdio.h> int main() { // a,b,c: 代表A、B、C三人的身份 // 1:诚实族 2:说谎族 3:两面族 int a, b, c; // aa,bb,cc: 代表三人说话的真假 // 1:真话 0:假话 int aa, bb, cc; // ... (逻辑判断部分) } 身份变量 (a, b, c) 定义三个整型变量,分别对应A、B、C三个人。通过数字枚举身份: 1 代表「诚实族」,2 代表「说谎族」,3 代表「两面族」。 真假变量 (aa, bb, cc) 定义三个整型变量,分别对应三人所说的话。通过布尔值概念量化: 1 代表说的是「真话」,0 代表说的是「假话」,用于后续逻辑运算。 代码解析:穷举所有可能 for (a = 0; a <= 1; a++) for (b = 0; b <= 1; b++) for (c = 0; c <= 1; c++) for (aa = 0; aa <= 1; aa++) for (bb = 0; bb <= 1; bb++) for (cc = 0; cc <= 1; cc++) { // 判断逻辑写在这里 } 核心逻辑:6层循环穷举所有身份可能性 为什么需要六层循环? 变量定义: • a, b, c: 左、中、右是否为诚实族(1=是) • aa, bb, cc: 左、中、右是否为两面族(1=是) 穷举逻辑: 每个人有三种身份(诚实、说谎、两面)。通过六个布尔变量分别表示是否为诚实和两面,说谎族通过 !a && !aa 推导。因此需要六层循环覆盖所有可能性。 代码解析:构建“if”条件 核心逻辑条件汇总 条件1:三人来自三个不同民族 • a + aa != 2 • b + bb != 2 • c + cc != 2 • a + b + c == 1 • aa + bb + cc == 1 条件2:根据左边人的回答推导 • (a && !aa && b && !bb) || (!a && !b) 条件3:根据中间人的回答推导 • !b 条件4:根据右边人的回答推导 • (c && !b && !bb) || ((!c && !cc) && (b||bb)) || (c&&cc) 核心代码实现:if条件判断 将所有逻辑条件组合成一个完整的if判断语句。 代码实现: if((a+aa!=2)&&(b+bb!=2)&&(c+cc!=2) && (a+b+c==1) && (aa+bb+cc==1) &&((a&&!aa&&b&&!bb)||(!a&&!b)) &&(!b) &&((c&&!b&&!bb)||((!c&&!cc)&&(b||bb))||(c&&cc))) { // 输出结果 } 代码解析:输出结果 ▍ 核心代码片段:输出结果 printf("The man stand on left is a %s. ", aa?"double-dealer":(a?"honest":"lier")); printf("The man stand on center is a %s. ", bb?"double-dealer":(b?"honest":"lier")); printf("The man stand on right is a %s. ", cc?"double-dealer":(c?"honest":"lier")); 输出逻辑解析 ✅ 格式化输出与三元运算符 使用`printf`格式化输出结果。其中`? :`是三元运算符,语法为: 条件 ? 表达式1 : 表达式2 若条件为真,执行表达式1,否则执行表达式2。 🤔 逻辑映射 `aa ? "double-dealer" : ...`:若aa为1,说明左边是两面族。 `... : (a ? "honest" : "lier")`:若aa为0,则根据a的值判断是诚实族还是说谎族。 谜语博士的难题:程序代码 程序文本:谜语博士的难题 #include<stdio.h> main() { int a,b,c,aa,bb,cc; for (a=0;a<=1;a++) for (b=0;b<=1;b++) for (c=0;c<=1;c++) for (aa=0;aa<=1;aa++) for (bb=0;bb<=1;bb++) for (cc=0;cc<=1;cc++) if (a+aa!=2&&b+bb!=2&&c+cc!=2&&a+b+c==1&&aa+bb+cc==1 &&(a&&!aa&&b&&!bb||!a&&!b)&&!b &&(c&&!b&&!bb||(!c&&!cc)&&(b||bb)||!c&&cc)){ printf ("The man stand on letf is a %s. ", aa?"double-dealer":(a?"honest":"lier")); printf ("The man stand on center is a %s. ", bb?"double-dealer":(b?"honest":"lier")); printf ("The man stand on right is a %s. ", cc?"double-dealer":(c?"honest":"lier")); } } 谜语博士的难题:运行结果 背诵记忆 穷举法思想 列出所有可能性,逐一验证。这是解决逻辑问题最直观、最有效的基础方法之一。 逻辑运算符 熟练运用逻辑与(&&)、逻辑或(||)和逻辑非(!),将简单条件组合,构建复杂的判断逻辑。 多层循环 通过嵌套循环结构,高效遍历二维甚至多维的可能性空间,是解决组合问题的关键手段。 问题建模 将自然语言描述的现实逻辑问题,抽象并转化为计算机可以理解的数学表达式和代码逻辑。 深入思考 Q1 Q1: 为什么需要六层循环?能不能优化? 穷举逻辑:使用a, b, c和aa, bb, cc六个变量,共同构成了所有可能的身份组合。 可读性优先:六层循环的写法最为直观,逻辑清晰,便于初学者理解和后续的代码维护。 Q2 Q2: 复杂的if条件能否简化? 条件对应:if条件中的每一部分都直接对应题目中的一个逻辑约束。 可读性优先:将所有条件清晰地罗列出来,更符合解题思路,便于对照题目进行逻辑检查和代码调试。 课堂练习(一) 题目描述 题目:请编写一个C语言函数 int factorial(int n),用于计算一个非负整数 n 的阶乘。在主函数中调用该函数,并输出计算结果。 阶乘定义: n! = n * (n-1) * ... * 1,特别地,0! = 1。 编程思维与算法讲解 核心思想:递归 (Recursion) 递归是一种编程思想,指函数自己调用自己。它将一个复杂问题分解为一个或多个规模更小的相同问题。 解题思路 • 递归终止条件: 当 n 为 0 或 1 时,阶乘结果为 1,这是递归的出口。 • 递归调用: 将计算 n! 的问题,转化为计算 n * (n-1)! 的子问题。 核心考察 函数的定义、递归思想的应用、问题分解能力。 课堂练习(一) 程序文本:计算一个非负整数 n 的阶乘 #include<stdio.h> int factorial(int n) { if(n==0||n==1) return 1;// 递归终止条件 else return n*factorial(n-1); } main() { int n; scanf("%d",&n); printf("%d",factorial(n)); } 课堂练习(一) 课堂练习(二) 题目描述 请编写一个C语言函数 int isPrime(int num),用于判断一个整数是否为素数。如果是素数,返回1;否则返回0。在主函数中调用该函数,判断并打印出1到100之间的所有素数。 素数定义:一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。 编程思维与算法讲解 核心思想:函数封装与算法优化 将“素数判断”这个独立功能封装成一个函数,便于主程序多次调用。 解题思路 判断逻辑:对于一个数 num,检查从 2 到 sqrt(num) 的所有整数是否能整除它。如果能,则不是素数。 算法优化:只需检查到 sqrt(num),因为如果 num 有大于 sqrt(num) 的因数,那么它必然有一个对应的小于 sqrt(num) 的因数。 核心考察 函数的定义与调用、算法逻辑的实现、代码优化意识。 课堂练习(二) 程序文本:判断一个整数是否为素数 #include <stdio.h> #include <math.h> // 判断是否为素数的函数 int isPrime(int num) { int i; if (num <= 1) return 0; for (i=2;i<=sqrt(num);i++) if (num % i == 0) return 0; return 1; } main() { int i; for(i=1; i<=100; i++) if(isPrime(i)) printf("%d ", i); } 课堂练习(二) 第二部分 知识讲授 项目开发实例 项目介绍:学生成绩管理系统 项目目标:开发一个简单的学生成绩管理系统,实现对学生信息的录入、查询、统计分析及展示等基础操作,掌握模块化编程思想。 01. 显示功能菜单 打印清晰的功能选项列表,引导用户进行下一步操作。 02. 添加学生成绩信息 交互式录入新学生的学号、姓名及三门核心课程的成绩数据。 03. 查找学生成绩信息 根据用户输入的学号作为关键字,快速检索并显示对应学生的详情。 04. 计算学生平均成绩 遍历数据,自动计算并输出系统中所有学生的三门课程平均分。 05. 计算各科成绩最高分 对比所有数据,找出并展示某一门指定课程中成绩最高的学生信息。 06. 显示所有学生成绩信息 以结构化表格的形式,完整列出当前系统中存储的所有学生记录。 总体设计:模块化编程 核心思想:模块化设计 将一个复杂的大程序,分解为若干个功能单一、相对独立的小程序(模块/函数)。每个模块负责一个特定的功能,模块之间通过函数调用进行通信,降低系统耦合度。 核心优势 结构清晰易维护: 逻辑分层明确,排查Bug与功能扩展更高效。 高效团队协作: 不同开发人员可并行负责不同模块,互不干扰。 数据结构分析:如何存储学生信息? 💡 核心方案:三数组并行存储 • 学号:no[100]存储唯一标识 (整型) • 姓名:name[100][20]存储字符串信息 (长度20) • 成绩:score[100][3]存储三门课成绩 (浮点型) 🔗 数据关联:索引一致性原则 同一个学生的多维信息,必须存储在三个数组的相同下标中。 示例:no[0]=201201 对应 name[0]="One" 对应 score[0]={80, 82, 66} 📊 方案评估:优缺点与优化方向 ✅优点:简单直观,直接复用数组知识,初期开发快。 ⚠️缺点:关联性弱。 💡 进阶:引入struct结构体优化。 程序入口:“main()” 函数 程序的总控中心 作为程序的唯一入口,负责统筹调度 welcome、menu、choose 等所有功能模块的执行顺序。 ▍核心代码片段 (C语言) void main()/*主函数*/ { welcome(); menu(); while(1){ choose (); if (on==0) { printf("系统运行结束! "); break; } } } 人机交互:菜单与选择 menu() 函数:负责“展示” 利用 printf 格式化输出文本,将功能选项清晰地呈现给用户,建立直观的交互入口。 choose() 函数:负责“导航” scanf("%d", &c); // 获取输入 switch(c) { // 核心分支逻辑 case 1: insert(); break; ... } 核心机制:switch-case 分支 根据用户输入的数字,精准映射并跳转至对应功能模块。 人机交互:菜单与选择 程序文本: /*显示欢迎信息*/ void welcome() { printf(" |----------------------------------------------| "); printf(" | 欢迎使用学生成绩管理系统 | "); printf(" |----------------------------------------------| "); } /*显示菜单栏*/ void menu () { printf(" |-------------------Student--------------------| "); printf("|\t 1.添加学生成绩信息 | "); printf("|\t 2.查找学生成绩信息 | "); printf("|\t 3.删除学生成绩信息 | "); printf("|\t 4.课程成绩统计 | "); printf("|\t 5.显示所有学生信息 | "); printf("|\t 6.显示功能菜单 | "); printf("|\t 0.退出系统 | "); printf(" |-------------------Student--------------------| "); } 人机交互:菜单与选择 程序文本: /*选择要执行的功能*/ void choose() { int c; printf("选择您要执行的功能,0-6:"); scanf("%d",&c); switch(c) { case 0:on=0;return;break; case 1:insert();break; case 2:search();break; case 3:del();break; case 4:total();break; case 5:print ();break; case 6:menu();break; } } 功能一:添加学生信息 “insert()” 功能核心描述 引导用户输入学号、姓名及三门核心课程成绩,通过合法性与唯一性双重校验后,将完整信息存储至全局数据数组中。 关键执行步骤 输入学号 范围校验 查重防重 存入数组 & 更新计数 终端交互演示 > 指令: 1 | 学号: 201206 | 姓名: Six (C:95/Java:85/DB:90) > [系统提示] 数据校验通过,信息已成功添加至数据库! 功能一:添加学生信息 “insert()” 程序文本: /*添加学生信息*/ void insert () { printf("请输入学生学号,格式为2012**:"); int x,i; scanf("%d",&x); if(x<0||x>201299) { printf("输入信息不合法! ");return; } for (i=0;i<num;i++){ if(no[i]!=0&&no[i]==x) { printf("该学号已经存在! ");return;} } no[num]=x; printf("输入学生姓名:"); scanf ("%s",&name[num]); printf("请输入C语言成绩:"); scanf("%d",&score[num][0]); printf("请输入Java成绩:"); scanf("%d",&score[num][1]); printf("请输入数据库成绩:"); scanf("%d",&score[num][2]); num++; realnum++; score_sum++; printf("添加成功! "); } 功能二:查找学生信息“search()” ▍ 功能核心定义 接收用户输入的目标学号,通过程序逻辑检索数据,精准定位并展示该学生的完整档案信息(如姓名、成绩等)。 01. 输入学号 用户在交互终端输入待查询的学生唯一标识(ID)。 02. 格式校验 系统自动验证输入内容是否为纯数字,确保数据有效性。 03. 遍历检索 利用 For 循环遍历 No 数组,逐一比对寻找匹配的索引值。 04. 结果输出 找到则打印学生详情;未找到则提示“查无此人”。 功能二:查找学生信息“search()” 程序文本 /*查找学生信息*/ void search() { int x, i,j; printf("请输入要查询的学生学号:"); scanf ("%d",&x); if(x<201201||x>201299) { printf("您查询的学生不存在! ");return; } for (i=0;i<num;i++) {if (no[i]==x)break; } if(no[i]!=x) { printf("您查询的学号不存在!n");return; } else { printf("学号\t\t姓名\t\tC语言\tJava\t数据库 "); printf("%d\t\t",no[i]); printf("%s\t\t",name[i]); for (j=0;j<3;j++) printf("%d\t",score[i][j]); printf(" "); } } 功能三:删除学生信息“del()” ▌ 核心功能定义 接收用户输入的目标学号,在学生信息数组中检索并执行对应的删除操作。 ▌ 关键执行步骤 01. 查找定位:遍历数组,匹配输入的学号 no[i]。 02. 逻辑删除:不移除元素,仅将该位置的 no[i] 赋值为 0。 03. 状态更新:将有效人数 realnum 和总分 score_sum 同步减1。 ▌ 逻辑删除 vs 物理删除 推荐:逻辑删除 仅做标记,数据可恢复 慎用:物理删除 移动数据,执行效率低 功能三:删除学生信息“del()” 程序文本 /*删除学生信息*/ void del() { int x, i; printf("请输入要删除的学生学号:"); scanf("%d",&x); if(x<201201||x>201299) {printf("您输入的学生信息不存在! ");return; } for (i=0;i<num;i++) { if(no[i]==x) break; } if (no[i]!=x) { printf("您输入的学生信息不存在! ");return; } else { no[i]=0; score_sum--; realnum--; printf("删除成功! ");} } 功能四:课程成绩统计“total()” ▍功能核心描述 遍历成绩数组,精准计算并展示每门课程的最高分、最低分及平均分,为教学评估提供数据支撑。 ▍核心执行流程 数据清洗:过滤逻辑删除(no[i]==0),复制有效数据。 函数调用:复用 max() / min() / average() 计算统计值。 结果输出:格式化打印统计表格,对齐显示数据。 ⚠️ 典型代码缺陷警示 原代码计算平均分时,误将「C语言」与「数据库」成绩的索引位置写反。这提醒我们编程时必须关注数组下标细节。 功能四:课程成绩统计“total()” 程序文本 /*统计课程信息*/ void total() { int i,j;int n=0; int score2[3][100]; for (i=0;i<num;i++) { if (no[i]==0) continue; else { for (j=0;j<3;j++) { score2[j][n]=score[i][j]; } n++; } } printf("统计\tC语言\tJava\t数据库 "); printf("最高分\t%d\t%d\t%d ",max (score2[0]),max (score2[1]),max(score2[2])); printf("最低分\t%d\t%d\t%d ",min (score2[0]),min (score2[1]),min(score2[2])); printf ("平均分\t%d\t%d\t%d ",average (score2[2]),average (score2[1]),average (score2[0])); } 功能五:显示所有学生信息“print()” 功能核心描述 该函数的核心任务是遍历整个学生信息数组,过滤掉已被逻辑删除(学号标记为0)的无效数据,并将剩余的有效学生信息按照规范的表格格式进行输出展示。 💡 设计意图 提供一个直观的数据总览窗口,方便用户快速查阅班级整体成绩情况。 关键执行流程 01. 初始化表头打印当前统计到的有效学生总数,以及格式化的表头标题。 02. 循环遍历数组使用循环结构依次访问 `no` 数组中的每一个索引位置。 03. 过滤无效数据若检测到 `no[i] == 0`,执行 `continue` 跳过本次循环。 04. 输出详细信息若数据有效,根据索引 i 打印该行学生的完整成绩信息。 终端模拟效果 > 共有 5 名有效学生 NO. NAME C JAVA DB 201201 One 80 82 66 201202 Two 91 65 76 201203 Thr 88 74 76 201204 Fou 86 87 81 201205 Fiv 98 88 77 📌 输出格式:对齐、清晰、易读 功能五:显示所有学生信息“print()” 程序文本 /*显示学生信息*/ void print (){ printf("共有%d名学生,学生信息如下: ",realnum); int i,j; printf("学号\t\t姓名\t\tc语言\t\tJava\t\t数据库 "); for(i=0;i<num;i++){ if(no[i]==0) continue; printf("%d\t\t",no[i]); printf("%s\t\t",name[i]); for (j=0;j<3;j++) printf("%d\t\t",score[i][j]); printf(" "); } return; } 辅助函数:计算工具集 (max, min, average) max() 最大值 遍历数组中的所有元素,通过循环逐一比较,最终筛选出数值最大的那个结果。 int max(int s[]) { int maxs; int i; maxs=s[0]; for (i=0;i<score_sum;i++) { if(maxs<s[i]) maxs=s[i]; } return maxs; } min() 最小值 遍历数组中的所有元素,通过循环逐一比较,最终筛选出数值最小的那个结果。 int min (int s[]) { int mins; int i; mins=s[0]; for(i=0;i<score_sum;i++) {if(mins>s[i]) mins=s[i]; } return mins; } avg() 平均值 先利用循环累加数组所有元素得到总和,再除以数组中元素的总个数得出平均值。 int average(int s[]) { int sum=0; int i; for(i=0;i<score_sum;i++) {sum=sum+s[i];} return sum/score_sum; } 学生成绩管理系统——运行结果 背诵记忆 模块化编程思想 将复杂问题分解为多个独立的小模块,降低整体程序的复杂度,提升代码的可读性与复用性。 函数的定义与调用 掌握如何设计规范的函数接口(参数传递与返回值定义),并在主程序中灵活调用实现功能。 流程控制应用 重点掌握 `switch` 多分支语句和 `while/for` 循环,在菜单驱动的交互程序中实现逻辑流转。 结构体与结构体数组 学习如何通过结构体组织同一对象的不同属性数据,并利用结构体数组来批量管理多条复杂记录。 全局变量与局部变量 深入理解两者在作用域(有效范围)和生命周期上的区别,并结合实际项目场景进行合理的变量设计。 课堂练习 🎯 题目要求 10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。编写程序求出经过这样多少次后大家手中的糖块一样多,每人各有多少块糖。 要求建立函数judge用来判断每个孩子手中的糖果数是否相同,函数print输出数组中每个元素的值。 课堂练习 程序文本 #include<stdio.h> int j=0;/*记录糖果分配次数*/ int judge(int c[])/*判断每个孩子手中的糖果数是否相同*/ { int i; for(i=0;i<10;i++) if(c[0]!=c[i]) return 1;/*不相同返回1*/ return 0;/*相同返回0*/ } void print(int s[])/*输出数组中每个元素的值*/ { int k; printf(" %2d ",j++); for(k=0;k<10;k++) printf("%4d",s[k]); printf(" "); } main() { int sweet[10]={10,2,8,22,16,4,10,6,14,20};/*初始化数组数据*/ int i,t[10],L; printf("child 1 2 3 4 5 6 7 8 9 10 "); printf("time "); print(sweet);/*输出每个孩子手中糖果的块数*/ while(judge(sweet))/*若不满足要求则继续进行循环*/ { for(i=0;i<10;i++) if(sweet[i]%2==0) t[i]=sweet[i]=sweet[i]/2; /*若为偶数则直接分出一半*/ else t[i]=sweet[i]=(sweet[i]+1)/2; /*若为奇数则加1后再分出一半*/ for(L=0;L<9;L++) sweet[L+1]=sweet[L+1]+t[L]; sweet[0]+=t[9]; print(sweet);/*输出当前每个孩子手中的糖果数*/ } } 课堂练习 课堂小结 01 / 第一堂课 · 逻辑与推理 掌握穷举法解决逻辑问题的思路,学习将自然语言转化为逻辑表达式的技巧,通过“谜语博士的难题”深入理解多层循环与条件判断的应用。 02 / 第二堂课 · 模块化实践 实践模块化编程思想,基于函数、结构体与数组开发“学生成绩管理系统”,理解小型项目的整体架构设计与数据管理方式。 💡 核心收获 函数不仅是代码的复用工具,更是我们组织程序结构、管理系统复杂度的核心方法论。 编程思维进阶之路 从基础的逻辑推理,迈向结构化的项目构建 课堂小结 作业布置: 1. 编写函数,给出年月日时,可计算该日是本年的第几天。 2. 编写程序,当输入2个数a和b时,可调用自己编写的函数交换a和b的值。 3. 输入一个字符串,调用函数判断该字符串是不是回文。所谓回文是指顺序读写和倒序读完全一样的字符串。例如,字符串“eye”就是回文。 课后任务 谢谢观看 THANKS $

资源预览图

第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课
1
第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课
2
第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课
3
第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课
4
第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课
5
第7章 第9、10节:函数应用实例(课件)-《C语言程序设计》(电子工业出版社)上好课
6
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。