配色: 字号:
C语言程序设计案例式教程-第4章 结构化程序设计
2022-11-08 | 阅:  转:  |  分享 
  
第4章 结构化程序设计《C语言程序设计案例式教程(第2版)》学习目标/Target章节概述/ Summary前面的章节一直在介绍C语言的基
本语法知识,然而仅仅依靠这些语法知识还不能编写出完整的程序。在程序中,通常需要加入业务逻辑,并根据业务逻辑关系对程序的流程进行控制
。本章将针对程序设计的灵魂——算法以及C语言中最基本的三种程序流程进行讲解。目录/Contents目录/Contents画“图”案
例4-1【案例4-1】画“图”(1)了解算法,能够说出算法的概念与特征(2)掌握流程图的画法,能够为程序需求画出流程图学习目标案例
描述编程可以完美展现思维逻辑之美。(1)把一件事情抽象出来。(2)用逻辑化的方法表达出来。通常的做法是,先为要实现的需求设计一个算
法,再根据算法画出流程图,最后根据流程图编写代码。案例描述在本案例中,有三个数x、y、z,请设计一个算法找出其中最小的数,并画出算
法流程图。知识需求本案例要求并不难,从3个数中找出最小的数,需要设计一个算法;设计出算法之后,需要根据算法画出流程图。因此,要想顺
利实现本案例,需要学习算法与流程图相关知识。设计算法√画流程图√知识讲解算法(Algorithm)是解决特定问题的步骤描述。问题的
解决方案就是算法。例如,新学期开学,从家到学校的交通方式这个问题,就有很多解决方案。1.算法知识讲解1.算法在计算机中,算法也是对
某一个问题的求解方法的描述,只是它的表现形式是计算机指令的有序序列,执行这些指令就能解决特定的问题。知识讲解1.算法一个算法,尤其
是一个成熟的算法,应该具有以下五个特性。(5)输出算法至少具有一个或多个输出。输出是输入经过信息加工后得到的结果。(4)输入算法具
有零个或多个输入。有的输入在算法执行时,有的输入嵌入在算法之中。(1)确定性算法的每一步都有确定的含义,不会出现二义性。(3)有穷
性一个算法必须在执行有穷步骤之后结束,且每一步都可在有穷时间内完成。(2)可行性算法的每一步都是可执行的,通过执行有限次操作来实现
其功能。知识讲解2.流程图算法有三种较为常用的表示方法:伪代码法、N-S结构化流程图和流程图法。用的最多的是流程图法。知识讲解2.
流程图流程图是描述问题处理步骤的一种常用图形工具,它由一些图框和流程线组成。特点:使用流程图描述问题的处理步骤形象直观、便于阅读。
画流程图时必须按照功能选用相应的流程图符号。知识讲解2.流程图流程图符号01起始框用于表示流程的开始或结束04处理框处理框用矩形表
示,它代表程序中的处理功能,如赋值、算术运算。02输入输出框用平行四边形表示,在其中可以写入输入或输出的内容。06连接点连接点用圆
形表示,用于流程图的延续。03判断框用菱形表示,它的作用是对条件进行判断。05流程线用实心单向箭头表示,指示程序的执行流向。起始框
输入输出框判断框处理框流程线连接点案例实现1.算法设计求x、y、z三个数中的最小值,其步骤如下所示。判断x>y是否成立;如果成立,
进入第(2)步;如果不成立,进入第(3)步。判断y>z是否成立;如果成立,则z为最小数;如果不成立,则y为最小数。判断x>z是否成
立;如果成立,则z为最小数;如果不成立,则x为最小数。案例实现2.流程图实现(1)程序开始(2)进入输入/输出框,输入三个变量值x
、y、z。(3)进入判断框。案例实现2.流程图实现(3)进入判断框。判断x>y是否成立,如果是成立,则进入左边的判断框,继续判断y
>z是否成立;否则进入右边的判断框,判断x>z是否成立。案例实现2.流程图实现(4)如果进入右边判断框。(4)如果进入左边判断框。
则判断x>z是否成立,如果成立,则进入左边的处理框,得出最小值是z;如果不成立,则进入右边的处理框,得出最小值是x。判断y>z是否
成立,如果成立,则进入左边的处理框,得出最小值是z;如果不成立,则进入右边的处理框,得出最小值为y。案例实现2.流程图实现(4)如
果进入右边判断框。(4)如果进入左边判断框。则判断x>z是否成立,如果成立,则进入左边的处理框,得出最小值是z;如果不成立,则进入
右边的处理框,得出最小值是x。判断y>z是否成立,如果成立,则进入左边的处理框,得出最小值是z;如果不成立,则进入右边的处理框,得
出最小值为y。(5)进入输出框,输出结果。(6)进入结束框,程序运行结束。闰年案例4-2【案例4-2】闰年掌握选择语句的用法,能够
使用if语句解决程序中的条件判断学习目标案例描述背景知识闰年是历法中的名词,它是为了弥补因人为历法规定造成的年度天数与地球公转周期
的时间差而设立的,补上时间差的年份就是闰年。在历法制定中,闰年的计算规则比较复杂,在我国古人的智慧积累中,将闰年的计算归结如下:四
年一闰,百年不闰,四百年再闰。案例描述背景知识总结起来就是如下规则。普通年份:能被4整除,但不能被100整除,该年为闰年,如200
4年就是闰年。世纪年份:能被400整除,该年为闰年,如2000年为闰年,1900年不是闰年。案例描述本案例要求编写一个程序判断闰年
,具体要求如下所示。(1)从键盘输入一个年份。(2)判断输入的年份是否为闰年,如果是闰年,则输出该年是闰年,否则输出该年不是闰年。
知识需求判断一个年份是否是闰年,需要判断两个条件。能被4整除且不能被100整除,或者能被400整除。这两个条件满足任一条件就可以得
出该年是闰年。对条件进行进行判断,可以使用C语言中的条件语句。知识讲解1.if语句if语句是指如果满足某种条件,就进行相应的处理。
例如,小明妈妈跟小明说“如果你考试得了100分,星期天就带你去游乐场玩”。如果小明考试得了100分 妈妈星期天带小明去游乐场if
(小明考试得了100分){ 妈妈星期天带小明去游乐场}知识讲解1.if语句由上述伪代码推导出if语句的格式。if(判断条件){
代码块}流程图知识讲解2.if┄else语句if…else语句是指如果满足某种条件,就进行相应的处理,否则就进行另一种处理。if(
判断条件){ 执行语句1}else{ 执行语句2}流程图知识讲解3.if┄else if┄else语句if…else if…el
se语句适用于需对多个条件进行判断,进而执行不同操作的情景中。if(判断条件1) { 执行语句1 }e
lse if(判断条件2) { 执行语句2 }……else if(判断条件n){
执行语句n }else{ 执行语句n+1 }流程图知识实现1.案例设计在程序中定义int类型的变量
year,对变量year执行以下运算。0102year%4==0 && year%100!=0。year%400==0。上述两个条
件有一个成立,则year表示的年份就是闰年。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现安全生产案例4-3【案例4-
3】安全生产掌握选择语句的用法,能够使用switch语句解决程序中的条件判断学习目标案例描述安全生产在我国非常重要,关系人民的切身
安全。对于个人来说,安全是人类最重要、最基本的需求,是人的生命与健康的基本保证。对于企业来说,安全生产是企业发展的重要保障,这是我
们在生产经营中贯彻的一个重要理念。企业是社会大家庭中的一个细胞,只有抓好自身安全生产,才能促进大环境的稳定,进而为企业创造良好的发
展环境。案例描述在本案例中,要求为企业生产编写一个安全监控程序,企业的安全级别系数有4个,用1~4整数表示。1:正常2:警告3:危
险4:立即停产当程序监测到1~2数字时,在屏幕输出相应信息;当监测到3时,在屏幕输出危险,并提示工作人员查看;当监控到4时,自动切
断机器运行,并在屏幕提示危险操作,已经自动停产。知识需求使用if…else if…else语句可以实现,但实现起来代码过长,不宜阅
读,不太合适。C语言还提供了另外一个选择语句:switch语句。switch语句用于数字或字符的判断。知识讲解1.switch语句
switch条件语句也是一种很常用的选择结构语句,和if条件语句不同,它针对某个表达式的值做出判断,从而决定程序执行哪一段代码。在
switch语句中,switch关键字后面有一个表达式,case关键字后面有目标值,当表达式的值和某个目标值匹配时,会执行对应ca
se下的语句。知识讲解1.switch语句例如,在程序中使用数字1~7来表示星期一到星期天,如果想根据某个输入的数字来输出对应中文
格式的星期值。 用于表示星期的数字 如果等于1,则输出星期一 如果等于2,则输出星期二 如果等于3,则输出星期
三 如果等于4,则输出星期四 如果等于5,则输出星期五 如果等于6,则输出星期六 如果等于7,则输出星期天 如果不是1~7,则输出
此数字为非法数字知识讲解1.switch语句根据上述伪代码总结出switch语句格式。 switch(表达式) { case 目标
值1: 执行语句1; break; … case 目标值n: 执行语句n; break; default: 执行语句n
+1; break; }知识讲解1.switch语句switch语句应用示例:根据数值判断星期几。switch(week){ca
se 1: case 2: case 3: case 4: case 5: printf("今天是工作日\n"); break;c
ase 6: case 7: printf("今天是休息日\n"); break;default: printf("输入的数字不正
确..."); break;}当变量week的值为1、2、3、4、5中任意值时,处理方式相同。知识讲解1.switch语句swit
ch语句应用示例:根据数值判断星期几。switch(week){case 1: case 2: case 3: case 4: c
ase 5: printf("今天是工作日\n"); break;case 6: case 7: printf("今天是休息日\n
"); break;default: printf("输入的数字不正确..."); break;}当变量week的值为6、7中任意
值时,处理方式相同。知识讲解2.跳转语句跳转语句的作用是使程序跳转到其他部分执行,在C语言中,常用的跳转语句有两种:break和c
ontinue。breakbreak出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语
句中,作用是结束循环,执行循环后面的代码。continuecontinue语句的作用也是使程序完成跳转知识讲解2.跳转语句cont
inue语句与break语句的区别有以下两点。VSbreak终止当前循环,执行循环体外的语句。可以用于switch语句。conti
nue终止本次循环,继续执行下一次循环。不可以用于switch语句。案例实现1.案例设计定义一个变量num用于记录生产安全级别系数
。调用scanf()函数从键盘输入安全级别系数。使用switch语句判断安全级别系数的值。根据判断结果输出相应提示信息。案例实现2
.完整代码本案例中可以实现的效果图如下。代码实现计算1到100的和案例4-4【案例4-4】计算1到100的和掌握循环语句的用法,能
够使用while语句、do…while语句解决程序中的循环问题学习目标案例描述数学家高斯有一个趣事:在他10岁时,数学老师出了一道
算术题:1+2+3+…+100的和是多少。在同学们都费心计算时,高斯没到1分钟就公布了答案为5050。老师对于高斯这样快速计算出结
果而感到吃惊,问其算法,原来高斯经过仔细观察,找了一个规律,他发现一头一尾两个数相加,每次相加的和都为101,100个数正好50组
101,于他得出10150=5050,而高斯发现的这个规律正是等差级数的对称性。背景故事案例描述本案例要求编写一个程序,计算1+
2+3+…+100的和。知识需求知识需求计算1到100的整数和,就需要逐个获取1~100的所有整数,即遍历1~100。需要用到循环
语句,C语言提供了while、do···while、for语句,先学习while、do···while语句。知识讲解1.while
语句while循环语句类似if条件判断语句,都是根据判断条件来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行
条件判断,只要条件成立,{}中的语句就会一直执行。while(循环条件){ 执行语句}知识讲解1.while语句while循环语句
的流程图如下。条件成立,循环会一直执行。知识讲解2.do┄while语句do···while循环语句和while循环语句功能类似,
只是do···while循环语句会先执行一次循环,再判断循环条件,根据循环条件结果决定是否再执行循环体。do {
执行语句 …} while(循环条件);知识讲解2.do┄while语句do···while循环语句流程图如下
。先执行一次循环体知识讲解2.do┄while语句do···while循环语句与while循环语句区别如下。VSdo···whil
e先执行一次循环体的语句再判断循环条件。会无条件执行一次循环体。while先判断循环条件,再执行循环体。条件不成立,一次循环体也不
会执行。案例实现1.案例设计案例设计步骤如下。在程序中定义int类型的变量num,初始化值为1,num用于遍历时记录1到100的整
数。定义int类型的变量sum,用于存储1到100的整数和。使用while循环遍历1~100,将遍历到数据加到sum变量中,循环条
件为num<=100。注意:每循环一次,num需要自增,以进行下一次条件判断。案例实现2.完整代码本案例中可以实现的效果图如下。代
码实现物不知数案例4-5【案例4-5】物不知数掌握循环语句的用法,能够使用for语句解决程序中的循环问题学习目标案例描述《孙子算经
》有题目:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何。答曰:二十三。术曰:三三数之剩二,置一百四十;五五数
之剩三,置六十三;七七数之剩二,置三十。并之得二百三十三,以二百一十减之即得。物不知数案例描述上述题目的含义为,有一个数,用3除余
数为2,用5除余数为3,用7除余数为2,问这个数是多少。答案是23,解法如下:用3除余数为2,则为140;用5除余数为3,则为63
;用7除余数为2,则为30。总和为233,再减去210就得到结果23。本案例要求编写一个程序,查找1000以内满足“物不知数”条件
的所有数。知识需求对3取模余数为2。对5取模余数为3。对7取模余数为2。if条件语句for循环语句知识需求根据数据需要满足的条件,
推导出案例实现所需要的知识。知识讲解1.for循环for循环通常用于循环次数已知的情况。for(初始化表达式; 循环条件; 操作表
达式){ 执行语句}执行顺序:循环条件执行语句(循环体)操作表达式知识讲解1.for循环对于初学者来说,for循环执行过程难以理解
,分别用“①”表示初始化表达式、“②”表示循环条件、“③”表示操作表达式、“④”表示循环体,通过序号来分析for循环的执行流程。f
or(① ; ② ; ③){ ④}知识讲解1.for循环for循环执行步骤如下。执行①。退出循环。执行②,如果判断条件的值非0,执
行第3步;如果判断条件的值为0,退出循环。执行④。执行③,然后继续执行第2步。num<=100。案例实现1.案例设计定义int类型
变量num,表示满足条件的数据。使用for循环遍历1~1000的数据,初始化表达式为num=1,循环条件为num<=1000,操作
表达式为num++。使用if语句判断“物不知数”的3个条件是否满足。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现九九
乘法表案例4-6【案例4-6】九九乘法表掌握循环嵌套的用法,能够使用循环嵌套解决复杂的循环问题学习目标案例描述由我国传诵下来的九九
乘法表,到现代已经普及,本案例要求编写一个程序,在控制台打印出九九乘法表。案例描述知识需求分析九九乘法表,可得出如下规律。(1)九
九乘法表一共有9行9列。(2)第1行有1列…第9行有9列,则行与列有相互作用的关系,即第n行,需要循环输出n列。(3)行列都需要遍
历,因此需要使用两次循环。(4)由于列与行有对应关系,所以列的遍历受到行的限制,列循环需要嵌套在行循环之内。九九乘法表规律由上面规
律可以推断出,实现九九乘法表需要使用循环嵌套。知识讲解循环嵌套循环嵌套是指在一个循环中再定义一个循环,while、do…while
、for循环语句都可以进行嵌套,其中,for循环嵌套是最常见的循环嵌套。for(初始化表达式; 循环条件;操作表达式) { for
(初始化表达式; 循环条件; 操作表达式) { 执行语句; }}知识讲解循环嵌套for循环嵌套应用示例:for(int i =
1; i <= 3; i++){ for(int j = 1; j <= 4; j++) { //… }}知识讲解循环嵌套
上述示例的循环过程如下图。案例实现1.案例设计案例设计步骤如下。123456九九乘法表一共有9行9列。设定外层为行,内层为列,则内
外层循环都是1~9,可以用for循环嵌套实现。使用变量i控制行数,则i的初始值为1,循环条件为i<=9。使用变量j控制列数,由于每
一行中,列数小于行数,因此其循环条件应当为j<=i。为了让九九乘法表呈现三角形状,在每一次内层循环结束时换行。为让每列之间保持间距
,在每一个输出语句后加上''\t''调整列间距。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现百钱百鸡案例4-7【案例4-
7】百钱百鸡掌握循环嵌套的用法,能够使用循环嵌套实现案例4-7学习目标案例描述张丘建《算经》有题目如下:鸡翁一,值钱五;鸡母一,值
钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?题目含义:公鸡五块钱一只,母鸡三块钱一只,小鸡雏一块钱三只,100块钱买10
0只鸡,则公鸡、母鸡、小鸡雏各多少只?百钱百鸡案例描述针对百钱百鸡问题,算经使用了三元一次不定方程进行解答,而本案例要求,编写一个
程序求解百钱百鸡问题。案例实现如果把公鸡,母鸡和小鸡的数量分别设为cock、hen、chicken,则它们满足以下条件。0<=co
ck<=20;0<=hen<=33;0<=chicken<=100;cock+hen+chicken=100;5cock+3h
en+chicken/3=100。1.案例设计知识需求由于母鸡、小鸡和公鸡的数量相互限制,所以可以使用三层循环嵌套来解决此问题。案
例设计步骤如下。定义三个整型变量cock、hen、chicken分别表示公鸡、母鸡和小鸡的数量。第一层for循环控制公鸡的数量,第
二层for循环控制母鸡的数量,第三层for循环控制小鸡的数量。在三层for循环中,cock、hen和chicken需要满足2个条件
。cock+hen+chicken=100。5cock+3hen+chicken/3=100。1.案例设计案例实现2.完整代码
本案例中可以实现的效果图如下。代码实现完美数案例4-8【案例4-8】完美数巩固前面所学知识,能够利用前面所学知识实现案例4-8学习
目标案例描述完美数是一些特殊的自然数,一个自然数,如果它所有真因子(除了自身之外的约数)之和等于它本身,这个数就是完美数。例如,6
=1+2+3、28=1+2+4+7+14,则6和28就是完美数。本案例要求编写一个程序查找完美数。案例实现1.案例设计1遍历数据查
找完美数,则需要遍历某个范围内的自然数,遍历自然数需要使用循环。2判断是否是完美数由于完美数是所有真因子的和等于其自身的数,在遍历
时,需要使用当前遍历到数除以比它小的所有自然数,这也需要使用循环实现,因此本案例要使用循环嵌套实现。案例实现1.案例设计(1)定义
long int类型的变量num,表示自然数;定义long int类型的变量sum,用于存储完美数所有真因子之和。(2)从键盘输入
数据为num赋值。(3)定义循环嵌套,外层循环,使用循环变量i遍历1~num的自然数;内层循环,使用循环变量j遍历小i的所有自然数
,即内层循环条件为j =i成立,则i为完美数,否则i不是完美数。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现回文素数案例4-9【案例4-9
】回文素数巩固前面所学知识,能够利用前面所学知识实现案例4-9学习目标案例描述素数:只有1和它本身两个因子的自然数。回文数:从左至
右读起来与从右至左读起来相同的数据,如11、202、333等。回文素数:从左至右读起来与从右至左读起来相同的素数。案例描述2位数的
回文素数只有11,所有的4位整数、6位整数、8位整数中也不存在回文素数。但是三位回文素数有很多,本案例要求通过编程求出所有小于10
00的回文素数。案例实现1.案例设计要对所有1000以内的整数进行判断 循环结构语句要判断是否为素
数以及判断是否为回文素数 选择结构语句先采用穷举法对1000以内所有整数进行遍历,判断其是否为素数
。判断一个数是否为素数的关键在于,判定整数能否被1和它自身之外的其他整数所整除,如果都不能整除,则此数为素数。案例实现1.案例设计
如果此数为素数,则继续判断此数是两位数还是三位数。如果为两位数,则判断其十位和个位是否相同,如果相同则说明此数为回文素数。如果是三
位数,则判断其百位和个位是否相同,如果相同则说明此数为回文素数。最后将所有小于1000的回文素数打印输出到屏幕上即可。案例实现2.
完整代码本案例中可以实现的效果图如下。代码实现亲密数案例4-10【案例4-10】回文素数巩固前面所学知识,能够利用前面所学知识实现
案例4-10学习目标案例描述亲密数是指这样两个数,两个数的所有真因子之和等于彼此。例如,有两个数a和b,a的所有真因子之和等于b,而b的所有真因子之和正好等于a,则a和b就是一对亲密数。本案例要求编写一个程序查找出10000以内的所有亲密数。案例实现1.案例设计对10000以内的数进行遍历,遍历每个数的真因子 循环结构语句判断两个数的真因子之和是否等于彼此 选择结构语句定义4个int类型的变量a、b、n、i,a用于遍历10000以内整数,b用于存储a的真因子之和,n用于存储b的真因子之和,i作为循环变量。案例实现1.案例设计使用for循环遍历10000以内的整数,在for循环内部,再次使用for循环遍历a的真因子并将这些真因子相加,将结果存储到变量b中。在遍历a的真因子的for循环后,再使用for循环遍历b的真因子,并将b的真因子相加,将相加结果存储到变量n中。内层的两个for循环结束之后,使用if语句判断n与b是否相等,如果相等就输出a与b的值。为了剔除重复的亲密数(如220-284与284-220),再添加一个判断条件a
献花(0)
+1
(本文系籽油荃面原创)