C程序流程设计_第1页
C程序流程设计_第2页
C程序流程设计_第3页
C程序流程设计_第4页
C程序流程设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ProgrammingFundamentalsC程序流程设计算法与结构化编程计算机专业基础课程课程目录CONTENTS01顺序结构理解程序按语句书写顺序依次执行的基本模式,掌握赋值与输入输出语句的使用场景与语法规范。02选择结构学会用if和switch语句根据条件判断改变执行路径,实现程序的分支决策能力。03循环结构掌握while、do-while、for三种循环的适用场景与区别,能用break和continue精确控制循环流程。04函数与模块化理解函数定义、调用与参数传递机制,培养将复杂问题分解为可复用模块的设计思维。05综合案例通过学生成绩统计系统串联全部知识点,体验从流程图设计到代码实现的完整开发过程。CC程序流程设计CONCEPTSDefinition什么是算法算法是为解决特定问题而设计的有限、明确、可执行的步骤序列,它是程序设计的灵魂——先有算法再有代码,算法的质量直接决定程序的效率与正确性。解题策略的形式化描述同一问题可有多种算法,评价标准包括时间复杂度、空间复杂度和可读性三个维度。算法≠程序算法可用自然语言、流程图、伪代码等多种方式表达,程序是算法用某种编程语言的具体实现。清晰的结构层次每个步骤都有明确的输入输出关系,避免歧义和二义性,便于后续编码与调试。生活中的算法实例菜谱、导航路线规划都是算法,都遵循"有限步骤+明确指令+可达结果"的基本范式。CC程序流程设计ALGORITHMCHARACTERISTICS算法的五大特性一个有效的算法必须同时满足有穷性、确定性、可行性、有零个或多个输入、有一个或多个输出这五个特性,缺一不可,这是判断一段描述能否称为算法的根本标准。01有穷性与确定性有穷性要求算法必须在有限步骤内结束,不能出现无限循环或永不终止的情况,否则程序将无法产出结果。确定性指每条指令的含义必须唯一明确,不存在歧义解释,相同输入在任何环境下都应产生相同的执行路径。02可行性与输入输出可行性意味着每个步骤都能通过已实现的基本运算在有限时间内完成,不能包含无法实现的抽象操作。输入输出:算法可以有零个或多个输入(如常量算法无需外部数据),但必须至少有一个输出,没有输出的算法毫无意义。CC程序流程设计METHODSREPRESENTATION算法的表示方法算法的表达不依赖特定编程语言,常用自然语言、传统流程图、N-S盒图、伪代码和PAD图五种方式,各有优劣,实际工程中流程图与伪代码最为常用。自然语言通俗易懂但容易产生歧义,适合向非技术人员解释思路,不适合直接作为编码依据。传统流程图用标准化图形符号(椭圆起止框、矩形处理框、菱形判断框)直观展示控制流,是最广泛使用的可视化工具。N-S盒图取消流程线,用嵌套矩形表示结构,强制体现结构化设计思想,避免传统流程图中随意跳转导致的混乱。伪代码介于自然语言与编程语言之间,用类英语关键字描述逻辑,既保持可读性又接近实际代码,便于快速转化为C程序。CC程序流程设计SECTIONDIVIDERCHAPTER01顺序结构程序按书写顺序依次执行,是最基础的流程结构06CC程序流程设计OVERVIEWSEQUENTIALSTRUCTURE顺序结构概述顺序结构是最基本的程序流程:语句按照书写的先后顺序依次执行,前一条语句的结果可作为后一条语句的输入,形成线性的数据流动链条。逐行执行,无分支无跳转顺序结构中不存在分支或跳转,CPU从main函数第一条可执行语句开始,逐行向下执行直到遇到return或右花括号为止。先声明后使用,赋值非相等变量必须先声明后使用,赋值语句"="的含义是"将右侧表达式的值存入左侧变量",而非数学中的相等关系。复合语句:花括号包裹多条语句复合语句用一对花括号{}包裹多条语句,在语法上视为单条语句,常用于需要整体执行的代码块。空语句:仅含一个分号空语句仅含一个分号";",不执行任何操作,有时用作循环体占位符或满足语法要求的占位。main()stmt_1;stmt_2;stmt_3;return;CC程序流程设计I/O&ASSIGNMENTPRACTICE赋值语句与数据输入输出数据的流入流出是程序与外界交互的桥梁:scanf负责从键盘读取数据存入变量,printf负责将变量值格式化输出到屏幕,二者配合赋值语句构成顺序结构的数据处理闭环。赋值与格式化输出1赋值运算符'='右侧可以是常量、变量或表达式,计算结果会自动转换为左侧变量的类型后再存储。2printf格式控制符%d对应整型、%f对应浮点型、%c对应字符型,格式符数量必须与后续参数一一对应。Assignment&Output键盘输入与常见陷阱1取地址符'&'scanf需要在变量名前加取地址符(数组名除外),遗漏'&'会导致写入非法内存地址引发运行时错误。2空白符分隔scanf默认以空格、Tab、回车作为分隔符,连续读取多个数值时用户可用空格或换行分隔输入。Input&PitfallsExample温度转换程序示例华氏温度转摄氏温度的公式为C=5/9×(F-32),这个简单例子完整展示了顺序结构的典型流程:输入→计算→输出三步线性执行,是理解数据流动的最佳入门案例。1变量声明float程序首先声明两个float变量fahrenheit和celsius,分别存储输入的华氏温度和计算得到的摄氏温度。2读取输入printfscanf("%f",&fahrenheit)使用printf提示用户输入,再用scanf("%f",&fahrenheit)读取键盘输入的浮点数并存入变量。3核心计算易错点celsius=5.0/9.0*(fahrenheit-32)核心计算语句celsius=5.0/9.0*(fahrenheit-32)中,5.0/9.0写成浮点常量避免整数除法截断为零。4格式化输出printf("%.2f",celsius)最后用printf("%.2f",celsius)保留两位小数输出结果,验证当输入212时输出应为100.00。temp_convert.c#include

