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

 

5.1 引例

【例子】假设今年我国人口总数为13亿,若按每年2%增长,计算从现在开始10年内每年人口数量

 

#include<stdio.h>
#include<math.h>
int main()
{
	int n = 13, year;
	double number, rate = 0.02;
	for (; year <= 10; year++)
	{
		number = n * pow((1 + rate), year);
		printf("%2d年后,人数为:%.2f亿\n", year, number);
	}
	return 0;
}

 

 【例5.2】计算1-4/1+7/1-10/1+13/1-16/1+...的和,直到某一项的绝对值小于10负6次方

 

#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)

        循环体语句;

1.首先计算表达式1;

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

3.计算表达式3。

4.返回第2步继续执行;

5.循环结束,继续执行for语句的下一条语句;
 

【例5.3】输入一个正整数n,求sum的值

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

 

 

 

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

格式如下:

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

                                        循环语句;

说明:省略表达式1时,可以将循环变量赋初值放在for之前。注意,此时不能省略第一个“;”。

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.4】输入一个正整数n,求n

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

  

 

【例5.5】输入一个整数n,计算1-1/4+1/7-1/10+1/13-1/16+...的前n项之和

#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】输入10个数,输出其中的最大数

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

 

 

 

【例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 + 1;
	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】 由键盘输入3个数字,将其组合成一个整型数并输出

#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(void)
{
	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语句的执行流程如图5.3所示

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

第二步:执行循环体语句。

第三步:返回第一步。

第四步:结束循环,执行while语句的下一条语句。

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

5.3.2   while循环使用示例

【例5.13】计算sum的值

#include<stdio.h>
int main()
{
	int i, sum;
	i = 1, sum = 0;
	while (i <= 100)
	{
		sum = sum + i;
		i = i + 1;
	}
	printf("sum=%d", sum);
	return 0;
}

 

 

【5.14】输入一个正整数n,计算n!

#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.计算表达式的值,若表达式的值为‘真’,返回第一步;若表达式的值为‘假’,则执行第3步;

3.结束循环;

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

5.4.2  do-while循环使用示例

【例5.16】使用do-while语句计算sum=\sum_{\sum_{n}^{n=1}}^{100}n的值

#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结束整个循环

【例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】由键盘输入一个正整数,判断其是否为素数

运行结果1

#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 scote, total = 0;
	num = 0, n = 0;
	while (1)
	{
		printf("请输入分数#%d(0~100):", n + 1);
		scanf_s("%f", &scote);
		if (scote < 0)
			break;
		if (scote < 60)
			num++;
		total = total + scote;
		n++;
	}
	printf("平均分数是:%.2f.\n", total / n);
	printf("不及格的有:%d.\n", num);
	return 

 

 

 

5.5.2  continue语句

作用:结束本次循环,开始下次循环

【例5.22】把1~100之间能7整除的数,以每行5个的形式在屏幕上输

#include<stdio.h>
int main()
{
	int num, n;
	float scote, total = 0;
	num = 0, n = 0;
	while (1)
	{
		printf("请输入分数#%d(0~100):", n + 1);
		scanf_s("%f", &scote);
		if (scote < 0)
			break;
		if (scote < 60)
			num++;
		total = total + scote;
		n++;
	}
	printf("平均分数是:%.2f.\n", total / n);
	printf("不及格的有:%d.\n", num);
	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语句

四种循环控制语句,for循环语句、while循环语句、do-while循环语句 、goto循环

【例5.24】使用goto语句计算sum=\sum_{n=1}^{100}n的值

#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.25】求1!+2!+3!+...+10!

#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 <= 1; j++)
			printf("%d*%d=%d\t", j, i, j * i);
	}
	return 0;
}

 

 

 【例5.27】求100以内的素数。要求每行输出10个。

#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】将10~20之间的正整数分解质因数

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

31.
#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.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】求sin(x)=x-x^3/3!+x^5/5!-x^7/7!+...的近视值,要求精确到10负6次方

#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】判断由1、2、3、4四个数字能组成多少个互不相同且无重复数字的三位数?输出这些数

#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 && 1 != 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】

1.定义整型i,j;

2.若i<=5;转第3步,则转第步;

3.若i<=20-i;转第4步;则转第5步;

4.输出" ";

5.j++;转第3步;

6.若j<=2*i-1;转第7步;则转第9步;

7.输出"*";

8.j++;转第6步;

9.输出\n;

10.i++,转第2步;

9.结束;

#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】

1.定义m,n,count;

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

3.输入一个10—80之间的整数;

4.判断是否为真,转第5步,则转第13步;

5.count++;

6.若m==n;转第7步;则转第9步;

7.m>n&&count<5;

8.输出"对不起!你猜对了!再来一次!";

9.m<n&&count<5;

10.输出"对不起!你猜大了!再来一次!";

11.若count==5;转第12步,则转第4步;

12.输出"对不起!n你没有机会!"

13.结束;

#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】

1.定义x,t;

2.输入"i|tpower\n";

3.若x<1000;转第4步;则第10步;

4.t=x*x;

5.若t!=0;转第6步;则转第9步;

6.若x==t%1000;转第7步;则转第8步;

7.输出x;x*x;

8.t=t/10;

9.x++,转第3步;

10.结束; 

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


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值