C20程序设计第5章循环结构_第1页
C20程序设计第5章循环结构_第2页
C20程序设计第5章循环结构_第3页
C20程序设计第5章循环结构_第4页
C20程序设计第5章循环结构_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

C20程序设计第5章循环结构5循环结构在Objective-C中,有若干方法可以用于重复执行一系列代码。本章的主题是这些循环功能,它们由以下几部分组成:for语句while语句do语句

从一个简单的例子——计数开始讨论。C20程序设计第5章循环结构5循环结构代码清单5-1---------------------------------------------------------------------------------------------------#import<Foundation/Foundation.h>//Programtocalculatetheeighthtriangularnumberintmain(intargc,char*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];inttriangularNumber;triangularNumber=1+2+3+4+5+6+7+8;NSLog(@”Theeighthtriangularnumberis%i”,triangularNumber);[pooldrain];return0;}输出:Theeighthtriangularnumberis36C20程序设计第5章循环结构第5章循环结构do语句5.3break语句5.4while语句5.2循环结构5.1continue语句5.5小结5.65.1for语句代码清单5-2的目的是计算第200位三角数。代码清单5-2---------------------------------------------------------------------------------------------------//Programtocalculatethe200thtriangularnumber//Introductionoftheforstatement#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intn,triangularNumber;

triangularNumber=0;

for(n=1;n<=200;n=n+1)

triangularNumber+=n;

NSLog(@”The200thtriangularnumberis%i”,

triangularNumber);}return0;}输出:The200thtriangularnumberis20100C20程序设计第5章循环结构5.1for语句用于计算第200位三角数的方法其实与5-1中用于计算第8位三角数的方法是相同的,就是求1到200之间的整数之和。在执行for语句之前,变量triangularNumber被设置为0。一般来说,在程序使用变量之前,需要将所有的变量初始化为某个值。虽然某些类型的变量将被给定默认值,但是无论如何都应该为变量设置初始值。for语句提供的机制可使你避免显示地写出1到200之间的每个整数。从某种意义上讲,这条语句将为你生成这些数字。C20程序设计第5章循环结构5.1for语句for语句的一般格式如下:for(init_expression;loop_condition;loop_expression)programstatement;

圆括号中的3个表达式init_expression,loop_condition和loop_expression建立了程序循环的“环境”。其后的programstatement可以是任何合法的Objective-C程序语句,它们组成循环体。这条语句执行的次数由for语句中设置的参数决定。

C20程序设计第5章循环结构5.1for语句for语句的第一部分init_expression,用于在循环开始之前设置初始值。在代码清单5-2中,for语句这个部分将n的初始值设置为1。for语句的第二部分loop_condition用于指定继续执行循环所需要的条件。换言之,只要满足这个条件,循环就将继续执行。在代码清单5-2中,loop_condition是由以下关系表达式指定的:n<=200;在这个例子中,只要n的值小于或等于200时,构成for循环体的程序语句triangularNumber+=;将被重复执行。当不再满足loop_condition条件时,程序继续执行for循环之后的程序语句。for语句的最后一部分loop_expression在每次执行循环体之后求值。在代码清单5-2中,loop_expression的作用是将n的值加1。因此,每次把n的值加到triangularNumber之后,它的值都要加1。值得注意的是,你的最终值201将不会加到triangularNumber的值上,因为只要不再满足循环条件,循环就会终止。C20程序设计第5章循环结构5.1for语句总之,for语句将按以下步骤执行:先求初始表达式的值。这个表达式通常设置一个将在循环中使用的变量,对于某些初始值来说,通常称作索引变量。求循环条件的值,如果条件不满足,循环就立即终止。然后执行循环之后的程序语句。执行组成循环体的程序语句。求循环表达式的值。这个表达式通常用于改变索引变量的值,最常见的情况是,将索引变量的值加1或减1。返回到步骤2.

记住:循环条件要在进入循环时,在第一次执行循环体之前立即求值。还要记住:不要再循环末尾处的结束圆括号后面放置分号。这将导致循环立即终止。C20程序设计第5章循环结构5.1for语句在代码清单5-2中的for语句第二部分,有关系表达式n<=200;这个表达式中的运算符“<=(小于或等于)”仅是Objective-C程序设计语言提供的若干关系运算中的一个。这些关系运算用于测试特定的条件。表5-1列出了Objective-C中可用的所有关系运算符。表5-1关系运算符运算符含义例子==Equaltocount==10!=Notequaltoflag!=DONE<Lessthana<b<=Lessthanorequaltolow<=high>Greaterthanpoints>POINT_MAX>=Greaterthanorequaltoj>=0C20程序设计第5章循环结构5.1for语句关系运算符的优先级比所有的算术运算符的优先级都低。这意味着,如下表达式:a<b+c将按a<(b+c)来求值。要特别注意等于运算符(==),不要将其与赋值运算符(=)混淆。表达式a==2用于测试a是否等于2,而表达式a=2是将2赋值给a。C20程序设计第5章循环结构5.1for语句代码清单5-3---------------------------------------------------------------------------------------------------//Programtogenerateatableoftriangularnumbers#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intn,triangularNumber;

