第3章程序的控制结构-_第1页
第3章程序的控制结构-_第2页
第3章程序的控制结构-_第3页
第3章程序的控制结构-_第4页
第3章程序的控制结构-_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计湖北民族学院信息工程学院张zhang_hbmy@第3章程序的控制结构3.1算法与语句

3.1.1算法及其特征一个程序包括以下两方面的内容:(1)数据的描述和组织形式。在程序中要指定数据的类型和数据的组织形式,即数据结构。(2)对操作的描述,即操作步骤,也就是算法。瑞士计算机科学家N•沃思(NikiklausWirth)教授提出了程序定义的著名公式:程序=数据结构+算法

程序设计需解决两个问题:程序按什么顺序或步骤执行——算法使用什么语句实现1.算法的概念计算机解决问题的方法和步骤就是计算机算法,即算法是对某一特定问题的求解步骤的一种描述。2.算法的特性1)有穷性:一个算法必须保证执行有限步之后结束;2)确定性:算法的每一个步骤必须具有确切的定义;3)有效性:算法的每一步都必须是计算机能进行的有效操作;4)输入:一个算法有零个或多个输入;5)输出:一个算法有一个或多个输出。3.1算法与语句

3.1算法与语句

3.1.2算法和程序结构

算法含有两大组成要素:1.操作

C语言所描述的操作主要包括算术运算、逻辑运算、关系运算、函数运算、位运算和I/O操作等。2.控制结构控制结构控制算法所描述的各种操作的执行顺序。顺序结构选择结构循环结构算法设计中,由三种基本结构可组成任何复杂结构的算法。3.1.3算法的描述自然语言描述传统流程图描述用N-S图描述伪代码描述3.1算法与语句

1.用自然语言描述算法例:用自然语言描述算法求5!(1)原始方法:①:求1×2,得到结果2;②:将①中的结果乘以3,得到新的结果6;③:将②中的结果乘以4,又得到新的结果24;④:将③中的结果乘以5,得到最后的结果120。(2)改进方法①:定义整型变量facto,初始值置为1;②:定义整型变量i,初始值置为2;③:使facto×i,将乘积赋值给变量facto;④:使i+1,将结果赋值给i;⑤:判断i的值是否小于或等于5,如果是,返回③并重复③④,否则输出facto的值。1.用自然语言描述算法2.用传统流程图描述算法流程图是对给定算法的一种图形解法。也称框图,用规定的一系列图形、流程线及文字说明表示算法。具体例子见教材用传统流程图表示求5!的算法FTfac=fac*ii<=5?开始结束fac=1;i=2;i=i+13.用N-S图描述算法N-S图也是一种流程图形式,它摒弃了流程线,算法描述在一个矩形框内。

例:用N-S图描述求5!的算法fac=1直到i>5fac=fac×ii=i+1

输出faci=24.用伪代码描述算法Begin(算法开始)fac=1i=2whilei<=5{fac=fac*1i=i+1}printfacEnd(算法结束)例:用伪代码描述求5!的算法书本例子错误!语句说明语句表达式语句空语句控制语句复合语句条件控制语句跳转控制语句循环控制语句3.1.4C语言的语句分类1.说明语句

说明语句是对变量或被调函数的声明,不产生机器指令,其作用是描述程序中被处理数据(变量或函数)的名称和类型,供编译程序使用。说明语句可以出现在程序中任何块(即函数或复合语句)的外面(称为外部说明)或块中(称为局部说明)。例:inta;/*定义变量a为整型*/floatz; /*定义变量z为浮点型*/floatadd(floatx,floaty);/*函数的声明*/3.1.4C语言的语句分类2.表达式语句

一般形式:表达式;例:x=10后面无分号,是赋值表达式,但不是语句x=10;后面有分号,是赋值语句3.1.4C语言的语句分类3.控制语句控制语句用于控制程序的执行流程,实现各种控制结构。C语言提供9种控制语句,可划分为三类。见教材。3.1.4C语言的语句分类4.复合语句把多条语句用一对花括号{}组成的一个语句称为复合语句。例:{intx,a=3,b=5;x=a;a=b;b=x;}注意:

“}”后不加分号;复合语句在语法上等价于一个语句。3.1.4C语言的语句分类5.空语句一般形式为:;

