第五章循环结构程序设计总结

5.1 引例

例5.1

代码:

#include<stdio.h>

#include<math.h>

int main() {

 int n = 13, year;

 double number, rate = 0.02;

 for (year = 1;year <= 10;year++) {

  number = n * pow((1 + rate), year);

  printf("%2d年后,人数为:%.2f亿\n",year,number); 

 }

 return 0;

}

执行结果:

 例5.2

代码:

#include<stdio.h>

#include<math.h>

int main() {

 double sum, item, flag, denominator;

 sum = 0;

 item = 1;

 flag = 1;

 denominator = 1;

 while( fabs(item) >= 1e-6) {

  sum = sum + item;

  flag = -flag;

  denominator = denominator + 3;

  item = flag / denominator;

 }

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

 return 0;

}

执行结果:

5.2  使用for语句实现循环结构

5.2.1   for语句的基本语法

for语句的一般形式为:

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

                  循环体语句;

for语句的执行过程如下:

①首先计算表达式1。

②判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第③步;若值为假(0),结束循环,转到第5步执行。

③计算表达式3。

④返回第2步继续执行。

⑤循环结束,继续执行for语句的下一条语句。

 例5.3

代码:

#include<stdio.h>

int main() {

 int i, n, sum;

 scanf_s("%d",&n);

 sum = 0;

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

  sum = sum + i;

 }

 printf("由1到%d的和是:%d\n", n, sum);

 return 0;

}

执行结果:

 例5.4

代码:

#include<stdio.h>

int main(void) {

 int i, n;

 double factoral;

 printf("输入n的值:");

 scanf_s("%d",&n);

 factoral = 1;

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

  factoral = factoral * i;

 }

 printf("%d!=%.0f\n",n,factoral);

 return 0;

}

执行结果:

5.2.2   for循环使用示例

 例5.5

代码:

#include<stdio.h>

int main() {

 int n, i, denominator, flag;

 float sum, item;

 printf("输入n的值:");

 scanf_s("%d",&n);

 flag = 1;

 denominator = 1;

 sum = 0;

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

  item = flag * 1.0 / denominator;

  sum = sum + item;

  flag = -flag;

  denominator = denominator + 3;

 }

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

 return 0;

}

执行结果:

例5.6

代码:

#include<stdio.h>

int main() {

 int i;

 float x, max;

 printf("请输入第1个数:s");

 scanf_s("%f",&x);

 max = x;

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

  printf("请输入第%d个数:",i+1);

  scanf_s("%f",&x);

  if (x > max) {

   max = x;

  }

 }

 printf("10个数的最大值是:%.0f",max);

}

执行结果:

 例5.7

代码:

#include<stdio.h>

int main() {

 int number, a, b, c;

 for (number = 100;number <= 999;number++) {

  a = number / 100;

  b = number % 100 / 10;

  c = number % 10;

  if (number==a*a*a+b*b*b+c*c*c) {

   printf("%5d",number);

  }

 }

 return 0;

}

执行结果:

 例5.8

代码:

#include<stdio.h>

int main() {

 int number, sum, i;

 printf("请输入一个正整数:");

 scanf_s("%d",&number);

 sum = 0;

 for (i = 1;i <= number - 1;i++) {

  if (number % i == 0) {

   sum = sum + i;

  }

 }

  if (number==sum) {

   printf("%d是完数\n",number);

  }

  else {

   printf("%d不是完数\n",number);

   

  }

 return 0;

}

执行结果:

例5.9

代码:

#include<stdio.h>

int main() {

 int upper, lower, digit, i, other;

 char ch;

 upper = lower = digit = other = 0;

 printf("输入10个字符:");

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

  ch = getchar();

  if (ch>='a'&&ch<='z') {

   lower++;

  }

  else if (ch>= 'A'&&ch<='Z') {

   upper++;

  }

  else if (ch>='0'&&ch<='9') {

   digit++;

  }

  else {

   other++;

  }

 }

执行结果:

 例5.10

代码:

#include<stdio.h>

int main() {

 char ch;

 for (;(ch = getchar()) != '\n';) {

  putchar(ch-32);

 }

 return 0;

}

执行结果:

例5.11

代码:

#include<stdio.h>

