计算机软件及应用控制结构和数据文件_第1页
计算机软件及应用控制结构和数据文件_第2页
计算机软件及应用控制结构和数据文件_第3页
计算机软件及应用控制结构和数据文件_第4页
计算机软件及应用控制结构和数据文件_第5页
已阅读5页,还剩243页未读 继续免费阅读

下载本文档

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

文档简介

2023/12/6第3章控制结构和数据文件1

——工作流程描述工作活动的流向顺序,帮助管理者了解实际工作活动,消除工作过程中多余的工作环节、合并同类活动,使工作流程更为经济、合理和简便,从而提高工作效率。2023/12/6第3章控制结构和数据文件2本章概要顺序、选择和循环是结构化程序的三大结构,体现了结构化程序设计的特点。本章着重介绍选择和循环结构程序设计。重点、难点重点:(1)分支语句和循环语句(3)选择及循环结构程序设计难点:(1)多分支语句(2)循环嵌套2023/12/6第3章控制结构和数据文件31、理解自顶向下和结构化程序设计思想2、理解并能构造关系表达式和逻辑表达式3、应用选择结构解决问题,编制程序4、应用循环结构编制程序5、掌握几种常用算法6、应用结构化程序设计方法解决实际问题7、理解并会简单使用从信息文件中读取数据和向信息文件中写入数据的方法本章教学目标2023/12/6第3章控制结构和数据文件4关键词语双语化1.在for-语句里(infor-statement)2.在条件里(incondition)

3.默认(default)4.关系运算符(relationoperator)

5.循环机制(loopingmechanisms)6.if-else语句(if-elsestatement)2023/12/6第3章控制结构和数据文件5本章内容3.1

流程控制概念3.2

流程控制的条件设计3.3

选择结构程序设计3.4

软件开发与项目案例设计

3.5

循环结构程序设计3.6

数据文件2023/12/6第3章控制结构和数据文件6本章项目任务软件界面的进一步优化和简单数据输入输出功能的实现。2023/12/6第3章控制结构和数据文件73.1流程控制概念实际工作流程:反映在完成工作的过程中,不同事件之间的因果和时间关系。工作过程进行中仅有一个事件发生,则没有控制意义。分析和描述工作流程常有五个步骤:目的分析:做什么?为什么做?有必要做?应该做什么?地点分析:合并相关工作活动,在什么地方做某项活动?为何在该处做?可否在别处做?应当在何处做?顺序分析:何时做某事?为何此时做?可否在其它时间做?应当何时做?人员分析:分析人员匹配的合理性,谁做?为何由此人做?可否用其他人做?应当由谁来做?方法分析:目的在于简化操作,如何做?为何这样做?可否用其他方法做?应当用什么方法来做?2023/12/6第3章控制结构和数据文件8实际工作流程设计与控制对应程序设计中的六步法程序流程控制(flowcontrol):反映程序语句执行的流程顺序。流程控制是程序设计的基本工作。常用三种不同的控制结构构造程序语句的执行流程。顺序选择循环流程控制结构主要讲述:条件判断循环控制转移2023/12/6第3章控制结构和数据文件93.2流程控制中的条件(Condition)设计3.2.1

关系运算符与关系表达式3.2.2

逻辑运算符和逻辑表达式3.2.3

控制条件的描述与表示

流程控制是程序的灵魂,流程控制中需要测试控制条件。选择、循环程序结构中常用“关系或逻辑运算”表达式做条件控制条件是能够计算出“真”或“假”的表达式,叫条件表达式条件表达式由关系运算符、逻辑运算符、其它运算符和运算对象构成。2023/12/6第3章控制结构和数据文件103.2.1关系运算符与关系表达式

(TheOperatorandExpressionsofRelations)

程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符由关系运算符将操作数连起来的表达式称为关系表达式。C语言提供了6个关系运算符2023/12/6第3章控制结构和数据文件11关系运算符名称案例含

义>大于x>y若x大于y,结果为真(1);否则结果为假(0)>=大于等于x>=y若x大于等于y,结果为真(1);否则结果为假(0)<小于x<y若x小于y,结果为真(1);否则结果为假(0)<=小于等于x<=y若x小于等于y,结果为真(1);否则结果为假(0)==等于X==y若x等于y,结果为真(1);否则结果为假(0)!=不等于x!=y若x不等于y,结果为真(1);否则结果为假(0)2023/12/6第3章控制结构和数据文件12关系运算符(Therelationaloperatorsare:)<、<=、>、>=(这四个运算符优先级是6级)、==、!=(优先级7级)双目运算符;结合方向:自左向右优先级(precedence):>,>=,<and<=:同一优先级。Theyallhavethesameprecedence.==,!=:同一优先级。比前四个低一级(Justbelowtheminprecedencearetheequalityoperators)总体来说,与其它运算符的关系:Theprecedenceoftherelationaloperator:

