《C语言程序 设计》课件-第三章 语句与流程控制_第1页
《C语言程序 设计》课件-第三章 语句与流程控制_第2页
《C语言程序 设计》课件-第三章 语句与流程控制_第3页
《C语言程序 设计》课件-第三章 语句与流程控制_第4页
《C语言程序 设计》课件-第三章 语句与流程控制_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

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

文档简介

本章重点基本输入、输出语句的使用顺序结构程序设计选择结构程序设计循环结构程序设计continue和break的使用

3.1算法基础3.1.1算法的定义3.1.2算法的描述方法3.1.3算法设计的要求3.1.1算法的定义算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。算法具有下列5个特性:1.有穷性。2.确定性。3.可行性。4.输入。5.输出。一个算法有一个或多个的输出。3.1.2算法的表示方法

常用方法有:自然语言、传统流程图、NS流程图、伪代码等

用自然语言表示的求1+2+3+…+6的算法如下:算法1:S1:计算1+2得到3;S2:将第一步中的运算结果3与3相加得到6;S3:将第二步中的运算结果6与4相加得到10;S4:将第三步中的运算结果10与5相加得到15;S5:将第四步中的运算结果15与6相加得到21。算法2:S1:定义循环变量i=1,用于保存和的变量s,并置初值为0;S2:判断i的值是否小于等于6,若是则执行S3,否则跳转到S4执行;S3:将i的值累加到s,然后变量i自身加1,转到S2执行;S4:输出s的值。算法1是最原始的方法,最为繁琐,步骤较多,当加数较大时,比如1+2+3+…+10000,再用这种方法是行不通的;算法2是比较简单的算法,且易于在计算机上执行操作。

用伪代码表示算法伪代码使用介于自然语言和计算机语言之间的文字和符号来描述算法。它使用起来灵活,无固定格式和规范,无图形符号,只要写出来自己或别人能看懂就行,由于它与计算机语言比较接近,便于向计算机语言算法(即程序)过渡。用伪代码描述的1+2+3+…+6算法如下:begin/*算法开始*/1=>i0=>swhilei≤6{s+i=>si+1=>i}printsend/*算法结束*/在程序设计中读者可根据需要和习惯任意选用。

用传统流程图表示算法流程图是一个描述程序的控制流程和指令执行情况的有向图,用流程图表示算法,直观形象,易于理解。美国国家标准化协会(ANSI)规定了一些常用符号如图所示用传统流程图描述计算1+2+3+…+6

的算法

用NS流程图描述计算1+2+3+…+6的算法3.1.3算法设计的要求1.正确性2.易读性3.健壮性4.高效率与低存储量需求3.2基本输入与输出语句用户在程序的运行过程中输入一些数据往往是需要的,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互,所以在程序设计中,输入输出语句是一类必不可少的重要语句,在C语言中,没有专门的输入输出语句,所有的输入输出操作都是通过对标准I/O库函数的调用实现。#include<stdio.h> 3.2.1常用的输入函数常用的输人函数是指从键盘上接收数据的函数,它们是getchar(),gets()和scanf()三个函数。 1.getchar()从键盘读入一个字符。该函数没有参数,它的返回值是一个int型数,即所接收的字符的ASCII码值。可以将该结果赋值给字符变量或整型变量,并自动将用户击键结果回显到屏幕上。 2.gets()该函数的功能是从键盘上获取所键入的字符串。该函数的正常返回值是一个字符型指针,即读取到的字符串的首地址,出错时返回null(null被定义为空)。 3.scanf()标准格式输入函数是指从标准输入设备健盘上读取数据犷并且按所指定的格式将读取的数据赋给相应的变量。该函数的格式如下:intscanf(“控制串”,参数列表)该函数的参数由两部分组成,其中一部分是由双引号括起来被称为控制串,另一部分是参数表,(控制串)中包含格式符和一般字符。格式符是用来说明对应的输入项的格式的。格式符的标识符是百分号(写),它后面跟的字母表示格式的格式说明符。格式说明符如下所示:d---十进制整数

x---十六进制整数

o---八进制整数

u---无符号十进制数

f---小数表示的浮点数

e---指数表示的浮点数

c---单个字符

