+关注继续查看

# 第5章循环结构程序设计

## 5.2用while语句实现循环

while循环和for循环的区别_FutureForXHF的博客-CSDN博客_while循环和for循环的区别

## do-while和while的区别

Do可以简单的使用英语翻译进行理解，就是做

Do{               做

​

             Printf(“2 “);     输出2 （这个行为）

​

}while(i<=5)        当i<=5时

​

而while则是

​

While(i<=5)      当i<=5时

​

{

​

     Printf(“2 “);      输出2

​

}

2        (repeat=2)

​

2E-4     (eps=2E-4)

​

0.02      (eps=0.02)

sum = 0.835549

​

sum = 0.826310

​

#include <stdio.h>

​

#include <math.h>

​

int main(void)

​

{​​​

​int denominator, flag;

​

    int repeat, ri;

​

    double eps, item, sum;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

        scanf("%le", &eps);

​

sum=0;

​

denominator=1;

​

flag=1;

​

item=1.0;

​

while(fabs(item)>=eps){

​

item=flag*1.0/denominator;

​

sum=sum+item;

​

flag=-flag;

​

denominator=denominator+3;

​

}

​

       printf("sum = %.6f\n", sum);

​

   }

​

return 0;

​

}​​​

40013    求奇数和

2    (repeat=2)

​

1 3 90 7 0

​

8 7 4 3 70 5 6 101 -1

The sum of the odd numbers is 11.

​

The sum of the odd numbers is 116.

​

#include <stdio.h>

​

int main(void)

​

{

​

    int x, sum;

​

    int repeat, ri;

​

    scanf("%d", &repeat);

​

for(ri = 1; ri <= repeat; ri++) {

​

        scanf("%d", &x);

​

sum=0;

​

while(x>0) {

​

if(x%2!=0)

​

sum+=x;

​

scanf("%d", &x);

​

}

​

       printf("The sum of the odd numbers is %d.\n", sum);

​

   }

​

}

40014    求整数的位数

4        (repeat=4)

​

12345    (in=12345)

​

-100     (in=-100)

​

-1       (in=-1)

​

1290     (in=1290)

​

count = 5 (12345的位数是5)

​

count = 3 (-100的位数是3)

​

count = 1 (-1的位数是1)

​

count = 4 (99的位数是2)

​

#include <stdio.h>

​

int main(void)

​

{

​

​  int count, in;

​

    int repeat, ri;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

      scanf("%d", &in);

​

count=0;

​

if(in<0)  in=-in;

​

do{

​

count++;

​

in=in/10;

​

} while (in!=0);

​

      printf("count = %d\n", count);

​

   }

​

return 0;

​

}

​

4        (repeat=4)

​

0        (in=0)

​

23456    (in=23456)

​

-100     (in=-100)

​

-1       (in=-1)

​

count = 1, sum = 0 (0的位数是1, 各位数字之和是0)

​

count = 5, sum = 20 (23456的位数是5, 各位数字之和是20)

​

count = 3, sum = 1 (-100的位数是3, 各位数字之和是1)

​

count = 1, sum = 1 (-1的位数是1, 各位数字之和是1)

​

#include <stdio.h>

​

int main(void)

​

{

    int count, in, sum;

​

    int repeat, ri;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

      scanf("%d", &in);

​

count=0; sum=0;

​

if(in<0) in=-in;

do{

​

count++;

​

sum+=in%10;

​

in=in/10;

​

} while (in!=0);

​

      printf("count = %d, sum = %d\n", count, sum);

​

   }

return 0;

​

}

## 5.4用for语句实现循环

for(表达式1；表达式2；表达式3；)

for（循环变量赋初值；循环条件；循环变量增值）

3        (repeat=3)

1        (n=1)

5        (n=5)

20       (n=20)

sum = 2.00    (第1项是2.00)

​

sum = 8.39    (前5项的和是8.39)

​

sum = 32.66   (前20项的和是32.66)

​

#include <stdio.h>

​

int main(void)

​

{

​

   int i, n;

​

    int repeat, ri;

​

    double denominator, numerator, sum, temp;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

        scanf("%d", &n);

​

sum=0;

​

denominator=1;

​

numerator=2;

​

for(i=1;i<=n;i++){

​

sum += numerator/denominator;

​

temp = denominator; /* 为求下一项分子，保留当前项分母 */

​

denominator=numerator;

​

numerator=numerator+temp;

​

}

​

      printf("sum = %.2f\n",sum);

​

   }

​

}

3 (repeat=3)

​

10  2 (height=10m, n=2)

​

4   1 (height=2m, n=1)

​

100 8 (height=100m, n=8)

​

distance=20.0, height=2.5 (第2次落地时，空中经过距离为20米, 第2次反弹高度为2.5米)

