c语言程序设计-程序控制结构课件_第1页
c语言程序设计-程序控制结构课件_第2页
c语言程序设计-程序控制结构课件_第3页
c语言程序设计-程序控制结构课件_第4页
c语言程序设计-程序控制结构课件_第5页
已阅读5页,还剩185页未读 继续免费阅读

下载本文档

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

文档简介

第3章程序控制结构烟台大学计算机学院刘培华C

语言程序设计1第3章程序控制结构烟台大学计算机学院刘培华C本章主要内容:C语言中程序设计的三种结构:顺序结构选择结构循环结构2本章主要内容:C语言中程序设计的三种结构:2程序的三种基本结构顺序结构N-S结构图流程图ABAB选择结构YNABP成立?PTFAB3程序的三种基本结构顺序结构N-S结构图流程图ABA选择结构程序的三种基本结构循环结构NYP成立?A当P成立时

A直到型循环

A当P成立时YNAP成立?当型循环N-S结构图流程图4程序的三种基本结构循环结构NYP成立?A当P成立时直到型循环C语言的语句类型主要内容:说明性语句表达式语句控制语句复合语句5C语言的语句类型主要内容:5说明性语句对程序中使用的变量、数组、函数等操作对象进行定义、声明的描述语句只起说明作用,不产生可执行的机器指令代码。

例如:inta,b;

floatfunction(int,int);C程序由函数组成。函数的格式:函数名(参数表){

说明部分;执行部分;}数据类型说明语句可执行语句6说明性语句对程序中使用的变量、数组、函数等操作对象进行定义、表达式后面加一个分号,构成表达式语句x=3;y=y+5;x=a-b&&c||d;printf("x=%d,y=%d\n",x,y);sort(a,10);表达式语句赋值语句函数调用语句注意:①分号是语句必不可少的一部分②单独的一个分号“;”构成一个空语句例如:;(空语句,是最简单的C语句)7表达式后面加一个分号,构成表达式语句表达式语句赋值语句函数控制语句1.选择分支控制语句

if()…else…

switch(){…} 2.循环控制语句

for()…

while()…do…while()3.其他控制语句

break、continue、gotoreturn8控制语句1.选择分支控制语句8复合语句用一对花括号“{}”括起来的若干条语句

花括号中可以是说明语句、表达式语句、控制语句,也可以是复合语句例如:⑴if(a>b){max=a;min=b;}

⑵for(n=1;n<10;n++)

{p=n+p;if(p>=100)

{

printf(“%d\n”,p);break;

}

}

9复合语句用一对花括号“{}”括起来的若干条语句9复合语句(续)复合语句中如果有说明性语句,应该写在可执行语句的前面例如:

main(){inta,b;a=b=100;{floatc=10.23;printf("%f\n",c);}printf("%d%d\n",a,b);}要特别注意:花括号的配对花括号的位置C语言学习的难点之一10复合语句(续)复合语句中如果有说明性语句,应该写在可执行语句3.1顺序结构程序设计3.4.1顺序结构程序的一般算法描述变量定义变量赋值运算处理输出结果可用:变量初始化赋值语句输入函数调用语句注意各个语句的顺序113.1顺序结构程序设计3.4.1顺序结构程序的一般算法描3.1.1顺序结构程序设计举例【例3.1】数据交换。从键盘输入a、b的值,输出交换以后的值。

思路:在计算机中交换变量a和b的值,不能只写下面两个赋值语句a=b;b=a;?正确的交换方法:c=a;a=b;b=c;123.1.1顺序结构程序设计举例【例3.1】数据交换。从键ab13ab13cba14cba14151516161717181819192020变量定义输入数据输出数据数据交换输出结果【例3.1】数据交换问题的算法描述21变量定义输入数据输出数据数据交换输出结果【例3.1】数据交换程序:main(){inta,b,c;printf("\ninputa,b:");scanf("%d,%d",&a,&b);printf("\nbeforeexchange:a=%db=%d\n",a,b);c=a;a=b;b=c;printf("afterexchange:a=%db=%d\n",a,b);}程序运行情况如下:inputa,b:32,57

beforeexchange:a=32b=57afterexchange:a=57b=32

22程序:main()程序运行情况如下:22举例:【例3.2】已知三条边a、b、c,求三角形面积。计算三角形面积的海伦公式:其中:设定义:整型变量a、b、c实型变量s、area23举例:【例3.2】已知三条边a、b、c,求三角形面积。计算程序如下:#include"math.h"main(){inta,b,c;floats,area;scanf("%d,%d,%d",&a,&b,&c);s=(a+b+c)/2.0f;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%8.3f\n",area);}程序运行情况如下:3,4,5

