C语言程序设计课件:选择结构程序设计_第1页
C语言程序设计课件:选择结构程序设计_第2页
C语言程序设计课件:选择结构程序设计_第3页
C语言程序设计课件:选择结构程序设计_第4页
C语言程序设计课件:选择结构程序设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

选择结构程序设计第一节单分支选择结构第二节双分支选择结构第三节多分支选择结构第四节项目任务:软件用户界面设计优化第一节单分支选择结构顺序结构程序自上而下执行,程序中的每一条语句都被执行一次,而且只能执行一次,完成简单的运算。而在许多情况下,语句执行的顺序常常依赖于输入的数据或中间运算结果,即只能根据当时的具体情况和需要采取不同的处理方式,这种程序结构称为选择结构。例如,输入三角形的三条边,首先必须判断是否能构成三角形,若能才求出三角形的面积。这些问题在处理时都需要根据判定条件来选择不同的操作。在C语言程序设计中,使用选择结构需考虑两个问题:一是确定要判断的是什么条件,二是当判断结果为不同的情况(“真”或“假”)时应该执行什么操作。根据选择执行程序分支的数目,可以将选择结构细分为三类:单分支选择结构、双分支选择结构、多分支选择结构。单分支选择结构是最简单选择结构,一般形式如下:If(表达式)语句;流程图如图3.1所示。图3.1单分支选择结构流程图单分支if语句的执行过程是:如果表达式的值为真(非0),则执行其后的语句,否则不执行该语句。【案例3-1】输入两个数,输出其中的大数。分析:这是一个两个数中求较大数的问题。显然,两个数为程序的输入项,较大数为程序的输出项,其算法可以表示如下:(1)输入两个数a,b;(2)将a赋值给变量max;(3)将b与max比较,如果b>max,将b赋给max;(4)输出max的值。#include<stdio.h>main(){inta,b,max;printf("\n请输入第一个整数:");scanf("%d",&a);printf("\n请输入第二个整数:");scanf("%d",&b);max=a;if(max<b)max=b;printf("较大数为%d",max);}【案例3-2】输入x,求出并输出x的绝对值。分析:在数学中,正数的绝对值是正数本身,负数的绝对值是其相反数。其算法可以表示如下:(1)输入x;(2)判断x是否小于0,若是,则取反;(3)输出x的绝对值#include<stdio.h>main(){floatx;printf("请输入一个数:");scanf("%f",&x);if(x<0)x=-x;printf("这个数的绝对值是:%f\n",x);}【注意】If后面的表达式一定要有圆括号。【案例3-3】输入3个数a、b、c,要求按由小到大的顺序输出。分析:其算法可以表示如下:(1)先将a与b比较,把小者放入a中,大者放入b中;(2)再将a与c比较,把小者放入a中,大者放入c中,此时a已是三者中最小的;(3)再将b与c比较,把小者放入b中,大者放入c中,此时a、b、c已按由小到大的顺序排列;#include<stdio.h>main(){ floata,b,c,t;printf("请输入需要排序的三个实数:");scanf("%f,%f,%f",&a,&b,&c);if(a>b) {t=a;a=b;b=t;}/*实现a和b的互换*/if(a>c){t=a;a=c;c=t;}/*实现a和c的互换*/if(b>c)

