第3章C语言程序的流程控制
利用计算机进行程序设计时,不仅仅只处理一些简单的数据,在大部分的程序设计里处理的问题还是相当复杂的。对于那些复杂的程序设计,读者不可能直接就能写出程序的源代码,而是要通过一些具体的设计方法(如用程序流程图)把程序设计思想先写出来,然后根据程序流程图编写代码。本章将具体介绍进行程序设计时使用的基本方法和C程序的流程控制。
3.1程序设计的基本知识
3.1.1程序流程图
在描述一个程序的基本结构思想时有很多种方法,其中程序流程图是最常用也是最基本的方法。
1.传统程序流程图
传统流程图表示法的特点是用一些图框表示各种类型的操作,用线表示这些操作的执行顺序。美国国家标准化协会ANSI规定了一些常用的流程图符号,现已为世界各
国普遍采用。我国也有自己的国家标准GB 1526-89与该标准基本相同,本书就参照ANSI标准做具体介绍。标准中各种图示如图3.1所示。
起止框输入输出框判断框处理框
或
流程线连接点注释框
图3.1 传统流程图表示法
下面对其中一些主要符号作简要说明:
(1)起止框是用来标识程序的开始和结束位置的。规定流程图以起止框开始,以起止框结束。
(2)输入输出框也叫数据框,其中可以注明数据名称、来源、用途或其它的文字说明。
(3)菱形框的作用是对一个给定的条
件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。
(4)处理框用矩形表示各种处理功能。例如,执行一个或一组特定的操作,从而使信息的值、信息的形式或所在位置发生变化。另外在矩形框内可注明特定处理名称或其简要功能。
(5)流程线用带箭头的直线表示程序的执行顺序。当流程自左向右或自上向下时流程线可以不带箭头,其它情况应加箭头表示流程。
(6)连接点用小圆圈表示将画在不同地方的流程线连接起来。下图中有两个以①为标志的连接点,它表示这两个点是互联在一起的,实际它们是同一个点。这种连接通常用在图形画不下而需要分开画时。
(7)注释框不是流程图的必要部分,其不反映流程操作,只是为了流程图中某些操作做解释补充的,以帮助阅读流程图的人更好的理解流程图的作用。
2.N-S流程图
灵活的流程线在程序设计中有它自己的优点,但也隐藏着许多导致错误的祸根。因为它允许用流程线使流程任意转移,这对程序设计是一个隐患,它使程序流程看起来很乱,使程序难以理解和维护。针对这一弊病,1973年美国学者I . Nassi和B . Shneiderman 提出了一种无流程线的流程图,称为N-S图。它的基本表示方法是用一个矩形框,把整个程序算法像堆积木一样组成。其基本结构如图3.3、3.4、3.5、3.6所示。
3.1.2程序的三种基本结构
结构化的程序设计方法是面向过程的程序设计的基本方法。1996年意大利Bobra和Jacopini提出了三种基本程序结构。已经证明,这三种算法可以解决任何复杂的问题。
1.顺序结构
(传统流程图表示) (N-S 流程图表示)
图3.3 顺序结构流程图
2. 选择结构
(传统流程图表示) (N-S 流程图表示)
图3.4 选择结构流程图
3. 循环结构
(1)while 循环结构
( 传统流程图表示) (N-S 流程图表示)
图3.5 当型循环结构流程图
当条件P 成立
语句组
(2)do …while 循环结构
( 传统流程图表示) (N-S 流程图表示) 图3.6 直到型流程图
例3.1 画出求s=1+2+3+ … +100的传统流程图和N-S 流程图。
3.2C语言的基本语句
3.2.1表达式语句
C语言是一种表达式语言,所有的操作运算都是通过表达式来实现的。由表达式组成的语句称为表达式语句,它是由一个表达式后接一个分号组成。这里要特别强调,没有分号的不是语句。
1.赋值语句
赋值语句由赋值表达式加一个分号组成。例如:i = 1 ;
2.函数调用语句
函数调用语句由函数调用表达式后跟一个分号组成。例如:
strcpy( s1, "student", 4 );
printf("good afternoon\n " );
3.空语句
空语句是只有一个分号而没有其他表达式的语句。例如:
;
它不产生任何操作运算,只作为形式上的语句,被填充在控制结构之中。
3.2.2复合语句
C语言还允许把一组语句放在一对花括号之中,称为复合语句。要特别强调一点,一个复合语句的后花括号之后不应再写分号。例如:
{
c = getchar();
b = b +
c ;
putchar();
}
3.2.3流程控制语句
选择型结构语句
循环控制结构语句
流程转向语句
……
3.3选择结构程序设计
在C语言中实现选择结构的语句有两大类:if语句和switch语句。
3.3.1if语句
(1)简单if语句
格式:if(表达式)语句;
功能:如果表达式的值为真,则执行其
后的语句,否则不执行该语句。其N-S流程图如图3.9表示。
图3.9 简单if语句流程图
(2)基本if … else语句
格式:if(表达式)语句1; else 语句2;
功能:如果表达式值为真,则执行语句1,否则执行语句2。其执行过程如图3.10所示。
图3.10 基本if … else语句流程图
例3.3 从键盘输入任意一整数,求其绝对值并输出。
# include
{
int x;
printf(" please enter a number: ");
scanf("%d",&x);
if(x<0)
x=-x;
else
x=x;
printf("number abs is d%",x);
}
(3)if语句的嵌套
当if语句中执行的语句又是if语句时,那么就构成了if语句的嵌套。其一般形式可以表示如下:
if(表达式)
if 语句1;
else 语句2;
else
if 语句3;
else 语句4;
在if语句的三种形式中,如果所要执行的语句超过一条必须用花括号括起来,构成一条复合语句,才能被完全执行。
例如:if(a>b)
{ a++;
b++; }
else
{ a=10;
b=100;
}
3.3.2switch语句
一种用于多分支选择的语句——switch 语句,用该语句编写的程序简洁、易懂。而且,其执行效率要比同样功能的阶梯式if …else if …else语句要高的多。
1.switch语句的一般形式
switch语句的一般形式如下:
switch(表达式)
{
case 常量表达式1:语句组1;
case 常量表达式2:语句组2;
·
··
case 常量表达式n:语句组n;
default :语句组n+1;
}
2.switch语句的执行过程
系统首先计算“表达式”的值,并逐个与其后的“常量表达式”的值相比较,当“表达式”的值与某个“常量表达式”的值相等时,就以此作为程序执行的入口,执行switch 结构中后面的各语句。如果没有任何一个case后面的“常量表达式”的值与“表达式”的值匹配,则执行default后面的语句(组)。例3.6用switch语句实现例3.4的功能。
# include
main()
{
int score;
printf("please input score(0-100):");
scanf(" %d ",&score); /*从键盘输入学生成绩*/
switch(score/10);
{
case 10:
case 9:printf("excellent\n");break;
case 8:printf("good\n"); break;
case 7:printf("medium\n"); break;
case 6:printf("pass\n"); break;
default:printf("fail\n");
}
}
3.4循环结构程序设计
C语言提供了循环控制的三种语句:while语句、do…while循环语句和for循环语句。
3.4.1while语句
while语句是一种条件循环结构,其控制结构如下:
while(条件表达式)
循环体
例3.7计算并输出从1加到100的和:s = 1+2+3+┅100。
# include
main()
{
int sum = 0 , i = 1; /*设置和与循环变量*/
while(i<=100)
{ sum = sum+i;
i++;
}
printf(" Sum=%d ", sum);
}
程序执行结果如下:
The sum of 1 to 100 equals is:5050
3.4.2do…while循环语句
do…while结构在C语言中用于实现“直到型”循环。其一般形式为:
do
循环体
while(条件表达式);
例3.9用do…while语句求1+2+3+…+100的和。
# include
main()
{
int i =1 , sum=0;
do
{ sum = sum+i;
i++;
}
while(i<=100);
printf("sum= %d",sum);
}
3.4.3for循环语句
for语句的使用最为灵活,既可以用于循环次数确定的情况,也可以用于循环次数未知的情况。
for语句的一般形式如下:
for(表达式1;表达式2;表达式3)
循环体
如图3.13所示,for语句的执行流程是:
图3.13 for语句的执行流程
例3.10输入一个整数,求出它的所有因子。
求一个整数n的所有因子可以采用穷举法,对1~ n的全部整数进行判断,凡是能够整除n的都是n的因子。由分析可知,这是一个已知循环次数的循环,因此可以使用for 语句。
# include
main()
{
int n, k;
printf("Please input a positive integer:");
scanf(" %d ",&n);
printf(" Number %d Factors:",n);
for(k=1;k<=n;k++)
if(n%k= =0)
printf(" %d",k);
printf("\n");
}
程序某次的运行结果如下:
Please input a positive integer:36↙Number 36 Factors:1 2 3 4 6 9 12 18 36
3.4.4循环嵌套
一个循环体内又可以包含另外一个完整的循环结构,从而构成多重循环结构,这就是循环的嵌套。
3.4.5continue和break语句
1.continue语句
continue语句可以出现在循环体中,其作用是结束本次循环,但不退出循环结构。它跳过循环体中下面尚未执行的语句,直接进行下一次是否执行循环的判定。
例3.12输出60~600之间所有不能被9整除的数。
# include
main()
{
int m;
for(m=60; m<=600 ; m++)
{
if(m%9= =0)
continue ;
printf("%d\n",m);
}
}
由这个程序可以看出,当某个自然数m 被9整除时,就利用continue语句结束本次循环(其后的输出语句不执行),但不退出for循环结构,接着对下一个数进行判断。
2.break语句
break语句只能用在switch结构或循环结构,而不能用于其他结构。但用在循环结构中时,只能跳出(或终止)它所在的循环,而不能同时跳出(或终止)多层循环。
本章小结
从程序执行的流程来看,程序可分为三种最基本的结构:顺序结构、分支结构以及循环结构。本章从学习程序的流程图画法入手系统的介绍了这三种基本结构。
程序中执行部分最基本的单位是语句。本章主要介绍了以下三种类型的语句:
(1)表达式语句,任何表达式末尾加上分号即可构成表达式语句,常用的表达式语句为赋值语句。
(2)复合语句,由{}把多个语句括起来组成一个语句。复合语句被认为是单条语句,它可出现在所有允许出现语句的地方,如循环体等。
(3)控制语句,用于控制程序流程,由专门的语句定义符及所需的表达式组成。主要有条件判断执行语句,循环执行语句,转向语句等。
C语言提供了多种形式的条件语句以构成分支结构。
(1)if语句主要用于单向选择。
(2)if…else语句主要用于双向选择。
(3)if …else if…else语句和switch语句用于多向选择。
这几种形式的条件语句一般来说是可以互相替代的。
C语言提供了三种循环语句。for语句主要用于给定循环变量初值、步长增量以及循环次数的循环结构。循环次数及控制条件
要在循环过程中才能确定的循环可用while 或do-while循环。三种循环语句可以相互嵌套组成多重循环。循环之间可以并列但不能交叉。可用转移语句把流程转出循环体外,但不能从外面转向循环体内。在循环程序中应避免出现死循环,即应保证循环变量的值在运行过程中可以得到修改,并使循环条件逐步变为假,从而结束循环。
第3章Java程序流程控制 实验1 三种基本程序结构 【实验目的】 (1)掌握Java中顺序语句、选择语句及循环语句的使用。 (2)熟练掌握用三种基本程序结构及相关的变量、表达式、运算符及有关类的方法来解决问题的思想。 【实验要求】 (1)设置MyEclipse的当前工作空间为D:\java。 (2)在MyProject3项目中创建GuessNumber类,并实现猜数游戏。 (3)编写程序WhileLoop实现用while结构求0~100整数数字之和。 (4)编写程序DoWhileLoop实现用do-while结构求0~100整数数字之和。 (5)编写程序ForLoop实现用for结构求0~100整数数字之和。 (6)求三个数中的最大值和最小值。 【实验内容】 (1)启动MyEclpise并设置MyEclipse的工作空间为D:\java。 (2)创建MyProject3项目并在该项目创建GuessNumber类,实现猜数游戏。利用Math.random()方法产生1~100的随机整数,利用JOptionPane.showInputDialog()方法产生一个输入对话框,用户可以输入所猜的数。若所猜的数比随机生成的数大,则显示“猜大了,再输入你的猜测:”;若所猜的数比随机生成的数小,则显示“猜小了,再输入你的猜测:”;若所猜的数正好为随机生成的数,则显示“猜对了!”。 (3)在MyProject3项目中创建WhileLoop类,用while结构求0~100的整数数字之和。 (4)在MyProject3项目中创建DoWhileLoop类,用do -while结构求0~100的整数数字之和。 (5)在MyProject3项目中创建ForLoop类,用for结构求0~100的整数数字之和。 (6)在MyProject3项目中创建MaxMinDemo类,求给定三个数中的最大值和最小值并输出这两个值。 【实验步骤】 1.设置MyEclipse的工作空间为D:\java (1)单击【开始】|【所有程序】|【MyEclipse】|【MyEclipse 8.5】选项启动MyEclipse。 (2)在出现的当前工作空间设置对话框中输入“D:\java”,并按【OK】按钮进入MyEclipse 工作界面。
第三章程序流程控制 一、教学内容 在Visual Basic6.0中,其流程控制语句分为条件测试语句和循环语句。本章将重点介绍这两种流程控制语句的用法与功能 二、目的要求 1.熟练掌握行if语句、块if结构、Select Case情况选择结构有使用,掌握选择的嵌套结构; 2.熟练掌握实现循环结构的For/Next循环结构及Exit For语句、Do/Loop循环结构的使用,掌握多重循环。 三、教学重点与难点 教学重点:选择结构及循环结构的实现及其应用 教学难点:选择的嵌套及多重循环结构 四、教学方法 多媒体教学为主。适当提问,加深学生对概念的理解。
第一讲(2学时) 一、教学内容 3种条件测试语句:由If构成的两种类型测试语句和由Select Case构成的测试语句二、目的要求 1.熟悉If…Then结构,If…Then…Else结构,Select…Case 结构 2.了解多重If语句,If语句的嵌套 三、教学重点与难点 教学重点:If…Then结构,If…Then…Else结构。 教学难点:多重If语句,If语句的嵌套 四、教学方法 多媒体教学。 五、教学过程 3.1.1 If测试语句 1. If…Then结构 单行语句格式: If 条件表达式Then 语句 多行语句格式: If 条件表达式Then 语句块 End If 2. If…Then…Else结构
语句格式: If 条件表达式Then 语句块1 Else 语句块2 End If 3. 多重If语句 语句格式: If 条件表达式1 Then 语句块1 ElseIf 条件表达式2 Then 语句块2 ElseIf 条件表达式3 Then 语句块3 …… ElseIf 条件表达式n Then 语句块n Else 语句块 End If
过程控制系统与仪表习题答案---第三章
第3章 习题与思考题 3-1 什么是控制器的控制规律?控制器有哪些基本控制规律? 解答: 1)控制规律:是指控制器的输出信号与输入偏差信号之间的关系。 2)基本控制规律:位式控制、比例控制、比例积分控制、比例微分控制和比例积分微分控制。 3-2 双位控制规律是怎样的?有何优缺点? 解答: 1)双位控制的输出规律是根据输入偏差的正负,控制器的输出为最大或最小。 2)缺点:在位式控制模式下,被控变量持续地在设定值上下作等幅振荡,无法稳定在设定值上。这是由于双位控制器只有两个特定的输出值,相应的控制阀也只有两个极限位置,总是过量调节所致。 3)优点:偏差在中间区内时,控制机构不动作,可以降低控制机构开关的频繁程度,延长控制器中运动部件的使用寿命。 3-3 比例控制为什么会产生余差? 解答: 产生余差的原因:比例控制器的输出信号y 与输入偏差e 之间成比例关系: e K y p = 为了克服扰动的影响,控制器必须要有控制作用,即其输出要有变化量,而对于比例控制来讲,只有在偏差不为零时,控制器的输出变化量才不为零,这说明比例控制会永远存在余差。 3-4 试写出积分控制规律的数学表达式。为什么积分控制能消除余差? 解答: 1)积分控制作用的输出变化量y 是输入偏差e 的积分:?=edt T y 1 1
2)当有偏差存在时,输出信号将随时间增大(或减小)。当偏差为零时,输出停止变化,保持在某一值上。因而积分控制器组成控制系统可以到达无余差。 3-5 什么是积分时间?试述积分时间对控制过程的影响。 解答: 1)? =edt T y 11 积分时间是控制器消除偏差的调整时间,只要有偏差存在,输出信号将随时间增大(或减小)。只有当偏差为零时,输出停止变化,保持在某一值上。 2) 在实际的控制器中,常用积分时间Ti 来表示积分作用的强弱,在数值上,T i =1/K i 。显然,T i 越小,K i 就越大,积分作用就越强,反之亦然。 3-6 某比例积分控制器输入、输出范围均为4~20mA ,若将比例度设为100%、积分时间设为2min 、稳态时输出调为5mA ,某时刻,输入阶跃增加0.2mA ,试问经过5min 后,输出将由5mA 变化为多少? 解答: 由比例积分公式:??? ? ??+=?edt T e P y 111分析: 依题意:%1001==p K p ,即K p =1, T I = 2 min , e =+0.2; 稳态时:y 0=5mA , 5min 后:mA edt T e P y y )7.05()52.02 12.0(151110±=??±±?+=???? ??++ =? 3-7 比例控制器的比例度对控制过程有什么影响?调整比例度时要注意什么问题? 解答:P74 1)控制器的比例度P 越小,它的放大倍数p K 就越大,它将偏差放大的能力越
第3章 习题与思考题 3-1 什么是控制器的控制规律?控制器有哪些基本控制规律? 解答: 1)控制规律:是指控制器的输出信号与输入偏差信号之间的关系。 2)基本控制规律:位式控制、比例控制、比例积分控制、比例微分控制和比例积分微分控制。 3-2 双位控制规律是怎样的?有何优缺点? 解答: 1)双位控制的输出规律是根据输入偏差的正负,控制器的输出为最大或最小。 2)缺点:在位式控制模式下,被控变量持续地在设定值上下作等幅振荡,无法稳定在设定值上。这是由于双位控制器只有两个特定的输出值,相应的控制阀也只有两个极限位置,总是过量调节所致。 3)优点:偏差在中间区内时,控制机构不动作,可以降低控制机构开关的频繁程度,延长控制器中运动部件的使用寿命。 3-3 比例控制为什么会产生余差? 解答: 产生余差的原因:比例控制器的输出信号y 与输入偏差e 之间成比例关系: e K y p = 为了克服扰动的影响,控制器必须要有控制作用,即其输出要有变化量,而对于比例控制来讲,只有在偏差不为零时,控制器的输出变化量才不为零,这说明比例控制会永远存在余差。 3-4 试写出积分控制规律的数学表达式。为什么积分控制能消除余差? 解答: 1)积分控制作用的输出变化量y 是输入偏差e 的积分:?=edt T y 1 1
2)当有偏差存在时,输出信号将随时间增大(或减小)。当偏差为零时,输出停止变化,保持在某一值上。因而积分控制器组成控制系统可以到达无余差。 3-5 什么是积分时间?试述积分时间对控制过程的影响。 解答: 1)? =edt T y 11 积分时间是控制器消除偏差的调整时间,只要有偏差存在,输出信号将随时间增大(或减小)。只有当偏差为零时,输出停止变化,保持在某一值上。 2) 在实际的控制器中,常用积分时间Ti 来表示积分作用的强弱,在数值上,T i =1/K i 。显然,T i 越小,K i 就越大,积分作用就越强,反之亦然。 3-6 某比例积分控制器输入、输出范围均为4~20mA ,若将比例度设为100%、积分时间设为2min 、稳态时输出调为5mA ,某时刻,输入阶跃增加0.2mA ,试问经过5min 后,输出将由5mA 变化为多少? 解答: 由比例积分公式:??? ? ??+=?edt T e P y 111分析: 依题意:%1001==p K p ,即K p =1, T I = 2 min , e =+0.2; 稳态时:y 0=5mA , 5min 后: m A edt T e P y y )7.05()52.0212.0(151110±=??±±?+=??? ? ??++=? 3-7 比例控制器的比例度对控制过程有什么影响?调整比例度时要注意什么问题? 解答:P74 1)控制器的比例度P 越小,它的放大倍数p K 就越大,它将偏差放大的能力越