它在语法上占有一个简单语句的位置,执行该语句不做任何操作。空语句常用于循环语句中,构成空循环。3.1.4C语言的语句分类C语言程序设计湖北民族学院信息工程学院张zhang_hbmy@1.数据类型转换:自动转换、赋值转换、强制转换2.算法的概念:对操作的描述,即操作步骤3.算法的描述方法:自然语言、流程图、N-S图以及伪代码4.C语言语句分类:说明、表达式、控制、复合以及空语句习题2中错误修正以及第三大题第四大题讲解上一堂课知识点回顾例a&&b例a||b例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符2.3运算符与表达式//只在a为真时,才判别b的值;//只在a为假时,才判别b的值;//结果m=0,n=12.3.4逻辑运算符和表达式(4)第3章程序的控制结构3.2数据的输入与输出

C语言无I/O语句,I/O操作由库函数实现#include<stdio.h>本节介绍用于键盘输入和显示器输出的库函数一、字符的输入与输出函数

1.字符输出函数putchar()

调用格式:

putchar(参数);

功能:在显示器上输出单个字符

参数:可以是字符常量、字符型变量或整型变量,即将一个整型数作为ASCII编码输出相应的字符。

返回值:输出成功返回输出字符的ASCII码值;出错,为EOF(-1)【例】输出单个字符。

#include<stdio.h>main(){inti=97;charch='a';putchar(i);putchar('\n'); putchar(ch); }程序运行结果为:aa一、字符的输入与输出函数2.字符输入函数getchar()

调用格式:getchar();

功能:从键盘上读入一个字符。

返值:若读入成功,返回读入字符的ASCII码值;

出错,返回EOF(-1)通常把读入的字符赋予一个字符变量,构成赋值语句。例:

charc;c=getchar();一、字符的输入与输出函数【例3.2】输入单个字符。

#include<stdio.h> main() {intch; ch=getchar(); putchar(ch); }程序运行结果如下:

a↙a执行getchar()时输入字符以回车结束输入。

一、字符的输入与输出函数二、格式化输入/输出函数

1.格式输出函数printf()

调用格式:printf(“格式控制字符串”,输出项列表)

功能:按格式控制字符串指定格式,向显示器输出所列出的输出项

返回值:若输出成功,返回输出字节数;出错,返回EOF(-1)

printf(“a=%4d,b=%4d”,a,b);格式控制字符串输出项表列1.格式输出函数printf()格式控制字符串格式说明:用于指定输出格式,由“%”、格式控制字符、附加格式修饰符组成。普通字符或转义序列:原样输出输出项表列:要输出的数据,可以没有,多个时以“,”分隔。输出项的个数必须与格式说明的个数一致,位置一一对应。printf(“a=%4d,b=%4d”,a,b);格式控制字符串输出项表列1.格式输出函数printf()格式说明:

%[flags][width][.prec][F|N|H|L]type

标志输出最小宽度精度长度类型(1)type类型表示格式控制字符,用来说明对应输出项的输出格式d以带符号的十进制形式输出整数(正数不输出符号)o以8进制无符号形式输出整数(不输出前导符O)x(X)以16进制无符号形式输出整数(不输出前导符Ox)u以无符号10进制形式输出整数c以字符形式输出一个字符s输出字符串f以小数形式输出单、双精度数,默认输出6位小数e(E)以标准指数形式输出单、双精度数,小数位数为6位g(G)选用%f或%e格式中输出宽度较短的一种格式1.格式输出函数printf()格式说明:

%[flags][width][.prec][F|N|H|L]type

标志输出最小宽度精度长度类型(2)附加格式修饰符:可根据输出格式要求进行取舍。

Flags标志字符常用的:

-:为左对齐,系统默认右对齐

+:正数输出+,负数输出-

空格:正数输出空格,负数输出-Width宽度指示符:用十进制数来设置输出值的最少输出个数,少则补空格,多则按实际输出,缺省则按实际输出。.prec精度指示符:用小数点加十进制正整数构成,用来限制输出数的精度,对于实数,指定输出的小数位数(四舍五入)。[F|N|h|L]长度修饰符:见教材例inta=1234;floatf=123.456;charch=‘a’;printf(“%8d,%2d\n”,a,a);printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f);printf(“%3c\n”,ch);运行1234,1234结果:123.456000,123.456000,123.5,123.46,1.23e+2

