C语言日记 15 循环结构程序设计(break,continue,循环结构程序举例)

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)

94a640d2017641c6b007354506ca1c76.png

标准答案:

#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;
}

e034811cd1194d65a8b00c050a4377fc.png

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;
}

4e627a518f0f4439a6b8f6d808c1249a.png

参考书上的提示,循环流程如下:

625a166286cc4aab9669c15af06c475f.png

循环结构程序举例

例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语句提前结束循环。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值