area=6.000

实际上还需要判断a、b、c是否能构成三角形,即应该进行选择判断处理24程序如下:#include"math.h"程序运行情况如if语句if语句的一般形式if语句的嵌套switch语句switch语句的一般形式break语句选择结构程序设计举例3.2选择结构程序设计25if语句3.2选择结构程序设计25简单分支语句语句一般格式if(表达式)

语句功能:计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句,顺序执行后续语句。内嵌语句,可为:赋值语句函数调用语句控制语句复合语句空语句可为算术、关系、逻辑、赋值等表达式26简单分支语句语句一般格式功能:内嵌语句,可为:可为算术、关系简单分支语句的算法:例如:⑴if(x>0)m++;⑵if(a>b){c=a;a=b;b=c;}

表达式非0

TF

语句N-S结构图语句流程图NY表达式非0?27简单分支语句的算法:例如:表达式非0N-S结构双重分支语句语句一般格式if(表达式)

语句1

else语句2

功能:计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。

28双重分支语句语句一般格式28双重分支语句的算法:例如:⑴if(x>0)m++;elsem--;⑵if(ch>='a'&&ch<='z')

{ch=ch-32;

printf("%c\n",ch);}elseprintf("%c\n",ch);

表达式非0

TF

语句1语句2N-S结构图语句1

语句2流程图NY表达式非0?29双重分支语句的算法:例如:表达式非0N-S结构图多重分支语句语句一般格式if(表达式1)

语句1

elseif(表达式2)

语句2

……elseif(表达式m)

语句m

else语句

n功能:依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n无论执行完那个语句分支,都转到后续语句30多重分支语句语句一般格式30多重分支语句的算法流程图表达式2?表达式1?语句n语句1

语句2

语句m…YNYNNY表达式m?31多重分支语句的算法流程图表达式2?表达式1?语句n语句1多重分支语句的算法N-S结构图表达式1?

TF

表达式2?语句1TF

语句2…

表达式m?TF

语句m语句n例如:if(a<0)x=-1;elseif(a==0)x=0;elsex=1;32多重分支语句的算法N-S结构图表达式1?if语句的简单应用【例3.3】输入一个字符,如果是大写字母,则将其转换为小写字母输出,否则直接输出。输入:用getchar或scnaf函数ch是否为大写字母:ch>='A'&&ch<='Z'(或ch>=65&&ch<=90)大写字母转换为小写字母:ch=ch+32输出:用putchar或printf函数思路:33if语句的简单应用【例3.3】输入一个字符,如果是大写字母,程序:#include"stdio.h"main(){charch;ch=getchar();if(ch>='A'&&ch<='Z')ch=ch+32;printf("%c\n",ch);}程序运行情况如下:Gg

可使用条件表达式代替putchar(ch>='A'&&ch<='Z'?ch+32:ch);putchar('\n')34程序:#include"stdio.h"程序运行情况如下

if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。

【例4.a】比较两个整数的关系。#include<stdio.h>main(){intx,y;printf("EnterintegerXandY:");scanf("%d%d",&x,&y);

if(x!=y)

if(x>y)printf("X>Y\n");

elseprintf("X<Y\n");

elseprintf("X=Y\n");}应该正确判断:if的内嵌语句if和else的配对提倡缩格书写有利于阅读程序35if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则

if语句嵌套的形式简单if语句的嵌套形式if(表达式)if语句双重(或多重)分支if语句的嵌套形式if(表达式)if语句else

if语句可以是各种形式的if语句可以是各种形式的if语句如果是简单if语句,必须用“{}”括起36if语句嵌套的形式简单if语句的嵌套形式可以是各种形式的例如:if(a>b) if(a>c) if(a>d)m=1; elsem=2; elsem=3; 问题:哪一个else和哪一个if相匹配?规则:在嵌套的if~else语句中,else总是与上面的离它最近的尚未配对的if

配对。37例如:if(a>b) 问题:哪一个else和举例【例3.4】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。

定义变量x输入x的值

x是奇数

TF