a1.格式输出函数printf()2.格式化输入函数scanf()调用格式:scanf("格式控制字符串",地址表列)功能:按格式控制字符串指定的格式,从键盘读入数据,并存入地址表指定的内存单元。返回值:返回输入数据个数例:scanf(“%d,%d,%f”,&a,&b,&c);地址表列:由一个或多个地址组成,若有多个以逗号隔开。常用取地址运算符&得到变量地址。格式控制字符串:

格式说明:说明需输入数据的类型。普通字符:输入数据时要原样输入。二、格式化输入/输出函数格式说明:%[*][width][F|N][h|L]typeType类型:是必须的,表示需输入数据的类型。d(D)十进制整数o(O)八进制整数x(X)十六进制整数i(I)自动根据数头分辨十、八、十六进制u(U)无符号十进制整数c单个字符s字符串f(e,g,G)实数n不输入数据,将已读入的字符输送到对应的地址中%百分号2.格式化输入函数scanf()格式说明:

%[*][width][F|N][h|L]type*输入赋值抑制字符:输入数据但不赋给对应变量,跳过该输入。width宽度指示符:表示最多可输入的字符个数。F|N地址大小修饰符:FfarNnearh|L输入数据类型:h短整型,l长整或双精度2.格式化输入函数scanf()例:scanf("%d%*d%d",&a,&b);输入:567时把5赋予a,6被跳过,7赋予b。2.格式化输入函数scanf()说明:(1)scanf()的格式控制字符串中的普通字符必须原样输入。例:scanf(“x=%d”,&x);(2)输入分隔符的指定一般以空格、TAB或回车键作为分隔符其它字符做分隔符:格式串中两个格式符间字符(3)scanf函数中没有精度控制,如:scanf(“%5.2f”,&a);是非法的。例scanf(“%d,%d,%d”,&a,&b,&c);

输入12,24,362.格式化输入函数scanf()例scanf(“%d%d%d”,&a,&b,&c);

输入122436例:输入圆的半径,输出圆的周长和面积。分析:1.定义实型变量r、c、s用于存放半径、周长、面积;2.调用输入函数,输入r:3.分别利用周长公式和面积公式求出c、s;4.调用输出函数输出c、s。3.2基本输入/输出函数#include<stdio.h>voidmain(){floatr,c,s;

scanf(“%f”,&r);/*输入一个浮点数据,存入地址&r*/c=2*3.14159*r;/*计算周长,赋值给c*/s=3.14159*r*r;/*计算面积,赋值给s*/printf(“\nc=%8.4f”,c);/*周长占8个字符宽,4位小数*/printf(“\ns=%8.4f”,s);

/*输出面积,数据共占8个字符宽,4位小数*/}3.2基本输入/输出函数C语言程序设计湖北民族学院信息工程学院张zhang_hbmy@分析:1.输入小写字母存入变量a;2.转换成大写a=a-32;3.输出a。例:从键盘输入一个小写字母,用大写形式输出该字母。3.2基本输入/输出函数#include<stdio.h>main(){chara;printf("Inputalowercaseletter:");a=getchar();a=a-32;/*将大写字母转换成对应的小写字母*/printf("%c\n",a);}

思考:如何使程序可以处理任何字符的输入。即判断输入的是小写字母,才转换成大写;如果输入的其他字符,则直接输出。

3.2基本输入/输出函数结构化程序设计基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto)结构化程序:由三种基本结构反复嵌套构成的程序优点:结构清晰,易读,提高程序设计质量和效率三种基本结构结构化程序的三种基本结构顺序结构、选择结构、循环结构3.3顺序结构特点:程序按照语句编排的先后顺序依次执行有点:程序简单明了,按顺序执行缺点:功能有限,很难处理复杂问题教材例题prog03_08.cAB●●ab二分支选择结构多分支选择结构特点:通过对某个给定条件的判断,自动选择要执行的语句PAB真假●●baA1A2AiAnk=k2k=k1k=knk=ki......●ab●3.4选择结构例如分段函数分析:首先判断x,如果x<0,则y=3-x;否则,y=2*x;需要根据x的值进行流程选择(分支)3.4选择结构

