在ObJC中,有若干方法可以重复执行一系列代码,这些重复执行的功能称之为循环功能,它们由以下几部分构成:
举一个简单的例子,如果想求10以内所有整数之和:(代码如下)
只需要将十以内的整数进行相加运算就可以,甚至在大脑中进行运算就可以。但是如果是100以内的整数相加,那么大部分人都会感到头疼,这时候就可以通过一些特殊的方法来解决如下问题。
至此引入循环结构——计算机的基本属性之一就是它可以重复执行一组语句。这种循环能力让程序员能够开发出包含重复过程的简洁程序,这些过程能够以不同的方式执行成百上千的程序语句。ObJC中包含3种用于编写循环结构的程序语句。
------for语句
计算100以内所有整数之和。
打印结束后 结果为:5050.
从中我们可以看到,由于引用了for()循环语句,相当于计算机自动帮助我们叠加n的值,直到n<101(n=100),而计算机一边帮我们叠加n的值,一边帮我们计算sum的值。
那么sum的值是如何计算的呢。首先先解释for语句的一般格式:
for(init_expression;loop_condition;loop_expression)
program statement
圆括号中的三个表达式,建立了程序循环的“环境”。其后的program statement(要以分号结尾),可以是任何ObJC语句,但是必须是合法的。它们组成循环体。这条语句执行的次数由for语句中设置的参数决定。
for语句的第一部分标着init_expression用于再循环开始之前设置初始值;第二部分标着loop_condition用于指定继续执行循环所需的条件(只要满足既定的条件,那么程序就会继续执行),如果循环不在满足既定的条件,那么程序就会停止循环,跳出循环之后继续执行循环体外的程序(在上个代码中就会继续执行NSlog(@"SUM=%d",sum);)。到这,关于sum的值是如何计算的,应该已经非常明确了,
(sum+=n)等价于(sum=sum+n),循环满足条件,n每次循环都会增加1(n++),那么每一次新的循环后等待求和的sum就等于上次循环得到的sum值加上新n值。
直到满足循环条件,循环结束。
总之,for语句将按以下步骤执行:
代码:生成三角数表的程序
打印结果:
在上个代码中,前三个NSlog语句的目的仅仅是提供总标题和输出列的标题。在显示适当的标题后,程序将计算前10个三角数,在你计算1-n的和时,使用变量n记录当前的数字,使用变量sum存储n的三角数值。(最后一行没对齐,如果想对齐,可将最后的NSlog修改为:NSlog(@"%2i %i",n,sum);)
键盘输入:如果我们不想计算前100个整数的和,改为计算前200,前500的整数之和,除了去代码中修改,还有一个更简单的方法,就是自己控制想要求多少以内的数的和,用键盘输入。
打印结果为:
本人输入的是59,那么计算机将计算1-59的和=1770。
那么问题又来了,如果我想要不断的计算不同的数,该怎么办?我们引入嵌套循环。
在循环中,考虑到需要人为终止循环,否则将会一直无休止的循环下去,所以我添加了变量stop并设置初值为1,也就是说循环开始只循环一次,然后在循环中加入stop++,这样每次循环结束,都会开始新一轮循环直到你感到厌烦想要终止这一切,按照本人现在的水平,只能写出按0退出的程度,不过也大体上符合了人道主义精神(我十分相信,如果我不加终止,那么如果有人看到这个程序,并且尝试了那么肯定有那么一个执着的人相信循环会有尽头。。。)
言归正传,第一个for循环主要解决用户要计算多少个整数之和的问题,而第二个for循环解决这个整数的和是多少的问题。
该程序的其他位置都没有使用counter这个变量,它的作用仅仅是充当循环计数器,但是,因为它是一个变量,所以必须在程序中声明。
如果将该程序转变成我们都能看得懂的语言那么就是:
一共循环运行5次!{
让用户输入他想计算的整数,如果他不想输入了就按0退出。
得到他输入的整数,并且计算出结果。
将结果打印出来。
}
------while语句
while语句进一步扩展了ObJC语言中得循环功能指令系统。while语句经常使用的语句语法如下:
while(expression)
program statement
圆括号中得expression将被求值。如果表达式求值的结果为true,则执行随后的语句(program statement),执行完这条语句(或位于花括号中得一组语句之后),将再次对表达式求值,若果求值结果为true,将再次执行循环语句。直到表达式的最终求值结果为false时,循环终止,然后执行program statement之后的语句。
试着用while语句求1-100的整数和:
打印结果为5050。
从以上程序中会发现,使用for语句同样可以方便的完成该任务。事实上,for语句都可转换成等价的while语句,反之亦然。比如说,下面的这个for语句语法结构可以转换成while语句语法结构
for(init_expression;loop_condition;loop_expression)
program statement
改为while语句后:
init_expression;
while(loop_condition){
program statement
loop_expression;
}
来一个求两个数最大公约数(greatest common divisor)的代码:
不说明最大公约数(简称为gcd)是什么,只说明求出gcd的步骤:
搞定,运行结果是如图所示。
继续来一个,打印一个数字各位数的程序。