distance=4.0, height=2.0 (第1次落地时，空中经过距离为4米，第1次反弹高度为2米)

distance=298.4, height=0.4 (第8次落地时，空中经过距离为298.4米，第8次反弹高度为0.4米)

#include <stdio.h>

​

int main(void)

​

{

​

    int i, n;

​

    int repeat, ri;

​

    double distance, height, bh;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

        scanf("%lf%d", &height, &n);

​

/*---------*/

​

distance = height;

​

bh = height/2.0;

​

if ( n>1 )

​

for (i = 2; i<=n; i++) {

​

distance  += bh*2;

​

bh = bh/2;

​

}

​

    printf("distance = %.1f, height = %.1f\n", distance, bh);

​

   }

​

}

## 5.5循环的嵌套

e = 1＋1/1!＋1/2!＋....＋1/n!

2       (repeat=2)

​

2       (n=2)

​

10      (n=10)

e = 2.5000

​

e = 2.7183

​

#include "stdio.h"

​

int main(void)

​

{

​

    int i, j, n;

​

    int repeat, ri;

​

    double e, product;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

        scanf("%d", &n);

​

e = 1.0;

​

for (i = 1; i<= n; i++) {

​

product = 1;

​

for (j = 1; j<=i ; j++) {

​

product *= j;

​

}

​

e += 1.0/product;

​

}

​

/*---------*/

​

     printf("e = %0.4f\n", e);

​

  }

​

}

40023    换硬币 （多重循环语句）

2     (repeat=2)

10    (money=10分)

13    (money=13分)

fen5:1,fen2:2,fen1:1,total:4

​

fen5:1,fen2:1,fen1:3,total:5

​

count = 2     (10分有2种换法)

​

fen5:2,fen2:1,fen1:1,total:4

​

fen5:1,fen2:3,fen1:2,total:6

​

fen5:1,fen2:2,fen1:4,total:7

​

fen5:1,fen2:1,fen1:6,total:8

​

count = 4     (13分有4种换法)

​

#include "stdio.h"

​

int main(void)

​

{

​

    int count, fen1, fen2, fen5, money;

​

    int repeat, ri;

​

    scanf("%d", &repeat);

​

    for(ri = 1; ri <= repeat; ri++){

​

        scanf("%d", &money);

​

count=0;

​

for(fen5=money/5;fen5>=1;fen5--)

​

for(fen2=money/2;fen2>=1;fen2--)

​

for(fen1=money/1;fen1>=1;fen1--)

​

if(fen5*5+fen2*2+fen1*1==money){

​

printf("fen5:%d,fen2:%d,fen1:%d,total:%d\n",fen5, fen2, fen1, fen5+fen2+fen1);

​

count++;}

​

     printf("count = %d\n", count);

​

    }

​

return 0;

​

}

​

5.6几种循环的比较

## 5.7改变循环执行的状态

89 100 (m=90, n=100)

90=7+83 92=3+89 94=5+89 96=7+89 98=19+79

​

100=3+97

​

#include "stdio.h"

​

#include "math.h"

​

int main(void)

​

{

​

    int count, i, j, k, m, n, number;

​

    scanf("%d%d", &m, &n);

​

    if(m % 2 != 0) m = m + 1;

​

    if(m >= 6){

​

/*---------*/

​

    }

​

}

​

#include <stdio.h>

​

int prime(int m)

​

{

​

int i, ifPrime=0;

​

if(m==1) return 0;

​

for(i=2;i<=m/2;i++) {

​

if(m%i==0)

​

break;

​

}

​

if(i>m/2)

​

ifPrime=1;

​

return ifPrime;

​

}

​

int main(void)

​

{

​

    int count, i, m, n, number;

​

    scanf("%d%d", &m, &n);

​

    if(m % 2 != 0) m = m + 1;

​

if(m >= 6) {

​

count=0;

​

for(number=m;number<=n;number=number+2)  {

​

for(i=1;i<=number/2;i++)  {

​

if(  prime(i) && prime(number-i) )  {

​

printf("%d=%d+%d ", number, i, number-i);

​

count++;

​

if(count%5==0)

​

printf("\n");

​

break;

​

}

​

}

​

}

​

    }

​

}

​

90=7+83 90=11+79 90=17+73 90=19+71 90=23+67 ...90=83+7

continue语句应该这样理解：当执行continue语句时，流程跳转到表示循环体结束的右花括号的前面（注意不是右花括号的后面）  也可以理解为continue后的不执行，然后重新进入下一次新的循环当中

# include <stdio.h>

​

int main(void)

​

