C语言控制结构_第1页
C语言控制结构_第2页
C语言控制结构_第3页
C语言控制结构_第4页
C语言控制结构_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

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

文档简介

第三章程序控制语句教学目标1掌握选择结构与循环结构控制语句的作用与使用规范2学习结构化程序设计中常用的基本算法3进行算法设计训练,能综合控制结构语句解决一般问题4能正确输入输出数据,并学习程序调试基本方法本章内容3.1顺序结构与基本输入输出3.2分支结构3.3循环结构3.4循环程序设计3.5应用举例3.1顺序结构与基本输入输出3.1.1C语句概述3.1.2顺序结构程序设计3.1.3字符输入输出3.1.4格式输入输出3.1.1C语句概述源程序的基本组成单位是语句,语句用于完成一定的操作任务。C语句有以下五类:1.说明语句变量定义、变量说明、函数说明、结构说明等int

x,y=4; 定义整形变量x、y,并初始化变量yexternint

x,y;说明整形变量x、y是已被定义的全局变量int

max(int,int); 声明函数max3.1.1C语句概述2.控制语句,完成程序流程控制if()~else~ 选择结构语句for()~ 循环语句switch 多分支选择结构语句return 从函数返回语句……3.表达式语句:在表达式后面加分号构成。例:a=3;/*赋值语句*/i++;/*算术表达式语句*/

表达式能构成语句是C的特色。4.空语句:只有分号“;”组成的语句,什么也不执行,但占据了一个语句的位置,也起一条语句的作用。常用于需要一个语句但不需要任何操作的情况。3.1.1C语句概述5.复合语句(语句块)

由大括号{}括起来的语句序列,在语法上复合语句被看作一条语句。例:{intx,y;z=x+y;t=z/100;

printf("%f",t);}复合语句常用于任何需要一条语句的地方。3.1.1C语句概述3.1.2顺序结构程序设计例3-1键盘输入一个三位数,输出逆序后的数。#include<stdio.h>voidmain(){intx,y,a,b,c;

printf("Pleaseinputanum:");

scanf("%d",&x);a=x/100;b=x/10%10;c=x%10;y=100*c+10*b+a;printf("x=%d,y=%d\n",x,y);}

顺序结构,就是语句按照编写的顺序依次执行。C中的输入输出1.C本身没有输入输出语句,数据的I/O由函数实现。2.源程序的开头使用如下语句:#include<stdio.h>#include“stdio.h”

3.1.3字符输入输出1.字符输出函数putchar()int

putchar(intc)作用:向终端输出一个字符。参数C可以int型与char型。例:#include"stdio.h"voidmain(){chara,b,c;a='B';b='O';c='Y';

putchar(a);putchar(b);putchar(c);}程序输出:BOY注:若要输出小写的boy,程序怎样修改?若没有#include“stdio.h”会怎样?实例函数参数可以是转义字符例:putchar('\n');输出换行符putchar('\101');输出字符'A'putchar('\'');输出单引号'putchar('\012');输出换行符putchar('\015');输出回车.不换行,光标到本行首

转义字符2.字符输入函数getchar()形式:int

getchar(void)作用:从stdin(键盘)输入一个字符,同时有回显。函数无参数,返回接收到的输入字符原型定义:stdio.h

常用用法:变量=getchar();#include"stdio.h"voidmain(){charc;c=getchar();

putchar(c);

ORputchar(getchar());}输出(如在键盘上输入“a”):a↙a实例3.1.4格式输入与输出1.格式输出函数printf()作用:按指定的格式输出指定数据一、printf()的一般格式printf("格式控制",输出列表);例: inti=3; doublef=4.56;

printf("i=%d,f=%lf\n",i,f);1.格式控制:控制按指定格式输出后面的参数。以“”括起。格式控制组成:普通字符(不含%的字符),原样输出(可为转义字符)格式说明符(%格式字符),控制输出数据的格式。2.输出表列:需要输出的数据,以,分隔。可为常、变量、表达式、函数,受格式控制中格式符的控制。也可以没有输出表列,如:

printf(“Name\tAdd\tTel\n”);printf函数格式二、格式字符1.d格式符:按十进制有符号数格式输出%d按int型数据实际长度输出%md