算术运算符>关系运算符>赋值(=)>逗号运算符(,)关系表达式的值为逻辑值,也称布尔值。逻辑值只有两个:指定关系式成立时,逻辑结果为真,以1表示;指定关系不成立时,逻辑结果为假,以0表示。例运算符优先级

c>a+b/*c>(a+b)*/a>b!=c/*(a>b)!=c*/a==b<c/*a==(b<c)*/a=b>c/*a=(b>c)*/例inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c/*表达式值1*//*表达式值1*//*表达式值0*//*表达式值0*//*f=0*/2023/12/6第3章控制结构和数据文件13例:

5>2>7>8在C中是允许的,值为0k==j==i+5;

根据运算符的左结合性,先计算k==j,如果该式不成立,其值为0,再计算0==i+5,如果也不成立,则表达式值为0。

关系运算的注意事项:例‘a’>0结果为

‘A’>100结果为10例:#include<stdio.h>voidmain(){floatd=123.45; if(123.45==d)printf("1\n");elseprintf("0\n");}

(1)字符变量以对应的ASCII码参与运算。(2)对于含多个关系运算符的表达式,根据运算符的左结合性计算.(3)注意“==”和“=”的区别。例:#include<stdio.h>#include<math.h>voidmain(){floatd=123.45; if(fabs(123.45-d)<1e-5)printf("1\n");elseprintf("0\n");}fabs()是数学库函数。功能:求浮点数x的绝对值。原型为:externfloatfabs(floatx);

包含在math.h头文件中(4)应避免对实数作相等或不等的判断例inti=1,j=7,a;a=i+(j%4!=0);

则a=2例:

inta=0,b=1;if(a=b)/*赋值,非比较*/printf(“aequaltob”);else

printf(“anotequaltob”);

数学概念:

|a-b|<ε其中,ε为很小的正数,表示a和b之间的误差。可以根据要求进行调节,ε越小,a和b之间的差就越小。若该式成立,则认为a与b之间误差不超过ε,近似相等;否则认为a和b不相等。2023/12/6第3章控制结构和数据文件143.2.2逻辑运算符与逻辑表达式

(TheOperatorandExpressionsofLogic)C语言中有3个逻辑运算符:&&(逻辑与,并且)||(逻辑或,或者)!(逻辑非,取反)“!”为单目运算符,“&&”和“||”为双目运算符。优先级顺序:!>&&>||“!”的优先级高于算术运算符,右结合性。“&&”和“||”的优先级低于关系运算符,左结合性。2023/12/6第3章控制结构和数据文件15逻辑运算结果也为逻辑值。例:若,a=4;b=5;则(1)!a(2)a&&b(3)a||b(4)!a||b(5)4&&0||2(6)5>3&&2||8<4-!0(7)‘c’&&‘d’值为1值为1值为1值为1值为0

//(5>3)&&2||(8<(4-(!0)))值为1值为12023/12/6第3章控制结构和数据文件16例

a<=x&&x<=b

a>b&&x>ya==b||x==ya>b||!a

/*(a<=x)&&(x<=b)*//*(a>b)&&(x>y)*//*(a==b)||(x==y)*//*||*/(!a)(a>b)只提倡用关系运算符和逻辑运算符构成的表达式表示逻辑值,不提倡使用赋值语句以及算术运算符组成的表达式。2023/12/6第3章控制结构和数据文件17短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符例:

intx=3,y=0,z=6;!x&&(y+1)&&(z+=2)解答:

表达式!x的值为0,整个表达式即为假,则表达式y+1和z+=2不再计算。这样z值没有被修改。2023/12/6第3章控制结构和数据文件18例:判断变量a的值是否在12到30之间。数学表达式写为:12<a<30

若把这样的表达式放在程序里,编译通过。但在运行时会出问题。首先进行12<a的判断,无论结果为真(1)或假(0),1<30或0<30永远成立。由此看来这种写法在程序中肯定是错的。正确的写法应该是:(12<a)&&(a<30)/*如果变量a的值大于12并且小于30*/注意区分C语言的关系表达式与数学上的比较运算表达式,并将数学上的比较运算转化为合法的C关系表达式。2023/12/6第3章控制结构和数据文件19例如:x>1&&x<100

/*判断x值是否介于1和100之间,或位于数轴中的开区间*/x>=1&&x<=100

/*判断x值是否介于1和100之间,位于数轴中间的闭区间*/x<1||x>=100

/*判断x值是否小于1或大于等于100,位于数轴的两端*/x>=0||y>=0

/*判断x和y值是否都大于等于0,或位于第一象限含数轴*/x+y>z&&x+z>y&&y+z>x

/*可用于判断三个数是否满足构成三角形的条件*/ch>='A'&&ch<=’Z’

/*用于判断变量ch是否为大写字母*/。2023/12/6第3章控制结构和数据文件203.2.3控制条件的描述与表示常见的控制条件有如下几种形式:(1)关系表达式:例,a>ba==0a!=0等

expression!=0等价于expressionexpression==0等价于!expression(2)逻辑表达式:例,a>b&&c>d

