C++语言提供了多种循环语句,可以组成不同形式的循环结构。
(1)while
(2)do...while
(3)for
另外,if语句和goto语句也可以构成循环结构。
goto语句:一种无条件转移语句。
书P47,例 3-13:
用goto 语句和if语句构成循环,求∑1~100,源程序:
#include <iostream>
using namespace std;
int main()
{
int i, sum = 0;
i = 1;
loop:if (i <= 100)
{
sum = sum + i;
i++;
goto loop;
}
cout << i << endl;
cout << sum << endl;
}
结果:
归纳整理得,该程序整体处理执行流程流程图如下:
输入中遇到的问题:
#include <iostream>
using namespace std;
int main()
{
int i, sum = 0;
i = 1;
loop:if (i <= 100)
{
sum = sum + i;
i++;
goto loop;
cout << i << endl;
cout << sum << endl;
}
}
“}”放错位置,结果导致:
在这里,实际上程序到goto loop永远会跳到前面的loop语句中
也就是说后面的语句 cout << i << endl; cout << sum << endl;永远不会被执行,
哪怕程序所有执行完毕,i等于101。 cout << i << endl; cout << sum << endl;
这两个语句永远都不会执行一次。
所以永远没有输出。
书P48,例 3-14:
用while语句求∑1~100
设计该程序时的设计思路
1.输出循环最后一次务必要让i等于100(sum的累加之中带入的最后的i必须等于100)
2.要考虑到无论where语句成不成立,语句至少要执行一次,也就是说至少要有一个输出。
源程序:
#include <iostream>
using namespace std;
void main()
{
int i, sum = 0;
i = 1;
//注意:这里,虽然sum是变量
//但是依然要(对sum)赋初值
while (i <= 100)
{
sum = sum + i;
i++;
}
cout << sum << endl;
}
这里输入99时,sum=∑1~99,i(OUT)=100,继续循环。输入100时,sum=∑1~100
i(OUT)=101,结束循环。所以i(OUT)=101。
我们在此基础上举一反三,同时输出i:
一:
#include <iostream>
using namespace std;
void main()
{
int i, sum = 0;
i = 1;
while (i <= 100)
{
sum = sum + i;
i++;
}
cout << i << endl
<< sum << endl;
}
二:(结果同"一"一样,下面不再赘述)
#include <iostream>
using namespace std;
void main()
{
int i, sum = 0;
i = 1;
while (i <= 100)
{
sum = sum + i;
++i;
}
cout << i << endl
<< sum << endl;
}
三:
#include <iostream>
using namespace std;
void main()
{
int i, sum = 0;
i = 1;
while (i <= 100)
{
++i;
sum = sum + i;
}
cout <<i<<endl
<< sum << endl;
}
结果就和上面的不同了:
四:(结果同"三"一样,下面不再赘述)
#include <iostream>
using namespace std;
void main()
{
int i, sum = 0;
i = 1;
while (i <= 100)
{
i++;
sum = sum + i;
}
cout <<i<<endl
<< sum << endl;
}
为什么?
根据上述结果,我们可以根据结果绘制表格如下:
sum = sum + i; i++; | sum = sum + i; ++i; | 101 5050 |
++i; sum = sum + i; | i++; sum = sum + i; | 101 5150 |
为什么?
答案其实很简单:因为
自增运算符只在单个语句内有效,自增运算的功能单位为单个语句。
具体表现形式为:用分号隔开
详细具体解释说明见:自增运算符附加说明_宇 -Yu的博客-CSDN博客 例2。
书P48,例 3-15:分析以下程序的运行结果:
#include <iostream>
using namespace std;
void main()
{
int a = 0, n;
cout << "input n: ";
cin>>n;
while
(n--)//即(n--)>=0就运行(执行)
cout << (a++ * 2) << "\t";
}
具体运行流程如下:
书P49 例 3-16:用do...while语句求∑100
#include <iostream>
using namespace std;
void main()
{
int i, sum = 0;
i = 1;
do
{
sum = sum + i;
i++;
} while (i <= 100);
cout << sum << endl;
}
举一反三,同时输出i:
具体各种操作,详见:书P49 例 3-16:用do...while语句求∑100 举一反三变型_宇 -Yu的博客-CSDN博客
这里我们只简化总结一下:
while
sum = sum + i; i++; | sum = sum + i; ++i; | 101 5050 |
++i; sum = sum + i; | i++; sum = sum + i; | 101 5150 |
do while
i=0
sum = sum + i; i++; | sum = sum + i; ++i; | 101 5050 |
i++; sum = sum + i; | ++i; sum = sum + i; | 101 5151 |
do while
i=1
sum = sum + i; i++; | sum = sum + i; ++i; | 101 5050 |
i++; sum = sum + i; | ++i; sum = sum + i; | 101 5150 |
原本的设想:
1,2,3结果一样,∑100(5050)。
4 不一样:cin i=99;sum=∑100。
所以这时,我们只要把while语句改成 while (i <= 99)即可(得到5050)。
结果实践以后事实大相径庭,不仅3结果和4一样,对3,4执行
"把while语句改成 while (i <= 99)即可(得到5050)"操作后,得到的结果反而是:
解释(收获):
1.为什么每次一和二的结果都一样,三和四的结果都一样?
因为
自增运算符只在单个语句内有效,自增运算的功能单位为单个语句。
具体表现形式为:用分号隔开
2. i = 0时三和四的结果5151,i = 1时(while也一样)三和四的结果5150是怎么回事(怎么来的)?
至至于为什么
"把while语句改成 while (i <= 99)即可(得到5050)"操作后,得到的结果反而是:5049
其实很简单:
当i=0时,把while语句改成 while (i <= 99)其实就是输出∑100,即5050。
当i=1时,把while语句改成 while (i <= 99)其实就是输出∑2~100,即5049。
而上面是在i=1的基础之上更改的,自然是5049,不必多说。
例3-17
从键盘输入一个整数i,计算区间[i,100]的整数之和。
分别用 while语句和do...while...语句循环实现。、
源程序1(while 语句):
#include <iostream>
using namespace std;
void main()
{
int sum = 0, i;
cin >> i;
while (i <= 100)
{
sum = sum + i;
i++;
}
cout << "sum=" << sum << endl;
}
源程序2(do.…while 语句):
#include <iostream>
using namespace std;
void main()
{
int sum = 0, i;
cin >> i;
do
{
sum = sum + i;
i++;
} while (i <= 100);
cout << "sum=" << sum << endl;
}
本project碰到的问题(收获):
在用do...while...语句时要注意,不同于while语句,do...while...语句中
while(语句)后要注意:一定要加一个分号。不然就又报错了。
本来还想写for语句的,但是这里介于篇幅过长,还是放到下一章再写,我们下一章再见!