第3章顺序和选择结构程序设计_第1页
第3章顺序和选择结构程序设计_第2页
第3章顺序和选择结构程序设计_第3页
第3章顺序和选择结构程序设计_第4页
第3章顺序和选择结构程序设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

第三章

顺序和选择结构程序设计

了解C语言程序的特点C程序的三种基本结构能编写简单的顺序结构程序。熟练掌握if语句的三种形式,掌握if语句的基本结构以及if语句的嵌套,并能将条件运算符给出的语句转化成if语句的形式。掌握switch语句的一般形式,并能把复杂的分支选择性结构化成switch语句来解决问题。本章重点3.1程序设计概述程序设计的最终目的是能在计算机上计算出正确的结果来。1969年,Dijkstra首先提出了结构程序设计的概念,强调从程序的结构和风格上来研究和设计程序。首先应从全局上把握系统所具备的功能是什么,并将系统划分成几个相对独立的子系统,而每个子系统只涉及局部的环境和条件。然后,进入第二步的实现阶段,即进行编码。在第一阶段,只要知道“做什么”,而在实现阶段,才考虑“如何做”。3.流程控制语句

结构化程序设计的基本思想是任何程序都可以用三种基本结构来实现,即顺序结构、选择结构和循环结构。顺序结构的程序流程是按语句书写的顺序依次执行。选择结构是根据给定条件进行判断,由判断的结果决定执行两条或多条路径中的一条。循环结构是在给定条件成立的情况下反复执行某个程序段,该程序段称为”循环体”。实现上述各种程序流程的语句称为流程控制语句。顺序结构:其按语句书写的先后顺序依次执行。例:输入两个变量,交换两者的值后输出。#include<stdio.h>voidmain(){ intx,y,z;printf("pleaseinputxandy:\n");scanf("%d,%d",&x,&y);printf("x=%d,y=%d\n",x,y);z=x;x=y;y=z;printf("x=%d,y=%d\n",x,y);}选择结构:程序的执行流程根据给定条件进行判断,由判断的结果决定在两支或多支程序段中选择一条分支执行,程序执行流程见图3-3。

图3-3选择结构流程图

循环结构:在给定条件成立的情况下程序的执行流程反复执行某个程序段,这种程序结构称为循环结构,其有两种实现形式:①“当型”循环结构。即当条件成立就执行循环。②“直到型”循环结构。即执行循环直到条件不成立时才停止循环。“当型”循环流程图“直到型”循环流程图C语言有9种控制语句①if-else(条件语句)②for()(循环语句)③while()(循环语句)④do-while()(循环语句)⑤continue(结束本次循环语句)⑥break(中止执行switch或循环语句)⑦switch(多分支选择语句)⑧goto(转向语句)⑨return(从函数返回语句)1.表达式语句任何一个表达式加上一个分号就可以组成一条语句。例如:

表达式表达式语句

a=b+c*(d+3)a=b+c*(d+3);

a+b+ca+b+c;

i++i++;3.3C语句函数调用也是表达式,在其后加一个分号,就变成了函数调用语句。

eg:printf函数调用语句和scanf函数调用语句小结:在表达式之后加一个分号,从而构成一个语句,这是C语言的一个特色。它使C语言的程序设计的表达能力更强。2.复合语句

定义:将多个相关联的简单语句用一对大括号括起来就构成了复合语句,在程序中当作一个语句看待。例如:{a=1.0;b=2.0;i++;}3.4if条件语句

1.if结构2.if-else结构3.if-else-if结构3.4.1if结构if结构的一般格式为:if(表达式)语句功能:首先计算表达式的值,若其值为非0(即“真”),则执行表达式后的语句;若其值为0(即“假”),则跳过这个语句去执行if语句的后继语句。注:if(表达式)后面的语句只能是一个语句或一个复合语句。流程图假(0)表达式为真吗?执行语句真(非0)入口表达式为真吗?执行语句真(非0)假(0)入口#include<stdio.h>voidmain(){floatr;printf(“Inputtheradius:”);scanf(“%f”,&r);

if(r>0)printf(“area=%f\n”,3.14159*r*r);}例:从键盘输入圆的半径,若半径小于等于0,则不进行计算;否则,计算圆面积。例:从键盘输入圆的半径,若为10,则计算圆的面积,若为20,则计算圆的周长。若既不等于10又不等于20,则不进行计算。

#include<stdio.h>voidmain(){floatr;printf("Inputtheradiut:");scanf("%f",&r);

if(r==10)printf("Area=%f\n",3.14159*r*r);

if(r==20)printf("Cycle=%f\n",2.0*3.14159*r);}例:输入两个实数,按由大到小的顺序输出这两个数。

#include<stdio.h>voidmain(){floata,b;scanf("%f,%f",&a,&b);

if(a>b)printf("%f,%f",a,b);