等(3)算术表达式:例,a1等1、对于简单的表示比较的条件,利用关系运算符就可以轻松构造。例如:表示“学生的语文成绩在90分以上”这样一个条件使用关系表达式:chinese>90表示“数学在95分以下”使用表达式:math<95一个数为奇数的条件表达式为n%2!=02、如果要表示比较复杂的条件,则可以使用逻辑运算符将多个关系表达式组合起来,从而构成复杂的条件。例如:表示“学生的语文成绩在90分以上并且数学在95分以下”使用表达式:chinese>90&&math<95判断变量ch是否是大写字母的表达式为ch>=‘A’&&ch<=‘Z’3、对于更复杂的条件,可以使用“()”和逻辑、关系运算符构造条件表达式。常见的构造条件表达式的方法:2023/12/6第3章控制结构和数据文件21分析:根据数学知识,闰年年份满足的条件为:如果年份能被4整除但不能被100整除,是闰年;年份能被400整除,也是闰年。例:设整型变量year表示年份,构造一个条件表达式,当year值为闰年时该条件表达式为“真”,否则为“假”。所以,判断闰年的条件表达式为下列二者之一:①year%4==0&&year%100!=0②year%400==0表达式①②的或运算完整地表示判断闰年的条件:

(year%4==0&&year%100!=0)||year%400==0

等价表示:year%4==0&&year%100!=0||year%400==0或year%4==0&&year%100||year%400==0或!(year%4)&&year%100||!(year%400)2023/12/6第3章控制结构和数据文件223.3选择结构(SelectionStructure)程序设计3.3.1

选择结构语句(ConditionalStatements)3.3.2

选择结构的嵌套(Nest)3.3.3switch语句、break语句和goto语句选择结构分为:单分支:if双分支:if-else多分支:if-else-if、swtitch2023/12/6第3章控制结构和数据文件233.3.1选择结构语句(ConditionalStatements)3-xx≤0y=2/xx>0分析:自然语言描述算法如下(1)输入x;(2)如果x<=0则y=3-x; 否则y=2/x;(3)输出y的值。定义变量y,x用户输入xX<=0Ty=3-xFy=2/x输出y引例1:计算分段函数2023/12/6第3章控制结构和数据文件24

引例2:学生查分时,应输出查询成绩。并只对分数高于85分的学生表示庆贺。定义变量y从文件读取数据yy>=85TF输出”祝贺你!”输出y

根据“条件表达式”的值选择不同的程序分支执行。分支流程控制用if语句(TheifStatement)实现。结论:2023/12/6第3章控制结构和数据文件25if语句的基本语句形式if单分支if-else双分支单分支语句格式:

if(condition)statement

双分支语句格式:if(condition)statement1

elsestatement2说明:condition是控制条件表达式,圆括号“()”必不可少;例,ifb==aarea=a*a;/*错,缺少条件括号*/语法上,内嵌statement是一条语句。内嵌statement有多条语句时,用复合语句内嵌statement又是if分支语句时,构成分支嵌套结构。C标准规定,编译程序必须能支持至少15层分支嵌套。内嵌语句可以是:赋值语句函数调用语句控制语句复合语句空语句2023/12/6第3章控制结构和数据文件26if(condition)if条件结构\控制流程\语句statement

条件TFstatementif(condition)条件Fstatement1statement2elsestatement2statement1T2023/12/6第3章控制结构和数据文件27【例3-1】把大写字母转换为对应小写字母

。分析:(1)问题背景:使用QQ、邮箱等软件时经常要输入用户名和密码。对用户而言,输入的用户名可不区分大小写需要把输入的字母转换为相应的小(大)写字母再与系统内容(全大写或小写)进行判断比较。(2)需求分析:从键盘输入一个字符,若是大写字母,输出其对应的小写字母。否则其它字符直接输出(3)数学建模:小写字母的ASCII码值=大写字母的ASCII码值+32。算法NS流程图描述

定义char型变量:chch=ch+32;输出ch;

输入字符ch;ch>=’A’&&ch<=’Z’TF#include<stdio.h>voidmain(){charch;printf("请输入一个字符:\n");ch=getchar();printf("输入的原始字符为%c:\n",ch);if(ch>='A'&&ch<='Z')ch=ch+32;printf(“转换后的字符为%c:\n”,ch);}编码

【例3-3】用“假设思想”法求任意两数中的较大数。(必记算法)分析:假设思想:先假设某事物成立或不成立,然后判断事实是否如此,如果事实和假设条件不符,则对假设进行修正。

设有变量x、y、max;

假设较大的数是max=x;然后反假设证之:如果max<y条件成立,则假设错误,修改语句:max=y;否则假设正确。输出总是大数的max值定义变量x,y,max;max=y;输出max;输入x,y;假设max=x;max<yTF#include<stdio.h>voidmain(void){intx,y,max; printf("请输入两个实数:"); scanf("%d%d",&x,&y);

max=x;

if(max<y)max=y;

