第3章结构化程序与流程控制_第1页
第3章结构化程序与流程控制_第2页
第3章结构化程序与流程控制_第3页
第3章结构化程序与流程控制_第4页
第3章结构化程序与流程控制_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第三

章结构化程序与流程控制目录3.1基本语句3.2关系运算符和关系表达式3.3逻辑运算符和逻辑表达式3.4分支程序设计3.5循环程序设计3.1基本语句(Statements)控制语句表达式语句函数调用语句空语句复合语句控制语句完成一定的控制功能C语言的9种控制语句if-elsewhilecontinueswitchreturnfordo-whilebreakgoto表达式语句形式expression;表达式最后加一个分号举例a=3; /*赋值语句*/z=x*y,z++; /*一条语句*/x-y; /*语句,但无实际意义*/i++; /*语句*/i++ /*表达式,不是语句*/函数调用语句形式function(arguments);函数调用后加一个分号函数调用语句可以看作一种表达式语句举例printf("%d",i);getchar();myfun(a,b);//自定义函数#include<stdio.h>intmax(intx,inty);//自定义函数intmain()/*主函数,程序从这里开始执行*/{ inta,b,c; printf("请输入两个整数:(两数以半角逗号分隔)"); scanf("%d,%d",&a,&b);/*标准输入函数*/ c=max(a,b);/*调用max()函数*/ printf("%d,%d中的大数为:%d\n\n\n",a,b,c);/*标准输出函数*/

return0;}intmax(intx,inty)/*自定义max()函数,求两个数中的大数*/{ intz; if(x>y)z=x;elsez=y; return(z);/*返回函数值*/}从键盘任意输入两个数,输出其中的大数。函数调用函数声明函数定义空语句形式;只有一个分号用法作为转向点作为循环语句中的循环体举例for(i=1;i<=100;i++)sum+=i;for(i=1;i<=100;sum+=i++);复合语句(块语句,Block)形式{statements}用{}把若干条语句组合成为一个复合语句{}内可以没有任何语句,可以只有一条语句,也可以有多条语句可以包括复合语句、空语句、控制语句等用法一个复合语句当作一条语句来使用需要把多条语句放在只允许一条语句的场合复合语句举例intx,y,t;if(x>y){ /*复合语句开始*/t=x;x=y;y=t;} /*复合语句结束*/printf("%d,%d",x,y);C语言语句使用说明除复合语句外,语句都以分号;作为结束语句书写格式比较自由,确定语句结束的唯一标准是分号(;)注意区分表达式和表达式语句,它们的用法不同举例,if((a=b)>0)t=a;错例,if((a=b;)>0)t=a;举例,if(x>y){x--;y++;}错例,if(x>y){x--;y++}3.2关系运算符(RelationalOperators)运算符名称举例优先级(算术运算符)<小于i<100高<=小于等于a<=MAX>大于f>3.14>=大于等于c>='a'==等于a==b低!=不等于x!=0(赋值运算符)3.2关系表达式用关系运算符将两个表达式连接起来a+b>c+d,(a=3)>x注意区分等于(==)和赋值运算符(=)a=b,a==b关系表达式的值是逻辑值—“真”或“假”C语言用整型表示逻辑值,“真”—1、“假”—0举例,

a=3,b=2,c=1; d=a>b; /*d=1*/ f=a>b>c; /*f=(a>b)>c=0*/3.3逻辑运算符(LogicalOperators)运算符名称举例优先级!逻辑非!(a>b)(算术运算符)(关系运算符)&&逻辑与(x>y)&&(y>z)||逻辑或(x>3)||(x<-3)(赋值运算符)逻辑运算规则!a若a为“真”,!a为“假”若a为“假”,!a为“真”a&&b若a、b都为“真”,则a&&b为“真”若a、b不全为“真”,则a&&b为“假”a||b若a、b都为“假”,则a||b为“假”若a、b不全为“假”,则a||b为“真”3.3逻辑表达式逻辑运算符把逻辑量或表达式连接起来(y%4==0&&y%100!=0)||(y%400==0)逻辑表达式的值是逻辑值用整型表示逻辑值“真”

1,“假”0把一个表达式的值作为逻辑值使用非零“真”,零

“假”这里的非零与零,包括整型、浮点型等逻辑表达式举例inti=3;charc='a';floatf=0.0;i==0;!i; /*两者逻辑值相同*/i!=0;i; /*两者逻辑值相同*/c&&!f; /*“真”*/i&&1.23||f;/*“真”*/c&&4&&f; /*“假”*/逻辑表达式求值特点逻辑表达式中的运算符,只有会影响表达式求值时,才会执行a&&b&&c若a为“假”,则不再判断b和ca||b||c若a为“真”,则不再判断b和c举例,(m=a>b)&&(n=c>d)DeMorgan定理!(a&&b) (!a)||(!b)!(a||b) (!a)&&(!b)!((a&&b)||c) (!a||!b)&&!c注意短路现象:要表示x在a,b之间,C语言中用(x>0)&&(x<10)表示。0<x<10在C语言中是错误的,得不到所要的结果。3.4分支程序设计if语句条件运算符?:switch语句分支程序设计举例if语句的三种形式if(expression)statementif(expression)statement1

