信息学奥林匹克竞赛C语言课程胶片3-定向改编V1.0_第1页
信息学奥林匹克竞赛C语言课程胶片3-定向改编V1.0_第2页
信息学奥林匹克竞赛C语言课程胶片3-定向改编V1.0_第3页
信息学奥林匹克竞赛C语言课程胶片3-定向改编V1.0_第4页
信息学奥林匹克竞赛C语言课程胶片3-定向改编V1.0_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

C语言Part3forNOI选择结构循环结构关系运算符及其优先次序<(小于)<=(小于或等于)>(大于)>=(大于或等于)==(等于)!=(不等于)优先级相同(高)优先级相同(低)算术运算符(+-*/%)>关系运算符>赋值运算符(=及其扩展赋值运算符)

关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符表达式)接起来的式子,称关系表达式例:a>b,a+b>b+c,(a=3)>(b=5),’a’<‘b’,(a>b)>(b<c)关系表达式的值是一个逻辑值,即“真”或“假”。例:关系表达式”a>b”的值为“真”,表达式的值为1。C89语言中没有专用的逻辑值,1代表真,0代表假例:c>a+bc>(a+b)a>b==c(a>b)==ca==b<ca==(b<c)a=b>ca=(b>c)逻辑运算符和优先次序&&(逻辑与)相当于其他语言中的AND||(逻辑或)相当于其他语言中的OR!(逻辑非)相当于其他语言中的NOT例:a&&b若a,b为真,则a&&b为真。

a||b若a,b之一为真,则a||b为真。!a若a为真,则!a为假。优先次序:!(非)>&&(与)>||(非)逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符先,逻辑运算符非再,算术运算符再,关系运算符后,逻辑运算符与、或最后,赋值运算符逻辑表达式1用逻辑运算符将关系表达式或逻辑量连接起来的式子就逻辑表达式逻辑表达式的值应该是一个逻辑量“真”或“假”。例:设a=4,b=5:!a的值为0a&&b的值为1a||b的值为1!a||b的值为14&&0||2的值为1任何非零的数值被认作“真”逻辑表达式2例:5>3&&8<4-!0

自左向右运算

1&&0逻辑值为08<3逻辑值为04-1值为3!0逻辑值为15>3逻辑值为1表达式值为0先,逻辑运算符非再,算术运算符再,关系运算符后,逻辑运算符与、或(5>3)&&(8<(4-(!0)))

例:!a&&b||x>y&&c((!a)&&b)||((x>y)&&c)逻辑表达式3在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。(1)a&&b&&c只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。(2)a||b||c只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c例:(m=a>b)&&(n=c>d)当a=1,b=2,c=3,d=4,m和n的原值为1时,由于“a>b”的值为0,因此m=0,而“n=c>d”不被执行,因此n的值不是0而仍保持原值1。逻辑表达式4

用逻辑表达式来表示闰年的条件能被4整除,但不能被100整除。能被4整除,又能被400整除?

(year%4==0&&year%100!=0)||year%400==0值为真(1)是闰年,否则为非闰年。非闰年:

(year%4!=0)||(year%100==0&&year%400!=0)if语句的三种基本形式1(1)if(表达式)语句

例5.1:charch;ch=getchar();if(ch>='a'&&ch<='z')ch=ch-'a'+'A';putchar(ch);表达式语句真(非0)假(0)charch;ch=getchar();if(ch>='a'&&ch<='z'){ch=ch-'a'+'A';putchar(ch);}if语句的三种基本形式2(2)if(表达式)语句1else语句2例:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

条件

语句1

语句2非00if语句的三种基本形式3(3)if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3