s---字符串(控制串)中的一般字符表示匹配符,另外在%和格式说明符之间还可加修饰符,这些内容将在后续章节讲解。(参数列表)是由一个或多个参数构成,多个参数使用时用逗号分隔。每个参数用地址值表示。要求参数的个数和类型与控制串中格式符的个数和类型相一致,即要求其个数相等,类型相同。

该函数具有一个整型数的返回值,该返回值表示该函数参数表中成功获得数据的参数的个数。3.2.1常用的输出函数常用的输出函数是指将输出结果显示在屏幕上的函数,它们是putchar(),puts()printf()三个函数。 1.putchar()该函数的功能是将所指定的一个字符输出到屏幕上,即将该字符显示在屏幕上。该函数的格式如下:intputchar(c)

intc;

其中,c是该函数的参数。该函数将c所表示的字符显示在屏幕上。c可以是一个字符常量,也可以是一个字符型变量,还可以是一个表达式。正常情况下。该函数返回输出字符的代码值。出错时,返EOF.例演示如何使用getchar()和putchar()函数。#include<stdio.h>main(){charc;c=getchar();/*从键盘读入一个字符,按回车键结束输入,该字符被存入变量c*/

putchar(c);}

2.puts()该函数的功能是将所指定的字符串显示在屏幕上。gets()和puts()的使用示例将在字符数组中具体介绍 3.printf()该函数是将指定的表达式的值按指定的格式输出到屏幕上,即显示在屏幕上。1.printf函数的一般格式printf(格式控制,输出表列)例如:printf(”i=%d,c=%c\n”,i,c);格式声明1.printf函数的一般格式printf(格式控制,输出表列)例如:printf(”i=%d,c=%c\n”,i,c);普通字符1.printf函数的一般格式printf(格式控制,输出表列)例如:printf(”i=%d,c=%c\n”,i,c);可以是常量、变量或表达式2.常用格式字符d格式符。用来输出一个有符号的十进制整数可以在格式声明中指定输出数据的域宽printf(”%5d%5d\n”,12,-345);%d输出int型数据%ld输出long型数据2.常用格式字符c格式符。用来输出一个字符charch=’a’;

printf(”%c”,ch);或printf(”%5c”,ch);输出字符:a2.常用格式字符s格式符。用来输出一个字符串printf(”%s”,”CHINA”);

输出字符串:CHINA2.常用格式字符f格式符。用来输出实数,以小数形式输出①不指定数据宽度和小数位数,用%f

例3.6用%f输出实数,只能得到6位小数。doublea=1.0;printf(”%f\n”,a/3);

2.常用格式字符f格式符。用来输出实数,以小数形式输出②指定数据宽度和小数位数。用%m.nf

printf("%20.15f\n",1/3);

