C语言程序设计笔记(浙大翁恺版) 第五周:循环控制

按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源。原课程链接如下:

https://www.icourse163.org/course/ZJU-9001

由于是大三抽空回头整理的,所以可能前五章会记的内容比较简略。此外,作为选学内容的A0:ACLLib的基本图形函数和链表两章也没有做。西电的考试是机试,理论上学到结构体就能够应付考试了,但为了以后的学习考虑建议全学。

 

其他各章节的链接如下:

C语言程序设计笔记(浙大翁恺版) 第一周:程序设计与C语言

C语言程序设计笔记(浙大翁恺版) 第二周:计算

C语言程序设计笔记(浙大翁恺版) 第三周:判断

C语言程序设计笔记(浙大翁恺版) 第四周:循环

C语言程序设计笔记(浙大翁恺版) 第五周:循环控制

C语言程序设计笔记(浙大翁恺版) 第六周:数据类型

C语言程序设计笔记(浙大翁恺版) 第七章:函数

C语言程序设计笔记(浙大翁恺版) 第八周:数组

C语言程序设计笔记(浙大翁恺版) 第九周:指针

C语言程序设计笔记(浙大翁恺版) 第十周:字符串

C语言程序设计笔记(浙大翁恺版) 第十一周:结构类型

C语言程序设计笔记(浙大翁恺版) 第十二周:程序结构

C语言程序设计笔记(浙大翁恺版) 第十三周:文件

其他各科笔记汇总

 

循环控制

第三种循环

for循环

这是最古老的循环,确实样子看上去有点古怪

 

 

for循环

for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1

for ( 初始条件; 条件; 每轮的动作 ) {
   
}

 

for中的每一个表达式都是可以省略的,for( ; 条件; ) == while( 条件 )

在这里插入图片描述

 

 

for = 对于

for ( count=10; count>0; count-- )就读成:”对于一开始的count=10,当count>0时,重复做循环体,每一轮循环体在做完循环体内语句后,使得count--

 

 

阶乘

n ! = 1 × 2 × 3 × 4 × . . × n n!=1\times 2 \times 3\times 4\times .. \times n n!=1×2×3×4×..×n

写一个程序,让用户输入 n n n,然后计算输出 n ! n! n!

int n;

scanf("%d", &n);
int fact = 1;

int i = 1;
for ( i=1; i<=n; i++ ) {
    fact *= i;
}

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

循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,我们可以把变量i的定义放到for语句里面去写成for ( int i=1; i<=n; i++ ) { ... }

但是即使宣称支持C99的编译器,也可能需要加特殊的选项才能够使用这种写法

在这里插入图片描述

 

循环的计算和选择

如何计算循环的次数,如何选择不同的循环

 

 

循环次数

for ( i=0; i<n; i+= )则循环的次数是n,而循环结束后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响

 

 

Tips for loops

如果有固定次数,用for。如果必须执行一次,用do_while。其他情况用while

在这里插入图片描述

 

循环控制

循环控制

如何用breakcontinue来控制循环

 

 

break vs continue

break:跳出循环

continue:跳过循环这一轮剩下的语句进入下一轮

在这里插入图片描述

 

 

素数

只能被1和自己整除的数,不包括1

#include <stdio.h>

int main()
{
	int x;

	scanf("%d", &x);
	
	int i;
	int isPrime = 1;	//	x是素数
	for ( i=2; i<x; i++ ) {
		if ( x % i == 0 ) {
			isPrime = 0;
			break;
		}
	}
	if ( isPrime == 1 ) {
		printf("是素数\n");
	} else {
		printf("不是素数\n");
	}
	return 0;
}

 

嵌套的循环

在循环里面还是循环

 

 

嵌套的循环

循环里面还是循环

 

 

100以内的素数

如何写程序输出100以内的素数?

#include <stdio.h>

int main()
{
	int x;
	
	for ( x=1; x<=100; x++ ) {
		int i;
		int isPrime = 1;	//	x是素数
		for ( i=2; i<x; i++ ) {
			if ( x % i == 0 ) {
				isPrime = 0;
				break;
			}
		}
		if ( isPrime == 1 ) {
			printf("%d ", x);
		} 
	}
	printf("\n");
	return 0;
}

 

前50个素数

如何写程序输出前50个素数?

#include <stdio.h>

int main()
{
	int x;
	int cnt = 0;

	x = 1;
	while ( cnt <50 ) {
		int i;
		int isPrime = 1;	//	x是素数
		for ( i=2; i<x; i++ ) {
			if ( x % i == 0 ) {
				isPrime = 0;
				break;
			}
		}
		if ( isPrime == 1 ) {
			cnt ++;
			printf("%d\t", x);
			if ( cnt %5 == 0 ) {
				printf("\n");
			}
		} 
		x++;
	}
	return 0;
}

 

从嵌套的循环中跳出

break只能跳出其所在的循环

 

 

breakcontinue只能对它所在的那层循环做

当有多重循环,希望从最内层跳到最外层时可以用break接力或者goto

 

 

凑硬币

如何用1角、2角和5角的硬币凑出10元以下的金额呢?

#include <stdio.h>

int main()
{
	int x;
	int one, two, five;
	int exit = 0;
	
	scanf("%d", &x);
	for ( one = 1; one < x*10; one++ ) {
		for ( two = 1; two < x*10/2; two++ ) {
			for ( five = 1; five < x*10/5; five++ ) {
				if ( one + two*2 + five*5 == x*10 ) {
					printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n", 
						one, two, five, x);
					exit = 1;
					break;
				}
			}
			if ( exit == 1 ) break;
		}
		if ( exit == 1 ) break;
	}
	
	return 0;
}

#include <stdio.h>

int main()
{
	int x;
	int one, two, five;
	
	scanf("%d", &x);
	for ( one = 1; one < x*10; one++ ) {
		for ( two = 1; two < x*10/2; two++ ) {
			for ( five = 1; five < x*10/5; five++ ) {
				if ( one + two*2 + five*5 == x*10 ) {
					printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n", 
						one, two, five, x);
					goto out;
				}
			}
		}
	}
out:	
	return 0;
}

 

 

循环应用

  • 前n项求和
  • 整数分解
  • 求最大公约数

 

编程练习解析

  • 4-0:给定条件的整数集
  • 4-1:水仙花数
  • 4-2:九九乘法表
  • 4-3:统计素数求和
  • 4-4:猜数游戏
  • 5-0:n项求和
  • 5-1~5-3
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值