C语言的选择语句有两种:if语句、switch语句main(){floatx,y;scanf(“%f”,&x);y=2*x;if(x<0)y=3-x;printf(“y=%6.2f”,y);}1.(单分支选择结构):格式:if(表达式)语句执行过程:表达式语句真假表达式语句1语句2真假2.(双分支选择结构):格式:if(表达式)

语句1else

语句2执行过程:3.4.1

if语句main(){floatx,y;scanf(“%f”,&x);

if(x<0)y=3-x;

elsey=2*x;printf(“y=%6.2f”,y);}main(){floatx,y;scanf(“%f”,&x);y=2*x;

if(x<0)y=3-x;printf(“y=%6.2f”,y);}3.4选择结构例:输入两个数,比较其大小,将较大的数输出。算法分析:(1)输入两个数据a,b;(2)如果a>b则输出a;否则,输出b。#include<stdio.h>main(){floata,b;scanf(“%f,%f”,&a,&b);if(a>b)printf(“%f”,a);elseprintf(“%f”,b);}3.4选择结构表达式1语句1真假表达式2表达式3语句n语句3语句2真真假假3.(多分支选择结构):格式:

if(表达式1)

语句1

elseif(表达式2)

语句2elseif(表达式3)

语句3…...else

语句n

执行过程:例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;

3.4选择结构if语句中的表达式一般为关系或逻辑表达式,也可以为任何数值类型的表达式。执行语句可以是一条简单语句、空语句或复合语句,也可以嵌套其它流程控制语句。

if(x)if(x!=0)if(!x)if(x==0)例考虑下面程序的输出结果:#include<stdio.h>main(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y)x=y;y=x;elsex++;y++;printf(“%d,%d\n”,x,y);}CompileError!3.4选择结构3.4.2if语句的嵌套当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。例如:if(表达式1)if(表达式2)

语句1;if(表达式1)if(表达式2)

语句1;else

语句2;3.4选择结构#include<stdio.h>main(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y)printf("X>Y\n");elseprintf("X<Y\n");

elseprintf("X==Y\n");}运行:Enterintegerx,y:12,23X<YEnterintegerx,y:12,6X>YEnterintegerx,y:12,12X==Y例

:输入两整数并判断其大小关系3.4选择结构缺省{}时,else总是和它上面离它最近的未配对的if配对if(……)if(……)if(……)else…...else…...else…...if~else配对原则:3.4选择结构例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}3.4选择结构例考虑下面程序输出结果:main(){intx=100,a=10,b=20;intv1=5,v2=0;if(a<b)if(b!=15)if(!v1)x=1;elseif(v2)x=10;x=-1;printf(“%d”,x);}结果:-13.4选择结构一般形式:switch(表达式){case常量表达式1:语句组1;

[break;]case常量表达式2:语句组2;

[break;]…….case常量表达式n:语句组n;

[break;][default:语句组n+1;]}执行过程:switch表达式语句组1语句组2语句组n语句组…...E1E2Endefaultcase3.4.3switch…case语句说明:语句中的表达式可以是数字型或字符型,表达式的值,称为开关值语句结构中各个case后常量表达式的值必须互不相同;否则执行时将出现矛盾,即同一个开关值,对应多种执行方案当表达式的值与某一个常量相等时,就执行后面的语句;若无break语句,执行该语句后,流程控制转移到下一个分支:继续执行这一个分支的语句,一至到最后一个语句执行完当表达式的值与所有常量表达式的值不相等时,执行default:后面的语句case后可包含多个可执行语句,且不必加{}多个case可共用一组执行语句switch可嵌套如:……case‘A’:case‘B’:case‘C’:printf(“score>60\n”);break;……..3.4.3switch…case语句switch(grade){case‘A’:printf(“85~100\n”);case‘B’:printf(“70~84\n”);case‘C’:printf(“60~69\n”);case‘D’:printf(“<60\n”);default:printf(“error\n”);}运行结果:若grade为A则输出:85~10070~8460~69<60error3.4.3switch…case语句例:按照考试成绩的等级打印出百分制分数段,可以用switch语句实现例:按照考试成绩的等级打印出百分制分数段,可以用switch语句实现3.4.3switch…case语句switch(grade){case‘A’:printf(“85~100\n”);break;case‘B’:printf(“70~84\n”);break;case‘C’:printf(“60~69\n”);break;case‘D’:printf(“<60\n”);break;default:printf(“error\n”);}运行结果:若grade为A则输出:85~100运行结果:若grade为E则输出:error例voidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“\na=%d,b=%d”,a,b);}运行结果:a=2,b=13.4.3switch…case语句例,根据输入的学生百分制成绩判断等级并输出。3.4.3switch…case语句score0——5960——6970——7980——8990——100score/10score/100,1,2,3,4,56789,10default使用switch解题的关键是通过分析找到表达式然后将问题分几种情况3.4.3switch…case语句case4:case5:y='E';break;case6:y='D';break;case7:y='C';break;case8:y='B';break;case9:case10:y='A';break;default:y='';}if(y=='')printf("Scoreerror!");elseprintf("Grade=%c",y);}#include<stdio.h>main(){intx;chary;printf("\nx:");scanf("%d",&x);switch(x/10){case0:case1:case2:case3:3.4.3switch…case语句switch和else-if的比较else-if比switch的条件控制更强大一些else-if可以依照各种逻辑运算的结果进行流程控制switch只能进行==判断,并且只能是整数判断switch比else-if更清晰两者都要尽量避免用得过多、过长,尤其不要嵌套得太多,它们大大增加程序的分支,使逻辑关系显得混乱,不易维护,易出错3.4.3switch…case语句C语言程序设计湖北民族学院信息工程学院张zhang_hbmy@当型循环结构直到型循环结构PA假真●●baAP假真b●●a循环结构3.5循环结构

