i取值从0到n-1:
写此文章的最初目的:
本人最近在教准备考研跨考计算机的女朋友C++程序设计,但是她在for循环这一板块有严重薄弱与理解困难。同时我想到在以往的学习中有不少同学也在for循环中绕晕,摔跟头,因此我打算自己写博客,细说让所有新人“似懂非懂”“模棱两可”的for语句。
什么是for循环:
for 循环是允许你编写一个执行特定次数的循环的语句。
首先我们需要明白,最终我们要靠for循环实现的,是一个执行特定次数的任务。
因此我们需要把一个个问题,抽象成可以“重复多次”的问题。
假设让你输出一个"Hello",你可能会觉得,“这还不容易?不就是cout<<"Hello"<<endl;吗”
那假设让你输出两个"Hello",你可能会想把cout重复两次。
那如果执行一百次呢?此时重复显然是不适用的了,因此需要引入for循环。
for(int i=0;i<100;i++){
cout<<"Hello"<<endl;
}
这是一个最简单的输出一百次"Hello"的方法。
让我们来剖析一下这段代码的结构以及执行过程。
为方便起见,我们给代码的每一段标个号。
for(int i=0 --1--;i<100 --2--;i++ --3--)
cout<<"Hello"<<endl;
--4--
}
首先解释一下每一段的内容。
--1--:int i=0代表初始化,如果你想要执行n次指令,一定需要有一个计数器,从1数到n(或0数到n-1)吧?那么int i = 0就是约定俗成的计数器,你可以任意取名字,可以从0或者1开始,相对应的限定条件也要发生改变。此处也可以省略,也就是说计数器可以之前就定义好。
--2--:循环能够执行的条件,类型为bool。意思也就是说,假如你把此处填为true,那么循环就会一直进行(除非你写了break;)此处因为我们需要执行100次,于是就需要i<100。
有同学会问,为什么不写成i<=100?的确,这是个很容易混淆的问题,别急,等我随后理清for语句执行过程你就明白了。
--3--:此处代表循环体结束之后需要执行的内容。当我们执行完一次任务之后,是否需要让计数器记一次数呢?这个板块就是用于干这个的。我们可以让i++,让它自增1,由此增加一次计数。此处如果省略或者写成i--,那么也会造成死循环。
--4--:循环体所需要执行的部分,也就是你要执行的具体命令。
接下来的内容至关重要。我们需要了解一个for语句的执行顺序。
按照上文的编号,执行顺序依次是:
1→2→4→3→2→4→3→2→4→3→2→4→3→……→2
当某一次--3--执行完时,我们会发现--2--已经不满足条件了。
以上文举例,当执行完100次之后,i会从99变成100,不满足i<100,因此循环退出。
那么为什么要写成i<100而不是i<=100呢?
从上文我们可以看到,for循环刚开始执行的顺序是1→2→4→3,
也就是说当第一次循环开始执行时,i还是初始值0,执行完第一次i才变成1
也就是说:
第1次执行→i =0
第2次执行→i =1
...
第100次执行→i =99
当第一百次执行完之后,进行--3--部分,也就是i++时,此时i=100,不符合i<100,循环退出。倘若把--2--部分的i<100改成i<=100,不就要执行第101次了吗?
如果经过以上点播已经明白了为什么要这样,那么恭喜你,你已经入门了。
(同样的,以上的i<100可以写成i<=99,原因自己推理。)
请注意,这里的1,2,3,4部分都是可以自定义的,甚至都可以空着,可以单纯写个for(;;){}的空死循环。
如果把循环“倒着执行”,也就是让计数器从大到小,那也完全ok.
for(int i=100;i>0;i--){
cout<<"Hello"<<endl;
}
第1次执行时,i=100
第2次执行时,i=99
...
第100次执行时,i=1
当第100次执行完后,i--,i=0,此时不满足i>0条件,于是退出。
i>0同样可以写成i>=1.
如果突然分辨不清楚要不要加=,可以从小类推。例如
for(int i=1;i>0;i--){
cout<<"Hello"<<endl;
}
第一次执行cout时,i=1,执行完之后i--,i=0,不满足i>0,因此执行一次。所以在i=1;i>0的情况下执行一次。
以此类推,i=100;i>0的情况下执行一百次。
如果你还是一头雾水,实在没办法学,那只能记一些常用的结论了。
但是如果可以的话一定要把上文的内容理清楚,这样才能以不变应万变。
i取值从0到n-1,执行n次:
//从0到n-1,执行n次
for (int i=0;i<n;i++){
//代码
}
i取值从1到n,执行n次:
//从1到n,执行n次
for (int i=1;i<=n;i++){
//代码
}
i取值从n-1到0,执行n次:
//从n-1到0,执行n次
for (int i=n-1;i>=0;i--){
//代码
}
i取值从n到1,执行n次:
//从n到1,执行n次
for (int i=n;i>=1;i--){
//代码
}
最后,只学会机械地重复同一段代码是没有达到要求的。在实际的题目和程序中,计数变量i同样发挥着很大效用。
例如让你输出1-1000所有质数,你需要建立一个1-1000的for循环,每当i++后,就要判断它是不是质数,如果是质数就输出。
bool isPrime(int num){
//..省略
}
///
///
for(int i=1;i<=1000;i++){
if(isPrime(i)){
cout<<i<<" ";
}
}
相关题目: