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

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

 

 

说明:

while语句是三种循环结构之一,while后括号中的表达式称为循环条件,循环开始时,一定要保证循环条件为真。需要重复执行的语句精神了循环体。
5.2使用for语句实现循环结构
for语句是C语言提供的功能强大、使用广泛的一种循环结构,不仅可以解决循环次数未知的循环问题,特别适合解决循环次数已知的循环问题。 

5.2.1     for语句的基本语法
                                     for语句的一般形式为:
                           for(表达式1;表达式2;表达式3)
                                              循环体语句;


for语句的执行过程如下:

1.首先计算表达式1。
2.判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第3步;若值为假(0),结束循环,转到第5步执行。
3.计算表达式3。
4.返回第2步继续执行。
5.循环结束,继续执行for语句的下一条语句。大部分情况下,循环体语句为一复合循语句。
注意,表达式1只在进行循环之前计算一次。表达式2、循环体语句和表达3将重复执行。
根据for语句格式的特点,其实际应用可以有多种形式。
1.可以应用于计数型的循环
格式如下:
for(循环变量赋初值;循环条件;循环变量增量)
循环体语句
说明:循环变量赋值是一个赋值语句,用于给循环变量赋初值;循环条件是一个条件表达式,决定何时终止循环(即确定循环的终值);循环变量增量决定循环变量在完成一次循环后如何变化。三部分之间以“;”隔开。

              5.3

 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语句的一般形式中省略表达式1
格式如下:
                                for(;表达式2;表达式3)
                                                循环体语句;

说明:

省略表达式1时,可以将循环变量赋初值放在for之前。

注意:

此事不能省略第一个“;”

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

  格式如下:
                                        for(表达式1;;表达式3)
                                                        循环体语句;

说明:

循环表达式2时,表示不对循环进行控制,这时如果没有其他处理的话,会形成死循环。应避免这样使用for结构
4.for语句的一般形式中省略表达式3
格式如下:
                                        for(表达式1;表达式2;)
                                                       循环体语句;

说明:

省略表达式3时,可以在循环体语句中加入修改循环变量的语句
5.for语句的一般形式中表达式1和表达式3也可以是逗号表达式
6.for语句的一般形式中表达式2的值只要非0,就执行循环体
7.for语句的一般形式中循环体句可以省略

5.2.2for循环使用示例 

5.5

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

 

 5.6.1

#include<stdio.h>
int main()
{
	int i;
	float x, max;
	for (i = 1; i <= 10; i++){
		printf("请输入第 % d个数:", i + 1);
		scanf_s("%f", &x);
		if (i==1) {
			max = x;
		}
		else {
			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\n", 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;
}
#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);
		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语句实现循环结构

在C语言中,使用while语句完成不定次数的循环。如果满足循环条件,则反复执行循环体语句,当循环条件不满足时退出循环。
5.3.1while语句的基本语法
while语句在使用时,总是先要判断一个条件,所以可以用while语句实现“当型”循环。while语句的一般形式如下:
                                                        while(表达式)
                                                                循环体


执行流程图:
第1步:计算表达式的值,若表达式的值为“真”,则执行第2步;若表达式的值为“假”,则转到第4部。
第2步:执行循环体语句。
第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

 

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

在C语言中,do-while语句也用于完成不定次数的循环控制。do-while语句不同的是,do-while语句首先执行一次循环体,然后判断循环条件,如果满足,则反复执行循环体语句;否则结束循环。
5.4.1do-while语句的基本语法
do-while语句在使用时,首先执行循环体语句,然后再判断条件。所以说可以用do-while语句实现“直到型”循环。do-while语句的一般形式如下:
                                                        do
                                                                循环体
                                                        while(表达式);


do-while执行流程如下:
第1步:执行循环体语句。
第2部:计算表达式的值,若表达式的值为“真”(非0),返回第1步;若表达式的值为“假”(0),则执行第3步。
第3步:结束循环,执行do-while语句的下一一条语句。
注意,do-while语句的特点是先执行循环体,后判断循环条件。因此,do-while循环至少要执行一次循环体。
5.4.2do-while循环使用示例 

5.16

 

在使用都do-while语句使用注意以下几点:
1.在do之后不能有语句结束符“;”因为该语句还没有结束。
2.在while(表达式)之后必须有语句结束符“;”表示do-while语句到此结束。
3.在循环体中必须有改变循环条件的语句,否则会出现死循环。

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 改变循环结构的跳转语句
在前面介绍的三种循环语句,即for循环语句、while循环语句及do-while循环语句中,控制循环是通过循环达到设定的次数或者循环的判断条件为“假”时结束循环,这种循环控制方式在实际的程序设计中是不够的。许多时候当循环结构中出现多个循环条件时,要求当某个条件满足时会立即结束循环,或者循环结构中根据条件会跳过某些语句继续循环,这就要在循环结构中配合使用break语句和continue语句
5.5.1 break语句
break语句在循环语句和switch语句中。
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.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", sum);
    return 0;
}

 

注意,语句标号必须与goto语句处于同一函数中。通常goto语句与if语句连用实现循环控制。大型循环中由于goto语句可能存在的不合理的使用,会使循环结构变坏,所以程序设计中,不建议使用goto语句。
5.6 循环嵌套
当一个循环的循环体内有包含了另一个完整的循环结构时,称为循环的嵌套或者是二重循环。根据问题的需要可以构成三重及以上的循环嵌套结构,但一般情况下最多使用到三重循环。
使用for语句、while语句及do-while语句相互嵌套,构成的嵌套结构有以下几种。
(1)for语句中嵌套for语句 

(2)for语句中嵌套while语句

(3)while语句中嵌套while语句

( 4)do-while语句嵌套for语句

(5)do-while语句中嵌套do-while语句

(6)while语句中嵌套do-while语句 

使用循环嵌套时,注意以下几点:
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.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 = 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值