printf("%.0f\n”,10000/3.0);2.常用格式字符f格式符。用来输出实数,以小数形式输出②指定数据宽度和小数位数。用%m.nffloata;a=10000/3.0;printf("%f\n",a);2.常用格式字符f格式符。用来输出实数,以小数形式输出③输出的数据向左对齐,用%-m.nf2.常用格式字符f格式符。用来输出实数,以小数形式输出float型数据只能保证6位有效数字double型数据能保证15位有效数字计算机输出的数字不都是绝对精确有效的2.常用格式字符e格式符。指定以指数形式输出实数%e,VC++给出小数位数为6位

指数部分占5列

小数点前必须有而且只有1位非零数字printf(”%e”,123.456);

输出:1.234560

e+0022.常用格式字符e格式符。指定以指数形式输出实数%m.neprintf(”%13.2e”,123.456);

输出:1.23e+002(前面有4个空格)2.常用格式字符e格式符。指定以指数形式输出实数%m.neprintf(”%13.2e”,123.456);

输出:1.23e+002(前面有4个空格)3.3顺序结构顺序结构是3种基本程序结构中最基本的程序结构,即程序代码从上至下按顺序执行,前面我们所出现的例子基本都是顺序结构。下面的程序是一个复数加法的例子。#include<stdio.h>main(){floata1,b1,a2,b2;charch;printf("\t\t\tcomplexsAddition\n");printf("pleaseinputthefirstcomplex:\n");printf("\trealpart:");scanf("%f",&a1);printf("\tvirtualpart:");scanf("%f",&b1);printf("%5.2f+i%5.2f\n",a1,b1);printf("\npleaseinputthesecondcomplex:\n");printf("\trealpart:");scanf("%f",&a2);printf("\tvirtualpart:");scanf("%f",&b2);printf("%5.2f+i%5.2f\n",a2,b2);printf("\nTheadditionis:");printf("%6.3f+i%6.3f\n",a1+a2,b1+b2);printf("programnormalterminated,pressenter...");ch=getchar();ch=getchar();}运行结果如下:

complexsadditionpleaseinputthefirstcomplex:realpart:1.2virtualpart:3.4这个例子是最基本的顺序机构C程序,结合了前面介绍的输入输出函数的使用。3.4选择结构程序的流程由多路分支组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。C语言中,提供if语句和switch语句选择结构,if语句用于两者选一的情况,而switch用于多分支选一的情形。对于要先做判断再选择的问题就要使用选择结构(也称为分支结构)。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。如:在数学中,要计算x的绝对值,根据绝对值定义,当x>=0时,其绝对值为x,而x<0时其绝对值是为-x。选择结构分支条件通常用关系表达式或逻辑表达式来表示,实现程序流程的语句由C语言的if语句或switch语句来完成图3-8选择结构流程图图3-8表示,当条件P为真(成立)时执行A框,否则执行B框。无论P是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框。无论走哪条路径,在执行A框或B框之后,都脱离本选择结构。

3.4.1if语句

1.单分支结构2.双分支结构3.多分支结构1.单分支结构if形式:

if(表达式)语句S图3-9单分支结构的流程图执行过程:系统首先计算表达式的值,如果表达式结果不为0,则执行语句S,否则跳过语句S,继续执行其后的其他语句。说明:①“if”是C语言的关键字;“表达式”可以任意合法的C语言表达式,可以是关系表达式或逻辑表达式,也可以是任意的数值类型(包括整型、实型、字符型等);表达式两侧的括号不能省略。②语句S可以是一条语句,也可以是任意合法的复合语句,其位置比较灵活,可以直接出现在if同一行的后面,也可以出现在if的下一行。if语句举例:写出以下程序执行后的输出结果#include<stdio.h>main(){inta=4,b=3,c=5,t=0;if(a<b)t=a;a=b;b=t;if(a<c)t=a;a=c;c=t;printf("%d%d%d\n",a,b,c);}输出结果为:503分析:程序第一行在定义a、b、c、t四个变量的同时进行了初始化。接下来第一个if语句的表达式a<b为假(0),if其后的语句“t=a;”不执行,值得注意的是“a=b;b=t;”不属于if的语句,将被执行,执行后a值为3,b值为0;然后第二个if语句的表达式a<c为真,则执行语句“t=a;”,t值变为3,接着执行“a=c;”,a值变为5,再接着执行“c=t;”,c值变为3;因此,输出结果为:503。计算并输出一个整数的绝对值。分析:计算一个整数的绝对值的关键就是判断该数是否小于0。#include<stdio.h>main(){ intx,y; scanf("%d",&x);/*输入一个整数*/ y=x;/*x大于等于0时,y=x*/

if(x<0)y=-x;/*若x<0成立,y=-x*/

printf("y=%d\n",y);}

2.双分支结构

if-else形式:if(表达式)语句S1else语句S2图3-10双分支结构的流程图执行过程:系统首先计算表达式的值,如果表达式结果不为0,则执行语句S1,否则,执行语句S2。选择结构执行完成后继续执行其后的其他语句。例如:求两个数中的较大值,可用下面的语句:if(a>b)max=a;elsemax=b;将输出绝对值示例用双分支结构实现,程序代码如下:#include<stdio.h>main(){intx,y;scanf("%d",&x);

/*输入一个整数*/if(x<0)y=-x;/*若x<0成立,y=-x,否则y=x*/elsey=x;

