1、第第第第第第3 3 3 3 3 3章章章章章章 程序控制结构程序控制结构程序控制结构程序控制结构程序控制结构程序控制结构刘刘 培培 华华23N-S结结构构图图流流程程图图ABABYNABP成立成立? P T F A B4NYP成立成立?A当当P成立时成立时 A A当P成立时YNAP成立成立?N-S结结构构图图流流程程图图56 int a,b; float function( int, int);可执行语句可执行语句789 if (ab) max=a; min=b; for(n=1; n= 100 ) printf(“dn”, p); break; 10 main( ) int a,b; a=b
2、=100; float c=10.23; printf(%fn,c); printf(%d %dn,a,b); 11变量定义变量定义变量赋值变量赋值运算处理运算处理输出输出结果结果可用:可用: 变量初始化变量初始化 赋值语句赋值语句 输入函数调用语句输入函数调用语句12正确的交换方法:正确的交换方法:c=a ; a=b ; b=c;13ab14cba15161718192021变量定义变量定义22main( ) int a,b,c; printf(ninput a, b: ); scanf(%d,%d,&a,&b); printf(nbefore exchange:a=%d b=%dn,a,b
3、); c=a; a=b; b=c; printf(after exchange: a=%d b=%dn,a,b);程序运行情况如下:程序运行情况如下:input a, b: 32, 57 before exchange: a=32 b=57 after exchange: a=57 b=32 23) cs)(bs)(as ( sarea) cba (21s24#include math.hmain( ) int a,b,c; float s,area ; scanf(%d, %d, %d,&a,&b,&c); s =(a+b+c)/2.0f ; area = sqrt(s*(s-a)*(s-b
4、)*(s-c) ; printf(area = %8.3f n,area) ;程序运行情况如下:程序运行情况如下:3,4,5 area = 6.000 2526内嵌语句,可为:内嵌语句,可为: 赋值语句赋值语句 函数调用语句函数调用语句 控制语句控制语句 复合语句复合语句 空语句空语句可为算术、关系、逻辑、赋值可为算术、关系、逻辑、赋值等表达式等表达式27 (x0) m+; ( ab ) c=a; a=b; b=c; 表达式非表达式非0 T F 语句语句N-S结构图结构图语句语句流程图流程图NY表达式非表达式非0?2829 (x0) m+; m-; ( ch= a & ch=A & ch=A
5、& ch=Z ? ch+32:ch);putchar ( n)35【例【例4.a】比较两个整数的关系。比较两个整数的关系。#include main( ) int x, y; printf (Enter integer X and Y:); scanf (%d%d, &x, &y); if ( x != y ) if ( x y ) printf (XYn); else printf (XYn); else printf (X=Yn);有利于阅读程序有利于阅读程序36可以是各种形式的可以是各种形式的if语句语句可以是各种形式的可以是各种形式的if语句语句如果是简单如果是简单if语句,语句,必须
6、用必须用“ ”括起括起3738定义变量定义变量x输入输入x的值的值 x是奇数是奇数 T F 输出输出“odd” x是是5的倍数的倍数 输出输出“even” T F是是5的倍数的倍数39main( ) int x; scanf (%d,&x); () printf(%d is an odd n,x) ; () printf(%d is the times of 5 n,x) ; printf(%d is an even n,x) ;404142switch (a) case 5: printf(&); case 2: printf(#); default:printf($); 当当a等于等于5,
7、输出:,输出:当当a等于等于2,输出:,输出:当当a是其他值,输出:是其他值,输出:43switch (a) case 2: printf(#); default: printf($); case 5: printf(&);break;break; break;4445#include stdio.hmain( ) float x=100,y=15,z; char op; op=getchar( ); switch (op) case +: z=x+y; break; case -: z=x-y; break; case *: z=x*y; break; case /: z=x/y; brea
8、k; default: z=0; if(int)z!=0) printf(%f%c%f=%fn,x,op,y,z); else printf (%c is not an operatorn,op); 实型数通常不使用实型数通常不使用z=0或或z!=0的比较的比较 可用可用代替代替46aacbbx2422, 14748#include math.hmain( ) float a,b,c,d,x1,x2,lp,ip; scanf(%f%f%f,&a,&b,&c); printf(the equation ); if (fabs(a)1e-6) printf(is not quadratic); e
9、lse d=b*b-4*a*c; if (fabs(d)1e-6) x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(has two real roots:n) ; printf(x1=%8.4f, x2=%8.4fn,x1,x2); else lp=-b/(2*a);ip=sqrt(-d)/(2*a); printf(has two complex roots: n); printf(x1=%8.4f+%8.4fin,lp,ip); printf(x2=%8.4f-%8.4fin,lp,ip); 运行运行jc4_650设定标志变量设定标志变
10、量,只要符合其中一个条件的就只要符合其中一个条件的就是闰年,令是闰年,令 ;否则令否则令 51定义变量定义变量year、leap 输入年份输入年份year T F leap=1 T F leap = 1 leap = 0 leap=1? T F 是闰年是闰年 不是闰年不是闰年52main( ) int year, leap ; scanf(%d, &year); if (year%4=0 & year%100!=0) leap=1; else if (year%400=0) leap=1; else leap=0; if (leap = 1) printf(%d is a leap year
11、n, year); else printf(%d is not a leap year n, year); 53545556当表达式为真当表达式为真 语句语句表 达 式 非表 达 式 非0?语句语句57思路:寻找思路:寻找加数加数与与求和求和的规律的规律 加数加数 从从1变到变到100,每循环一次,使,每循环一次,使i增增1,直到直到i的值超过的值超过100。 的的设为设为1。求和求和设变量设变量 存放和存放和,循环求,循环求,直至直至i超过超过100。 58main( ) int i,sum; i=1; sum=0; while () sum=sum+i; i+; printf(sum=%d
12、n,sum);程序输出结果:程序输出结果:sum=5050 i=1,sum=0 当当i = 100 sum=sum+i i+输出输出sum59 while (i=100) i+; sum=sum+i; 606162 循环体循环体当表达式为真当表达式为真N-S结构图结构图NY循环体循环体表达式非表达式非0?流程图流程图main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);6364定义定义m、n、rmnT F m和和n交换交换r=m%nm=nn=r 当当r != 0时时输出最大公约数输出最大公约数m65mai
13、n( ) int m,n,r; scanf(%d, %d,&m,&n); if (mn) r=m; m=n; n=r; r=m%n; m=n; n=r; printf(%dn,m); 666768N-S结构图结构图for (表达式表达式1;表达式表达式2;表达式表达式3) 语句语句NY流程图流程图计算表达式计算表达式1 语句语句计算表达式计算表达式3表达式表达式2为真为真?main( ) int i,sum; sum=0; printf(sum=%dn,sum);69注意:在省略某个表达式时,应在适当位置进行循注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行环
14、控制的必要操作,以保证循环的正确执行7071思路:求阶乘与求累加的运算处理过程类似,只要思路:求阶乘与求累加的运算处理过程类似,只要将将“ ”变为变为“ ”。设置:设置: ,初值为,初值为1,终值为,终值为n(n是循环控制终是循环控制终值,需要从键盘输入)值,需要从键盘输入) ,每次循环令,每次循环令p = p*i72main( ) int i, n; ; printf(Enter n:); scanf(%d,&n); for (i=1; i=n; i+) =; printf(p = n,p);7374757677后续语句后续语句 后续语句后续语句后续语句后续语句7879for (n=100;
15、 n=200; n+) n不能被不能被7整除整除 T F 终止本次循环终止本次循环 输出输出n 输出输出10个数个数 T F 换行换行80main( ) int n,j=0; for(n=100;n=200;n+) printf(%6d,n); printf( n j=%dn,j); 81后续语句后续语句后续语句后续语句后续语句后续语句8283#include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (j=i)?%4dn:%4d,i*j); 外循环语句外循环语句内循环语句内循环语句8485l分别用分别
16、用尝试能否整除整数尝试能否整除整数 。86#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m); for (j=2; ; j+) printf(%d ,m); if () printf(YESn); else printf(NOn); 输入一个数输入一个数mfor (j=2; j=m T F输出输出YES“ 输出输出NO87#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m);
17、 for (j=2; ; j+) printf(%d ,m); if () printf(YESn); else printf(NOn);88* * * *89main( ) int i,j; 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+) 输出一个星号输出一个星号 换行换行90设鸡翁、鸡母、小鸡各为设鸡翁、鸡母、小鸡各为x、y
18、、z只,根据只,根据题目要求,列出方程为:题目要求,列出方程为: x+y+z=100 5x+3y+z/3=100三个未知数,两个方程,此题有若干个解。三个未知数,两个方程,此题有若干个解。解决此类问题采用解决此类问题采用“试凑法试凑法”,把每一种情,把每一种情况都考虑到。况都考虑到。91 三重循三重循环共执行次环共执行次数超过一百数超过一百万次万次92 两重循两重循环共执行次环共执行次数超过一万数超过一万次次x+y+z=1005x+3y+z/3=100 7x+4y=10093 单循环共执单循环共执行次数行次数101次次x+y+z=1005x+3y+z/3=100 7x+4y=10094 单循环单循环共执行共执行4次次x+y+z=1005x+3y+z/3=100 7x+4y=1004y4y和和100100都是都是4 4的的倍数且倍数且7 7与与4 4互质,互质,所以所以x x必为必为4 4的倍的倍数数。95