输出“odd”x是5的倍数输出“even”TF是5的倍数38举例【例3.4】输入一个数,判断它是奇数还是偶数,如果是奇程序:main(){intx;scanf("%d",&x);

if(x%2!=0)

{printf("%disanodd\n",x);

if(x%5==0)printf("%disthetimesof5\n",x);

}

elseprintf("%disaneven\n",x);}思考:如果没有,算法和输出如何?39程序:main()思考:如果没有,算法和输出如何?39学习if语句的难点if~else语句的配对正确用表达式描述条件例如:当x大于5小于10时令x自增if(5<x<10)x++;正确判断内嵌语句例如:if(x<y)x=x+3;y=y-2;elsex=x-3;y=y+2;if(x>5&&x<10)x++;{}{}40学习if语句的难点if~else语句的配对正确判断内嵌语switch语句switch语句的一般形式

switch(表达式){case常量表达式1:语句序列1case常量表达式2:语句序列2

……case常量表达式n:语句序列ndefault:语句序列n+1

}功能:计算表达式的值,与常量表达式的值比较,等于第i个值时,顺序执行语句序列i、i+1、…、n+1若与所有常量表达式值都不相等,执行语句序列n+1。

41switch语句switch语句的一般形式41switch语句的算法描述N-S结构图计算表达式常量表达式1语句序列1常量表达式2语句序列2…………常量表达式n语句序列ndefault语句序列n+1例如:switch(a){case5:printf("&");case2:printf("#");default:printf("$");}当a等于5,输出:&#$当a等于2,输出:#$当a是其他值,输出:$42switch语句的算法描述N-S结构图计算常量表达式1语句序说明:“case常量表达式i:”等价于语句标号,计算出的表达式值等于哪个语句标号,就从哪个位置开始顺序向下执行语句序列。∴语句位置影响运行结果例如:switch(a){case2:printf("#");default:printf("$");case5:printf("&");}switch与break语句结合才能实现程序的分支break;break;break;43说明:“case常量表达式i:”等价于语句标号,计算出的表switch语句的简单应用【例3.5】已知x=100,y=15,要求输入一个算术运算符(+、-、*或/),并对x和y进行指定的算术运算。

思路:设x和y为float型变量并赋初值;输入的运算符op为char型变量;根据op的值(为'+'、'-'、'*'、'/')进行x和y的相加、相减、相乘、相除运算(选择分支);还要考虑到输入字符不是+、-、*或/时的情况44switch语句的简单应用【例3.5】已知x=100,y=1程序:#include"stdio.h"main(){floatx=100,y=15,z;charop;op=getchar();switch(op){case'+':z=x+y;break;case'-':z=x-y;break;case'*':z=x*y;break;case'/':z=x/y;break;default:z=0;}if((int)z!=0)printf("%f%c%f=%f\n",x,op,y,z);elseprintf("%cisnotanoperator\n",op);}实型数通常不使用z==0或z!=0的比较可用if((int)z)代替45程序:#include"stdio.h"实型数通常不使用z选择结构程序设计举例【例3.6】求一元二次方程ax2+bx+c=0的根。

思路:一元二次方程的根取决于系数a,b,c求根公式:

判别式d=b2-4ac

d=0时,方程有两个相等的实根:x1=x2=-b/(2*a)当d>0时,方程有两个不相等的实根:x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)

当d<0时,方程有两个虚根:x1=jp+ipix2=jp-ipi实部

jp=-b/(2*a)

虚部

ip=sqrt(-d)/(2*a)46选择结构程序设计举例【例3.6】求一元二次方程ax2+bx+算法:定义变量a、b、c、d、x1、x2、jp、ip输入系数a、b、ca==0TF

计算d=b*b-4*a*c

不是二d==0

次方程TFd>0

计算重根TF

输出重根计算实根计算虚根输出实根输出虚根47算法:定义变量a、b、c、d、x1、x2、jp、ip4程序:#include"math.h"main(){floata,b,c,d,x1,x2,lp,ip;

scanf("%f%f%f",&a,&b,&c);

printf("theequation");

if(fabs(a)<1e-6)printf("isnotquadratic");

else

{d=b*b-4*a*c;

if(fabs(d)<=1e-6)

/*相等的实根*/

{printf("hastwoequalroots:\n");

printf("x1=x2=%8.4f\n",-b/(2*a));

}48程序:#include"math.h"48程序(续):

elseif(d>1e-6)

/*不相等的实根*/

{x1=(-b+sqrt(d))/(2*a);

x2=(-b-sqrt(d))/(2*a);

printf("hastworealroots:\n");

printf("x1=%8.4f,x2=%8.4f\n",x1,x2);

}

else

/*虚根*/

{

lp=-b/(2*a);ip=sqrt(-d)/(2*a);

printf("hastwocomplexroots:\n");

printf("x1=%8.4f+%8.4fi\n",lp,ip);

printf("x2=%8.4f-%8.4fi\n",lp,ip);

}

}

}运行jc4_649程序(续):elseif(d>1e-6)举例(续):【例3.7】输入年份,判别该年是否为闰年。思路:年份year为闰年的条件为①