else

statement2if(expression1)statement1

elseif(expression2)statement2

elseif(expression3)statement3......

elseif(expressionn-1)statementn-1

else

statementnif语句的说明无论哪种形式,一条if语句,包括else或elseif子句,只算作一条语句if语句中的子句,可以是一条任何类型的语句,包括表达式语句、空语句、复合语句、控制语句子句末尾的分号,只表示子句的结束,不表示if语句结束注意复合语句末尾没有分号else子句都是可以没有的if语句举例if(x>y) /*y为x和y的较大值*/y=x;if(x>y) /*d为x和y之间的距离*/d=x-y;elsed=y-x;if(x>y); /*合法,但没有实际操作*/if语句的嵌套if语句的各子句都可以又是if语句应注意if-else的配对关系else总是与其上面最近的if配对可以用{}明确if-else的配对关系if(exp1) if(exp1)if(exp2) {if(exp2)

statement1

statement1}else else

statement2

statement2条件运算符(ConditionalOperator)条件运算符?:条件表达式exp1?exp2:exp3先判断exp1若exp1为“真”,表达式的值为exp2的值若exp1为“假”,表达式的值为exp3的值举例, max=(x>y)?x:y;同: if(x>y)max=x; elsemax=y;switch语句

switch(expression){

case

const-exp:statements

case

const-exp:statements......

case

const-exp:statements

default:statements }switch语句的说明先求switch后表达式的值,若此值与某个case后的常量表达式的值相等,则跳转到这个case后的语句;若没有相等的常量表达式,则跳转到default跳转后程序一直往下执行,不会因为遇到另一个case而直接跳出switch根据实际需要,可以没有default若需要跳出switch,可使用break语句case和default的顺序不影响执行结果switch语句举例(1)switch(day){ /*打印星期的缩写*/case1:printf("Mon.\n");break;case2:printf("Tue.\n");break;case3:printf("Wed.\n");break;case4:printf("Thu.\n");break;case5:printf("Fri.\n");break;case6:printf("Sat.\n");break;default:printf("Sun.\n");}整型常量switch语句举例(2)switch(deptno){ /*根据系编号打印学院*/case15:case16:case17:printf("商学院\n");break;case18:case25:printf("人文学院\n");break;case7:printf("地空学院\n");break;default:printf("其他学院\n");}switch语句:

一定要注意有break和没有break的差别,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。

注意:如果由嵌套的switch结构,break是跳出他所在的那层switch结构,而不是所有的。continue不能用于switch语句中,只有break可以。

switch(x)//x:是整型,字符型,枚举型数据。{ case1:…… case2:…… ……}#include<stdio.h>voidmain(){ charop; intoperand1,operand2,resault; printf("inputoperand1operator(+,-,*,/)operand2\n"); scanf("%d%c%d",&operand1,&op,&operand2); switch(op) { case'+':resault=operand1+operand2;break; case'-':resault=operand1-operand2;break; case'*':resault=operand1*operand2;break; case'/':resault=operand1/operand2;break; default:break; } printf("%d%c%d=%d\n",operand1,op,operand2,resault);}字符型常量例:从键盘输入一个整数,显示与该整数对应的枚举常量的英文名称。

#include<stdio.h>

voidmain()

{

enumweekday{sun,mon,tue,wed,thu,fri,sat}day;

intk;

printf("inputanumber(0--6)");

scanf("%d",&k);

day=(enumweekday)k;

switch(day)

{

casesun:printf("sunday/n");break;

casemon:printf("monday/n");break;

casetue:printf("tuesday/n");break;

casewed:printf("wednesday/n");break;

casethu:printf("thursday/n");break;

casefri:printf("friday/n");break;

casesat:printf("satday/n");break;

default:printf("inputerror/n");break;

}

}

程序运行结果为:

inputanumber(0--6)1

monday

枚举型常量分支程序设计举例求一元二次方程的根当a=0时,不是一元二次方程当a≠0时,方程的根为当b2-4ac≥0,方程有两个实根当b2-4ac<0,方程有两个共轭复根例1:求一元二次方程的根N-S流程图程序的结构化设计描述算法常用的工具:程序流程图常用的流程图符号ax+b=03.5循环程序设计while语句do-while语句for语句break和continue语句循环程序设计举例while语句while(expression) statementwhile型循环先判断表达式,后 执行语句一般情况下,循环 中应含有能使循环 语句结束的操作statementabexpr.真假while语句举例inti,sum;i=1;sum=0;while(i<=100){sum+=i; /*循环体缩进书写*/i++; /*使循环趋向结束*/}do-while语句do