printf("两数中较大的数为%d\n",max);}定义变量x,y,max;max=y;输出max;输入x,y;假设max=x;max<yTF求三个数或更多数中的最大数或最小数都可以使用该算法。

求三个数中的最小数,程序如下:

#include<stdio.h>voidmain(void){floatx,y,z,min; /*定义x、y、z三个变量*/printf("请输入三个实数:"); /*提示信息*/scanf("%f%f%f",&x,&y,&z); /*输入数据*/

min=x;/*假设x的值较大*/if(min>y)min=y; /*假设若不成立则max值修正为y*/

if(min>z)min=z;printf("三数中较小的数为%10.4f\n",min);}算法1:双分支语句floatx,y,max;if(x>y)max=x;elsemax=y;输出max;双分支语句求两数中的较大数算法2:双分支语句floatx,y;if(x>y)输出x;else

输出y;算法3:双分支语句floatx,y,max,min;if(x>y)max=x,min=y;elsemax=y,min=x;输出max,min;算法4:单分支语句floatx,y,max;max=x;ifmax<ymax=y;输出max;双分支单分支应用:数据排序。将x、y中的数据按降序排列。算法分析:“假设思想”1、定义变量x,y,t2、假设x、y已按降序排列,输出x、y。3、若x,y是升序,则交换两个变量中的值(两两交换)4、输出x,y。#include<stdio.h>voidmain(void){intx,y,t;printf("Enterx,y:");scanf("%d,%d",&x,&y);if(x<y)

{

t=x;x=y;y=t;

}

/*两两交换*/

printf("%d,%d\n",x,y);}定义变量x,y,t;x<yTFt=x,x=y,y=t;输出x,y#include<stdio.h>voidmain(void){intx,y;printf("Enterx,y:");scanf("%d,%d",&x,&y);if(x<y)

{intt

t=x;x=y;y=t;

}

/*两两交换*/

printf("%d,%d\n",x,y);}【例3-4】数学中有许多有趣的数,如水仙花数、完数等。水仙花数是一个三位数,其各位数字的立方和恰等于这个数。例如153,13+53+33=153。编写程序,从键盘上输入一个三位的整数,判断其是否为水仙花数。分析:(1)问题描述:判断一个三位整数num是否为水仙花数(2)数学建模和流程:分解num的每一位数字:ge=num%10 /*个位*/bai=num/100 /*百位*/shi=num/10%10; /*十位*/若num==bai*bai*bai+shi*shi*shi+ge*ge*ge,则num为水仙花数,否则不是。定义变量num,ge,shi,bai;输出yes输入一个三位数num;从num分解ge,shi,bai输出no#include<stdio.h>voidmain(void){intnum,bai,shi,ge;printf("请输入一个三位的整数:");scanf("%d",&num);bai=num/100;shi=num/10%10;ge=num%10;if(num==bai*bai*bai+shi*shi*shi+ge*ge*ge)printf("%d是水仙花数。",num);elseprintf("%d不是水仙花数。",num);}是水仙花数?TF2023/12/6第3章控制结构和数据文件372、条件运算符和条件表达式条件运算符是C语言中唯一的三目运算符,由“?”和“:”组成。条件表达式的一般形式为: 表达式1?

表达式2:

表达式3

说明:表达式1一般是控制条件表达式2和表达式3可以是C语言中任意合法的表达式,一般这两个表达式的值类型相同。2023/12/6第3章控制结构和数据文件38功能:首先计算表达式1(条件)的逻辑值如结果为真,则计算表达式2的值,并将表达式2的值作为整个条件表达式的值;如结果为假,则计算表达式3的值,并将表达式3的值作为整个条件表达式的值。条件运算符可看作以下if语句的缩略形式:

if(表达式1)条件表达式的值=表达式2的值

else

条件表达式的值=表达式3的值例,求两数中的较大数:max=(x>y?x:y)条件运算符的优先级低于逻辑运算符,高于赋值操作符,自右向左结合。

2023/12/6第3章控制结构和数据文件39【例3-5】从键盘输入一个数,判断其是奇数还是偶数。#include<stdio.h>voidmain(void){intx;printf("x=?");scanf("%d",&x);x%2?printf("%d是奇数!\n",x):printf("%d是偶数!\n",x);}2023/12/6第3章控制结构和数据文件40

趣味例题:编写一个程序统计某物品的数量,统计结束后将物品数量存储在变量nItems中并报告用户。

把结果报告给用户最直接的方法是调用printf函数:

printf(“%ditemsfound.”,nItems);

但假如遇到一个语言学者,而nItems的值又恰巧为1时,看到这个输出可能会让他很不满意:

1itemsfound./*

*/

因为其中复数形式的items应该是单数形式的。可以这样用条件运算符实现:

printf(“%ditem%cfound.”,nItems,nItems>1?’s’:’’);

提示:如果使用“?:”运算符代替复杂的if语句来处理一些小的细节,那它将大大简化程序的结构。2023/12/6第3章控制结构和数据文件413.3.2选择结构的嵌套(

Nestedifstatement)一个基本的if语句可以用作另一个if语句的分支语句,构成嵌套选择结构。