能够被4整除,但不能被100整除的年份;②

能够被400整除的年份。只要满足任意一个就可以确定它是闰年。例如:1996年、2000年是闰年1998年、1900年不是闰年设定标志变量leap,只要符合其中一个条件的就是闰年,令leap=1;否则令leap=0

50举例(续):【例3.7】输入年份,判别该年是否为闰年。思路算法:定义变量year、leap

输入年份year

能被4整除且不能被100整除?

TF

能被400整除?

leap=1

TFleap=1leap=0leap=1?TF

是闰年不是闰年year%400==0year%4==0&&year%100!=051算法:定义变量year、leapyear%400==0yea程序:main(){intyear,leap;scanf("%d",&year);if(year%4==0&&year%100!=0)leap=1;elseif(year%400==0)leap=1;elseleap=0;if(leap==1)printf("%disaleapyear\n",year);elseprintf("%disnotaleapyear\n",year);}52程序:main()52作业1、P102:一、选择题 二、读程序 三、程序填空2、P107:四(1、2、3)上机调试并整理,在课程网站提3、P108: 实验4顺序结构程序设计 实验5选择结构程序设计53作业1、P102:53while循环控制do-while循环控制for循环控制用goto语句实现循环控制循环结构中的跳转语句循环的嵌套循环结构程序设计举例3.3循环结构54while循环控制3.3循环结构54while循环控制语句一般格式while(表达式)

语句

一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式

用来控制循环体是否执行称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分55while循环控制语句一般格式一般为关系表达式或逻辑表达功能:计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0时结束循环,转去执行while后面的语句。

当表达式为真语句N-S结构图NY流程图表达式非0?语句循环控制条件循环体56功能:计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句例如:【例3.8】编写程序,求100个自然数的和即:

s=1+2+3+…+100

思路:寻找加数与求和的规律

加数i——从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。求和——设变量

sum存放和,循环求sum=sum+i,直至i超过100。

57例如:【例3.8】编写程序,求100个自然数的和思路:寻找加算法和程序:main(){inti,sum;i=1;sum=0;while(i<=100)

{sum=sum+i;i++;

}printf("sum=%d\n",sum);}程序输出结果:sum=5050i:循环控制变量sum:累加器

i=1,sum=0当i<=100sum=sum+ii++输出sum58算法和程序:main()程序输出结果:i:循环控制变量注意:如果while的(表达式)值为0,则循环体一次也不执行

(例如当i的初值=101)。在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。思考程序段的输出?……while(i<=100){i++;sum=sum+i;}运行后,输出:sum=5150原因是什么?

59注意:如果while的(表达式)值为0,则循环体一次也注意(续):为了保证循环正常运行,应该特别注意:循环控制条件的描述

控制条件的初始状态(初始值)

循环体内部对控制条件的影响60注意(续):为了保证循环正常运行,应该特别注意:60do-while语句语句一般格式do语句

while(表达式);

功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为0结束循环,转去执行while下面的语句。61do-while语句语句一般格式61

do-while循环的算法循环体当表达式为真N-S结构图NY循环体表达式非0?流程图main(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("%d\n",sum);}用do-while语句求100个自然数的和62do-while循环的算法循环体N-说明:while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构区别:do-while语句先执行循环体再判断条件,循环体至少执行一次;while语句先判断条件再执行循环体,循环体有可能一次也不执行do—while循环体中一定要有能使表达式值趋于0的操作(如i++),否则会出现死循环。