……elseif(表达式m)语句melse语句nif语句的三种基本形式4intnumber;floatcost,price,total;printf("Pleaseenternumberandprice:\n");scanf("%d,%1f",&number,&price);if(number>500)cost=0.15;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("Total=%10.2f\n",total);例5.2:为了促销,对购买货物多的顾客有优惠:凡是购买50件及以上的,优惠5%;凡是购买100件及以上的,优惠7.5%;凡是购买300件及以上的,优惠10%;凡是购买500件及以上的,优惠15%。要求编程序,用户输入购买数量和单价,程序输入应付货款。switch(表达式){ case常量表达式1:语句1 case常量表达式2:语句2 …… case常量表达式n:语句n default:语句n+1}Switch语句intnumber;chartype;floatcost,price,total;printf("Pleaseenternumber,type(A,B,C,D)andprice:\n");scanf("%d,%c,%1f",&number,&type,&price);switch(type){case'A':cost=0.15;break;case'B':cost=0.10;break;case'C':cost=0.075;break;case'D':cost=0.05;break;default:cost=0;}total=number*price*(1-cost);printf("Total=%10.2f\n",total);字符型或者数值型每个常量表达式值必须互不相同C99允许1023个caseCase前允许执行语句;如果没有break,则按顺序执行,因此多个case可以共用一条执行语句if语句的三种基本形式513种形式的if语句中在if后面都有表达式,一般为逻辑表达式或关系表达式。2第二,第三种形式的if语句中,在每个else前面有一个分号,整个语句结束处有一个分号。3在if和else后面可以只含有一个内嵌的操作语句,也可以有多个操作语句,此时用花括号将几个语句括起来成为一个复合语句。if语句的三种基本形式5例5.3输入两个实数,按代数值由小到大的顺序输出这两个数。floata,b,t;scanf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f\n",a,b);yna>b交换两个数if语句的三种基本形式5例5.4输入三个数,要求按由小到大的顺序输出。floatsort[3];inti;for(i=0;i<3;i++){if(i==2)scanf("%f",(sort+i));elsescanf("%f,",(sort+i));}floatswap;if(sort[0]>sort[1]){swap=sort[1];sort[1]=sort[0];sort[0]=swap;}if(sort[0]>sort[2]){swap=sort[2];sort[2]=sort[0];sort[0]=swap;}if(sort[1]>sort[2]){swap=sort[2];sort[2]=sort[1];sort[1]=swap;}for(i=0;i<3;i++){printf("sort[%d]=%f\n",i,sort[i]);}数1>数2交换数1和数2取两个数if语句嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。形式:If()

if()语句1 else语句2Else

if()语句3 else语句4内嵌ifElse总是与它上面的,最近的,同一复合语句中的,未配对的if语句配对当if和else数目不同时,可以加花括号来确定配对关系条件语句的嵌套层数:C99为63,C89为8if语句嵌套例5.5有一个函数,编一程序,输入一个x值,输出y值。算法1:算法1:

输入x输入x

若x<0,则y=-1若x<0,则y=-1

若x=0,则y=0否则: 若x>0,则y=1若x=0,则y=0

输出y若x>0,则y=1

输出y

if语句嵌套上例中的程序段有四个,请判断哪个是正确的?程序1:程序2:

if(x<0)if(x>=0)Y=-1;if(x>0)y=1;elseelsey=0;if(x==0)y=0;elsey=-1;elsey=1;程序3:程序4:y=-1;y=0;if(x!=0)if(x>=0)If(x>0)y=1;if(x>0)y=1;elsey=0;elsey=-1;正确正确条件运算符格式表达式1?表达式2∶表达式3功能判断表达式1的值,如果成立就执行表达式2,否则就执行表达式3使用场合若在if语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值时,可以用一个条件运算符来处理。max=(a>b)?a∶b;条件运算符优先级高于赋值运算符,低于关系运算符和算术运算符。

条件运算符的结合方向为“自右至左”。

表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。

条件运算符例5.6输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。

charch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("%c\n",ch);

如果字符变量ch的值为大写字母,则条件表达式的值为(ch+32),即相应的小写字母。如果ch的值不是大写字母,则条件表达式的值为ch,即不进行转换。

例5.7运输公司对用户计算运费路程(s)越远,每公里运费越低。标准如下:s<250km没有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:f=p*w*s*(1-d)

例5.7源代码intc,s;floatp,w,d,f;printf("Pleaseinputbasicfee,weight,distance:\n");scanf("%f,%f,%d",&p,&w,&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);printf("freight=%15.4f\n",f);选择结构循环结构什么是循环为什么要使用循环?问题1:问题2:求学生平均成绩

分数相加后除以课数

在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。goto语句goto语句为无条件转向语句,它的一般形式为

goto语句标号;语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。

例如:gotolabel_1;合法;goto123;不合法.goto语句

结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、可读性差.一般来说,可以有两种用途:(1)与if语句一起构成循环结构;(2)从循环体中跳转到循环体外。