printf("y=%d\n",y);}从键盘读入一个字符,以与原来不同的形式进行输出。分析:该题的意图是实现英文字符的输入输出,所谓与与原来不同的形式是指原来输入的是小写字母,则转换为对应的大写字母并输出;原来输入的是大写字母则转换为对应的小写字母并输出。程序实现的步骤是:①从键盘输入一个英文字符;②判断该英文字符的大小写,并转换成对应的字母;③输出转换后的英文字符。该题的关键问题是怎样将判断字符的大小写状态和实现转换。有两种方式实现:一种是根据ASCII码进行判断和转换,小写字母比对应的大写字母的ASCII码大32。另一种方式是利用字符处理函数isupper(ch)判断ch是否为大写字母,是则返回1,否则返回0;islower(ch)函数判断ch是否为小写字母,是则返回1,否则返回0;toupper(ch)函数将ch转换为大写,tolower(ch)函数将ch转换为小写。注意,使用这四个函数需要包含头文件ctype.h。用第一种方式实现的程序如下:#include<stdio.h>main(){ charch; ch=getchar();/*从键盘输入一个英文字符*/

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

/*判断ch是否为小写字母*/

ch=ch-32;

/*ch为小写字母,将其转换为大写*/

else

ch=ch+32;

/*ch为大写字母,将其转换为小写*/ putchar(ch);

/*输出ch*/}运行时,输入:a↙输出:A思考:用字符处理函数怎样实现程序?

3.多分支结构

if-else-if形式:if(表达式1)语句S1elseif(表达式2)语句S2…elseif(表达式n)语句Snelse语句Sn+1执行过程:if-else-if结构实际上是由多个if-else结构组合而成的,系统首先计算表达式1,其值为真(不为0)时,执行语句S1;否则,计算表达式2,其值为真(不为0)时,执行语句S2;…如果if后的所有表达式都不为真,则执行语句Sn+1,并结束整个分支结构。选择结构执行完成后继续执行其后的其他语句。根据输入的成绩等级打印出评语,等级与评语的对应关系如下表:等级评语4Excellent3Good2Average1Poor0Failing分析:该题通过输入成绩的等级(0~4级),转换为对应的评语,是典型的多分支结构,可以用if-else-if结构实现。具体实现步骤为:①输入成绩等级的数字;②对输入的数字进行判断,得到对应的评语;③输出结果。#include<stdio.h>main(){ intgrade; printf("Pleaseinputgrade:"); scanf("%d",&grade);

if(grade==4)printf("Excellent"); elseif(grade==3)printf("Good"); elseif(grade==2)printf("Average"); elseif(grade==1)printf("Poor"); elseif(grade==0)printf("Failing");else

printf("Illegalgrade");}

4.if语句的嵌套

if语句的嵌套是指if或else子句中又包含一个或多个if语句。内层的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。内嵌if语句的一般形式如下:if(表达式1)

if(表达式2)语句1

else语句2else

if(表达式3)语句3

else语句4嵌套的if语句的几种变化形式①只在if子句中嵌套if语句,形式如下:if(表达式1)

if(表达式2)语句1else语句2else语句3②只在else子句中嵌套if语句,形式如下:if(表达式1)

语句1elseif(表达式2)语句2else语句3③不断在else子句中嵌套if语句形成多层嵌套,形式如下:if(表达式1)语句3

语句1…elseif(表达式n-1)if(表达式2)语句n-1

语句2elseelse

语句nif(表达式3)

可以用if-else-if语句形式表示,看起来层次比较分明。

if(表达式1)…语句1…elseif(表达式2)elseif(表达式n-1)

语句2语句n-1elseif(表达式3)else

语句3语句n从键盘输入三个正整数,找出其中的最大数,并输出这个数。流程图如下:#include<stdio.h>main(){inta,b,c,max;scanf("%d%d%d",&a,&b,&c);

if(a>b)if(a>c)max=a;elsemax=c;

else

if(b>c)max=b;elsemax=c;printf("max=%d",max);}注意①注意if与else的配对关系。内嵌结构中,else总是与它上面最近的、未配对的if配对,组成一对if-else语句。②如果if与else的数目不一样,为了避免在if与else配对时出错,建议读者使用“{}”来限定内嵌if语句的范围。如下形式的嵌套语句:if(表达式1){if(表达式2)语句1}else语句2这里,“{}”限定了内嵌if语句的范围,因此else与第一个if配对。思考:如果没有“{}”,else与哪个if配对?例3.15设变量a、b、c、d和y都已正确定义并赋值。若有以下if语句

if(a<b)if(c==d)y=0;elsey=1;该语句所表示的含义是()。A)B)C)D)

3.4.2switch语句