NSLog(@”TABLEOFTRIANGULARNUMBERS”);

NSLog(@”nSumfrom1ton”);

NSLog(@”----------”);

triangularNumber=0;

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

triangularNumber+=n;

NSLog(@”%i%i”,n,triangularNumber);

}}return0;}输出:TABLEOFTRIANGULARNUMBERSn Sumfrom1ton----------- ----------------------------1 12 33 6

4 10

5 15

6 21

7 28

8 36

9 4510 55C20程序设计第5章循环结构5.1for语句在代码啊清单5-3中,前3个NSLog语句的目的仅仅是提供一个普通标题并标记输出列。在显示适当的标题后,程序将计算前10个三角数。变量n用于记录当前的数字,而变量triangularNumber用于存储第n个三角数的值。前面提到过,在for语句之后的程序语句构成了程序循环的主体。但是如果不只想执行单个程序语句,而是想执行一组语句,可以把这样的程序语句放入一对花括号中。系统会把这组语句看做单个实体。C20程序设计第5章循环结构5.1for语句在for语句的第三个部分中,有一个表达式:

++n;它意味着n=n+1;事实上,++n其实是相当合法的Objective-C表达式。它引入了Objective-C程序设计语言中的一个新运算符——自增运算符。双加号(或叫做自增运算符)的作用是将运算数加1。加1运算在程序设计中很常见。因此,表达式++n等价于表达式n=n+1;与自增运算符相对的,是自减运算符。用Objective-C书写的表达式bean_counter=bean_counter-1可用自减运算符等价地表示成:

--bean_counter;

一些程序员喜欢将++或--放到变量名后面,如n++或bean_counter--。这种情况是可以接受的,只不过是个人喜好问题。C20程序设计第5章循环结构5.1for语句你可能已经注意到,代码清单5-3输出的最后一行没有对齐。使用以下NSLog语句来代替相应的语句,可以改正这个小毛病。

NSLog(“%2i%i”,n,triangularNumber);NSLog语句所做的主要改动是它包含了字段宽度的说明。字符“%2i”告知NSLog例程:不仅在特定点显示整数值,而且要展示的整数应该占用显示器的两列。通常占用空间少于两列的任何整数(即0到9之间的整数)在显示时都带有一个前导空格。这种情况称为向右对齐。C20程序设计第5章循环结构5.1.1键盘键入代码清单5-2可计算出第200个三角数,但不能计算更多。如果要计算第50或者第100个三角数,就不得不更改程序,以便for循环可以执行合适的次数。还必须更改NSLog语句来显示正确的信息。使用一个名为scanf的例程,可以解决上述问题。在概念上,scanf例程与NSLog例程类似。但NSLog例程用于显示值,而scanf例程的用途是程序员可以把值输入到程序中。当然,如果使用图形用户界面编Objective-C程序,那么在程序中可能根本不用NSLog或scanf。C20程序设计第5章循环结构5.1.1键盘键入代码清单5-4---------------------------------------------------------------------------------------------------#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intn,number,triangularNumber;

NSLog(@”Whattriangularnumberdoyouwant?”);

scanf(“%i”,&number);

triangularNumber=0;

for(n=1;n<=number;++n)

triangularNumber+=n;

NSLog(@”Triangularnumber%iis%i\n”,number,

triangularNumber);}return0;}C20程序设计第5章循环结构5.1.1键盘键入在后面的程序输出中,用户键入数字100,可以得到相应的输出结果。代码清单5-4输出:Whattriangularnumberdoyouwant?100Triangularnumber100is5050

依照输出,可以看出数字100是由用户键入的。然后该程序计算第100个三角数并将结果5050显示在终端上。如果用户想要计算一个特定的三角数,可以随便键入10或者30。C20程序设计第5章循环结构5.1.1键盘键入在代码清单5-4中,第一个NSLog语句:NSLog(@”Whattriangularnumberdoyouwant?”);用于提示用户键入数字。到这时,程序会停止等待,直到用户输入数字后,才继续执行下面的代码。