63说明:while和do-while都能实现循环控制,whido-while语句的简单应用【例3.9】用辗转相除法求m和n的最大公约数定义m、n、rm<nTFm和n交换r=m%nm=nn=r当r!=0时输出最大公约数m64do-while语句的简单应用【例3.9】用辗转相除法求m算法和程序:main(){intm,n,r;scanf("%d,%d",&m,&n);if(m<n){r=m;m=n;n=r;}

do{r=m%n;m=n;n=r;}while(r!=0);printf("%d\n",m);}程序运行情况如下:24,601265算法和程序:main()程序运行情况如下:65for语句语句一般格式for(表达式1;表达式2;表达式3)语句功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。循环初始条件循环控制条件循环体66for语句语句一般格式功能:循环初始条件循环控制条件循环体说明:for语句中的表达式,分别对应着循环控制中的三个基本组成部分,即:表达式1:循环控制变量的初始化(只执行1次),允许是逗号表达式。表达式2:循环判断条件,是循环的入口,若条件满足则执行循环体,否则结束循环。表达式3:改变循环控制变量操作(循环控制变量的增量),执行完循环体后,执行该语句;执行完毕,转去执行表达式2。67说明:67for语句的算法N-S结构图for(表达式1;表达式2;表达式3)语句NY流程图计算表达式1语句计算表达式3表达式2为真?例如:main(){inti,sum;sum=0;

for(i=1;i<=100;i++)sum=sum+i;

printf("sum=%d\n",sum);}可部分或全部省略,但“;”不可省略68for语句的算法N-S结构图for(表达式1;表达式2;表省略for语句的表达式⑴表达式1、2、3全省略,即:for(;;)

就等同于:while(1),会无限循环(死循环)注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行⑵省略表达式1和表达式3,即:for(;表达式2;)

就等同于:while(

表达式2)⑶省略表达式2,即:

for(表达式1;;表达式3)

就等同于:表达式1;while(1){…表达式3;}69省略for语句的表达式⑴表达式1、2、3全省略,即:注意:说明:所有用while

语句实现的循环都可以用for

语句实现。

等价于:for(表达式1;表达式2;表达式3)

语句;表达式1;while(表达式2){

语句;

表达式3;

}70说明:所有用while语句实现的循环都可以用for语句for语句的简单应用【例3.10】求n!,即计算p=1×2×3×…×n的值。

思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。设置:乘数i

,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器p

,每次循环令p=p*i71for语句的简单应用【例3.10】求n!,即计算p=1×2程序:main(){inti,n;longp;

p=1;

printf("Entern:");scanf("%d",&n);for(i=1;i<=n;i++)

p=p

*

i;printf("p=%ld\n",p);}思考:如何输出1!,2!,…,n!?如何求s=1!+2!+…+n!?72程序:main()思考:72几种循环语句的比较while和do-while语句的表达式只有一个,for语句有三个。while和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况73几种循环语句的比较while和do-while语句的表达式只用goto语句实现循环有兴趣的同学自学不提倡使用goto语句注意:goto语句能实现程序无条件转移,为编程提供了便利。但是无限制地使用,会破坏程序的结构化程度。因此应限制使用。74用goto语句实现循环有兴趣的同学自学注意:74【例3.11】计算s=1+2+3+4+……+100,使用goto语句实现#include<stdio.h>main(){inti=1,s=0;

loop:{s+=i;++i;if(i<=100)

gotoloop;

}printf("%d\n",s);}75【例3.11】计算s=1+2+3+4+……+100,使用go循环结构中的跳转语句有如下三种语句实现跳转:continue语句break语句goto语句在循环语句的循环体中使用,可以进行循环的流程控制76循环结构中的跳转语句有如下三种语句实现跳转:76后续语句…continue;

…YN表达式?后续语句…continue;…表达式?YNcontinue语句及应用功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。while语句do-while语句后续语句计算表达式3计算表达式1…continue;…表达式2?YNfor语句77后续语句…YN表达式?后续语句…表达式?YNcontinue例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);

if(x<0)continue;

s+=x;n++;};

⑵intx,n=0,s=0;do{scanf("%d",&x);

if(x<0)continue;

s+=x;n++;}while(n<10);

⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);

if(x<0)continue;

s+=x;}78例如:⑴intx,n=0,s=0;⑵intx,n=0应用举例【例3.12】把100~200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。

for(n=100;n<=200;n++)n不能被7整除

TF终止本次循环输出n

输出10个数

TF

换行79应用举例【例3.12】把100~200之间能被7整除的数,算法和程序main(){intn,j=0;for(n=100;n<=200;n++){if(n%7!=0)continue; printf("%6d",n);

j++;

if(j%10==0)printf("\n");

}printf("\nj=%d\n",j);}80算法和程序main()80后续语句…break;…YN表达式?后续语句…break;…表达式?YN循环中break的应用功能:利用break语句能够强迫终止本层循环,转到后续语句执行。while语句do-while语句后续语句计算表达式3计算表达式1…break;…表达式2?YNfor语句81后续语句…YN表达式?后续语句…表达式?YN循环中break例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);

if(x<0)break;s+=x;n++;};⑵intx,n=0,s=0;do{scanf("%d",&x);

if(x<0)break;s+=x;n++;}while(n<10);⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);