即statement部分又是分支语句时,称为分支嵌套。

C标准规定,编译程序必须能支持至少15层分支嵌套。

2023/12/6第3章控制结构和数据文件42if语句嵌套的形式如下:(1)单if语句的嵌套形式

if

(表达式)if语句内嵌语句,可以是各种形式的if语句(2)双分支if语句的嵌套形式

if(表达式)

if语句

else

if语句

内嵌语句,如果是复杂的if语句,请用“{}”括起1、分支语句嵌套2023/12/6第3章控制结构和数据文件43例如:①if(c<=100)/*内嵌语句是单分支if语句,单分支嵌套单分支*/if(c>=50)printf("50<=c<=100\n");②if(c<=100) /*内嵌语句是双分支if语句,单分支嵌套双分支*/if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n")③if(num1>num2)/*双分支内嵌双分支,求三个数中的最大值*/if(num1>num3)max=num1; /*双分支内嵌双分支*/elsemax=num3elseif(num2>num3)max=num2; /*双分支内嵌双分支*/elsemax=num32023/12/6第3章控制结构和数据文件44例,单分支的statement是一个双分支选择语句。if(a==1)if(b==2)printf(“***\n”);elseprintf(“###\n”);else与if配对问题:if语句中出现多个“if”与“else”时,要注意它们之间的匹配关系,否则可能导致逻辑错误。

书写形式不能改变句法规则,不能决定else的配对问题。else与if的匹配原则是:一个else应与其之前距离最近且没有与其它else配对的if配对等价书写形式:if(a==1)if(b==2)printf(“***\n”);elseprintf(“###\n”);if(a==1)

if(b==2)printf(“***\n”);elseprintf(“###\n”);2023/12/6第3章控制结构和数据文件45

例:(else匹配问题)⑴if(c<=100)

if(c>=50)printf("50<=c<=100\n");⑵if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n");else

if(c<=150)printf("100<c<=150\n");elseprintf("c>150\n");⑶if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n")与哪个if配对?与哪个if配对?与哪个if配对?与哪个if配对?⑴if(c<=100)

if(c>=50)printf("50<=c<=100\n");⑵if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n");else

if(c<=150)printf("100<c<=150\n");elseprintf("c>150\n");⑶if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n")2023/12/6第3章控制结构和数据文件46

【例3-6】编程实现,判断某数是否能被k整除。算法分析:1、问题背景:任何数除以零的值是无穷大,计算机无法存储,产生一个数据溢出错误并终止程序的执行。为了防止程序被0除而终止,必须保证除数不为零。

2、算法描述:定义并输入数据a,k;如果除数k!=0

则继续判断a/k,若结果为0,能整除。否则不能整除

#include"stdio.h"voidmain(){inta,k;scanf("%d%d",&a,&k);if(k)/*确保k非零的情况下执行a/k运算*/

if(a%k==0)printf("%d/%dyes\n",a,k);else

printf("%d/%dno\n",a,k);}单分支嵌套双分支if(k)是if(k!=0)常用的等价写法x+5x≤1

y=

2x1<x<103/(x-10)x>10【例3-7】实际问题或数学中有许多分段函数。有分段函数如下,编程求其值。分析:(1)问题描述:分支嵌套语句的典型应用是求解分段函数。本分段函数可用多种方法观察图形。从左往右(或从右往左)看数轴,分段函数若以第一个点分界,把数轴分为“x≤1”和“x>1”两部分;其中“x>1”再从左往右,又分成三种情况1<x<10x>10x!=100110注意:多分段函数中的断点。(2)需求分析:输入x的值,根据x的值计算并输出y的值。

y=2*xintx,y;输出yx>1TF输入x;x<10TFy=3/(x-10)y=x+5;X>10TFX无定义#include"stdio.h"voidmain(void){intx,y;printf("请输入数据x:");scanf("%d",&x);

if(x>1)/*嵌套双分支*/if(x<10)y=2*x;/*1<x<10*/elseif(x>10)y=3/(x-10); /*x>10*/elseprintf("x无定义。\n"); /*x=10无定义*/

elsey=x+5; /*x≤1*/printf("x=%d,y=%d\n",x,y);}使用分支嵌套结构编写程序如下提倡缩格书写(indentation)有利于阅读程序2023/12/6第3章控制结构和数据文件512、多分支语句if-else-if(重点)

多分支选择结构:根据条件k(k1、k2、...、kn)的逻辑结果,执行语句体1、2、...、n、n+1之一。条件1语句体1Y条件2NY语句体2条件3N语句体3Y语句体n+1N条件n语句体nYN2023/12/6第3章控制结构和数据文件52语句功能:首先计算条件表达式1的值,如为真,执行子句1;否则,若条件表达式2为真,执行子句2;…;以此类推,若条件表达式n真,执行子句n;若有语句n+1,则执行语句n+1。所有条件均不成立,则结束if-else-if语句,执行其下一条语句。多分支if-else-if语句的一般格式if(条件1) 语句体1;elseif(条件2) 语句体2;