按m指定的宽度输出(不足补空格,大于m位时按实际长度输出),右对齐%ld,%mld

输出longint

型数据,m指定输出宽度%hd,%mhd输出shortint型数据%0md,%0mld,%0mhd0(数字0)表示位数不足m时补0%-md,%-mld

左对齐输出,右边补空格注:%后面的m(位数控制)、0(位数不足补0)对于其他格式符也适用。例:(□表示空格)inti=123;longj=123456;printf("%d□%5d□%05d,□%ld□%8ld□%08ld",i,i,i,j,j,j);结果:123□□□123□00123,□123456□□□123456□00123456强调:对long型数据要用%ld输出,若用%d可能会发生错误。同理,shortint

数据要用%hd2.o(字母)格式符:按八进制无符号数的格式输出。符号位作为数一并输出。例:shortinta=-1;

printf(“a=%hd,%ho\n”,a,a);结果:a=-1,1777773、x格式符:按十六进制无符号数格式输出int型数。4、u格式符:以无符号十进制形式输出整数对longint数据都需要附加l,对shortint

需要附加h如%lo,%10hx,%-10lo5、c格式符:以字符形式输出。例:charc=‘\101’;printf("%c",c);也可以使用:%mc、%-mc6、s格式符:以字符串格式输出。%s例:printf("%s","CHINA");%msm指定宽度(不足时左补空格,大于时按实际宽度输出),右对齐%-ms左对齐,不足m时右补空格%m.ns

输出占m列,取字符串左端n个字符,左补空格%-m.ns

同上,n个字符输出,占m列,右补空格7、f格式符:按小数格式输出实数。printf("%0.3f",123.45678);显示123.457%f按小数格式输出,整数部分全输出,6位小数%m.nf输出占m列(含小数点),其中n位小数(四舍五入)%-m.nf同上,左对齐%lf用于double型数据8.e格式符:以标准指数形式输出实数%e指数形式输出实数,尾数保留6位小数。%m.ne

n指保留尾数部分小数位数,右对齐%-m.ne

左对齐%ledoublea=-1.1e300;printf("a=%le,sizeof=%d\n",a,sizeof(a));输出:a=-1.100000e+300,sizeof=82.格式输入函数scanf()一、一般格式作用:按规定格式输入形式:int

scanf("格式控制",地址列表)原型定义:stdio.h将键盘输入的数据按指定的格式接收、转换后,送到相应的地址中。#include"stdio.h"voidmain(){int

a,b,c;

scanf("%d%d%d",&a,&b,&c);

printf("%d,%o,%x\n",a,b,c);}运行时输入:10□11□12↙程序输出:10,13,c二、格式说明与printf()的格式控制类似格式字符说明d

用于输入十进制数o用于输入八进制数x用于输入十六进制数c用于接收单个字符s接收字符串认为空格是结束符f用于输入实数(小数或指数均可接收)e与f相同附加格式说明符l用于long(%ld)和double(%lf)型数据h用于短整型数据(%hd、%ho、%hx)域宽(一个正整数)指定输入所占宽度*表示对应输入量不赋给一个变量1.可以指定输入数据的列数,系统自动按它截取所需数据。例:scanf("%2d%3d",&a,&b);输入123456↙系统自动将12赋给a,345赋给b。2.*格式用于跳过一个数据域scanf("%2d□%*3d□%2d",&a,&b);输入:12□345□67↙结果,a=12,345被跳过,b=67。*主要用于利用现有数据时,跳过某些数据项。3.输入实数不能规定精度.如:scanf("%7.2f",&a);说明1、sacnf()中的变量必须使用地址。

inta,b;

scanf(“%d,%d”,a,b);

错误