当问题的分支较多(一般大于3个),用if-else-if结构解决时由于分支过多,结构冗长,程序逻辑关系不清晰,通常使用开关语句(switch语句)来简化程序设计。开关语句就像多路开关一样,使程序控制流程形成多个分支,根据一个表达式可能产生的不同结果值,选择其中的一个或几个分支语句去执行。因此,它常用于各种分类统计、菜单等程序设计。switch语句的一般形式switch(表达式){case常量表达式1:语句1;break;case常量表达式2:语句2;break;…case常量表达式n:语句n;break;default:语句n+1;break;}switch结构流程图执行过程:①计算switch后圆括号内表达式的值,然后用该值逐个与case后的常量表达式值进行比较。当找到相匹配的值时,就执行该case后面的语句。若所有case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。②执行完一个case后面的语句后,如果遇到break语句,则跳出switch语句;如果没有break语句,程序转到下一个case处继续执行,并不再进行判断。说明:①switch、case、default、break均是关键字。上述格式中花括号括起来的部分称为switch语句体。switch语句体中可以没有break语句和default部分。②switch后的表达式可以是整型或字符型,不能为实型。每一个case后面的常量表达式的值必须互不相同,常量表达式中不能有变量。③default最多只有一个,位置任意。各个case和default的出现次序不影响执行结果。④多个case可以共用一组执行语句。若有定义:floatx=1.5;inta=1,b=3,c=2;则正确的switch语句是()。A)switch(x){case1.0:printf(“*\n”);case2.0:printf(“**\n”);}B)switch((int)x);{case1:printf(“*\n”);case2:printf(“**\n”);}C)switch(a+b){case1:printf(“*\n”);case2+1:printf(“**\n”);}D)switch(a+b){case1:printf(“*\n”);casec:printf(“**\n”);}3.5循环结构循环控制结构(又称重复结构)是程序中的另一个基本结构。在实际问题中,常常需要进行大量的重复处理,循环结构可以使我们只写很少的语句,而让计算机反复执行,从而完成大量类同的计算。C语言提供了for语句、while语句和do...while语句实现循环结构。

3.5.1while语句

一般形式为:

while(表达式)循环体执行过程:先求表达式的值,当表达式值为非零(为真)时,则执行循环体中的语句(为清楚起见,循环体语句通常用一对花括号括起来,构成复合语句),接着再次判定表达式……,先判定表达式,再执行循环体,这个过程持续进行直到表达式的值为0时,结束循环。特点是:先判断表达式,后执行循环体语句。用while语句,求1+2+3+……+99+100分析:本题的关键是定义循环的判断条件,实现100个自然数求和。定义一个变量i,从1开始,每循环一次加上1,直到i>100为止;再定义一个变量sum存放总和,将其清零,然后,每循环一次加上一个自然数到总和中。流程图如图所示。程序代码如下:#include<stdio.h>main(){inti=1,sum=0;

while(i<=100)

{ sum=sum+i;i++;}printf(“%d\n”,sum);

}从键盘输入一个正整数,计算其阶乘。分析:本题的题意是要求n!,其中n从键盘输入。利用while语句实现循环时,关键是定义循环终止的条件,可以定义一个循环变量i,i从1开始,每循环一次加上1,直到i>n终止,while语句的表达式为i<=n;再定义一个变量sum存放阶乘积,令sum的初值为1(思考:为什么不能为0?),每循环一次乘以一个i。程序代码如下:#include<stdio.h>main(){inti=1,sum=1,n;printf("Pleaseinputn:"); scanf("%d",&n);

while(i<=n) {sum=sum*i;i++; }printf("sum=%d\n",sum);}关于while语句的说明:

①循环体有可能一次也不执行;②循环体语句可以是任意类型语句;

③遇到下列情况退出循环:条件表达式不成立(为0);循环体内遇break,return,goto;④无限循环:当条件表达式始终是非零时,while语句将无法停止。事实上,C语言程序员有时故意用非零常量作为条件表达式来构造无限循环。惯用形式为:while(1)循环体除非循环体含有跳出循环控制的语句(break、return、goto)或者调用了导致程序终止的函数,否则上述这种形式的while语句永远执行下去。

3.5.2

do…while语句

一般形式为:

do

循环体