C语言有while、do-while、和for语句三种循环结构语句。前两个称为条件循环,即根据条件来决定是否继续循环;后一个称为计数循环,即根据设定的执行次数来执行循环。3.5循环结构一般形式:while(表达式)

循环体语句;执行流程:表达式循环体假(0)真(非0)while3.5.1

while语句3.5循环结构特点:先判断表达式,后执行循环体说明:如果表达式的值一开始就为0,则循环体一次也不执行循环体可为任意类型语句循环体中应有使循环趋向于结束的语句While语句特点和说明3.5循环结构用while循环求1至100的和.3.5循环结构解决“累加”类型问题基本方法:

两个变量:累加和,当前项(1)先给累加和赋初值(一般为0);(2)用循环语句实现累加;(3)循环体语句的设计:累加和当前值=累加和原值+当前项;例:用while循环求1至100的和#include<stdio.h>main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体3.5循环结构#include<stdio.h>main(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100例输出1~10的平方3.5循环结构一般形式:do

循环体语句;

while(表达式);执行流程:do循环体表达式假(0)真(非0)while3.5.2

do-while语句3.5循环结构特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构表达式循环体假(0)真(非0)循环体While循环do~while语句特点和说明3.5循环结构例:用do-while循环求1至100的和。#include<stdio.h>main(){inti,sum=0;i=1;

do{sum=sum+i;i++;}while(i<=100)printf("%d",sum);}#include<stdio.h>main(){inti,sum=0;i=1;

while(i<=100){sum=sum+i;i++;}printf("%d",sum);}

运行结果:5050

运行结果:50503.5循环结构一般形式:for([表达式1];[

表达式2];[

表达式3])

循环体语句;执行流程:3.5.3

for语句表达式2循环体假(0)真(非0)for表达式1表达式33.5循环结构for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){

循环体语句;}例:用for循环求1至100的和。#include<stdio.h>main(){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("%d",sum);}3.5循环结构for语句中表达式1;表达式2

;表达式3

类型任意,都可省略,但分号;不可省。(1)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值(2)省略了“表达式2(循环条件)”,则不做其它处理时便成为死循环(3)省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句for语句说明3.5循环结构逗号表达式

逗号运算符的主要应用就在for语句中。for语句中的表达式1和表达式3可以是逗号表达式,特别是有两个循环变量参与对循环的控制时。表达式1和表达式3为逗号表达式,将使程序显得非常清晰。

例:for(i=1,j=10;i<=j;i++,j--)3.5循环结构例:求1/100+2/99+…+50/51floats=0.0;for(i=1,j=100;i<j;i++,j--)s=s+i/j;3.5循环结构选择三种循环的一般思路:如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while只是思路,不是定律3.5循环结构在一个循环结构中又嵌入另一个或几个完整的循环结构,称为循环的嵌套。嵌套在内的循环体称为

温馨提示

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

评论

0/150

提交评论