if(x<0)break;s+=x;}82例如:⑴intx,n=0,s=0;⑵intx,n=0循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套例如:

#include<stdio.h>main(){inti,j;

for(i=1;i<10;i++)for(j=1;j<=i;j++)printf((j==i)?"%4d\n":"%4d",i*j);

}外循环语句内循环语句83循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称注意:while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。例如:for(a=1;a<=10;a++){for(b=0;b<=5;b++)

……}外循环执行了10次,内循环执行6次循环正常结束时,内循环执行了10×6=60次84注意:while、do-while、for循环语句可以并列,举例2【例3.13】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。

思路:素数是指只能被1和它本身整除的数,如5、7、11、17、…等。

分别用2、3、…,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。这是一种穷举算法设除数为j,从2循环到m-185举例2【例3.13】判断输入的某个数m是否为素数。若是素数,算法和程序:#include"math.h"main(){intj,m,k;printf("Enteranintegernumber:");scanf("%d",&m);for(j=2;j<=m-1;j++)

if(m%j==0)break;printf("%d",m);if(j>=m)printf("YES\n");elseprintf("NO\n");}

输入一个数mfor(j=2;j<=m-1;j++)m%j==0TF

退出循环

j>=mTF输出"YES“输出"NO"86算法和程序:#include"math.h"输入一程序的优化对于穷举法来说,为了提高程序的效率,就要减少尝试次数。#include"math.h"main(){intj,m,k;printf("Enteranintegernumber:");scanf("%d",&m);

k=sqrt(m);for(j=2;j<=k;j++)

if(m%j==0)break;printf("%d",m);if(j>=k+1)printf("YES\n");elseprintf("NO\n");}思考:如何输出100~200中所有的素数

87程序的优化对于穷举法来说,为了提高程序的效率,就要减少尝试次举例5【例3.14】编程序,输出以下图形。

****************一共有4行,每行由空格和星号组成:空格数按行增加,星号按行减少变量

i

控制输出行数,从1变化到4变量j控制输出每行的空格和星号:j从1变化到

i,每次输出一个空格j从1变化到8-2*i+1,每次输出一个星号使用双重循环实现思路:88举例5【例3.14】编程序,输出以下图形。*******一算法和程序:main(){inti,j;

for(i=1;i<=4;i++)

{for(j=1;j<=i;j++)printf("");for(j=1;j<=8-(2*i-1);j++)printf("*");printf("\n");

}}for(i=1;i<=4;i++)for(j=1;j<=i;j++)

输出一个空格

for(j=1;j<=8-(2*i-1);j++)

输出一个星号换行思考:如何输出10行图形?输出图形向右平移20个字符位置,应如何修改程序?89算法和程序:main()for(i=1;i<=4;i【例3.15】

百钱买百鸡。鸡翁1,钱值5;鸡母1,钱值3;鸡雏3,钱值1;何以百钱买百鸡?

设鸡翁、鸡母、小鸡各为x、y、z只,根据题目要求,列出方程为:

x+y+z=1005x+3y+z/3=100三个未知数,两个方程,此题有若干个解。解决此类问题采用“试凑法”,把每一种情况都考虑到。90【例3.15】百钱买百鸡。鸡翁1,钱值5;鸡母1,钱值3方法一:最简单

三个未知数利用三重循环来实现for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++) {

if(x+y+z==100)&&(5*x+3*y+z/3.0==100) printf(“x=%d,y=%d,z=%d\n”,x,y,z); }三重循环共执行次数超过一百万次91方法一:最简单