当用户输入数字后,程序调用scanf例程接收输入。scanf(“%i”,&number);scanf的第一个参数是格式字符串。它不以@字符开头。格式字符串告知scanf要从控制台读入的值类型。和NSLog一样,%i字符用于指定整型值。scanf例程的第二个参数用于指定将用户键入的值存入到哪个变量中。在这种情况下,变量number之前的&字符是必须的。但不用担心它在此处的功能。所以程序调用scanf,指定要输入整型值并将其存储到变量number中。键入了希望的数字后,按下键盘上的enter键,表示该数字的键入工作已完成。程序便接下去执行后续的代码。C20程序设计第5章循环结构5.1.2嵌套的for循环代码清单5-4向用户提供了一下灵活性:使程序计算出任何想要的三角数。但是假设用户要计算5个三角数的列表。在这种情况下,用户可简单地将程序执行5次,每次键入要计算的列表中下一个三角数即可。实现相同目的的另一个办法是,通过向程序中插入循环,将整个过程重复执行5次。代码清单5-5及其输出说明了执行过程。C20程序设计第5章循环结构5.1.2嵌套的for循环代码清单5-5---------------------------------------------------------------------------------------------------#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intn,number,triangularNumber,counter;

for(counter=1;counter<=5;++counter){

NSLog(@”Whattriangularnumberdo

youwant?”);

scanf(“%i”,&number);

triangularNumber=0;

for(n=1;n<=number;++n)

triangularNumber+=n;

NSLog(@”Triangularnumber%iis%i”,number,

triangularNumber);

}}return0;}C20程序设计第5章循环结构5.1.2嵌套的for循环代码清单5-5输出---------------------------------------------------------------------------------------------------Whattriangularnumberdoyouwant?12Triangularnumber12is78Whattriangularnumberdoyouwant?25Triangularnumber25is325Whattriangularnumberdoyouwant?50Triangularnumber50is1275Whattriangularnumberdoyouwant?75Triangularnumber75is2850Whattriangularnumberdoyouwant?83Triangularnumber83is3486C20程序设计第5章循环结构5.1.2嵌套的for循环该程序包含两层for循环。最外层的for循环语句如下:for(counter=1;counter<=5;++counter)这条语句指定该程序循环正好执行5次。与上一个程序例子不同,程序的其他位置都没有使用变量counter。它的作用仅仅是充当for循环语句中的循环计数器。C20程序设计第5章循环结构5.1.3for循环的变形编写for循环时,你可能发现在开始循环之前需要初始化多个变量,或者可能每次循环都要计算多个表达式。for循环的任何位置都可包含多个表达式,只要使用逗号分隔这些表达式。例如,使用以下形式开始for循环:

for(i=0,j=0;i<10;++i)……在循环开始前,将i的值设为0,将j的值设为0。两个表达式i=0和j=0通过逗号隔开,而两者都是循环init_expression部分。另一个例子:

for(i=0,j=100;i<10;++i,j-=10)...的for循环设置了两个索引变量:i和j,在循环开始之前,它们分别被初始化为0和100。每次执行完循环体之后,i的值加1,j的值减10。就像可能希望for循环的特定字段包含多个表达式一样,可能还需要省略语句中的一个或多个字段。通过省略指定的字段并使用分号标记其位置。省略for语句中的某个字段的最常见情形发生在无需计算初始表达式的值时。在这种情况下,init_expression字段可以简单的留白,只要任然包括分号即可:

for(;j!=100;++j)...如果在进入循环之前已经设置了初始值,则可采用这条语句。C20程序设计第5章循环结构5.1.3for循环的变形省略loop_condition字段的for循环可有效地设置无限循环,就是理论上执行无限次循环。只要有其他方式退出循环(执行return,break或goto语句),就可以使用这一循环。在for循环中,还可定义一个变量作为初始表达式的一部分。使用以前定义变量的传统方式可实现:

for(intcounter=1;counter<=5;++counter)变量counter只在for循环的整个执行过程中是已知的(它名为局部变量),并且不能在循环体外部访问。作为另一个例子:

for(intn=1,triangularNumber=0;n<=200;++n) triangularNumber+=n;定义了两个整型变量,并相应地设置了它们的值。C20程序设计第5章循环结构第5章循环结构do语句5.3break语句5.4while语句5.2continue语句5.5小结5.6循环结构5.15.2while语句while语句进一步扩展了Objective-C语句中的循环功能指令系统。这个经常使用的结构的语法如下:

while(expression) programstatement圆括号中指定的expression将被求值。如果求值的结果是true,则执行随后的programstatement。执行完这条语句后,将再次对expression求值。继续这个过程直到expression的最终求职结果是false为止。然后,继续执行programstatement之后的语句。C20程序设计第5章循环结构5.2while语句代码清单5-6-----------------------------------------------------------------------------------------------------//Thisprogramintroducesthewhilestatement#import<Foundation/Foundation.h>#import<stdio.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intcount=1;

while(count<=5){

NSLog(@”%i”,count);

++count;

}}return0;}输出:12345C20程序设计第5章循环结构5.2while语句从以上程序可以意识到,使用for循环一样可以方便地完成该任务。事实上,for循环都可以转换成等价的while语句,反之亦然。例如下面的for循环:

for(init_expression;loop_condition;loop_expression) programstatement可用while语句的形式等价地表示:

init_expression;while(loop_condition){programstatementloop_expression;}熟悉使用while语句之后,将对何时用while语句更合理以及何时用for语句有更好的认识。一般来说,最先选用for语句来实现执行预定次数的循环。同样,如果初始表达式,循环表达式和循环条件都涉及同一变量,那么for语句很可能更适合。C20程序设计第5章循环结构5.2while语句下一个程序提供了使用while语句的另一个例子。这个程序计算两个整数值的最大公因子(greatestcommondivisor,一下简称gcd)。问题:找出两个非负整数u和v的最大公因子。步骤1:若v等于0,则结束,gcd等于u。步骤2:计算temp=u%v,u=v,v=temp并回到步骤1。

不要过分关注上述算法的运行细节。代码清单5-7找出用户键入的两个整数的gcd。C20程序设计第5章循环结构5.2while语句代码清单5-7-----------------------------------------------------------------------------------------------------//Thisprogramfindsthegreatestcommondivisor//oftwononnegativeintegervalues#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

unsignedintu,v,temp;

NSLog(@”Pleasetypeintwononnegative

integers.”);

scanf(“%u%u”,&u,&v);

while(v!=0){

temp=u%v;

u=v;

v=temp;

}

NSLog(@”Theirgreatestcommondivisoris%u”,u);}return0;}C20程序设计第5章循环结构5.2while语句输入两个整型值并分别存储到变量u和v(只用%u格式字符读入一个无符号的整型值)之后,程序进入一个while循环来计算它们的最大公因子。退出while循环之后,u的值会显示出来,即代表v和u的原始值的gcd,并显示一条适当的消息。C20程序设计第5章循环结构5.2while语句对于下一个说明while语句的程序,设想的任务是反转从终端输入的整数位。例如,如果用户键入数字1234,该程序将把这个数字的位颠倒过来,并显示4321.通过将整数除以10之后取其余数,可提取整数最右边的数字。例如,1234%10会得出值4,就是1234最右边的数字,也是第一个要颠倒的数字。通过将数字除以10,可以获得下一个数字。因此1234/10的结果为123,而123%10的结果为3,它是颠倒数字的下一个数。这个过程可以一直执行,知道计算出最后一个数字为止。一般情况下,如果最后一个整数除以10的结果为0,那么这个数字就是最后一个要提取的数字。C20程序设计第5章循环结构5.2while语句代码清单5-8-----------------------------------------------------------------------------------------------------//Programtoreversethedigitsofanumber#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){

@autoreleasepool{

intnumber,right_digit;

NSLog(@”Enteryournumber.”);

scanf(“%i”,&number);

while(number!=0){

right_digit=number%10;

NSLog(@”%i”,right_digit);

number/=10;

}}return0;}输出:Enteryournumber.1357997531C20程序设计第5章循环结构第5章循环结构break语句5.4do语句5.3continue语句5.5小结5.6循环结构5.1while语句5.25.3do语句迄今为止,本章讨论的这两个循环结构都要在循环开始前测试一组条件。因此如果条件不满足,那么可能永远都不会执行循环体。开发程序时,有事需要在循环结尾(而不是在开始)处执行测试。Objective-C语言也提供了专门的语言结构用于处理这种情况,即do语句:

do programstatementwhile(expression);do语句按以下过程执行:首先执行programstatement。其次,求圆括号中expression的值,如果expression的求值结果为true,循环将继续,并再次执行programstatement。只要expression的计算结果为true,就将重复上述过程。当expression的值为false时,循环终止并以正常顺序执行程序中的下一条语句。do语句只是while语句的简单转置,它把循环条件放在循环的结尾而不是开头。代码清单5-8使用while语句来翻转数字中的各个位。在5-8中,若用户输入的是0而不是1234,while循环中的语句永远不会执行。如果用do语句代

温馨提示

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

评论

0/150

提交评论