while(表达式);分号不能少!执行过程:与while语句不同,do…while语句不管条件如何,至少先执行一次循环体内的语句,然后判断while后括号内表达式的值是否为真,若表达式的值非0,即为真,则继续重复执行循环体语句,然后再次计算表达式的值……,当循环体执行后,条件表达式的值变为0时,循环结束。用do…while语句,求1+2+3+……+99+100分析:本题的关键是定义循环的终止判断条件,实现100个自然数求和。定义一个变量i,从1开始,每循环一次加上1,直到i>100为止;再定义一个变量sum存放总和,将其清零,然后,每循环一次加上一个自然数到总和中特点:先执行循环体,然后判断循环条件是否成立。#include<stdio.h>main(){inti=1,sum=0;

do{sum=sum+i;

i++; }while(i<=100);printf("sum=%d\n",sum);}可以看出如果将循环变量i的初值改为101。思考:为什么结果不同?用户任意从键盘输入一个整数,计算其数字的位数。分析:此题的算法是把输入的整数反复除以10,直到结果变为0停止,除法的次数就是这个整数的位数。因为不知道需要多少次除法运算才能达到0,所以程序中需要执行某种循环,用while语句还是do…while语句?显然do…while更合适,因为每个整数,甚至是0,都至少有一位数字。程序代码如下:#include<stdio.h>main(){ intdigits=0,n;/*digits为数字位数,n为输入的整数*/ printf("Enteranonnegativeinteger:");

scanf("%d",&n);

do {n/=10;

digits++; }while(n>0);printf("Thenumberhas%ddigit(s).\n",digits);}程序运行时,输出结果为:Enteranonnegativeinteger:60↙Thenumberhas2digit(s).思考:如果用相似的while循环替换do…while循环会发生什么?当n初始值为0时,结果会一样吗?

3.5.3

for语句

for语句是C语言循环结构中功能最为强大、应用最为灵活、最为广泛的一种形式,它不仅适用于循环次数确定的情况,也适用于循环次数未知的情况。while语句和do…while语句循环均可转换成for循环的形式。一般形式为:

for(表达式1;表达式2;表达式3)循环体说明①for是关键字。②for之后的圆括号内一共有三个表达式,以分号隔开。一般情况下,表达式1的作用是赋初值;表达式2的作用是控制循环,即循环条件;表达式3的作用是修改循环变量的值,一般是赋值。③循环体语句如果只有一条,可以不加花括号;如果循环语句超过一条,则必须加花括号组成复合语句。④圆括号内的三个表达式在语法上都可以省,但两个“;”不能省。执行过程:先执行表达式1;再判断表达式2是否为0,若不为0,则执行循环体语句,执行表达式3,再重新计算表达式2;若表达式2为0,则退出for循环。图3-19for循环流程图for语句和while语句关系密切。事实上,除极少数情况外,for语句总可以用等价的while语句替换:表达式1;while(表达式2){循环体语句;表达式3;}图3-19for循环流程图用for语句,求1+2+3+……+99+100分析:本题用for循环,关键是定义三个表达式,根据题意,要求100个自然数之和,所以定义循环变量i,i初值为1(表达式1:i=1),每循环一次循环变量加1(表达式3:i++),循环一共执行100次,(表达式2:i<=100),循环体语句就是累加循环变量的当前值(sum+=i)。程序代码如下:#include<stdio.h>main(){intsum,i;sum=0;

for(i=1;i<=100;i++) sum+=i;printf("sum=%d\n",sum);}说明:在整个for循环的执行过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次,循环体可能多次执行,也可能一次都不执行,要视条件而定。其中:①表达式1可省略,此时应在for语句前给循环变量赋初值。如:

i=1;for(;i<=100;i++)sum+=i;②表达式2可省略,即不判断循环条件,循环将无终止的进行下去,需要在循环体中用break语句退出循环。如:for(i=1;;i++){if(i>100)break;sum=sum+i;}③表达式3也可省略,但应在循环体中让循环变量产生变化,保证循环能正常结束。如:for(i=1;i<=100;){sum+=i;i++;}④

表达式1和3可同时省略,只给出表达式2(循环条件)。如i=1;for(;i<=100;){s=s+i;i++;}⑤

三个表达式都可省略,但分号不能少。此时在循环体中需要使用相关语句保证循环结束。如:i=1;for(;;){if(i>100)break;sum+=i;i++;}⑥

循环体可以是空语句,空语句用于延时。