int main() {

 int n = 0,i;

 char ch;

 printf("请输入3个数字:");

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

  scanf_s("%c",&ch,3);

  n = n * 10 + ch - '0';

 }

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

 return 0;

}

执行结果:

例 5.12

代码:

#include<stdio.h>

int main() {

 int i, flag, number;

 printf("请输入一个正整数:");

 scanf_s("%d",&number);

 flag = 1;

 for (i = 2;i <= number - 1 && flag;i++) {

  if (number%i==0) {  

   flag = 0;

  }

 }

 if (flag) {

  printf("%d是素数\n",number);

 }

 else {

  printf("%d不是素数\n",number);

 }

 return 0;

}

执行结果:

5.3  使用while语句实现循环结构

5.3.1 while语句的基本语法

while语句的一般形式如下:

while(表达式)

        循环体;

while语句的执行过程如下:

①计算表达式的值,若表达式的值为“真”,则执行第2步;若表达式的值为“假”,则转第4步。

②执行循环体语句。

③返回第1步。

④结束循环,执行while语句的下一条语句。

注意:while语句的特点是先判断循环条件,后执行循环体。

5.3.2   while循环使用示例

 例5.13

代码:

#include<stdio.h>

int main() {

 int i, sum;

 i = 1;

 sum = 0;

 while (i<=100) {

  sum = sum + i;

  i = i + 1;

 }

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

 return 0;

}

执行结果:

例 5.14

代码:

#include<stdio.h>

int main() {

 int i;

 long n, fact;

 i = 2;

 fact = 1;

 printf("请输入n的值:");

 scanf_s("%ld",&n);

 while (i<=n) {

  fact = fact * i;

  i += 1;

 }

 printf("%ld!=%ld\n",n,fact);

 return 0;

}

执行结果:

例 5.15

代码:

#include<stdio.h>

int main() {

 int digit, letter, other;

 char ch;

 digit = letter = other = 0;

 printf("请输入一串字符:");

 while ((ch=getchar())!='\n') {

  if ((ch>='0')&&(ch<='9')) {

   digit++;

  }

  else if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {

   letter++;

  }

  else {

   other++;

  }

 }

 printf("数字%d个,字母%d个,其他%d个\n",digit,letter,other);

 return 0;

}

执行结果:

5.4  使用do-while语句实现循环结构

5.4.1   do-while语句的基本语法

do-while语句的一般形式如下:

      do

              循环体

       while(表达式);

do-while语句的执行过程如下:

①执行循环体语句。

②计算表达式的值,若表达式的值为”真”(非0),返回第1步;若表达式的值为“假”(0),则执行第3步。

③结束循环,执行do-while语句的下一条语句。

注意:do-while语句的特点是先执行循环体,后判断循环体条件。因此,do-while循环至少要执行一次循环体。

5.4.2  do-while循环使用示例

例 5.16

代码:

#include<stdio.h>

int main() {

 int i, sum;

 i = 1;

 sum = 0;

 do {

  sum = sum + i;

  i += 1;

 } while (i<=100);

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

 return 0;

}

执行结果:

 例5.17

代码:

#include<stdio.h>

int main() {

 int a, b, r, n, m;

 printf("请输入两个整数:");

 scanf_s("%d%d",&a,&b);

 m = a, n = b;

 do {

  r = a % b;

  a = b;

  b = r;

 } while (r!=0);

 printf("%d和%d的最大公约数是:%d\n",m,n,a);

 printf("最小公倍数是:%d",m*n/a);

 return 0;

}

执行结果:

例5.18

代码:

#include<stdio.h>

int main() {

 long n, m;

 int count = 0;

 printf("请输入一个整数:");

 scanf_s("%ld",&n);

 m = n;

 if (n<0) {

  n = -n;

 }

 do {

  n = n / 10;

  count++;

 } while (n!=0);

 printf("整数%ld有%d位数\n",m,count);

 return 0;

}

执行结果:

5.5  改变循环结构的跳转语句

5.5.1    break语句

break语句用在循环语句和switch语句中。

break语句的一般形式如下:

                        break;

当break语句用于循环体语句中时,可使程序终止循环而转去执行循环语句的后继语句。

例 5.19

代码:

#include<stdio.h>