scanf(“%d,%d”,&a,&b);正确2、scanf()的“格式控制”中,可以使用普通字符,但在输入时必须输入这些字符,成为数据输入时的分隔符。例:scanf("%d,%d",&a,&b);输入:3,4↙(逗号与"%d,%d"中的逗号对应)三.使用scanf()函数的注意事项例:scanf("%d□□%d",&a,&b);输入:3□□4↙(两个或以上空格)例:scanf("%d:%d:%d",&h,&m,&s);输入:12:23:36↙(与格式控制中的冒号对应)例:scanf("a=%d,b=%d,c=%d",&a,&b,&c);输入:a=12,b=24,c=36↙(a=,b=,c=及逗号与格式控制相对应)3、在用“%c”输入时,空格、回车、TAB等均作为有效字符被接收。例:scanf("%c%c%c",&c1,&c2,&c3);输入:a□b□c↙结果:a→c1,□→c2,b→c3(其余被丢弃)若输入:123ab结果:1→c1,2→c2,3→c34、输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数)。①遇空格、“回车”、“跳格”键或用户指定的分隔符。②遇宽度结束。③遇非法输入。5、注意%c与%d混合使用时的问题。例:scanf(“%c%d%c”,&a,&b,&c);执行:a12c↙结果:a=’a’,b=12,c=’c’ a□12□c↙结果:a=’a’,b=12,c=□6、数据类型与格式符匹配使用%f%lf用于实型%d%o%x用于整型%c用于字符型问题与讨论1.scanf函数变量名前没有&会怎样?编译器会报错吗?2.a=getchar()与scanf("%c",&a)的异同3.怎样设计scanf使得输入数据时减少出错?3.2分支结构程序需要进行比较与逻辑判断,根据判断结果决定不同的操作。确定判断的条件确定判断结果为“真”或“假”时执行的不同操作2.2.4关系运算符与关系表达式关系运算:也称比较运算,比较两个运算对象的大小。关系表达式:关系运算符连接的式子,关系表达式可能结果有:“真”(true)和“假”(false)。例:a>3、a==3、a!=31.关系运算符及其优先次序<小于优先级相同(高)<=小于等于>大于>=大于等于==等于优先级相同(低)!=不等于C中的逻辑值:0(假)1(真)关系表达式:用关系运算符连接的表达式。关系表达式的值:

0、1与int

型等效例:若a=3,b=2,c=1,则:a>b 真,表达式的值为1

(a>b)==c 真,表达式的值为1

b+c<a假,表达式的值为0

d=a>b

d的值等于1

f=a>b>c

f的值等于0注意:数学式a>b>c应写为a>b&&b>c2.关系表达式3.关系运算的特点右结合双目运算符优先级例:c>a+b

等效于 c>(a+b)

a>b!=c 等效于 (a>b)!=c

a==b<c 等效于 a==(b<c)

a=b>c 等效于 a=(b>c)2.3.3逻辑运算符与逻辑表达式1.逻辑运算符及其优先次序

&&逻辑与“双目运算符”:要求两个操作数,如:(a>b)&&(x>y)||逻辑或!逻辑非单目运算符,要求一个操作数,如:!(a>b)优先级:!高于&&高于||1&&1=11&&0=00&&1=00&&0=01||1=11||0=10||1=10||0=0!1=0!0=1逻辑运算规则表混合运算:!a&&b==c||x*2>y+3&&c++按右图优先级运算。用逻辑运算符将关系表达式或逻辑量连接起来。在C中,参与逻辑运算的数据可为任意类型,非0即为真,0为假。例:’a’+’b’||’c’ 值为1 ‘a’&&’\0’ 值为0 5>3&&2||8<8-!0 值为1编译器在求解逻辑表达式的值时,采用“非完全求解”的方法,即:当求得表达式为真后,就结束求解;只有在需要执行下一个逻辑运算时,才继续运算。

2.逻辑表达式1.a&&b&&c只有a为真时,才判别b的值;只有a和b均为真时,才判别c的值。只要a为假,就不再判别b和c的值,直接求得表达式的值为假。2.a||b||c只要a为真,就不再判别b和c的值,直接求得表达式的值为真。只有a为假时,才判别b的值;只有a和b均为假时,才判别c的值。即:对&&而言,当左边为0时,不再计算右边表达式 对||而言,当左边为1时,不再计算右边表达式例:计算(a=5>3)&&(b=’a’==’b’)&&(b=3>1)后

a的值为1,b的值为0应用:常直接用逻辑表达式构造条件。例如闰年条件:(y%4==0&&y%100!=0)||(y%400==0)条件PTF语句块1语句块2exprstatement1statement2非0==03.2分支结构3.2.1if语句1.if-else分支if(表达式)语句块1;else