statementwhile(expression);类似于Until型循环先执行一次循环体 语句,后判断表达 式statementabexpr.真假do-while语句举例inti,sum;i=1;sum=0;do{sum+=i;i++;}while(i<=100);do-while与Until型循环do{sum+=i;i++;}while(i<=100);C语言形式repeat{sum+=i;i++;}until(i>100);Until型循环for语句for(expr1;expr2;expr3)

statementexpr1;while(expr2){

statement

expr3; }for语句的说明三个表达式的说明expr1:初始化expr2:循环条件expr3:一般是循环变量的改变三个表达式都可以省略分隔表达式的分号不能省略expr1省略,不进行初始化expr2省略,认为循环条件永为“真”expr3省略,不在这里改变循环变量for语句举例inti,sum;for(i=1,sum=0;i<=100;i++)sum+=i;for(i=1,sum=0;i<=100;)sum+=i++;for(i=0,sum=0;i++<100;)sum+=i;break语句形式break;说明跳出switch语句跳出本层循环语句如果有多层循环存在,break只跳出它所在的那一层循环语句,不影响外层循环的执行不能用于循环语句和switch语句之外的任何其他场合continue语句形式continue;说明结束本次循环跳过循环体中余下的其他语句,接着进行下一次循环的判定只能用于循环语句中break和continue语句break语句跳出本层循环

while(i<j){...if(i>100)

break;...}continue语句结束本次循环

while(i<j){...if(i>100)

continue;...}循环程序设计举例求最大公约数和最小公倍数例2:求最大公约数和最小公倍数输出100-200间不能被3整除的数#include"stdio.h"voidmain(){ for(inti=100;i<=200;i++) { if(i%3==0)

continue; printf("%d\t",i); }}示例:字符计数从键盘读字符并计算字符数while循环实现字符计数#include"stdio.h"voidmain(){ longnc; nc=0; intch=getchar(); while(ch!=EOF) { nc++; ch=getchar(); } printf("%ld\n",nc);}for循环实现字符计数voidmain(){ longnc;

for(nc=0;getchar()!=EOF;nc++) ; printf("%ld\n",nc);}示例:单词计数#include"stdio.h"#defineIN1#defineOUT0voidmain(){ intstatus=OUT; intnw=0; intch; ch=getchar();while(ch!=EOF){ if(ch=='\n'&&ch=='\t'&&ch=='') status=OUT; elseif(status==OUT)

{ status=IN; nw++;

}

}}#include"stdio.h"#include"string.h“inttrim(chars[])voidmain(){ chars1[]="abc"; intlen; len=trim(s1); printf("trim(s1)is%s,len=%d\n",s1,len);}inttrim(chars[]){ intn; for(n=strlen(s)-1;n>=0;n--)if(s[n]!=''&&s[n]!='\t'&&s[n]!='\n')

break; s[++n]='\0'; returnn;}删除串尾空格,返回删除后的串长度示例:atoi示例

将数字字符串转化为整数;5种情况:“123”,”-123”,”-123”,”-123abc1”,“+123a1”算法:1.数字字符串转化为数值:n=0读一个数字字符c;n=n*10+(c-’0’);2.串前空格处理:读字符,为空格则走过即下标移下一位置3.符号位处理:设置变量sign=1;若读到’-’,则sign=-1;’+’,’-’下标移下一位置4.非数字字符处理:非数字字符则程序结束。5.按上述问题在串中出现顺序处理:2→3→1→4#include"stdio.h"#include"ctype.h"intatoi(chars[]){ inti=0; intn=0; intsign=1; for(i=0;isspace(s[i]);i++) ; if(s[i]=='-') sign=-1; if(s[i]=='+'||s[i]=='-') i++; for(;isdigit(s[i]);i++) n=n*10+(s[i]-'0'); returnsign*n;}}voidmain(){chars1[]="123",s2[]="-123“;chars3[]="-123"; chars4[]="-123abc1",s5[]="+123a1"; printf("%stoint%d\n",s1,atoi(s1)); printf("%stoint%d\n",s2,atoi(s2)); printf("%stoint%d\n",s3,atoi(s3)); printf("%stoint%d\n",s4,atoi(s4)); printf("%stoint%d\n",s5,atoi(s5));}数组的定义和使用:intx[3];x[0]=1;x[1]=2;x[2]=3;intx[]={1,2,3}charc[]=“123”;示例:逆序字符串算法 设立两个循环变量i,j;

i从串头递增获取字符,j从串尾开始递减获取字符,将s[i]与s[j]交换。直到i>j代码#include"string.h"voidreverse(chars[]){ inti,j; charc; for(i=0,j=strlen(s)-1;i<j;i++,j--) { c=s[i];s[i]=s[j];s[j]=c; }}示例:

将整形数据

温馨提示

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

评论

0/150

提交评论