第五章总结

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语句的基本语法

1.可以应用于计数型的循环

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 factorial;
 printf("输入n的值:");
 scanf_s("%d", &n);
 factorial = 1;
 for (i = 1; i <= n; i++)
  factorial = factorial * i;
 printf("%d!=%.0f\n", n, factorial);
 return 0;
}

 

2. for语句的一般形式中省略表达式:

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

            循环体语句; 

3.for语句的一般形式中省略表达式2:

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

         循环体语句;

4.for语句的一般形式中省略表达式3:

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

         循环体语句;

5.for语句的一般形式中表达式1和表达式3也可以是逗号表达式

6.for语句的一般形式中表达式2的值只要非0,就执行循环体

7.for语句的一般形式中循环体语句可以省略

5.2.2 for循环使用示例

例5.5

#include<stdio.h>
int main(void)
{
 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(void)
{
 int i;
 float x, max;
 printf("请输入第一个数:");
 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);
 return 0;
}

 

 例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++;
  }
  printf("小写字母%d个,大写字母%d个,数字%d个,其他字符%d个\n", lower, upper, digit, other);
 return 0;
}

 

 例5.10

#include<stdio.h>
int main()
{
	int i;
	char ch;
	for (i = 1; (ch = getchar()) != '\n'; i++)
		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);
			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语句的执行流程如图5.3所示。
第1步:计算表达式的值,若表达式的值为“真”,则执行第
2步;若表达式的值为“假”,则转到第4步。
第2步:执行循环体语句。
图5.3
第3步:返回第1步。
第4步:结束循环,执行 while语句的下一条语句。
注意, while语句的特点是先判断循环条件,后执行循环体。

5.3.2while循环使用示例

例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 = 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-语句的执行流程如图5.4所示。
第1步:执行循环体语句。
第2步:计算表达式的值,若表达式的值为“真”(非0),返回第1步;若表达式的值为
“假”(0),则执行第3步
第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 = 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语句中,在 switch语句中的用法第4章已经介绍,
这里介绍其在循环语句中的用法。
 break语句的一般形式如下:
                                                          break:
当 break语句用于循环语句中时,可使程序终止循环而转去执行循环语句的后继语句
通常 break语句总是与if语句一起配合使用,即满足条件时便跳出循环
 

例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 (score < 0)
            break;
        if (score >60)
            num++;
            total = total + score;
        n++;
    }
    printf("平均分数是:%.2f\n",total/n);
    printf("不及格的有:%d\n", num);
    return 0;
}

5.5.2 contine语句
 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语句时会控制跳转到该语句标号处,达到控制循环的
目的。

例5.24

#include<stdio.h>
int main()
{
 int i, sum = 0;
 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)循环嵌套格式中的内外循环体不允许出现交叉,即外循环要完全包含内循环。

(3)循环嵌套时,内循环体中使用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");
    }
    return 0;
}

例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

int main()
{
 int n = 1; float x;
 double fz, fm = 1, sinx;
 printf("输入x的值:");
 scanf_s("%f", &x);
 fz = x; sinx = x;
 do
 {
  n = 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<stdio.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\tpoer\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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值