for(s=0,i=1;i<=100;s=s+i,i++);打印Fibonacci数列。Fibonacci数列为:1,1,2,3,5,8,13,21,34,…它的规律是:从第3项开始,每一项都是其前两项之和。分析:根据上述规律,假设c为所求的项,a为其前二项(a的初值为1),b为其前一项(b的初值为1),则c=a+b(从第3项开始)。因此,迭代公式为:

c=a+b;

a=b;/*为下一次迭代作准备*/

b=c;然后通过循环不断迭代,得出所求数列。#include<stdio.h>main(){ inta,b,c,n,i; a=1;b=1; printf("Entern:"); scanf("%d",&n);/*输入数列的打印项数*/ printf("%10d%10d",a,b);/*打印第1项和第2项*/

for(i=3;i<=n;i++)/*求数列的第3~n项*/

{ c=a+b;/*求第i项*/ a=b;/*为下一次迭代作准备*/ b=c;

printf("%10d",c);/*输出第i项,右对齐*/ if(i%5==0)printf("\n");/*每行输出5项*/ } printf("\n");}程序运行时,输入:40↙输出结果如下图:

循环结构的嵌套

循环结构中的循环体语句可以是任何合法的C语句,while、do…while、for语句是合法的C语句,当然也能出现在循环体中,这种循环体中又包含了另一个完整的循环结构,称为循环的嵌套。内嵌的循环还可以嵌套循环,这就是多层循环。while、do…while、for三种循环可以相互嵌套,层数不限。但最常用的是二重循环或三重循环,如果嵌套的层数更多,会增加程序阅读、理解的困难,给程序调试带来麻烦。嵌套循环的执行过程:首先执行外循环,然后执行内循环,外循环每执行一次,内循环就完整地执行一遍。若内循环中还存在嵌套的循环,则进入下一层嵌套循环结构中,顺序执行有关的循环结构。若在某层循环结构中嵌套了两个或多个并列的循环结构,则从外循环进入时,顺次执行这些并列的循环结构。例如:输出如下图所示图形,可以用单层循环实现:#include<stdio.h>main()*****{*****inti;*****for(i=1;i<=5;i++)*****

printf(“*****\n”);*****}

语句“printf(“*****\n”);”的功能等价于以下的循环结构:for(j=1;j<=5;j++)printf(“*”);printf(“\n”);进行一个等价替换,就可以得到以下的嵌套循环:#include<stdio.h>main(){inti,j;for(i=1;i<=5;i++)

{for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}整元换零钱问题。把1元兑换成1分、2分和5分的硬币,共有多少种不同换法?(每种至少一个)分析:本题是一个穷举法问题。穷举是一种重复型算法。它的基本思想是,对问题的所有可能状态一一测试,直到找到解或者将全部可能状态都测试过为止。设5分硬币的可能个数为i,则i的取值范围应为1~19;设2分硬币的可能个数为j,则j的取值范围应为1~(100-i*5)/2-1;而1分的硬币个数应是100-5*i-2*j。设共有m种换法。为了方便阅读和计数,每10种换法中间空一行。#include<stdio.h>main(){ inti,j,m; m=0;

for(i=1;i<=19;i++) for(j=1;j<=(100-i*5)/2-1;j++) { printf("%d\t%d\t%d\n",i,j,100-5*i-2*j); m++; if(m%10==0)printf("\n");

} printf("\nm=%d\n",m);}3.6控制转移语句有时,我们需要在循环体中提前跳出循环,或者在满足某种条件下,不执行循环中剩下的语句而立即从头开始新的一轮循环,这时就要用到break和continue语句。 1.break语句break语句结束整个循环过程,不再判断执行循环的条件是否成立 2.continue语句continue语句只结束本次循环,而不是终止整个循环的执行N表达式1Y表达式2N……Y…………N表达式1Y表达式2NY…………break语句continue语句强行退出循环只结束本次循环例5.6输出以下4*5的矩阵。12345246810369121548121620解题思路:可以用循环的嵌套来处理此问题用外循环来输出一行数据用内循环来输出一列数据按矩阵的格式(每行5个数据)输出#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}累计输出数据的个数控制一行内输出5个数据#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}双重循环#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}控制输出4行#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++)

温馨提示

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

评论

0/150

提交评论