语句块2;例3-6输入一个字符,判断它是否为英文小写字母。#include<stdio.h>voidmain(){charc;

printf("Pleaseinputacharacter:");c=getchar();

if(c>='a'&&c<='z')

printf("Itisalowercase.\n");else

printf("Itisnotalowercase.\n");}if-else使用说明(1)if语句中的条件表达式一般是关系表达式或者逻辑表达式。

if(a==b&&x==y)printf("a=b,x=y");

也可以为任意数值类型,如:

if(3-5%2)printf("yes");elseprintf("no");

输出yesif(3)printf("O.K.");

输出O.k

判别条件是:“非零即真”if-else使用说明(2)“程序块1”和“程序块2”必须是单条语句,若是两条以上的语句,则必须用{}将多条语句括起来成为一条复合语句,使它们成为一个语句单元。

if(score>=60)

printf("Passed\n"); else

{

printf("Failed\n");

printf("Youmusttakethiscourseagain\n"); }变量score的值大于60时,程序将输出:PassedYoumusttakethiscourseagainif-else使用说明(3)if~else语句执行完毕后执行if~else的后续语句。系统将整个if~else结构处理为一条语句单元。2.if分支if(表达式)语句;

exprstatement非0==0条件PTF语句1例3-9输入三个数,按由小到大的顺序输出#include<stdio.h>voidmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);if(a>b){t=a;a=b;b=t;/*变量a与b互换,t为中间变量*/}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%d\n",a,b,c);}例3-8设计一个加法计算训练程序,由机器随机产生两个整数,让用户计算两数之和,若用户计算正确则打印“Right”,否则打印“Wrong”。#include<stdio.h>voidmain(){int

a,b,s;a=rand();/*rand()是库函数,随机产生一个0-32767之间的数*/b=rand();

printf("%d+%d=",a,b);

scanf("%d",&s);/*用户输入结果*/

if(s==a+b)/*计算机判断用户结果是否正确*/

printf("Right\n");else

printf("Wrong\n");}

常见错误

多条语句为内嵌时忘记用{}括起来。在if(表达式)之后多加一个分号。比较运算符“==”与赋值运算符“=”混淆使用。最常见的错误为:if(x==1)误写为:if(x=1)…………

无论x的原值是什么,赋值表达式x=1的值总为1,其作为条件时恒为真。3.if…elseif…else多分支if(表达式1)语句1;else

If(表达式2)语句2;

else If(表达式3)语句3 …… else if(表达式m)语句m else语句n条件1TF语句1条件2语句2语句3条件3……例3-10应用多分支结构编写此程序,根据用户输入的自变量x的值,计算y的值。voidmain(){floatx;

printf("pleaseinputx:");

scanf("%f",&x);

if(x<0.0)

printf("y=0\n");elseif(x<=30)

printf("y=%f\n",x);

elseif(x<=60)

printf("y=%f\n",x*x);elseprintf("y=%f\n",x*x*x);}例3-10条件PTF语句1语句2条件PTF语句1条件1TF语句1条件2语句2语句3条件3……分支结构流程图条件PTF语句1语句2条件PTF语句1条件1TF语句组语句组条件2条件3语句组语句组语句组语句组语句组语句组If-else嵌套流程图3.2.2if语句的嵌套if(条件表达式1)if(条件表达式2)程序块1;else程序块2;elseif(条件表达式3)程序块3;else程序块4;if~else的内嵌程序块中又包含一个或多个if~else语句称为if语句的嵌套,常用于实现多路选择。嵌套if语句时,必须特别注意if与else配对。配对原则:从最内层开始,else总是与它上面最接近的(未曾配对的)if配对。避免if与else配对错位的最佳办法是加大括号,同时,为了便于阅读,使用适当的缩进,(只有大括号能保证if和else不错位配对,缩进仅便于阅读)If与else的匹配例:if(a==b)

if(b==c)

printf(“a==b==c”);else

printf(“a!=b”);修改:if(a==b){if(b==c)

printf(“a==b==c”);}else

printf(“a!=b”);实现if~else

正确配对方法:加{}实现if~else正确配对方法if(p1)

{if(p2)语句A;}else

if(p3)语句B;

