1.03k likes | 1.19k Views
第四章 程序的控制结构. 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. 算法特征:有穷性、确定性、有效性、输入、输出. 算法的分类 数值运算算法 求平方根 计算
E N D
第四章 程序的控制结构 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 算法特征:有穷性、确定性、有效性、输入、输出
算法的分类 数值运算算法 求平方根 计算 非数值运算算法 排序 查找 算法的描述方法: 自然语言 流程图 NS图 伪代码 用辗转相除法求两个正整数的最大公因子 input m,n; if m<nm˂=˃n; loop: r=mmod n; if r=0output n; m=n;n=r; goto loop;
描述算法的三种基本结构: 顺序结构 选择结构循环结构 CC 流程图 A1 BC A2 B2 B1 C1 A3 BC A1 CC NS图 A2 B1 B2 C1 A3
CC 流程图 A1 BC A2 B2 B1 C1 A3 • 三种基本结构的特点 只有一个入口 只有一个出口 每一部分都有机会被执行 不存在死循环
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 输出各位数字 结束
4.2 选择结构 如果外面下雨了,我就带雨伞 红灯停,绿灯行 如果a除以b余数为0,那么b是a的因子,否则b不是a的因子 公园门票,1.2米以下儿童免票,60岁以上老人免票,其余人全票50元。
如果外面下雨了,我就带雨伞 否 下雨了? 是 带雨伞
红灯停,绿灯行 红灯 否 是 停止前进 继续前进
x=a除以b的余数 否 x等于0? 是 b是a的因子 b不是a的因子 判断b是否是a的因子
一、逻辑表达式示例 x是偶数 a是介于20到30之间的整数 c是数字字符 c是字母字符 year是闰年 (1)能被4整除,但不能被100整除 (2)能被400整除 t是3位整数
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
已知A、B、C、D、E、F共6人参加比赛 A、B至少一人获奖 A、B、C至少二人获奖 A、E中最多一人获奖 ?谁获奖了? 有人猜测6人依次获得第一名到第六名。 这个猜测只猜对了三人的名次 ?这6个人的名次?
1 0 a a 0 1 0 1 b b 1 0 1 0 c c 1 0 注意(短路计算): 逻辑表达式中并不是 所有的逻辑运算符都被执行 a && b && c a || b || c
讨论: if(i++||j++||k++) ; if(i++&&j++&&k++) ; if(i||j||k) i++,j++,k++;
表达式 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图
表达式 Y N N 表达式 语句1 语句2 Y 语句1 语句2 N-S图 流程图 if(表达式)语句1 else 语句2 if (a>b) max=a; else max=b;
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");
编程示例 int main( ) {char ch; ch=getchar(); if(ch>='A'&&ch<='Z') ch=ch+32; putchar(ch); }
编程示例 int main( ) {char ch; ch=getchar(); if(ch>='A'&&ch<='Z') ch=ch+32; elseif(ch>='a'&&ch<='z') ch=ch-32; putchar(ch); }
讨论: 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");
输入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; }
-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;
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
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
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
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结合
找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
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;
表达式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;
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); }
三、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
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
格式: switch (表达式) {case 常量表达式1:语句串1 case 常量表达式2:语句串2 ………… case 常量表达式n:语句串n default :语句串n+1 } 表达式只能是整型、字符型、枚举类型 各常量表达式中不能有相同的值 执行完某个分支后, 要用break语句终止switch语句的执行 不同的常量表达式可以执行相同的语句串
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"); }
break语句用来在执行完一个case分支后,终止switch语句的执行。break语句用来在执行完一个case分支后,终止switch语句的执行。 如果某个case分支后没有break语句,程序将不再做比较而执行下一个分支,直到break语句或该复合语句结束。 当没有case子句匹配时,就执行default子句。default子句是任选的(可有可无)。若无default子句,此时switch语句就什么动作也没有做。 switch语句的功能可以用if-else语句来实现,但某些情况下,使用switch语句更简炼。
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"); } }
y a=0? b2-4ac=0? b2-4ac>0? 输出一个实根 • 求方程的根 开始 输入系数a、b、c N y 输出两个相等的实根 N y 计算并输出两个不同的实根 N 计算并输出两个虚根 结束
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);
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); } } }
运费计算 公里 折扣 <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)
公里 折扣 <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
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;
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; }
4.3循环结构程序设计 往前走,直到到达目标为止 没到? N Y 只要..... 往前走
计算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;
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);
sum=0; i=1; N i<=100 Y sum=sum+i; i+=2; 输出sum 计算1+3+5+......+99
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;
sum=0; i=1; N i<100 Y sum=sum+i; i+=2; 输出sum 计算1+3+5+......+99