<stdio.h>int

main(){floatfahrenheit,celsius;printf("请输入华氏温度:");scanf("%f",&fahrenheit);celsius=5.0/9.0*(fahrenheit-32);printf("摄氏温度:%.2f\n",celsius);return

0;}5/95.0/9.0注意:5/9结果为0(整数截断),必须写成5.0/9.0输入Input计算Process输出Output顺序结构·SequentialStructureCHAPTER02选择结构根据条件判断选择不同的执行路径CC程序流程设计CONTROLFLOWCONDITIONALSTATEMENTSif-else与嵌套ifif-else提供双分支能力,嵌套if处理多层判断;层数过多时应改用else-if阶梯或switch重构。if-else双分支结构if(条件)语句A;else语句B;if(条件)语句A;else语句B;条件为真执行A,为假执行B,两者必选其一。elseifelse总是与上方最近的尚未匹配的if配对,缩进不影响配对关系,嵌套时必须用花括号明确归属。else-if阶梯与重构建议elseif多条件互斥时用elseif串联,比深层嵌套更清晰,编译器也会优化为跳转表。switch嵌套超过三层时应考虑重构:提取子条件为独立函数、改用switch或查表法替代硬编码条件链。SYNTAXCPROGRAMMINGswitch多分支语句switch适用于单一整型表达式的多值等值判断,相比else-if更简洁;需注意case穿透和default兜底。整型约束switch表达式必须是整型或字符型,不能是浮点型或字符串;case标签必须是编译时常量。switch(grade){case'A':/*整型常量*/case90:/*编译时常量*/}case穿透每个case末尾通常需要break终止switch,否则会继续执行下一个case的代码称为穿透。case1:printf("一");break;//防穿透case2:/*...*/default兜底default处理所有未被case匹配的值,虽非语法必需但强烈建议始终添加以增强健壮性。default:printf("未知输入");break;//增强健壮性合并处理多个case共享代码时可省略中间case的语句体,如caseA:casea:实现大小写合并处理。case'A':case'a':printf("字母A");break;EXAMPLESELECTIONSTRUCTURE选择结构综合例题闰年判断综合运用逻辑运算和嵌套if:能被4整除且不能被100整除,或能被400整除即为闰年。1闰年条件C语言表达(year%4==0&&year%100!=0)||(year%400==0)注意括号优先级,逻辑与优先于逻辑或2嵌套if实现:外层判断能否被4整除,内层区分100和400整除,层次清晰但代码较长。3else-if阶梯改写:可将三个条件平铺排列,减少嵌套深度,推荐在实际项目中使用。4测试用例应覆盖四种情况:2024普通闰年1900世纪非闰年2000世纪闰年2023普通非闰年C程序设计基础SECTIONDIVIDERChapter03循环结构重复执行某段代码直到满足终止条件for(;;)while(expr)do...while15CC程序流程设计SYNTAXwhile与do-while循环while先判断条件再执行循环体,可能一次都不执行;do-while先执行再判断,至少执行一次。选择取决于业务是否允许零次执行。01while循环的执行模型while(表达式)语句;每次迭代前先求值表达式,非零则执行循环体并回到判断处,为零则跳出。循环体内必须有改变条件表达式的语句,否则条件永远为真导致死循环;初始化应在while之前完成。02do-while的适用场景do{语句;}while(表达式);先无条件执行一次循环体,再判断是否继续,语法上while后的分号不可省略。典型应用包括菜单系统(至少显示一次菜单)、输入验证(至少读取一次再判断合法性)等需要先行动后判断的场景。SYNTAXfor循环详解for(初始化;条件;更新)将循环三要素集中在头部,特别适合已知迭代次数或遍历数组的场景;三个表达式均可省略。01执行顺序初始化→判断条件→执行循环体→更新→再判断条件。初始化仅执行一次,更新在每次循环体之后执行。02标准遍历范式for(inti=0;i<n;i++)for(inti=0;i<n;i++)是遍历数组的标准写法,i从0到n−1共n次迭代,与数组下标天然对齐。03表达式省略省略初始化需在for前手动赋初值;省略条件等价于永真循环;省略更新需在循环体内手动修改控制变量。04C99变量作用域C99起允许在for的初始化部分声明变量,该变量作用域仅限for循环内部,离开循环后不可访问。CONTROLFLOWCPROGRAMMINGbreak与continue控制break立即终止最内层循环或switch;continue仅跳过当前迭代剩余代码,直接进入下一次迭代的条件判断或更新步骤。break的跳转语义在循环中break使程序跳出整个循环体,后续迭代全部取消;在switch中break防止case穿透到下一个分支。嵌套循环中break只能跳出最内层循环,若要跳出外层需用标志变量、goto或多层条件判断等替代方案。continue的迭代跳过continue跳过本次循环体中位于它之后的所有语句,直接回到while/do-while的条件判断或for的更新表达式处。典型用途是在遍历中过滤不符合条件的元素:if(!valid)continue;使主逻辑只处理有效数据,减少嵌套层级。APPLICATIONNESTEDLOOPS循环嵌套与典型应用循环嵌套是实现二维遍历、矩阵运算和图案打印的基础手段:外层控制行,内层控制列,两层变量的组合决定每个位置的输出。01九九乘法表打印九九乘法表是经典嵌套案例:外层i从1到9控制行数,内层j从1到i控制每行列数,输出i×j后换行。02二维数组遍历双重for循环遍历矩阵:for(i=0;i<rows;i++)for(j=0;j<cols;j++)arr[i][j],内外层边界必须分别对应行列维度。03冒泡排序嵌套循环实现相邻比较交换:外层控制轮数(n-1轮),内层控制每轮比较次数(逐轮递减),时间复杂度O(n²)。04嵌套深度控制嵌套层数不宜超过三层:过深嵌套会导致代码难以理解和维护,应考虑抽取函数或改用递归/算法库替代。PRACTICE循环结构课堂练习以下练习题覆盖while、for和嵌套循环的核心用法,请在课堂上独立完成,检验对循环控制变量、终止条件和嵌套逻辑的掌握程度。基础题:累加与计数1用while循环计算1到100的和,要求循环变量从1开始递增,累加器初始为0,循环条件为i<=100。2用for循环统计用户输入的10个整数中正数的个数,负数和零不计入,体会for循环在已知次数场景下的简洁性。进阶题:图案与算法3用双重for循环打印5行直角三角形星号图案,第i行打印i个星号,注意内层循环上限与外层变量的关联。4改写冒泡排序使其支持降序排列,思考只需修改哪一处比较运算符即可完成升序到降序的切换。Chapter04函数与模块化将功能封装为独立单元,提高代码复用性CCPROGRAMMINGFUNCTIONCONCEPT函数的定义与调用函数是将特定功能代码封装为可复用单元的机制:定义时指定返回类型、函数名、参数列表和函数体,调用时通过函数名传递实参获取返回值。01函数定义格式—返回类型函数名(参数列表){函数体},无返回值时用void,无参数时括号内写void或留空。02函数声明(原型)—放在调用之前,告知编译器函数的返回类型和参数类型,使函数定义可以出现在调用之后。03return语句—将控制权交还给调用者并带回返回值,void函数可用不带表达式的return提前退出。04main函数—本身也是函数,由操作系统调用,其返回值int表示程序退出状态,0通常表示正常结束。DEFINITIONintadd(inta,intb){returna+b;}CALLintresult=add(3,5);//result=8VOIDvoidgreet(void){printf("Hi");}FUNCTION参数传递机制C语言函数参数一律采用值传递:实参的值被复制给形参,函数内对形参的修改不影响实参;若要修改实参需传递指针。值传递的单向性调用时实参表达式的值被计算并复制到形参变量中,形参是函数栈帧内的局部变量,与实参占据不同内存位置。swap(a,b)交换形参x和y的值不会影响main中的a和b,因为交换的是副本而非原始变量本身。地址传递实现双向通信将实参的地址(&a)传给指针形参(int*p),函数内通过*p即可读写实参所在的内存单元,实现真正的修改。数组作为参数时自动退化为指向首元素的指针,因此函数内修改数组元素会直接影响原数组,无需额外取地址。CONCEPTS递归函数设计递归是函数直接或间接调用自身的技巧,将大问题分解为结构相同的子问题;必须设定明确的基准情形作为终止条件,否则导致无限递归和栈溢出。阶乘递归定义阶乘n!的递归定义为n×(n-1)!,基准情形0!=1;每次调用n减1,必然趋向基准情形从而保证终止。双分支递归斐波那契fib(n)=fib(n-1)+fib(n-2)是典型双分支递归,朴素实现时间复杂度为指数级,需记忆化优化。栈帧与溢出风险每次递归在栈上分配新栈帧保存局部变量和返回地址,递归深度过大(通常数千层以上)会导致栈溢出崩溃。递归转迭代任何递归算法都可改写为等价迭代版本,当性能敏感或递归深度不可控时应优先考虑迭代实现。CC程序流程设计DESIGNPHILOSOPHYMODULAR模块化程序设计思想模块化是将复杂系统分解为高内聚、低耦合独立单元的设计哲学:每个模块承担单一职责,通过明确接口与其他模块交互。高内聚·低耦合模块内部各元素紧密围绕同一功能组织,模块间依赖尽可能少,修改一个模块不影响其他模块的正常运行。头文件与源文件分离头文件声明对外接口(函数原型、宏、类型定义),源文件包含实现细节,编译时通过#include组装。数据传递原则全局变量破坏模块独立性,应用参数和返回值传递数据;必要时用static限定文件作用域减少可见范围。设计策略自顶向下从main勾勒整体流程再逐层细化;自底向上先写底层工具函数再逐步组装上层逻辑。CHAPTER05综合案例串联全部知识点完成一个完整小程序05CCPROGRAMMINGCASESTUDYPROJECTOVERVIEW学生成绩统计系统设计学生成绩统计系统综合运用数组存储、循环遍历、选择判断和函数封装,实现录入、查询、排序、统计四项核心功能,是本课程知识点的集大成实践项目。数据结构与功能划分结构体封装:用结构体Student封装学号、姓名和三科成绩,用Student数组存储全班数据,MAX_STUDENTS宏定义上限便于统一管理。函数模块化:四大功能各自封装为独立函数:inputScores录入、queryByNo查询、sortByTotal排序、printStats统计,main仅作调度。核心算法与交互设计排序与统计:排序采用冒泡或选择排序按总分降序排列,统计函数遍历数组计算平均分、最高分和及格率并格式化输出。菜单驱动:交互用do-while循环+switch实现:显示菜单→读取选项→执行对应函数→返回菜单,选0退出程序。MethodologyCPROGRAMDESIGN流程图设计与代码实现先画流程图再写代码是工程实践的标准流程:流程图帮助理清控制流和数据流,暴露逻辑漏洞;代码则是流程图的精确翻译。01顶层流程设计成绩统计系统的顶层流程图包含:开始→初始化→显示菜单→读取选项→switch分发→各功能子流程→返回菜单→结束。02录入子流程录入子流程用for循环遍历学生数组,每次循环内依次读入学号、姓名和三科成绩,输入后立即校验数据合法性。03排序子流程排序子流程用双重循环实现冒泡排序,外层控制轮数、内层执行相邻比较交换,每轮结束后最大值沉底。04代码映射规则代码实现时每个函数对应流程图中的一个子流程块,注释中标注对应的流程步骤编号,便于后期维护和文档同步。CC程序流程设计DEBUGGINGPRACTICALSKILLS常见错误与调试技巧C语言的灵活性带来了丰富的出错可能:语法错误由编译器捕获,逻辑错误需靠调试定位;掌握常见错误模式和系统化调试方法比盲目试错高效十倍。高频错误模式四大高频陷阱:scanf漏写&导致段错误、==写成=导致条件恒真、数组越界访问未定义行为、switch漏break导致穿透——这四类占初学者错误的八成以上。隐性陷阱:未初始化变量直接使用、整数除法截断、浮点比较用==而非误差范围、函数声明与定义签名不一致也是常见错误。系统化调试方法插桩与断点:printf插桩法在关键位置打印变量值和执行标记,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论