else语句C;语句D;比较差异:if(p1) if(p2)语句A;

else

if(p3)语句B;

else语句C;语句D;#include<stdio.h>voidmain(){int

a,b,c,max;

printf("pleaseinputthreenumbers:\n");

scanf("%d%d%d",&a,&b,&c);max=a;

if(c>b)

if(c>a)max=c;else

if(b>a)max=b;

printf("themaxis%d\n",max);}max=a;if(c>b){

if(c>a)max=c;}else{

if(b>a)max=b;}

printf("themaxis%d\n",max);}运行时:pleaseinputthreenumbers:输入:253输出:themaxis2良好习惯

(1)相配对的if与else书写于同一列上,

内嵌语句缩格书写,以表明层次结构。(2)if语句多重嵌套实现多路选择时,应尽可能的在else中分支,即在else中嵌套另一个if语句,而不要在if中嵌套。(3)具体实现时,每一个if的条件为真时只有唯一的一种情况,而将剩余的各路选择放在else中一次次细分。在if语句中,在“表达式”为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值,例如:if(a>b)max=a;else

max=b;可以用如下赋值语句来处理:max=(a>b)?a:b;条件运算符要求有三个操作对象,称为“三目运算符”(它是C语言中唯一的一个三目运算符)。3.2.3条件运算符

条件表达式的一般形式:

表达式1?表达式2:表达式3说明:1.执行顺序:先求解表达式1的值,若其为真,求解表达式2的值,做为整个条件表达式的值;若表达式1为假,则求解表达式3的值,且整个条件表达式的值等于表达式3。max=(a>b)?a:b

把条件表达式的值赋给max。

3.2.3条件运算符2.优先级:高于赋值运算符,低于算术运算符、关系运算符和逻辑运算。max=(a>b)?a:b

max=a>b?a:ba>b?a:b+1 (a>b)?a:(b+1)3.结合性:右结合。a>b?a:c>d?c:d

(a>b)?a:(c>d?c:d)4.if~else与条件表达式的替代:

if(a>b)printf("%d",a); elseprintf("%d",b);

替代:printf("%d",a>b?a:b);

条件运算符说明5.表达式1、表达式2、表达式3的类型可以不同。6.可以嵌套。max=(a>b?a:b)>c?(a>b?a:b):c例:P48例3-13,大小写转换。(read)if(ch>=‘a’&&ch<=‘z’)ch-=32;或:

ch-=(ch>=‘z’&&ch<=‘z’)?32:0条件运算符说明3.2.4switch语句其一般形式:switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;┆case常量表达式n:语句n;break;default:语句n+1}{}不能省各常量值必须不相等break用于跳出switch例:根据考试成绩的等级(grade)

打印出百分制分数段:grade=getchar();switch(grade){case'A':printf(“90~100\n");case'B':printf("75~89\n");case'C':printf("60~74\n");case'D':printf("<60\n");default:printf("error\n");}如果输入A,回车,输出?当grade='A'时,程序从printf(“90~100\n")开始执行,因此输出结果为:

90~10075~8960~74<60error本例中,原意是输出一个值,要实现这一要求,应在语句后加break语句。1、switch语句的执行部分由一对大花括号括起来,case和后面的常量表达式之间要有空格。2、每一个case后面的常量值必须各不相同3、当每一个case语句后均有break语句时,case出现的次序不影响执行结果。(default总是放在最后,这时,deafult后不需要break语句)。4、break语句的功能是跳出所在的switch语句,转而执行switch后面的语句。break不是语法必须的语句,而是逻辑上实现多路选择的必须。Switch说明5、case后面包含多个语句时,不需要加大括号。(从:开始执行).6、多个case可以共用一组执行语句,例、case'A':case'B':case'C':printf(">60\n");break;7、case后面必须是整形常量或字符型常量。Switch说明例3-15五分制成绩转换成百分制#include<stdio.h>voidmain(){charc1,c2;

printf("pleaseinputthescore:");

scanf("%c%c",&c1,&c2);例3-15五分制成绩转换成百分制switch(c1){case'5':switch(c2){case'+':printf("100\n");break;case'\n':printf("90\n");break;case'-':printf("85\n");break;}break;case'4':switch(c2){case'+':printf("80\n");break;case'\n':printf("75\n");break;case'-':printf("70\n");break;}break;case'3':printf("60\n");break;case'2':case'1':printf("<60\n");break;}}3.3循环结构在一个算法中,某些步骤需要反复多次地执行时,需要设计一个循环。循环是在给定循环条件为真时由计算机重复执行一组循环体语句的控制结构。循环结构是结构化程序三种基本结构之一。构建循环让计算机反复执行一组操作语句,从而完成大量类同的计算。根据开始循环的初始条件和结束循环的条件不同,C语言中用如下语句实现循环1、用while语句。2、用do-while语句。3、用for语句。循环构成3.3.1while语句一般形式:while(表达式)

