break语句示例:
例3-22:
在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。
我编的程序:
第一版:
#include<iostream>
using namespace std;
int main()
{
int i,sum=0,n=0;
cout << "个人捐款数目" ;
cin >> i;
while (sum <= 100000 && n <= 1000)
{
sum = sum + i;
n++;
}
cout << "人均捐款项"<<sum/n;
cout << "捐款人数"<<n<<endl;
}
第二版:
#include<iostream>
using namespace std;
int main()
{
int i,sum=0,n=0;
cout << "个人捐款数目" ;
cin >> i;
while (sum <= 100000 && n <= 1000)
{
sum = sum + i;
n++;
cin >> i;
}
cout << "人均捐款项"<<sum/n;
cout << "捐款人数"<<n<<endl;
}
结果输入的结果与正常的运算根本对不上
这是因为在系统开始循环之前,我就发出指令,要求在开始循环之前就先输入一个 i,且这第一个 i 一定会在循环中被要求加到 sum(变量)当中。
随后一直输入 i 加到sum(变量)当中,直到 sum > 10w。
若sum = 10w,继续循环,要求输入下一个 i,然后再进行下一步:
把输入的 i 加到sum(变量)当中以后,执行判断语句“(sum <= 100000 && n <= 1000)”为真还是为假。
第三版:
#include<iostream>
using namespace std;
int main()
{
int i, sum = 0, n = 0;
cout << "个人捐款数目" << endl;
while (sum <= 100000 && n <= 1000)
{
cin >> i;
sum = sum + i;
n++;
}
cout << "人均捐款项" << 1.0 * sum / n;
cout << "捐款人数" << n << endl;
}
1:
改变了程序结构,再循环开始之前不输入 i,在开始循环以后统一第一步先输入 i。
2:
确定输出结果为实数(浮点)型,例:(sum<=100)
标准答案:
#include<iostream>
using namespace std;
#define SUM 100000
int main()
{
float amount, aver, total;
int i;
for (i = 1, total = 0; i <= 1000; i++)
{
cout << "please enter amount:";
cin >> amount;
total = total + amount;
if (total >= SUM) break;
}
aver = total / i;
cout << "num=" << i << "\naver=" << aver << endl;
}
书上原文:
注意:在多层循环中,一个break 语句只向外跳一层。
continue语句:
根据书上小段程序版块更改所得到的的示例程序:
break语句:
#include<iostream>
using namespace std;
int main()
{
int i, sum = 0;
for (i = 0; i < 5; i++)
{
if (i == 1) break;
sum += i;
}
cout << "i= " << i << endl;
cout << "sum= " << sum << endl;
}
continue语句:
#include<iostream>
using namespace std;
int main()
{
int i, sum = 0;
for (i = 0; i < 5; i++)
{
if (i == 1) continue;
sum += i;
}
cout << "i= " << i << endl;
cout << "sum= " << sum << endl;
}
参考书上的提示,循环流程如下:
循环结构程序举例
例3-23 用公式 pi/4=1-1/3+1/5-1/7+…...
求π
分析:先求等式右边的数列之和,然后再乘以4。
我写的:
方法一:(统一用一个通项解决所有问题)
#include<iostream>
using namespace std;
int main()
{
int i,n,number,pi,sum=0;
for (i = 1, n = 0;; n++)
{
number = 1 / i * ((-1) ^ n);
sum = number + sum;
pi = 4 * sum;
cout << "pi=" << pi << endl;
}
return 0;
}
运行结果和我们想要的pi显然不同:
因为((-1) ^ n)不能表示(-1)的n次方。^在c++环境中表示的含义为"按位异或"。如果一定要表示(-1)的n次方,只能使用"pow(-1,n)"函数(在<math.h>文件中)
方法二:(用次数的奇偶分开加减号进行计算)
#include<iostream>
using namespace std;
int main()
{
int i, n, number, pi, sum = 0, 正数, 负数;
for (i = 1, n = 0;; n+4)
{
正数 = 1 / i;
负数 = 1 / (i + 2) * (-1);
sum = sum + 正数+负数;
pi = 4 * sum;
cout << "pi=" << pi << endl;
}
return 0;
}
运行结果和我们想要的pi显然不同:
1.
不应该习惯性地把所有的变量类型定义为int类型。因为我们想输出的pi想都不用想肯定是实数类型,所以应该把定义类型从int改为float或者double
2.
在给(正数)和(负数)变量赋值时被除数应该从1改为1.0,理由如上(因为我们想输出的pi想都不用想肯定是实数类型,所以应该把定义类型从int改为float或者double)
3.
for (i = 1, n = 0;; n+4) 应改为 for (i = 1, n = 0;; i+4)
(写的时候笔误写错(改错))
修正后正确的答案:
#include<iostream>
using namespace std;
int main()
{
double i, n, number, pi, sum = 0, 正数, 负数;
for (i = 1, n = 0;; i += 4)
{
正数 = 1.0 / i;
负数 = 1.0 / (i + 2) * (-1);
sum = sum + 正数 + 负数;
pi = 4*sum;
cout << "pi=" << pi << endl;
}
return 0;
}
如果要一次性(立即)就出答案,不妨(也可以)加一个关于循环次数的限制条件例如:
#include<iostream>
using namespace std;
int main()
{
double i, n, number, pi, sum = 0, 正数, 负数;
for (i = 1, n = 0;n<=1000000; i += 4,n++)
{
正数 = 1.0 / i;
负数 = 1.0 / (i + 2) * (-1);
sum = sum + 正数 + 负数;
pi = 4*sum;
}
cout << "pi=" << pi << endl;
}
标准答案,源程序:
第一版(存在问题)
#include<iostream>
using namespace std;
int main()
{
int s;
float n, t, pi;
t = 1, pi = 0; n = 1.0; s = 1;
while (fabs(t) > 1e - 6)
{
pi = pi + t;
n = n + 2;
s = -s;
t = s / n;
}
pi = pi * 4;
cout << "pi=" << pi << endl;
return 0;
}
第二版
#include<iostream>
using namespace std;
int main()
{
int s;
float n, t, pi;
t = 1, pi = 0; n = 1.0; s = 1;
while (fabs(t) > 1e-6)
{
pi = pi + t;
n = n + 2;
s = -s;
t = s / n;
}
pi = pi * 4;
cout << "pi=" << pi << endl;
return 0;
}
改动:1e-6不要(不能)用空格隔开(格式要求)。
注解:fabs()属于C语言中的库函数,用于求浮点数x的绝对值。
#include<iostream>
using namespace std;
int main()
{
int s;
float n, t, pi;
t = 1, pi = 0, n = 1.0,s = 1;
//注意给n以及t,pi赋的全是浮点型
while (fabs(t) > 1e-6)
{
pi = pi + t;
n = n + 2;
s = -s;
//变换逻辑:每变换一次t就变一次号
t = s / n;
}
pi = pi * 4;
//最后(在循环结束后)令pi最后自己乘以4即可
//不用(没必要为此再去特地新去特设一个变量)
cout << "pi=" << pi << endl;
return 0;
}
例3-24 判断m是否为素数。
分析:判断m是否为素数,方法是用m去除以2~√m之间的整数,看能不能整除,只要2~√m之间有一个整数能整除m,则说明m是合数;若都不能整除,则m是素数。
我写的:
第一版:
#include<iostream>
using namespace std;
char main()
{
int m, i, k;
cin >> m;
k = square(m);
loop:for(i = 2; i <= k; i++)
{
if (m % i == 0)
{
cout << "m是合数";
}
else goto loop;
}
? ? ? cout << "m是素数";
//因为前面没有学过
//当所有判断循环都为真才运行某语句的语法结构
//所以这里我们只能想着另寻出路。
}
当然这里面肯定有很多语法和解决不了的问题。
经邹旺同学的帮助提醒建议后修改改动作为最终一版的output project:(引用return函数)
#include<iostream>
using namespace std;
char main()
{
int m, i, k;
cin >> m;
k = sqrt((float)m);
for (i = 2; i <= k; i++)
{
if (m % i == 0)
{
cout << "m是合数";
return 0;
}
}
cout << "m是素数";
}
源程序:
#include<iostream>
using namespace std;
int main()
{
int m, i, k;
cin >> m;
k = sqrt((float)m);
//k==√m;
for (i = 2; i <= k; i++)
if (m % i == 0) break;
if (i >= k + 1)
cout << m << " is a prime number\n";
//此时跳出时2~√m之间所有的整数都被整除过了
//说明m不是合数,即说明这个m就是素数
else
cout << m << " is not a prime number\n";
}
为什么“k = sqrt((float)m);”里一定要把m强制转换成float型?
sqrt()内的参数只能是double/float等实数类型,如果输入int等整数类型会报错
而且实际上还存在这样“参数只能是double/float等实数类型”的函数
例如:pow()
这里他设计巧妙的地方,在于无论是不是素数,最后都让他跳出循环;
如果这个数是素数,跳出循环时的i必定小于k。
(只要2~√m之间有一个整数能整除m,则说明m是合数)
如果这个数不是素数,跳出循环时的i必定大于等于k。
当然,这里标准答案和我们编的程序还有一个漏洞:
1 既不是素数也不是合数
例3-25
求100~200之间的全部素数。
我写的:
#include<iostream>
using namespace std;
int main()
{
int i, j, k;
for (i = 100; i <= 200; i++)
{
k = sqrt((float)i);
for (j = 2; j <= k; j++)
if (i % j == 0)
//记得是“==”而不是“=”
break;
if (j >= k + 1)
cout << i << endl;
}
}
过程中犯过的错误:
1.
在C++语言环境中,等于用“==”表示,而不是用表示赋值的“=”表示。
2.
for语句表达式的语法标准是for(a;b;c)d而不是我老是搞错写成的“for(a,b,c)d”。
书上的标准答案,源程序:
#include<iostream>
using namespace std;
int main()
{
int m, i, k, n = 0;
for (m = 101; m <= 200; m = m + 2)
{
k = sqrt((float)m);
for (i = 2; i <= k; i++)
if (m % i == 0)
break;
if (i >= k + 1)
{
cout << m << '\t';
n = n + 1;
if (n % 5 == 0) cout << endl;
}
}
}
另外这里这个标准答案优化了的一步就是m+=2,因为双数不可能是素数。
while、do..…while和for三种循环结构可以相互嵌套。
也可以使用break或continue语句提前结束循环。