int main() {

 int i = 5;

 do {

  if (i%3==1) {

   if (i%5==2) {

    printf("%d",i);

    break;

   }

   

  }i++;

 } while (i!=0);

 return 0;

}

执行结果:

 例5.20

代码:

#include<stdio.h>

#include<math.h>

int main() {

 int n, m, i;

 printf("请输入一个正整数:");

 scanf_s("%d", &n);

 m = sqrt(n);

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

  if (n%i==0) {

   break;

  }

 }

 if (i>m) {

  printf("%d是素数!\n",n);

 }

 else {

  printf("%d不是素数!\n",n);

 }

 return 0;

}

执行结果:

例5.21

代码:

#include<stdio.h>

int main()

{

 int num, n;

 float score, total = 0;

 num = 0; n = 0;

 while (1)

 {

  printf("输入分数#%d(0~100):", n + 1);

  scanf_s("%f", &score);

  if (sc

ore < 0)

   break;

  if (score < 60)

   num++;

  total = total + score;

  n++;

 }

 printf("平均分数是:%.2f.\n", total / n);

 printf("不及格的有:%d.\n", num);

 return 0;

}

执行结果:

5.5.2   continue语句

continue语句的作用是跳过循环中continue后面的语句,继续下一次循环。

continue语句的一般形式如下:

                                                        continue;

 例5.22

代码:

#include<stdio.h>

int main()

{

 int i, n = 1;

 for (i = 1; i <= 100; i++)

 {

  if (i % 7 != 0)

   continue;

  printf("%4d", i);

  if (n++ % 5 == 0)

   printf("\n");

 }

 return 0;

}

执行结果:

 例5.23

代码:

#include<stdio.h>

int main()

{

 int n, s = 0;

 n = 1;

 while (n < 10)

 {

  s = s + n;

  if (s > 5)

   break;

  if (n % 2 == 1)

   continue;

  n++;

 }

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

 return 0;

}

执行结果:

5.5.3  goto语句

goto语句的一般形式如下:

 goto语句标号;

程序执行到goto语句时,会控制跳转到该语句标号处,达到控制循环的目的。

例5.24 

代码:

#include<stdio.h>

int main()

{

 int i, sum;

 i = 1; sum = 0;

loop:if (i <= 100)

{

 sum = sum + i;

 i = i + 1;

 goto loop;

}

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

return 0;

}

执行结果:

5.6    循环嵌套

使用循环嵌套时,注意以下几点:

(1)循环嵌套格式中的内循环不允许出现交叉,即外循环要完全包含内循环 。

(2)循环嵌套时,内循环中使用break语句和continue语句时,只能影响包含他们的内循环,与外循环无关。

例5.25 

代码:

#include<stdio.h>

int main() {

 int i, j;

 double factorial,s=0;

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

  factorial = 1;

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

   factorial = factorial * j; 

  }

  s = s + factorial;

 }

 printf("1!+2!+3!+···+10!=%.0f\n",s);

 return 0;

}

执行结果:

 例5.26

代码:

#include<stdio.h>

int main() {

 int i, j;

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

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

   printf("%d*%d=%d\t",j,i,j*i);

  }

  printf("\n");

 }

}

执行结果:

 例5.27

代码:

#include<stdio.h>

#include<math.h>

int main() {

 int i, n, k, count = 0;

 n = 2;

 while (n<100) {

  k = sqrt(n);

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

   if (n % i == 0) {

    break;

   }

  }

   if (i>k) {

    printf("%4d",n);

    if (++count%10==0) {

     printf("\n");

    }

   }

   n++;

  }

  return 0;

}

执行结果:

例5.28 

代码:

#include<stdio.h>

int main()

{

 int i, n, m;

 for (m = 10; m <= 20; m++)

 {

  n = m, i = 2;

  printf("%d=", n);

  do

  {

   if (n % i == 0)

   {

    printf("%d*", i);

    n = n / i;

   }

   else

    i++;

  } while (n != i);

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

 }

 return 0;

}

执行结果

5.7  典型算法案例

5.7.1  递推法

 例5.29

代码:

#include<stdio.h>

int main()

{

 int day, d1, d2;

 day = 9;

 d2 = 1;

 do

 {

  d1 = (d2 + 1) * 2;

  d2 = d1;

  --day;

 } while (day > 0);

 printf("第一天摘了%d\n", d1);

 return 0;

}