循环体语句;作用:实现“当型”循环。当“表达式”为非0(真)时,执行“循环体语句”,其后回到循环开始while处再次判断表达式真假,……,直至表达式为假,结束循环,执行while后续。特点:循环体只能是一条语句。若有多条语句,使用{}使之成为复合语句。表达式一般是关系或逻辑表达式。当然,在C中也可以为任意类型表达式。循环结构流程图实例例3-16求

voidmain(){int

i,n,sum=0;i=1;

printf(“pleaseinput:”);

scanf(“%d”,&n);while(i<=n){ sum+=i; i++;}

printf("%d",sum);}1.注意给出循环的初始条件,如本例中“sum=0i=1”。2.循环体包含一个以上的语句时,用大括号括起来,形成复合语句。3.循环体中必须有使循环趋于结束的语句,否则程序进入“死循环”(不结束)。4.书写方式:缩格书写。n3.3.2do-while语句一般形式:do{循环体语句}while(表达式);执行过程:从do开始,先执行一次“循环体语句”,然后判断“表达式”,“表达式”非0,重回do处再次执行“循环体语句”,直到“表达式”为0,循环结束。先循环后判断用do-while语句求下面程序的功能是?voidmain(){ints=0,n;

scanf(“%d”,&n);do {s+=n; n--; }while(n>0);

printf(“s=%d\n”,s);}例3-17计算x的y次方#include<math.h>#include<stdio.h>voidmain(){

int

y,i;doublex,z;

printf("Pleaseinputxandy:");

scanf("%lf%d",&x,&y);z=1;i=1;

do{z*=x;i++;}while(i<=fabs(y)); if(y<0)z=1/z;printf("result=%lf\n",z);}循环条件一开始为假,循环执行一次。while和do-while是可以互换的。在一般情况下,用while和do-while语句解决同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但当循环条件一开始就为“假”时,两种循环的结果不同。这是因为此时while循环的循环不被执行,而do-while循环的循环体被执行一次。While和do-while例3-17计算x的y次方修正#include<math.h>#include<stdio.h>voidmain(){

int

y,i;doublex,z;

printf("Pleaseinputxandy:");

scanf("%lf%d",&x,&y);z=1;i=1;

if(y!=0)do{z*=x;i++;}while(i<=fabs(y));if(y<0)z=1/z;printf("result=%lf\n",z);}3.3.3for语句

for(表达式1;表达式2;表达式3)

{循环体语句;

}执行过程:(1)求表达式1;(2)求表达式2,若为“真”,执行“循环语句”;若为假,转第(5)步。(3)求表达式3。(4)转第(2)步。(5)执行for语句下面的语句。for循环流程图例3-18用for循环求1+2+3+……+100#include<stdio.h>voidmain(){

int

i,sum;

for(i=1,sum=0;i<=100;i++)sum+=i;

printf("sum=%d\n",sum);}for语句中: “表达式1”循环变量初始化 “表达式2”判别循环条件 “表达式3”循环控制变量更新例:for(sum=0,i=1;i<=100;i++) sum=sum+i;这里,循环条件由变量i设定,变量i称为“循环变量”。for语句

(1)表达式1和表达式3经常是逗号表达式,可以分别或同时省略。for语句省略“表达式1”。“表达式1”的作用是设定循环初始条件,“表达式1”省略后,应在for语句前面设置循环初始条件。例:i=1;for(;i<=100;i++)