{

​

int val; //variable的缩写, “变量”的意思

​​​

printf("请输入您想去的楼层:");

​​​

while (1)

​​​

{

​​​

scanf("%d", &val);

​​​

switch (val)

​​​

{

​​​

case 1:

​​​

printf("1层开!\n");

​​​

break; //跳出switch

​​​

case 2:

​​​

printf("2层开!\n");

​​​

break; //跳出switch

​​​

case 3:

​​​

printf("3层开!\n");

​​​

break; //跳出switch

​​​

default:

​​​

printf("该层不存在, 请重新输入:");

​​​

continue; //结束本次while循环

​​​

}

​​​

break; //跳出while

​​​

}

​​​

return 0;

​​​

}

## continue和break的区别

continue 语句和 break 语句的区别是，continue 语句只结束本次循环，而不是终止整个循环。break 语句则是结束整个循环过程，不再判断执行循环的条件是否成立。而且，continue 只能在循环语句中使用，即只能在 for、while 和 do…while 中使用，除此之外 continue 不能在任何语句中使用。

## 第五章典型题（循环）：

### 斐波那契数列

【C语言】斐波那契数列_EurekaO-O的博客-CSDN博客_斐波那契数列c语言

## 第五章习题答案：

C语言程序设计第五版谭浩强课后答案 第五章习题答案_月已满西楼的博客-CSDN博客_统计出当fabs(t) >= pow(10, -6)和fabs(t) >= pow(10, -8)时

3.输人两个正整数m和n,求其最大公约数和最小公倍数

#include <stdio.h>

​

int main()

​

{

​

int  p, r, n, m, temp;

​

printf("请输入两个正整数n,m:");

​

scanf("%d%d,", &n, &m);

​

//调整n保存较大的值

​

if (n < m)

​

{

​

temp = n;

​

n = m;

​

m = temp;

​

}

​

p = n * m;

​

while (m != 0)

​

{

​

r = n % m;

​

n = m;

​

m = r;

​

}

​

printf("它们的最大公约数为:%d\n", n);

​

printf("它们的最小公倍数为:%d\n", p / n);

​

return 0;

​

}

​

6.求∑ n = 1 20 n ! \sum\limits_{n=1}^{20}n!

​

n=1

​

∑

​

20

​

​

 n! (即求1!+2!+3!+4!+…+20!)。

​

#include<stdio.h>

​

int main()

​

{

​

double total_sum = 0;

​

for(int i = 1; i <= 20; i++)

​

{

​

double single_sum = 1;

​

for (int j = i; j > 0; j--)

​

{

​

single_sum *= j;

​

}

​

total_sum += single_sum;

​

}

​

printf("1~20每个数字阶乘总和为：%lf\n",total_sum);

​

return 0;

​

}

8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1*+5*+3。

#include <stdio.h>

​

int main()

​

{

​

 //a表示百位数字，b表示十位数字，c表示各位数字

​

int a, b, c;

​

for (int i = 100; i <= 999; i++)

​

{

​

a = i / 100;

​

b = (i / 10) % 10;

​

c = i % 10;

​

if (a * a * a + b * b * b + c * c * c == i)

​

{

​

printf("%d\n", i);

​

}

​

}

​

return 0;

​

}​​​

## 第五章目录回顾：

5.1为什么需要循环控制110

5.2用while语句实现循环111

5.3用do…while语句实现循环113

5.4用for语句实现循环116

5.5循环的嵌套120

5.6几种循环的比较121

5.7改变循环执行的状态121

5.7.1用break语句提前终止循环122

5.7.2用continue语句提前结束本次循环123

5.7.3break语句和continue语句的区别124

5.8循环程序举例127

|
29天前
|

C语言程序设计-----猜数字游戏(1A2B详解)
C语言程序设计-----猜数字游戏(1A2B详解)
48 0
|
2月前
|
C语言

55 1
|
2月前
|
C语言

46 1
|
2月前
|
C语言
【C语言初阶】 循环结构（循环语句）
【C语言初阶】 循环结构（循环语句）
32 0
|
2月前
|
C语言
C语言实验五 循环结构程序设计（二）
C语言实验五 循环结构程序设计（二）
25 0
|
2月前
|

C语言实验四 循环结构程序设计（一）
C语言实验四 循环结构程序设计（一）
27 0
|
3月前
|
C语言
【C语言—零基础第八课】循环结构与break continue

360 0
|
5月前
|

c语言复习之分支循环结构（五）
c语言复习之分支循环结构（五）
41 0
|
5月前
|

C语言基础犄角旮旯的知识之分支与循环结构
C语言基础犄角旮旯的知识之分支与循环结构
29 0
|
7月前
|

C语言及算法设计课程实验五：循环结构程序设计
C语言及算法设计课程实验五：循环结构程序设计
103 0