1 / 103

第四章 程序的控制结构

第四章 程序的控制结构. 4.1 顺序结构 4.2 选择结构 4.3 循环结构 4.4 结构化程序设计. 算法 —— 计算方法 解决问题的方法和步骤. 例:用辗转相除法求两个正整数的最大公因子 1 .输入 m 和 n 2 .若 m<n, 则交换 m 和 n 3 . m 除以 n ,余数为 r 4 .若 r=0 ,则 n 为最大公因子,输出 n ,否则执行 5 5 . m=n , n=r ,转 3. 算法特征:有穷性、确定性、有效性、输入、输出. 算法的分类 数值运算算法 求平方根 计算 

star
Download Presentation

第四章 程序的控制结构

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 程序的控制结构 4.1顺序结构4.2选择结构 4.3循环结构 4.4结构化程序设计

  2. 算法——计算方法 解决问题的方法和步骤 例:用辗转相除法求两个正整数的最大公因子 1.输入m和n 2.若m<n, 则交换m和n 3.m除以n,余数为r 4.若r=0,则n为最大公因子,输出n,否则执行5 5.m=n,n=r,转3 算法特征:有穷性、确定性、有效性、输入、输出

  3. 算法的分类 数值运算算法 求平方根 计算 非数值运算算法 排序 查找 算法的描述方法: 自然语言 流程图 NS图 伪代码 用辗转相除法求两个正整数的最大公因子 input m,n; if m<nm˂=˃n; loop: r=mmod n; if r=0output n; m=n;n=r; goto loop;

  4. 描述算法的三种基本结构: 顺序结构 选择结构循环结构 CC 流程图 A1 BC A2 B2 B1 C1 A3 BC A1 CC NS图 A2 B1 B2 C1 A3

  5. CC 流程图 A1 BC A2 B2 B1 C1 A3 • 三种基本结构的特点 只有一个入口 只有一个出口 每一部分都有机会被执行 不存在死循环

  6. 4.1 顺序结构 开始 从键盘任意输入一个三位数,计算并输出它的个位、十位、百位数字 输入number 计算个位数bit0 int main() { int number; int bit0,bit1,bit2; scanf("%d",&number); bit0= bit1= bit2= printf("个位=%d,十位=%d, 百位=%d",bit0,bit1,bit2); } 计算十位数bit1 计算百位数bit2 输出各位数字 结束

  7. 4.2 选择结构 如果外面下雨了,我就带雨伞 红灯停,绿灯行 如果a除以b余数为0,那么b是a的因子,否则b不是a的因子 公园门票,1.2米以下儿童免票,60岁以上老人免票,其余人全票50元。

  8. 如果外面下雨了,我就带雨伞 否 下雨了? 是 带雨伞

  9. 红灯停,绿灯行 红灯 否 是 停止前进 继续前进

  10. x=a除以b的余数 否 x等于0? 是 b是a的因子 b不是a的因子 判断b是否是a的因子

  11. 一、逻辑表达式示例 x是偶数 a是介于20到30之间的整数 c是数字字符 c是字母字符 year是闰年 (1)能被4整除,但不能被100整除 (2)能被400整除 t是3位整数

  12. int x,a,year,t; char c; (1)x%2==0或x/2*2==x (2)x>20&&x<30 (3)c>='0'&&c<='9' (4)c>='a'&&c<='z'||c>='A'&&c<='Z' (5)year%4==0&&year%100!=0||year%400==0 (6)t/100>0&&t<1000

  13. 已知A、B、C、D、E、F共6人参加比赛 A、B至少一人获奖 A、B、C至少二人获奖 A、E中最多一人获奖 ?谁获奖了? 有人猜测6人依次获得第一名到第六名。 这个猜测只猜对了三人的名次 ?这6个人的名次?

  14. 1 0 a a 0 1 0 1 b b 1 0 1 0 c c 1 0 注意(短路计算): 逻辑表达式中并不是 所有的逻辑运算符都被执行 a && b && c a || b || c

  15. 讨论: if(i++||j++||k++) ; if(i++&&j++&&k++) ; if(i||j||k) i++,j++,k++;

  16. 表达式 Y N N 表达式 语句 Y 语句 二、 if语句 if(a>b) printf("It's right"); if(a+b>c&&b+c>a&&c+a>b) printf("能构成一个三角形\n"); if(表达式)语句 流程图N-S图

  17. 表达式 Y N N 表达式 语句1 语句2 Y 语句1 语句2 N-S图 流程图 if(表达式)语句1 else 语句2 if (a>b) max=a; else max=b;

  18. if(a>b) printf("a比b大"); else printf("a比b小"); if(a+b>c&&b+c>a&&c+a>b) printf("it is an triangle"); else printf("it is not an triangle");

  19. 编程示例 int main( ) {char ch; ch=getchar(); if(ch>='A'&&ch<='Z') ch=ch+32; putchar(ch); }

  20. 编程示例 int main( ) {char ch; ch=getchar(); if(ch>='A'&&ch<='Z') ch=ch+32; elseif(ch>='a'&&ch<='z') ch=ch-32; putchar(ch); }

  21. 讨论: if(a>b) t=a; a=b; b=t; if(a>b) { t=a; a=b; b=t;} if(b>c) max=b; min=c; else max=c; min=b; if(a=0) printf("a equal to zero"); else printf("a is not equal to zero");

  22. 输入x的值,利用函数计算y的值 -1 (x<0) y= 0 (x=0) 1 (x>0) 嵌套的if语句 N x<0 Y N y=-1 x=0 Y y=0 y=1 int main( ) {int x,y; scanf("%d",&x); if(x<0) y= 1; else if(x==0) y=0; else y=1; printf("x=%d,y=%d\n",x,y); return 0; }

  23. -1 (x<0) y= 0 (x=0) 1 (x>0) if(x<0) y= 1; else if(x==0) y=0; else y=1; if(x>=0) if(x>0) y= 1; else y=0; else y=-1; y=-1; if(x>=0) if(x>0) y= 1; else y=0; y=0; if(x!=0) if(x>0) y= 1; else y=-1;

  24. if(num>500) cost=0.15; else if(num>300) cost=0.10; else if(num>100) cost=0.075; else if(num>50) cost=0.05; else cost=0; N num>500 N Y num>300 N num>100 N Y num>50 Y cost=0.1 cost=0.15 Y cost=0.075 cost=0.05 cost=0

  25. if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 …………………. else if(表达式n) 语句n else 语句n+1 N e1 N Y e2 Y e3 … Y s1 s2 s3 sn+1

  26. e1 e1 Y N Y N e2 e2 e3 Y Y Y N N N s3 s2 s2 s4 s1 s1 s3 if(e1) if(e2) s1 else s2 else s3 if(e1) if(e2) s1 else s2 else if(e3) s3 else s4

  27. e1 e1 N N Y Y e2 e2 Y Y N N e3 e3 s3 Y Y N N s1 s1 s2 s2 s3  if(e1) if(e2) s1 else if(e3) s2 else s3 没有if就没有else else总是与最近的尚未配对的if结合

  28. 找a、b、c的最大值 a~b if(a>b) if(a>c) max=a; else max=c; else if(b>c) max=b; else max=c; a>b b≥a b~c a~c c≥a c≥a b>c a>c max=c max=b max=c max=a

  29. max=a; if(a<b) max=b; if(max<c) max=c; if(a>b&&a>c) max=a; if(b>c&&b>a) max=b; else max=c;

  30. 表达式1 N Y x=表达式2 x=表达式3  条件表达式 1.格式: 表达式1 ?表达式2 :表达式3 2.语义: if(表达式1) 表达式2 else 表达式3 x=表达式1 ?表达式2 :表达式3 max=(a>b) ? a : b;

  31. 3.优先级:高于赋值运算 低于关系和算术运算 4.结合方向:从右向左 a>b?a:c>d?c:d; 5.结果类型:与表达式2或表达式3相同 main( ) {char ch; scanf("%c",&ch); ch=(ch>='A'&&ch<='Z')?(ch+32):ch; printf("%c\n",ch); }

  32. 三、switch语句 switch(ch) {csae 'A': printf("Good!\n"); break; case 'B': printf("Good!\n"); break; case 'C': printf("Pass\n"); break; case 'D': printf("Fail!\n"); break; } ch case ch=='C' ch=='D' ch=='A' ch=='B' Good Fail Pass

  33. switch(ch) {csae 'A': case 'B': printf("Good!\n"); break; case 'C': printf("Pass\n"); break; case 'D': printf("Fail!\n"); break; } ch case ch=='C' ch=='D' ch=='A' ch=='B' Good Fail Pass

  34. 格式: switch (表达式) {case 常量表达式1:语句串1 case 常量表达式2:语句串2 ………… case 常量表达式n:语句串n default :语句串n+1 } 表达式只能是整型、字符型、枚举类型 各常量表达式中不能有相同的值 执行完某个分支后, 要用break语句终止switch语句的执行 不同的常量表达式可以执行相同的语句串

  35. switch(ch) {csae 'A': case 'B': printf("Good!\n"); break; case 'C': printf("Pass\n"); break; case 'D': printf("Fail!\n"); break; } switch(ch) {csae A: case B: printf("Good!\n"); case C: printf("Pass!\n"); case D: printf("Fail!\n"); } switch(ch) {csae 'A' || 'B': printf("Good!\n"); case C: printf("Pass!\n"); case D: printf("Fail!\n"); } switch(ch) {csae 'A'<= ch<='B': printf("Good!\n"); case C: printf("Pass!\n"); case D: printf("Fail!\n"); }

  36. break语句用来在执行完一个case分支后,终止switch语句的执行。break语句用来在执行完一个case分支后,终止switch语句的执行。 如果某个case分支后没有break语句,程序将不再做比较而执行下一个分支,直到break语句或该复合语句结束。 当没有case子句匹配时,就执行default子句。default子句是任选的(可有可无)。若无default子句,此时switch语句就什么动作也没有做。 switch语句的功能可以用if-else语句来实现,但某些情况下,使用switch语句更简炼。

  37. int main( ) { int data1,data2; char op; printf("Type number operator number\n"); scanf("%d%c%d",&data1,&op,&data2); switch(op) {case '+': printf("%d+%d=%d\n", data1,op,data2,data1+data2); break; case '-': printf("%d-%d=%d\n", data1,op,data2,data1-data2); break; case '*': printf("%d %c%d=%d\n", data1,op,data2,data1*data2); break; case '/': if(0==data2) printf("Dividey by Zero!\n"); else printf("%d/%d=%d\n", data1,op,data2,data1/data2); break; default: printf("Unknow operator!\n"); } }

  38. y a=0? b2-4ac=0? b2-4ac>0? 输出一个实根 • 求方程的根 开始 输入系数a、b、c N y 输出两个相等的实根 N y 计算并输出两个不同的实根 N 计算并输出两个虚根 结束

  39. int main( ) {float a,b,c,p,q,disc; printf("Please enter a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); printf("The Equation:"); if(fabs(a)<=1e-6) printf("has one roots:%6.2f\n",-c/b);

  40. else {disc=b*b-4*a*c; p=-b/(2*a); q=sqrt(fabs(disc))/(2*a); if(fabs(disc)<1e-6) printf("has two equal roots:%6.2f\n", p); else if(disc>1e-6) printf("has two unequal real roots: %6.2f and %6.2f\n",p+q,p-q); else {printf("has complex roots:\n"); printf("%6.2f+%6.2f i\n", p,q); printf("%6.2f-%6.2f i\n", p,q); } } }

  41. 运费计算 公里 折扣 <250 无 >=250 <500 2% >=500 <1000 5% >=1000 <2000 8% >=2000 <3000 10% >=3000 15% 每公里每吨货物的 基本运费为p 货物重量为w 距离为s 折扣为d 总运费为: f=p*w*s*(1-d)

  42. 公里 折扣 <250 无 >=250 <500 2% >=500 <1000 5% >=1000 <2000 8% >=2000 <3000 10% >=3000 15% 输入p、w、s s/250 4 8 9 2 5 0 >= 12 1 10 3 6 7 11 d=0 d=2 d=5 d=8 d=10 d=15 f=p*w*s*(1-d/100.0); 输出f

  43. int main( ) {int c,s; float p,w,d,f; printf("Input p,w,s:"); scanf("%f,%f,%d",&p,&w,&s); if (s>=3000) c=12; else c=s/250;

  44. switch(c) {case 0: d=0; break; case 1: d=2; break; case 2: case 3: d=5; break; case 4: case 5: case 6: case 7: d=8; break; case 8: case 9: case 10: case 11:d=10; break; case 12:d=15;break; } f=p*w*s*(1-d/100.0); printf("freight=%15.4f\n",f); return 0; }

  45. 4.3循环结构程序设计 往前走,直到到达目标为止 没到? N Y 只要..... 往前走

  46. 计算1+2+3+......+100 sum=1+2; //sum存放和值 sum=sum+3; sum=sum+4; ...... sum=sum+100; sum=0; //sum存放和值 i=1; sum=sum+i; i=i+1; sum=sum+i; i=i+1; sum=sum+i; i=i+1; sum=sum+i; ...... i=i+1; sum=sum+i; sum=0; //sum存放和值 sum=sum+1; sum=sum+2; sum=sum+3; sum=sum+4; ...... sum=sum+100;

  47. sum=0; i=1; N i<=100 Y sum=sum+i; i++; 输出sum 计算1+2+3+......+100 int i,sum; sum=0; i=1; while(i<=100) { sum+=i; i++; } printf("%d",sum); int i,sum; sum=0; for(i=1; i<=100; i++) { sum+=i; } printf("%d",sum);

  48. sum=0; i=1; N i<=100 Y sum=sum+i; i+=2; 输出sum 计算1+3+5+......+99

  49. sum=0; i=1;s=1; N i<100 Y sum=sum+s*i; i+=2; s=-s; 输出sum 计算1-3+5-7......-99 符号s,初始为1; s=-s;

  50. sum=0; i=1; N i<100 Y sum=sum+i; i+=2; 输出sum 计算1+3+5+......+99

More Related