if(a<b)printf("%f,%f",b,a);}分析:输入两个实数时,这两个实数的大小顺序是任意的。但是题中要求输出的顺序是由大到小。若a>b,则先a后b;若a<b,则先b后a。用交换变量值的方法按顺序输出这两个数交换变量值的思想:不改变变量名,但变量值可改变的性质。若a的值大于b的值,则a与b的值不交换;若a的值小于b的值,则两者互相交换值。从而使得无论何时,变量a的值始终大于变量b的值。最后,按先a后b的顺序输出,即可实现按由大到小的顺序输出的功能。实现方法:为了能够进行相互交换,必须引进一个临时变量t。用以下三个赋值语句可实现交换。

t=a;a=b;b=t;/*t=a,a=b,b=t;*/程序如下:#include<stdio.h>voidmain(){floata,b,t;printf("Pleaseinputtwonumbers:\n");scanf("%f%f",&a,&b);

if(a<b){t=a;a=b;/*复合语句*/b=t;}printf("%f,%f",a,b);}3.4.2if-else结构if-else结构的一般格式为:if(表达式)语句1else语句2功能:首先计算表达式的值,若其值为非0,则执行语句1,然后跳过语句2,往下执行if结构的后继语句;若其值为0,则跳过语句1,执行语句2,然后往下执行if结构的后继语句。注意:语句1和语句2分别都是一个语句或一个复合语句。流程图假(0)表达式为真吗?执行语句1真(非0)入口执行语句2例:求a、b中的最大值。#include<stdio.h>voidmain(){inta,b,max;scanf(“%d%d”,&a,&b);

if(a>b)max=a;

elsemax=b;printf(“Maxumis%d”,max);}例:输入一个正整数,判断这个数是奇数还是偶数。#include<stdio.h>voidmain(){intnumber;printf("Inputanumberfortesting:");scanf("%d",&number);

if(number%2==1)printf("%disodd.\n",number);

else

printf("%diseven.\n",number);}分析:因为对一个正整数,不是奇数就是偶数,只有两种选择,故使用if-else结构语句。3.4.3if-else-if结构if-else-if结构的一般格式为:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…else语句n注:每当选择其中一个语句执行完以后,整个if-else-if语句就结束了,然后执行if-else-if语句的后继语句流程图例:输入一个x值,求下列相应的y值#include<stdio.h>voidmain(){floatx,y;scanf(“%f”,&x);

if(x>0)y=1.0;

elseif(x<0)y=-1.0;

elsey=0;printf(“y=%f\n”,y);}-1.0(x<0)0(x=0)1.0(x>0)y=运行结果:-88y=-1.0000003.4.4if语句的嵌套

条件语句的嵌套就是在if语句中包含另一个if语句。

从语法上讲,if语句中所包含的语句是一个语句或一个复合语句,这个语句当然也可以是另一个if语句,即内嵌if语句。例:输入一个任意整数i,试判断这个数是奇数还是偶数?分析:先判断这个数是否为正数,在正数(i>0)的前提下,再判断:若i能被2整除,则i为偶数;若i不能被2整除,则i为奇数。可写出如下if语句:if(i>0)

if(i%2==0)/*i>0&&(i%2==0)*/printf("positiveandeven\n");/*正数且偶数*/else

/*否则,i>0&&(i%2!=0)*/printf(“postiveandodd\n”);/*正数且奇数*/elseprintf(“notpositive\n”);

else与前面最近(未曾配对)的if配对。如果要改变上页中所确定的配对关系,即else要与外层的if配对,则第二个if语句必须用花括号括起来。例如:if(i>0){

if(i%2==0)printf(“positiveandeven\n”);}elseprintf(“notpositive\n”);C语言规定的配对关系花括号将内嵌的if语句孤立,形成一个独立的复合语句,使内嵌的if不与后面的else配对,从而else必定与外一层的if配对

#include<stdio.h>voidmain(){floata,b,c,max;scanf(“%f%f%f”,&a,&b,&c);if(a>b){if(a>c)max=a;elsemax=c;}else{if(b>c)max=b;elsemax=c;}printf(“Max=%f\n”,max);}说明:(1)程序引进了一个中间变量max,用以存放最大数。(2)嵌套在内层的if语句可以不用花括号括起来。但为了使结构更清晰,添加花括号也决不是多余的。例:从键盘输入三个实数,求其最大者。修改后的程序:

#include<stdio.h>voidmain(){floata,b,c,max;scanf("%f%f%f",&a,&b,&c);if(a>b)max=(a>c)?a:c;elsemax=(b>c)?b:c;printf("Max=%f\n",max);}3.4.1if结构if结构的一般格式为:if(表达式)语句注:if(表达式)后面的语句只能是一个语句或一个复合语句。3.4.2if-else结构if-else结构的一般格式为:if(表达式)语句1else语句2注意:语句1和语句2分别都是一个语句或一个复合语句。3.4.3if-else-if结构if-else-if结构的一般格式为:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…else语句n注:每当选择其中一个语句执行完以后,整个if-else-if语句就结束了,然后执行if-else-if语句的后继语句3.5switch语句在if语句中,用if-else-if结构可以解决多分支的选择问题。但是,如果判断条件太多,程序冗长,逻辑关系就变得不够清晰。C语言中提供的switch语句可用于解决过多分支的问题。switch语句的一般格式为:switch(表达式){case常量表达式1:语句块1break;case常量表达式2:语句块2break;…case常量表达式n:语句块nbreak;default:语句块n+1break;}功能:

(1)执行switch语句时,首先计算表达式的值,然后将此值与case后面的常量表达式的值相比较,如果某个常量表达式的值与它相等,则执行该case后的语句块;如果表达式的值与所有常量表达式的值都不相等,则执行default后的语句块。当执行完某一个case语句块后遇到break或执行完default语句块时,就跳出switch语句。case结构与else-if结构的对比if(a==1)printf("A");elseif(a==2)printf("B");elseif(a==3)printf("C");elseprintf("D");switch(a){case1:printf("A");break;case2:printf("B");break;case3:printf("C");break;default:printf("D");}(2)如果执行完某一个case的语句块后没有遇到break语句,就进入到下一个case的语句块或进入到default后的语句块去执行。switch(a){case1:printf(“A”);case2:printf("B");break;case3:printf("C");break;default:printf("D");}

if(a==1){printf("A");printf("B");}elseif(a==2)printf("B");elseif(a==3)printf("C");elseprintf("D");(3)多个case可以共用一个语句块switch(a){case1:case2:case3:printf("A");break;…}

if(a==1||a==2||a==3)printf("A");elseif…几点说明:(1)switch后的表达式的值一般是整型或字符型(2)case后的表达式是可以求得整型量或字符型量的常量表达式。常量表达式中不允许包含有变量和函数调用。(3)default通常出现在switch的最后部分。但这不是它的唯一位置。default可以出现在case之间,甚至出现在所有的case之前,但等效于出现在switch的最后部分。switch语句例:写出下面程序的输出结果.#include<stdio.h>voidmain(){ intx; scanf(“%d”,&x); switch(x) { case5:printf(“excellent”); case4:printf(“Good”); break; case3:printf(“Pass”);case2:printf(“Fail”);/*break;*/ default:printf(“Poor”); }}若从键盘输入3输出为:PassFailPoor程序设计举例

例:输入三个整数x,y,z,请把这三个数由小到大输出#include<stdio.h>voidmain(){

intx,y,z,t;

scanf("%d,%d,%d",&x,&y,&z);

if(x>y){t=x;x=y;y=t;}/*交换x,y的值*/

if(x>z){t=z;z=x;x=t;}/*交换x,z的值*/

if(y>z){t=y;y=z;z=t;}/*交换z,y的值*/

printf("smalltobig:%d%d%d\n",x,y,z);}分析:若想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。本题是采用依次比较的方法排出大小顺序。例:某产品的国内销售价,80箱以下,每箱350元,超过80箱,超过部分每箱优惠20元;国外销售价,1000箱以下,每箱900元,超过1000箱,超过部分每箱优惠15元。试编写计算销售额的程序。分析:题中产品分国内、国外两种销售价格,适宜使用if-else结构语句处理。在每一种销售价格中,又根据销售量的不同而计算的方法也不同。因此,可用嵌套if语句实现。使用整型标志变量national表示国内、国外两种销售。#include<stdio.h>void

main(){floatmoney;intnational,count;printf("Inputnationalorexternal:");scanf("%d",&national);printf("Inputcountofproduct:");scanf("%d",&count);

if

(national)

if(count<=80)money=count*350.0;

elsemoney=count*350.0-(count-80)*20.0;else

if

(count<=1000)money=count*900.0;elsemoney=count*900.0-(count-1000)*15.0;printf("tatal=%f",money);}程序的清晰易读性越来越被人们所强调。scanf()函数、字符输入函数getchar()函数,可以实现数据的输入。putchar()是字符输出函数。在任何表达式的后面加上一个分号,都可以构成一个表达式语句。复合语句在语法上等同于一个语句,它可以出现在一个语句所允许出现的地方。if语句具有三种结构:if结构、if-else结构和if-else-if结构。在if语句中可以嵌套另一个if语句,这种形式可以使if语句嵌套到任意深度。switch语句用于多路分支结构,它使得程序更加简明清晰.但是必须注意switch语句中,与break语句的配合使用。本章小结scanf()函数

getchar()函数

putchar()函数例:在同一行中输入三个数据#include<stdio.h>voidmain(){inta1,a2;floata3;printf("Pleaseentervalueofa1,a2,a3:");scanf("%d%d%f",&a1,&a2,&a3);printf("a1=%d,a2=%d,a3=%f\n",a1,a2,a3);}数据输入方式:(c)123回车(a)1234567.89456回车(b)123TAB456TAB7.897.89回车3.2

getchar()函数字符输入函数getchar()是专门用于输入一个字符常量的函数它没有参数,函数的值就是从键盘输入的一个字符使用getchar()函数之前,必须用#include包含“stdio.h”。程序中使用getchar()从键盘的输入中得到一个字符常量并赋给字符变量c,然后输出该字符例:显示从键盘输入的一个字符。

#include<stdio.h>

voidmain()

{

ch

温馨提示

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

评论

0/150

提交评论