elseif(条件3) 语句体3;

...elseif(条件n) 语句体n;

else 语句体n+1;2023/12/6第3章控制结构和数据文件53特征多分支选择语句只能选择执行多个子句中的一个子句,所以也叫多选一分支选择语句。多分支选择语句中,每个分支有不同的条件表达式,可以有任意个else子句。也叫级联if语句(cascadingifstatement)只在else分支嵌套if-else语句。语法上,if-else-if结构是一条语句。它是双分支语句的嵌套扩充。2023/12/6第3章控制结构和数据文件54【例3-9】某些应用中常需要判断键盘输入的字符类型。试编程实现。分析:

设字符类型数据分为:数字字符大写字母小写字母其它字符输入一个字符,输出该字符的类型。

charch;输入ch;Tch>=’0’&&ch<=’9’F数字Tch>=’A’&&ch<=’Z’F字符

;大写

ch>=’a’&&ch<=’z’

字母;T F

小写 其它字符; 字母

;#include<stdio.h>voidmain(){charch;printf("请输入一个字符");ch=getchar();

if(ch>=’0’&&ch<=’9’) printf("这是一个数字字符。\n");

else

if(ch>=’A’&&ch<=’Z’) printf("这是一个大写字母。\n");

else

if(ch>=’a’&&ch<=’z’) printf("这是一个小写字母。\n");

elseprintf("是其它字符。\n");}2023/12/6第3章控制结构和数据文件57【例3-10】多分支的典型应用。用if-else-if语句编程计算分段函数的值。分析:数学基础:分段函数的自变量取值范围一般是整个数轴或数轴某部分。分段函数将数轴分成几段,在各段应用不同的公式计算函数的值。y=x2+2x+1x<-12x+sin(x)-1≤x≤1x3-1x>1

-1012023/12/6第3章控制结构和数据文件58在数轴上从左向右(或从右向左)逐个分析各分段点并产生分支。若x<-1为真,应用公式x2+2x+1;(分支一)否则,若x<=1,若为真,应用公式2x+sin(x);(分支二)否则应用公式x3-1计算函数的值。(分支三)2023/12/6第3章控制结构和数据文件59定义变量x,y输入xx<-1Tx<=1Ty=2x+sin(x)y=x3-1输出yFFy=x2+2x+1提示:对于类似可以映象到数轴上的有序问题,均可用if-else-if语句来设计编程。2023/12/6第3章控制结构和数据文件60程序如下:#include"stdio.h"#include"math.h"voidmain(){doublex,y;printf("enterx:");

scanf("%lf",&x);

if(x<-1)y=x*x+2*x+1;

else

if(x<=1)y=2*x+sin(x);

elsey=x*x*x-1;printf("x=%.2f,y=%.2f",x,y);}2023/12/6第3章控制结构和数据文件61【学生项目案例3-1】从键盘任意输入一个百分制考试成绩,判断该成绩的等级。——新编项目功能代码分析:

对于考试成绩等级的划分,可在数轴上分段划分如下:

为保证程序的健壮性,应进行数据的有效性检查。及格中良优无效数据无效数据060708090100不及格2023/12/6第3章控制结构和数据文件62定义变量score输入scorescore>100||score<0score>=90输出优score>=80数据有错输出良score>=70输出中score>=60及格不及格TTTTTFFFFF2023/12/6第3章控制结构和数据文件63编写程序代码如下:#include<stdio.h>voidmain(void){ floatscore;printf("请输入成绩:");scanf("%f",&score);/*从键盘输入考试成绩*/

if(score<0||score>100)printf("成绩输入错误!\n");/*有效性检查*/

else

if(score>=90)printf("%4.1fisA\n",score);

else

if(score>=80)printf("%4.1fisB\n",score);

elseif(score>=70)printf("%4.1fisC\n",score);

else

if(score>=60)printf("%4.1fisD\n",score);

elseprintf("%4.1fisE\n",score);}if-else-if语句结构易使程序冗长不清晰,降低程序的可读性2023/12/6第3章控制结构和数据文件64例【3-11】玩牌游戏。本游戏中,每一组牌用数字1~13代表;当要显示这些牌时,2~10可以直接显示数字,但1、11、12、13应该用Ace、Jack、Queen和King来表示。分析:

(1)问题描述:根据不同的牌面显示不同的结果。设牌面值用变量cardnum表示

(2)处理流程:

3.3.3switch语句和break语句2023/12/6第3章控制结构和数据文件65定义牌面变量x输入xx==1输出AceTF方法流程一:单分支语句

……x==2输出2TF

x==3输出3TF

x==11输出JackTF

x==12输出QueenTF

x==13输出KingTF

2023/12/6第3章控制结构和数据文件66定义牌面变量x输入xx==1输出AceTF方法流程二:多分支语句

x==2