sum=sum+i;/*注意,“表达式1”后面的分号不能省略*/for语句说明for语句省略“表达式3”。表达式3用于修改控制循环条件(修正循环变量的值),若省略,应在循环体语句中增加修改循环变量值的语句,以保证循环能正常结束。例:for (sum=0,i=1;i<=100;□){ sum=sum+i; i++;} for语句说明for语句说明同时省略“表达式1”和“表达式3”,只有“表达式2”。例:i=1;sum=0;for(;i<=100;){sum+=i;i++;}i=1;sum=0;for(;i<=100;){sum+=i++;}(2)表达式2是循环条件。如果省略“表达式2(循环条件)”,则不判别循环条件,认为循环循环条件始终为“真”,循环将无终止地进行下去。for(i=1,sum=0;;i++)sum+=i;相当于:for(i=1,sum=0;1;i++)sum+=i;(3)循环体只能是一条语句,若包含多条语句,应用{}括起来。for语句说明(4)for语句的其他变形例1:for(sum=0,i=1;i<=100;) sum=sum+i++;例2:sum=0,i=1;for(;;){sum=sum+i++;

if(i>100)break;}(5)各表达式可为逗号表达式

for(i=0,j=100;i<=j;i++,j--) k=i+j;for语句说明例3-19用for语句计算x的y次方,y为整数。x与y的值都由键盘输入。voidmain(){int

y,i;doublex,z;

printf("Pleaseinputxandy:");

scanf("%lf%d",&x,&y);for(z=1,i=1;i<=fabs(y);i++) z*=x;if(y<0)z=1/z;

printf("result=%lf\n",z);}例3-20求最高分与平均分例3-20歌手大奖赛,有裁判12人。编写计算歌手得分程序,键盘输入12个成绩,输出最高分、最低分与最终得分。#defineN12voidmain(){inti;floatscore,max,min,sum,aver;

scanf("%f",&score);max=min=sum=score;

for(i=1;i<=N-1;i++){scanf("%f",&score);

if(score>max)max=score;

if(score<min)min=score; sum+=score;}aver=(sum-max-min)/(N-2);

printf("max=%6.2f,min=%6.2f,average=%6.2f\n",max,min,aver);}3.3.4循环的嵌套循环嵌套:一个循环(称为“外循环”)的循环体内包含另一个循环(称为“内循环”)。内循环中还可以包含循环,形成多层循环。(循环嵌套的层数理论上无限制)。三种循环(while、do-while、for)可以互相嵌套。多重循环的使用与单一循环完全相同,但应特别注意内、外层循环条件的变化。内、外层循环变量赋初值的位置、变量名的使用等。注意:外循环必须完整地包含内循环。do{…… while() {……} for(;;) {……do{……}while();

…… }}while();例:1!+2!+3!+……+n!voidmain(){longs=0,k;

int

i,n,j;

scanf(“%d”,&n);

for(i=1;i<=n;i++){k=1;

for(j=1;j<=i;j++) k*=j; s+=k;}

printf(“s=%ld\n”,s);}voidmain(){longs=0,k;

int

i,n,j;k=1;

scanf(“%d”,&n);

for(i=1;i<=n;i++){

for(j=1;j<=i;j++) k*=j; s+=k;}

printf(“s=%ld\n”,s);}求1!+1!*2!+……+1!*2!*……*n!voidmain(){longs=0,k;

int

i,n;

scanf(“%d”,&n);

for(i=1,k=1;i<=n;i++) {k*=i; s+=k; }printf(“s=%ld\n”,s);}循环嵌套实例例3-21打印九九乘法表。例3-22编程输出如下图形:

12223333344444445555555553.3.5break与continue语句1.break语句在while、for、do-while或switch结构中使用,可使程序立即退出该结构,转而执行该结构后的第一条语句。注:break只可跳出所在的一重循环。在多重循环中使用,只能跳出其所在的内层循环。Break跳出分析A;While(p1){B;for(C;p2;D) {E; if(p3)break; F; }G;}H; 例3-23求满足表达式1+2+3+……+n<=1000的最大的n

#include<stdio.h>voidmain(){int

i,sum;

for(sum=0,i=1;;i++){sum+=i;

if(sum>1000)break;}

printf("n=%d\n",i-1);}#include<stdio.h>voidmain(){intsum=1,i;

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