执行结果:

 例5.30

代码:

#include<stdio.h>

#include<math.h>

#define eps 1e-6

int main() {

 int n = 1;float x;

 double fz, fm = 1, sinx;

 printf("输入x的值:");

 scanf_s("%f",&x);

 fz = x;

 sinx = x;

 do {

  n += 1;

  fz = -fz * x * x;

  fm = fm * (2 * n - 2) * (2 * n - 1);

  sinx = sinx + fz / fm;

 } while (fabs(fz/fm)>eps);

 printf("sin(%f)=%0.6f\n",x,sinx);

 printf("sin(%f)=%0.6f\n",x,sin(x));

 return 0;

}

执行结果:

5.7.2    迭代法

例5.31

代码:

#include<stdio.h>

#include<math.h>

#define eps 1e-6

int main()

{

 float x1, x0, f, f1;

 x1 = 1.0;

 do

 {

  x0 = x1;

  f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;

  f1 = (6 * x0 - 8) * x0 + 3;

  x1 = x0 - f / f1;

 } while (fabs(x1 - x0) > eps);

 printf("%6.2f", x1);

 return 0;

}

执行结果:

5.7.3    穷举法

 例5.32

代码:

#include<stdio.h>

int main() {

 int men, women, child;

 for (men = 0;men <= 9;men++) {

  for (women = 0;women <= 12;women++) {

   child = 36 - men - women;

   if (men*4+women*3+child*0.5==36) {

    printf("男%d女%d小孩%d\n",men,women,child);

   }

  }

 }

 return 0;

}

执行结果:

 例5.33

代码:

#include<stdio.h>

int main() {

 int i, j, k, n = 0;

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

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

   for (k = 1; k < 5; k++) {

    if (i != k && i != j && j != k) {

     printf("%d%d%d\t", i, j, k);

     if (++n % 5 == 0) {

      printf("\n");

     }

    }

   }

  }

 }

 printf("\n共有:%d\n", n);

 return 0;

}

执行结果:

5.8   循环程序设计示例

例5.34

流程图表示:

 

代码:

#include<stdio.h>

int main() {

 int i, j;

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

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

   printf(" ");

  }

  for (j = 1; j <= 2 * i - 1; j++) {

   printf("*");

  }

  printf("\n");

 }

 return 0;

}

执行结果:

 例5.35

流程图表示:

 

代码:

#include<stdio.h>

#include<stdlib.h>

int main() {

 int m, n, count = 0;

 m = rand() % (80 - 10 + 1) + 10;

 printf("请输入一个10-80之间的整数:");

 while (1) {

  scanf_s("%d", &n);

  count++;

  if (m == n) {

   printf("恭喜!你猜对了,你真棒!\n");

   break;

  }

  else if (m > n && count < 5) {

   printf("对不起,你猜小了,再来一次!");

  }

  else if (m < n && count < 5) {

   printf("对不起,你猜大了,再来一次!");

  }

  if (count == 5) {

   printf("对不起,你没有机会了!\n这个数是:%d游戏结束!\n", m);

   break;

  }

 }

 return 0;

}

执行结果:

例5.36

流程图表示:

 

代码:

#include<stdio.h>

#include<math.h>

int main() {

 int x, i, j = 0, n, k = 0;

 for (x = 100; x < 1000; x++) {

  k = sqrt(x);

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

   if (x % i == 0) {

    break;

   }

   if (i > k) {

    k = x;

    n = 0;

    while (k > 0) {

     n = n * 10 + k % 10;

     k /= 10;

    }

    if (x == n) {

     printf("%d\t", x);

     if (++j % 5 == 0) {

      printf("\n");

     }

    }

   }

  }

 }

 return 0;

}

执行结果:

例 5.37

流程图表示:

 

代码:

#include<stdio.h>

int main() {

 int x, t;

 printf("i\tpower\n");

 for (x = 100; x < 1000; x++) {

  t = x * x;

  while (t != 0) {

   if (x == t % 1000) {

    printf("%d\t%d\n", x, x * x);

    break;

   }

   else {

    t = t / 10;

   }

  }

 }

 return 0;

}

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值