输出2TFx==3T输出3F……….下一语句2023/12/6第3章控制结构和数据文件67牌面变量1显示Ace2显示23显示34显示411显示Jack12显示Queen13显示King下一条语句2023/12/6第3章控制结构和数据文件68单分支语句实现:……if(cardnum==1)printf(“Ace\n”);if(cardnum==2)printf(“2\n”);…if(cardnum==11)printf(“Jack\n”);if(cardnum==12)printf(“Queen\n”);if(cardnum==13)printf(“King\n”);……

特点:每个单分支语句都要判断一次

多分支if-else-if语句实现:

if(cardnum==1)printf(“Ace\n”);else

if(cardnum==2)printf(“2\n”);

else………

else

if(cardnum==11)printf(“Jack\n”);

elseif(cardnum==12)printf(“Queen\n”);else

if(cardnum==13)printf(“King\n”);

特点:虽然判断的次数有所减少,但最坏情况下,还是要判断到最后且结构复杂。

2023/12/6第3章控制结构和数据文件691、switch语句选择结构switch语句是if-else-if语句的推广使用形式,又叫开关结构语句,它根据同一个表达式的多个不同取值执行不同的分支语句。特点:实现选择分支较多的复杂判断结构一般有两个以上的可选项各选项分支条件取值可表示为不同的整型量各选项条件可用同一个表达式表示2023/12/6第3章控制结构和数据文件70switch语句的一般格式如下:switch(expression){case

c1:statement1;

case

c2:statement2;

case

c3:statement3;……

case

cn:statementn;

default:statementn+1;}break;break;break;break;break;常量表达式开关表达式:可有多个不同结果

圆括号是必须的

2、功能:(1)计算expression的值,依次与各常量表达式的结果比较,等于第i个值时,顺序执行statementi、statementi+1、…、statementn+1子句。(2)若与所有常量表达式值都不相等,执行default语句序列n+1。(3)每个子句可以有break选取项2023/12/6第3章控制结构和数据文件71(1)break语句结束它所在的switch语句,终止该switch语句的执行,所以也叫终止语句。

switch语句本身并没有包括break语句。switch子句中如果没有break语句,程序将在执行完所选case子句后顺序执行紧随其后的子句。这种设计在某些情况下是有用的,但它解决的问题远比不上它所带来的麻烦。(2)开关expression的值应为有序类型,如整型、字符型和枚举类型等。(3)case子句和default子句组成switct语句的主体,statement子句可以为空。(4)常量表达式值互不相同且是expression可能的取值(5)default子句是可选项。注意:switch语句本意switch语句的执行过程:值1语句组1下一条语句switch表达式值2值3…

值ndeauflt语句组2语句组3…语句组n语句组n+1值1语句组1加入break语句的switch语句switch表达式值1语句组1下一条语句break值2语句组2break值3语句组3break……break值n语句组nbreakdeauflt语句组n+1break

设cardnum为牌变量;case1、11、12、13分四种不同情况;其它2~10号情况规律相同,作为default类情况处理,用printf(“%d”,cardnum)语句实现输出。程序段如下:#include<stdio.h>

voidmain(void){intcardnum; printf("Whatistherankofthecard(1-13)?");scanf("%d",&cardnum);switch(cardnum){ case1:printf("Ace\n");break; case11:printf("Jack\n");break; case12:printf("Queen\n");break; case13:printf("King\n");break;

default:printf("%d\n",cardnum);break;}}

2023/12/6第3章控制结构和数据文件75【趣味例题2】有些网页会向用户提示今天的日期或其它有趣的内容。编程模拟实现网页上每天星期几对应语句的显示。请学习者模拟上题分析。程序如下。#include<stdio.h>voidmain(){intd;printf("请输入今天星期几:");scanf("%d",&d); /*可利用标准函数从计算机系统直接获取*/switch(d) /*开关表达式,*/{case5:printf("总算熬到星期五了哈\n");break; case6:printf("哈哈,周末啦!\n");break; case0:printf("明天又要上班,想想就烦。\n");break; default:printf("每个工作日慢得都象蜗牛爬啊!\n");break;}2023/12/6第3章控制结构和数据文件76【学生项目案例3-2】用switch语句实现判断百分制考试成绩的等级。——进化【学生项目案例3-1】分析:1.问题背景:“学生信息管理系统”的“成绩管理子系统”中查询学生成绩时,一般输入学号进行查询。查询出学生成绩后,系统判断成绩等级并报告结果。2.数学模型:

switch语句的开关表达式值的类型必须是可列举的。学生成绩理论上可列举,但数据太多不可行。2023/12/6第3章控制结构和数据文件77