printf("i=%d\n",i-2);}2.continue语句作用:提前结束本次循环体的执行,回到循环的起始处,接着进行下一次循环条件的判别。说明:对于while,continue是回到while处再次判断条件,根据条件决定是否进行下一次循环;对do-while,回到do处,重新执行循环体语句,并不判别循环条件。对for,来到表达式3处,执行表达式3后再判断表达式2。While(p1){A; if(p2)continue; do{

if(p3)continue; B;

}while(p4); for(C;p5;D)

{if(p6)continue elsebreak;

}

}E;输出100~200之间不能被3整除的数。voidmain(){intn;for(n=100;n<=200;n++){if(n%3==0)

continue;

printf("%5d",n);}}voidmain(){intn;for(n=100;n<=200;n++){if(n%3!=0)

printf("%5d",n);}}例3-24键盘输入一组学生成绩,输出其中已及格的数据(>=60)。输入时以负数作为输入的结束。

voidmain(){ints=1;

while(s>=0){scanf("%d",&s);

if(s<60) continue;

printf("%d",s);}

printf("\n");}可否不使用continue?break语句和continue语句说明1.注意各自的功能while(表达式1) while(表达式1){ {if(表达式2)if(表达式2)break;continue;} }break语句跳出循环continue语句结束本次循环体的执行,进入下一次循环2.都不能单独使用。break只能用于循环与switch控制结构中,continue只能用于循环控制结构中。3.3.6goto语句(无条件转移语句)一般形式:goto

语句标号功能:无条件转向“语句标号”处执行。语句标号为一个标识符,放在语句前面,用:与语句分隔。goto语句引起一个无条件的转移,会破坏其他控制结构,不符合结构化程序设计原则,破坏了程序结构的清晰,因此,一般应避免使用goto语句。例3-25计算n+(n+1)+(n+2)+……+100#include<stdio.h>voidmain(){

int

i,s=0;

scanf("%d",&i);

if(i>100){

printf("Error");

gotoend;}

start:/*语句标号*/

if(i<=100){s+=i++;

gotostart;}

printf("s=%d",s);end:printf("\n");/*带语句标号的语句*/}3.4循环程序设计3.4.1循环设计循环是在循环条件为真时反复执行的一组计算机指令,是计算机解题的一个重要结构。循环控制有两种基本方法:计数法和标志法。1.计数器控制的循环事先准确地知道循环次数,因此设计一个循环控制变量,由变量值来控制循环次数。每循环一次,循环变量的值会递增(增值通常为1或-1),当其值达到终值时结束循环。2.标志控制的循环事先不知道准确的循环次数,由某一目标值标记循环的结束。C语言程序所需的任何控制形式可以用下面三种控制结构完成:顺序结构、if结构、while结构。一、循环设计程序设计的首要工作是算法设计,离开了算法也就没有了程序。算法,是指完成某一项工作而采取的方法和步骤,具体到程序设计,是对解题过程的准确而完整的描述,并用一种程序设计语言的来实现。循环主要用来解决程序设计中两类基本的算法:穷举和迭代。3.4.2基本算法穷举的基本思想是对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。穷举是一种重复型算法,其核心是设计循环,在循环体中依次测试。例0:最大公因数例1:百钱百鸡例2:最值问题。输入十个数,输出其中最大、平均值。例3:素数问题。判断x是不是素数。[例3-30]例4:输出100-1000之间所有素数,每行输出5个。例5:韩信点兵1.穷举判断素数韩信点兵韩信有一队兵,他想知道有多少人,便让士兵排队报数。按1-5报数最后一人报1;按1-6报数末一人报5;按1-7报数最后一人报4;按1-11报数最末一人报10。韩信有多少兵?思考:设士兵数为x,满足以下关系式:x%5==1&&x%6==5&&x%7==4&&x%11==10用穷举法对x从1开始测试,直到找到满足关系式的x按照特定规律和方法,不断用新值取代变量的旧值,或由旧值递推出变量新值,直至问题解决为止,这种解决问题的方法为迭代。迭代的关键因素是:迭代初值、迭代公式和迭代次数(精度要求)。例0:最大

温馨提示

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

评论

0/150

提交评论