{t=b;b=c;c=t;}/*实现b和c的互换*/printf(“由小到大是:%5.2f,%5.2f,%5.2f",a,b,c);}【注意】if语句表达式为真时,若只处理一条语句,直接书写即可;若处理多条语句,则此时需要用花括号括起来构成复合语句。第二节双分支选择结构一、if-else语句if语句更常用的形式是双分支语句,一般形式如下:if(表达式)

语句1;else

语句2;流程图如图3.5所示。双分支if语句的执行过程是:如果表达式的值为真(非0),则执行语句1;若表达式的值为假(0),执行语句2。语句1和语句2可以是一条语句也可以是多条语句。图3.5双分支选择结构流程图【案例3-4】完善案例3-2。输入x,求出并输出x的绝对值。分析:对任意数x,当x≥0时,它的绝对值为x;当x<0时,它的绝对值为-x。这可以用双分支选择结构解决。#include<stdio.h>main(){floatx,y;printf("请输入一个数:");scanf("%f",&x);if(x<0)y=-x;elsey=x;printf("这个数的绝对值是:%f\n",y);}【说明】if语句和else语句属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。【试一试】仿照案例3-4,用双分支if语句改写案例3-1。【案例3-5】完善案例2-12。输入三角形的边长,求三角形面积。分析:从数学知识可知,构成三角形的必要条件是两边之和大于第3边,因此在计算三角形面积之前应当进行该条件的判断。#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,s,area;printf("pleaseentera,b,c:”);scanf("%lf,%lf,%lf",&a,&b,&c);if(a+b>c&&b+c>a&&c+a>b)/*检查构成三角形的必要条件是否满足*/{s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%6.2f\n",area);}/*大括号内是一个复合语句*/elseprintf("输入错误,三边不能构成三角形!.\n");}【说明】在if和else后面可以只含一个语句,也可以有多个语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。【案例3-6】身高预测。每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。设faHeight为其父身高,moHeight为其母身高,身高预测公式为男性成人时身高=(faHeight+moHeight)×0.54cm女性成人时身高=(faHeight×0.923+moHeight)/2cm此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生饮食习惯,那么可增加身高1.5%。分析:编程从键盘输入用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示良好,输入字符N表示不好),利用给定公式和身高预测方法对身高进行预测。程序如下所示:#include<stdio.h>main(){charsex;sports;diet; floatmyHeight; faHeight;moHeight; printf("Areyouaboy(M)oragirl(F)?"); scanf("%c",&sex);scanf("%c",&sex);printf("Pleaseinputyourfather'sheight(cm):");scanf("%f",&faHeight);printf("Pleaseinputyourmother'sheight(cm):");scanf("%f",&moHeight); printf("Doyoulikesports(Y/N)?"); scanf("%c",&sports); printf("Doyouhaveagoodhabitofdiet(Y/N)?");scanf("%c",&diet); if(sex=='M'||sex=='m') myHeight=(faHeight+moHeight)*0.54; else myHeight=(faHeight*0.923+moHeight)/2.0; if(sports=='Y'||sports=='y')myHeight=myHeight*(1+0.02); if(diet=='Y'||diet=='y')myHeight=myHeight*(1+0.015); printf("Yourfutureheightwillbe%f(cm)\n",myHeight);}【想一想】条件(sex=='M'||sex=='m')的作用?与(sex=='M')有何区别?二、条件运算符与条件表达式C语言中有一种特有的运算符称为条件运算符,即“?:”。它在某种程度上可以起到逻辑判断的作用,一样可以实现双分支选择结构。由条件运算符构成的表达式称为条件表达式,与if-else语句具有相同的功能。其一般形式为:表达式1?表达式2:表达式3其运算规则为:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。【案例3-7】利用条件表达式改写案例3-1,输入两个数,输出其中的大数。#include<stdio.h>main(){inta,b,max;printf("\n请输入第一个整数:");scanf("%d",&a);printf("\n请输入第二个整数:");scanf("%d",&b);max=a>b?a:b;printf("\n较大数为%d",max);}【注意】条件运算符的优先级高于赋值运算符,但低于关系运算符和算术运算符。第三节多分支选择结构C语言中,可以使用嵌套if-else语句和switch语句来实现多分支选择结构。一、嵌套if-else语句前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if…elseif结构,其一般形式为:

if(表达式1)语句1;

elseif(表达式2)语句2;

elseif(表达式3)语句3;

……elseif(表达式n)语句n;

else语句m;流程图如图3.8所示。图3.8多分支选择结构流程图嵌套if-else语句的执行过程是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句m。然后继续执行后续程序。【案例3-8】商场团购促销活动如下:凡买50件以上(含50件)的优惠5%,买100件以上(含100件)的优惠7.5%,买300件以上(含300件)的优惠10%,买500件以上(含500件)的优惠15%。请输入购买的数量和单价,输出应付货款。分析:首先检查所购货物数量是否大于或等于500,如是,则确定折扣为15%,如果不是(即少于500件),再检查是否大于或等于300,如是,则表示在300~499范围内,折扣应为10%,以此类推。而计算公式为:应付货款=件数*单价*(1-优惠折扣)#include<stdio.h>#include<math.h>voidmain(){intnumber;doublecost,price,total;printf("请输入商品数量和单价:");scanf("%d,%lf",&number,&price);/*输入件数和单价*/if(number>=500)cost=0.15;/*嵌套的if语句*/elseif(number>=300)cost=0.10;elseif(number>=100)cost=0.075;elseif(number>=50)cost=0.05;elsecost=0;total=number*price*(1-cost);printf("应付货款=%10.2f\n",total);}【提示】为了使程序结构清晰,便于维护,程序尽量写成锯齿形式,养成写程序的良好习惯。图3.9案例3-8流程【案例3-9】评定学生成绩等级:85分以上为优秀,75分至85分之间为良好,60分至75分之间为及格,60分以下为不及格。请输入学生成绩,输出相应的等级。#include<stdio.h>main(){floatx;printf("请输入学生的成绩:");scanf("%f",&x);if(x>=85)printf("成绩优秀\n");elseif(x>=75)printf("成绩良好\n");elseif(x>=60)printf("成绩及格\n");elseprintf("成绩不及格\n");}【试一试】仿照案例3-8,绘制案例3-9的流程图。二、switch语句用嵌套的if语句可以处理多分支选择,但如果分支较多,则嵌套的if语句层数就多,程序冗长而且可读性降低。C语言提供的switch语句可以直接处理多分支选择,并且switch语句条理清楚,结构明了。其一般形式为:switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;...case常量表达式n:语句n;default:语句n+1;}switch语句的执行过程是:先计算表达式的值,如果值与哪个常量相匹配,就执行哪个case后的语句;如果表达式的值与所有列举的常量都不同,则执行default后的语句。【案例3-10】利用switch语句改写案例3-9。分析:案例3-9也可以用switch语句来实现,使用switch语句要简洁一些。#include<stdio.h>main(){intk;floatx;printf("输入一个百分制成绩:");scanf("%f",&x);if(x<0||x>100) /*判断输入数据的有效性*/{printf("输入的数据无效!\n");exit(0);}/*终止程序*/k=x/10;switch(k){case10:case9:printf("优秀\n");break;case8:printf("良好\n");break;case7:case6:printf("合格\n");break;default:printf("不及格\n");

}}【注意】①case语句和default语句后允许使用语句序列,当要安排多个语句时,不必用花括号括起来。②在switch结构中,每个case对应的语句中都有一条break语句,最后一个分支(default)可以不加break语句。【试一试】将案例3-10中的所有break语句删除,程序结果会改变吗?【案例3-11】编写程序,从键盘输入两个操作数和一个运算符,由计算机输出运算结果。(运算符为:+、-、*、/)分析:这是一个多分支选择的问题,根据运算符的不同,分为四种情况进行处理。#include<stdio.h>#include<math.h>main(){floatdata1,data2; /*定义两个操作符*/charop; /*定义运算符*/printf("请输入算术表达式:\n");scanf("%f%c%f",&data1,&op,&data2); /*输入运算表达式*/switch(op) /*根据输入的运算符确定要执行的运算*/ {case'+':printf("%f+%f=%f\n",data1,data2,data1+data2);break; /*处理加法*/case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);break;/*处理减法*/case'*': printf("%f*%f=%f\n",data1,data2,data1*data2);break;/*处理乘法*/case'/': if(fabs(data2)<=1e-7)/*与实数0比较*/printf("Divisionbyzero!\n"); elseprintf("%f/%f=%f\n",data1,data2,data1/data2);break;/*处理除法*/default:printf("无效操作符!\n"); }}【思考】为什么要用到语句“fabs(data2)<=1e-7”?【试一试】将星期一、星期二……星期六、星期日依次编号为1,2,……,6,7,编一程序从键盘输入星期的序号,则输出其对应的英文。比如,输入1,则输出Monday。第四节项目任务:软件用户界面设计优化【项目案例】“学生成绩管理系统”软件用户界面设计优化分析:结合项目案例任务实现,需对软件主界面和功能进行更加合理的设计。一般在软件开始主菜单界面中会让用户选择执行不同的功能模块,程序应该能够处理功能模块输入错误的情况,使软件初始界面程序更加健壮。可以利用if嵌套语句,多分支语句实现这种功能。其处理流程如下:(1)用户界面显示。显示进入系统的用户界面,用户根据界面的提示选择不同的操作。(2)用户输入功能编号。(3)判断输入功能编号。若选择错误功能编号,输出提示信息并退出系统。否则执行第④步。(4)根据用户所选择的功能编号执行不同的语句块。算法流程图如图3.10所示。图3.10算法流程图程序如下:#include<stdio.h>#include<stdlib.h>/*包含杂项函数及内存分配函数*/main(){charfunc_code;/*存放选择功能模块编号*/

温馨提示

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

评论

0/150

提交评论