缩小数据范围法。设学生成绩score为实型数据。将数据范围缩小到0~10的整数范围:(1)实型显式转换为整型;(2)用10取整转为1至2位的十进制整型;缩小数据的数学表达式为(int)score/10。5,4,3,2,1,067810,9(int)score/1059~069~6079~7089~80100~90(int)score59.0~069.0~60.079.0~70.089.0~80.0100.0~90.0floatscore分数值范围2023/12/6第3章控制结构和数据文件783.算法分析:编制自定义函数:函数首部:cjpd1()功能:判断成绩等级并报告结果定义一个临时主函数main(),调用cjpd1()函数。2023/12/6第3章控制结构和数据文件79cjpd1()函数主函数main()调用函数cjpd1();floatscore;输入学生成绩score;Tscore<0||score>100F

(int)score/10提示输入10、9876其它值成绩default:错误;输出输出输出输出输出’A’’B’’C’’D’’E’break;break;break;break;break;程序代码如下:#include"stdio.h"voidcjpd1()/*cjpd()自定义函数的定义*/{floatscore;printf("请输入学生成绩:");scanf("%f",&score);if(score<0||score>100)printf("输入成绩错误!\n");/*成绩有效性判断*/elseswitch((int)score/10) /*数据转换*/{case10: /*case子句可以为空*/case9:printf("A\n");break;/*case10和9对应同一语句序列*/case8:printf("B\n");break;case7:printf("C\n");break;case6:printf("D\n");break;default:printf("E\n");break;/*其它均为不及格*/}}voidmain()/*临时主函数的定义*/{cjpd1();/*函数调用*/}2023/12/6第3章控制结构和数据文件812023/12/6第3章控制结构和数据文件822、嵌套的switch语句分析如下程序段执行结果:intx=1,y=0;switch(x){case1:switch(y){case0:printf("**1**\n");break;case1:printf("**2**\n");break;

case2:printf("**3**\n")}break;/*插入该语句后结果如何*/2023/12/6第3章控制结构和数据文件833.4软件开发与项目案例设计3.4.1软件项目及其开发过程3.4.2项目案例设计2023/12/6第3章控制结构和数据文件843.4.1软件项目及其开发过程1.软件项目软件项目是完成特定目的、符合用户特定需求的软件所需的组织结构、过程和规范的集合。软件项目可以是一个单独的开发项目,也可以与产品项目组成一个完整的软件产品项目。若是订单开发,成立软件项目组即可;若是产品开发,需成立软件项目和产品项目组(负责市场调研和销售),组成软件产品项目组。公司实行项目管理时,首先要成立项目管理委员会,项目管理委员会下设项目管理小组、项目评审小组和软件产品项目组。实施软件项目需要周密部署,合理的规章制度,符合项目的软件开发过程,良好的项目管理以及人员安排等。2023/12/6第3章控制结构和数据文件852.软件开发从软件工程角度,软件开发主要分为六个阶段:需求分析阶段、概要设计阶段、详细设计阶段、编码阶段、测试阶段、安装及维护阶段。

软件开发需遵循七条基本原则。它们是:(1)用分阶段的生命周期计划严格管理;(2)坚持进行阶段评审;(3)实行严格的产品控制;(4)采用现代程序设计技术;(5)结果应能够清楚地审查;(6)开发小组地人员应该少而精;(7)承认不断改进软件工程实践的必要性。软件开发面临的问题:有限的时间、资金内,要满足不断增长的软件产品质量要求;开发的环境日益复杂,代码共享日益困难,需跨越的平台增多;程序的规模越来越大;软件的重用性需要提高;软件的维护越来越困难。2023/12/6第3章控制结构和数据文件863.软件项目管理与人员组织软件项目管理的目的是为了让软件项目尤其是大型项目的整个软件生命周期(从分析、设计、编码到测试、维护全过程)都能在管理者的控制之下,以预定成本按期,按质的完成软件交付用户使用。主要包括如下几个方面:人员的组织与管理,软件度量,软件项目计划,风险管理,软件质量保证,软件过程能力评估,软件配置管理等。

合理配置人员,根据项目工作量、所需专业技能,再参考各个人员的能力、性格、经验,组织一个高效、和谐的开发小组。一般一个开发小组人数在5到10人之间最为合适,如果项目规模很大,可以采取层级式结构,配置若干个这样的开发小组。不是一群高水平的程序员在一起就一定可以组成一个成功的小组。与同事沟通融洽的程序员很重要。2023/12/6第3章控制结构和数据文件874.软件开发流程很多项目都是小型项目,参与人员少(2到5人),需快速交付(一两个月)。项目人员配置一般有:一个项目经理,一到四位开发人员。项目经理负责需求分析,主持设计评审,决定设计评审是否通过,决定是否可进入交叉测试决定是否可发布项目。开发人员负责系统设计,开发和自测,交叉测试,修改Bug,编写部署手册和使用说明。要成功完成项目,除了使用成熟且被团队成员熟练使用的技术之外,有一个良好的开发流程,也是很必要的。小型软件项目开发流程项目立项结束需求分析软件需求规格说明书系统设计(业务流程、界面、数据库)设计文档设计评审评审记录通过开发&自测代码开发人员交叉测试Bug列表发布部署说明手册2023/12/6第3章

温馨提示

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

评论

0/150

提交评论