三个未知数利用三重循环来实现for(x=0;方法二:

从三个未知数的关系,利用两重循环来实现for(x=0;x<=100;x++)for(y=0;y<=100;y++) {

if(7*x+4*y==100) printf(“x=%d,y=%d,z=%d\n”,x,y,100-x-y); }两重循环共执行次数超过一万次x+y+z=1005x+3y+z/3=100

7x+4y=10092方法二:

从三个未知数的关系,利用两重循环来实现for(x=方法三:

分析题目,利用一重循环来实现for(x=0;x<=100;x++) {

if(100-7*x)%4==0) &&(100-7*x)>=0

printf(“x=%d,y=%d,z=%d\n”x,(100-7*x)/4,75+3*x/4); }单循环共执行次数101次x+y+z=1005x+3y+z/3=100

7x+4y=10093方法三:

分析题目,利用一重循环来实现for(x=0;x<=方法四:

详细分析题目,利用数据间的关系设计高效算法for(x=0;x<=12;x+=4){

printf(“x=%d,y=%d,z=%d\n”,x,(100-7*x)/4,75+3*x/4);}

单循环共执行4次x+y+z=1005x+3y+z/3=100

7x+4y=1004y和100都是4的倍数且7与4互质,所以x必为4的倍数。94方法四:

详细分析题目,利用数据间的关系设计高效算法for(作业1、P107: 四(5、6、7、8、9、10)2、P110: 实验6循环结构程序设计95作业1、P107:95第3章程序控制结构烟台大学计算机学院刘培华C

语言程序设计96第3章程序控制结构烟台大学计算机学院刘培华C本章主要内容:C语言中程序设计的三种结构:顺序结构选择结构循环结构97本章主要内容:C语言中程序设计的三种结构:2程序的三种基本结构顺序结构N-S结构图流程图ABAB选择结构YNABP成立?PTFAB98程序的三种基本结构顺序结构N-S结构图流程图ABA选择结构程序的三种基本结构循环结构NYP成立?A当P成立时

A直到型循环

A当P成立时YNAP成立?当型循环N-S结构图流程图99程序的三种基本结构循环结构NYP成立?A当P成立时直到型循环C语言的语句类型主要内容:说明性语句表达式语句控制语句复合语句100C语言的语句类型主要内容:5说明性语句对程序中使用的变量、数组、函数等操作对象进行定义、声明的描述语句只起说明作用,不产生可执行的机器指令代码。

例如:inta,b;

floatfunction(int,int);C程序由函数组成。函数的格式:函数名(参数表){

说明部分;执行部分;}数据类型说明语句可执行语句101说明性语句对程序中使用的变量、数组、函数等操作对象进行定义、表达式后面加一个分号,构成表达式语句x=3;y=y+5;x=a-b&&c||d;printf("x=%d,y=%d\n",x,y);sort(a,10);表达式语句赋值语句函数调用语句注意:①分号是语句必不可少的一部分②单独的一个分号“;”构成一个空语句例如:;(空语句,是最简单的C语句)102表达式后面加一个分号,构成表达式语句表达式语句赋值语句函数控制语句1.选择分支控制语句

if()…else…

switch(){…} 2.循环控制语句

for()…

while()…do…while()3.其他控制语句

break、continue、gotoreturn103控制语句1.选择分支控制语句8复合语句用一对花括号“{}”括起来的若干条语句

花括号中可以是说明语句、表达式语句、控制语句,也可以是复合语句例如:⑴if(a>b){max=a;min=b;}

⑵for(n=1;n<10;n++)

{p=n+p;if(p>=100)

{

printf(“%d\n”,p);break;

}

}

104复合语句用一对花括号“{}”括起来的若干条语句9复合语句(续)复合语句中如果有说明性语句,应该写在可执行语句的前面例如:

main(){inta,b;a=b=100;{floatc=10.23;printf("%f\n",c);}printf("%d%d\n",a,b);}要特别注意:花括号的配对花括号的位置C语言学习的难点之一105复合语句(续)复合语句中如果有说明性语句,应该写在可执行语句3.1顺序结构程序设计3.4.1顺序结构程序的一般算法描述变量定义变量赋值运算处理输出结果可用:变量初始化赋值语句输入函数调用语句注意各个语句的顺序1063.1顺序结构程序设计3.4.1顺序结构程序的一般算法描3.1.1顺序结构程序设计举例【例3.1】数据交换。从键盘输入a、b的值,输出交换以后的值。

思路:在计算机中交换变量a和b的值,不能只写下面两个赋值语句a=b;b=a;?正确的交换方法:c=a;a=b;b=c;1073.1.1顺序结构程序设计举例【例3.1】数据交换。从键ab108ab13cba109cba14110151111611217113181141911520变量定义输入数据输出数据数据交换输出结果【例3.1】数据交换问题的算法描述116变量定义输入数据输出数据数据交换输出结果【例3.1】数据交换程序:main(){inta,b,c;printf("\ninputa,b:");scanf("%d,%d",&a,&b);printf("\nbeforeexchange:a=%db=%d\n",a,b);c=a;a=b;b=c;printf("afterexchange:a=%db=%d\n",a,b);}程序运行情况如下:inputa,b:32,57

beforeexchange:a=32b=57afterexchange:a=57b=32

117程序:main()程序运行情况如下:22举例:【例3.2】已知三条边a、b、c,求三角形面积。计算三角形面积的海伦公式:其中:设定义:整型变量a、b、c实型变量s、area118举例:【例3.2】已知三条边a、b、c,求三角形面积。计算程序如下:#include"math.h"main(){inta,b,c;floats,area;scanf("%d,%d,%d",&a,&b,&c);s=(a+b+c)/2.0f;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%8.3f\n",area);}程序运行情况如下:3,4,5

area=6.000

实际上还需要判断a、b、c是否能构成三角形,即应该进行选择判断处理119程序如下:#include"math.h"程序运行情况如if语句if语句的一般形式if语句的嵌套switch语句switch语句的一般形式break语句选择结构程序设计举例3.2选择结构程序设计120if语句3.2选择结构程序设计25简单分支语句语句一般格式if(表达式)

语句功能:计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句,顺序执行后续语句。内嵌语句,可为:赋值语句函数调用语句控制语句复合语句空语句可为算术、关系、逻辑、赋值等表达式121简单分支语句语句一般格式功能:内嵌语句,可为:可为算术、关系简单分支语句的算法:例如:⑴if(x>0)m++;⑵if(a>b){c=a;a=b;b=c;}

表达式非0

TF

语句N-S结构图语句流程图NY表达式非0?122简单分支语句的算法:例如:表达式非0N-S结构双重分支语句语句一般格式if(表达式)

语句1

else语句2

功能:计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。

123双重分支语句语句一般格式28双重分支语句的算法:例如:⑴if(x>0)m++;elsem--;⑵if(ch>='a'&&ch<='z')

{ch=ch-32;

printf("%c\n",ch);}elseprintf("%c\n",ch);

表达式非0

TF

语句1语句2N-S结构图语句1

语句2流程图NY表达式非0?124双重分支语句的算法:例如:表达式非0N-S结构图多重分支语句语句一般格式if(表达式1)

语句1

elseif(表达式2)

语句2

……elseif(表达式m)

语句m

else语句

n功能:依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n无论执行完那个语句分支,都转到后续语句125多重分支语句语句一般格式30多重分支语句的算法流程图表达式2?表达式1?语句n语句1

语句2

语句m…YNYNNY表达式m?126多重分支语句的算法流程图表达式2?表达式1?语句n语句1多重分支语句的算法N-S结构图表达式1?

TF

表达式2?语句1TF

语句2…

表达式m?TF

语句m语句n例如:if(a<0)x=-1;elseif(a==0)x=0;elsex=1;127多重分支语句的算法N-S结构图表达式1?if语句的简单应用【例3.3】输入一个字符,如果是大写字母,则将其转换为小写字母输出,否则直接输出。输入:用getchar或scnaf函数ch是否为大写字母:ch>='A'&&ch<='Z'(或ch>=65&&ch<=90)大写字母转换为小写字母:ch=ch+32输出:用putchar或printf函数思路:128if语句的简单应用【例3.3】输入一个字符,如果是大写字母,程序:#include"stdio.h"main(){charch;ch=getchar();if(ch>='A'&&ch<='Z')ch=ch+32;printf("%c\n",ch);}程序运行情况如下:Gg

可使用条件表达式代替putchar(ch>='A'&&ch<='Z'?ch+32:ch);putchar('\n')129程序:#include"stdio.h"程序运行情况如下

if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。

【例4.a】比较两个整数的关系。#include<stdio.h>main(){intx,y;printf("EnterintegerXandY:");scanf("%d%d",&x,&y);

if(x!=y)

if(x>y)printf("X>Y\n");

elseprintf("X<Y\n");

elseprintf("X=Y\n");}应该正确判断:if的内嵌语句if和else的配对提倡缩格书写有利于阅读程序130if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则

if语句嵌套的形式简单if语句的嵌套形式if(表达式)if语句双重(或多重)分支if语句的嵌套形式if(表达式)if语句else

if语句可以是各种形式的if语句可以是各种形式的if语句如果是简单if语句,必须用“{}”括起131if语句嵌套的形式简单if语句的嵌套形式可以是各种形式的例如:if(a>b) if(a>c) if(a>d)m=1; elsem=2; elsem=3; 问题:哪一个else和哪一个if相匹配?规则:在嵌套的if~else语句中,else总是与上面的离它最近的尚未配对的if

配对。132例如:if(a>b) 问题:哪一个else和举例【例3.4】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。

定义变量x输入x的值

x是奇数

TF

输出“odd”x是5的倍数输出“even”

温馨提示

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

评论

0/150

提交评论