但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时(例如能大大提高效率)才使用.例6.1用if语句和goto语句构成循环,求1到100的和

inti=1,sum=0;

loop:

if(i<=100)

{

sum=sum+i;

i++;

gotoloop;

}

printf("sum:%d\n",sum);说明:这里用的是“当型”循环结构,当满足“i<=100”时执行花括弧内的循环体。运行结果:5050goto语句while语句while语句用来实现“当型”循环结构。一般形式:

while(表达式)语句当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。例6.1-1求1到100的和

inti=1,sum=0;

while(i<=100)

{

sum=sum+i;

i++;

}

printf("sum:%d\n",sum);说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。

while语句do-while语句do-while语句的特点:先执行循环体,然后判断循环条件是否成立一般形式:

do

循环体语句

while

(表达式);执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。例6.1-2求和Do-while语句inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("sum:%d\n",sum);在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是,如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。do-while和while语句比较例6.1-3求和运行结果:1↙sum:5050再运行一次:101↙sum:101Do-while和while语句的比较inti,sum=0;scanf("%d",&i);do{sum=sum+i;i++;}while(i<=100);printf("sum:%d\n",sum);inti,sum=0;scanf("%d",&i);while(i<=100){sum=sum+i;i++;};printf("sum:%d\n",sum);运行结果:1↙sum:5050再运行一次:101↙sum:0C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。一般形式:

for(表达式1;表达式2;表达式3)语句for语句先求解表达式1。求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行面第(3)步。若为假(值为0),则结束循环,转到第(5)步。求解表达式3。转回上面第(2)步骤继续执行。循环结束,执行for语句下面的一个语句for语句的执行过程for语句等价于下列语句:表达式1;while(表达式2){语句;表达式3;}

表达式2?执行语句成立不成立执行for循环之后的语句执行表达式3执行表达式1for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如

for(;i<=100;i++)sum=sum+i;

执行时,跳过“求解表达式1”这一步,其他不变。for语句如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;;i++)sum=sum+i;

表达式1是一个赋值表达式,表达式2空缺。它相当于:

i=1;while(1){sum=sum+1;i++;}for语句表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:

for(i=1;i<=100;){sum=sum+i;i++;}

在上面的for语句中只有表达式1和表达式2,而没有表达式3。i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。for语句可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:

for(;i<=100;)在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。for语句3个表达式都可省略,如:

for(;;)语句相当于

while(1)语句即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。for语句表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:

for(sum=0;i<=100;i++)sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。for语句表达式1和表达式3也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:

for(sum=0,i=1;i<=100;i++)sum=sum+i;或for(i=0,j=100;i<=j;i++,j--)k=i+j;表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为最右边的表达式的值for语句表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体for语句for(i=0;(c=getchar())!=′\n′;i+=c);

在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于′\n′(换行符),如果不等于′\n′,就执行循环体。循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。for语句例6.2输入单词并打印for语句运行情况:Computer↙(输入)Computer(输出)而不是Ccoommppuutteerrfor(intc;(c=getchar())!='\n';)printf("%c",c);for语句中只有表达式2,而无表达式1和表达式3。其作用是每读入一个字符后立即输出该字符,直到输入一个“换行”为止。请注意,从终端键盘向计算机输入时,是在按Enter键以后才将一批数据一起送到内存缓冲区中去的。C语言中的for语句比其他语言(如BASIC,PASCAL)中的FOR语句功能强得多。可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for语句中。for语句一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环(while循环、do-while循环和for循环)可以互相嵌套。循环嵌套(1)

while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();(4)

while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见下节)。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制.几种循环的比较break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句一般形式:

break;注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。

break语句例6.3:计算r=1到r=10时的圆面积,直到面积area大于100为止break语句当area>100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。floatpi=3.14159;for(intr=1;r<=10;r++){floatarea=pi*r*r;if(area>100)break;printf("r=%d,area=%3.5f\n",r,area);}作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.一般形式:

continue;continue语句

例6.5把100~200之间的不能被3整除的数输出。说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。continue语句

for(intn=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);}continue语句只结束本次循环,而不是终止整个循环的执行。break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。break语句和continue语句的区别

例6.6

用π/4≈1-1/3

温馨提示

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

评论

0/150

提交评论