for循环、break和continue、二重循环

循环语句

循环语句可以反复多次执行同一组语句,for关键字可以用来编写循环;可以在for循环里让一个变量依次代表一组数字,然后使用同一组语句处理这个变量代表的每个数字。这个变量叫做循环变量,按照统一的规律从第一个数字开始把每个数字都计算出来并让循环变量代表它,以下格式用来描述循环变量的变化过程。(把开始数字赋值给循环变量;用逻辑表达式描述循环变量和结束数字之间的关系;根据前一个数字计算后一个数字的规则)

c 复制代码
for( ; ;){
    
}

如果一个问题的解决过程中包含一组数字的变化过程,每个数字的处理方法又类似就可以使用循环解决这个问题。

练习:编写程序在屏幕上显示以下内容;每次显示一行,for循环实现

1 x 9 =9
2 x 8 =16
3 x 7=21
4 x 6 =24
5 x 5 =25

点击查看代码

/*
 *
 *每次先是一行,屏幕上显示以下内容
 *
 *1x9=9
 *2x8=16
 *3x7=21
 *4x6=24
 *5x5=25
 *
 *
 * */
#include<stdio.h>
int main(){
	int num1 = 0,tmp =10;
	for(num1 = 1;num1 < 6;num1 ++){
			printf("%d x %d = %d\n ",num1,(tmp-num1),num1 * (tmp-num1));
		}
	return 0;
}

练习:编写程序从键盘得到两个整数;把他们之间所有的奇数的和计算出来并显示在屏幕上
点击查看代码

/*
 *
 * 求两个整数之间的所有奇数和显示在屏幕上
 *
 * */
#include<stdio.h>
int main(){
	int max = 0,min = 0,tmp = 0,num = 0,sum = 0;
	printf("请输入两个数字\n");
	scanf("%d%d",&min,&max);
	if (min >= max){
		tmp = min;
		min = max;
		max = tmp;
	}
	for (num = min;num <= max;num ++){
		if (num & 1){
			sum += num;
		}
	}
	printf("求和结果%d\n",sum);
	return 0;
}

假设有以下的for循环

c 复制代码
for(1;2;3){
	4
}

他按照以下方式分组执行:[1,2] [4,3,2] [4,3,2] ......[4,3,2]。第一组和其他所有组都不同,正常情况下for循环一定在两组之间结束;如果某一组最后一组编号为2的逻辑表达式结果为真就启动下一组,否则结束循环。如果for循环正常结束则循环结束后循环变量落在指定数字范围之外,for循环有可能不执行大括号里的语句,for循环小括号里每条语句都可以省略,for循环小括号里中间的逻辑表达式如果省略就表示逻辑表达式永远为真,这种循环不能正常结束,他们叫做死循环

c 复制代码
for(;;)

for循环里 小括号里前面和后面的部分可以是用逗号连接的多条语句,C99规范里允许在for循环的小括号里临时声明循环变量,这种循环变量只能在循环里使用就,循环结束后就不能用了(不支持使用)。

练习:鸡兔同笼;40个头,100只脚。编写程序计算兔子和鸡各有多少只
点击查看代码

/*
 *鸡兔同笼
 *头=40
 *脚=100
 *求各有多少只
 *
 * */
#include<stdio.h>
int main (){
	int num = 0;
	for (num = 0; num <=40;num ++){
		if (4 * num + 2 * (40-num) == 100){
			printf("兔子有%d只,鸡有%d\n",num ,40-num);
			break;
		}
	}
	printf("num = %d\n",num);
	return 0;
}

break语句

可以在循环里使用break;语句立即结束循环的执行,一旦执行了break语句,则循环里的一切语句都不再执行,包括循环变量也不再变化,如果循环采用break;语句结束则结束后循环变量一定在指定数字范围之内,如果编写循环的时候不知道循环要重复执行多少次就可以编写一个死循环然后用break;语句结束它。

continue语句

可以在循环大括号里使用continue;语句直接跳到大括号的末尾,中间的所有语句这次循环都不执行

随机数

无法预知的数字叫随机数;rand标准函数可以用来获得随机数,为了使用这个标准函数需要包含stdlib.h这个头文件,srand标准函数用来设置随机数种子,这个函数需要一个整数作为种子使用,不同的种子得到的随机数不同,为了使用这个标准函数需要包含stdlib.h头文件,任何程序只需要设置一次随机数种子,time标准函数可以用来获得当前时间,这个函数用一个整数表示获得的时间;同一秒之内获得的代表时间的整数不会变化。为了使用这个标准函数需要包含time.h头文件。

练习:编写猜数游戏
点击查看代码

/*
 *
 *
 *猜数游戏
 *
 *
 *
 * */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (){ 
	int num = 0,guess=0;
	srand(time(0));
	num = rand() % 100;
	while (1){
		printf("请输入猜测的数字\n");
		scanf("%d",&guess);
		if (guess > num){
			printf("大了\n");
		}
		else if (guess < num){
			printf("小了\n");
		}
		else {
			printf("对了\n");
			break;
		}
	}
	return 0;
}

程序首先获得一个0到99之间的随机数,然后让用户猜这个数字,每次猜完给出相应提示(猜大了.猜小了,猜对了),直到猜对程序结束

分支和循环都是流程控制语句,他们可以让程序里的语句不在从上到下顺序执行。

goto语句

goto语句也是流程控制语句,它可以把程序中任何一条语句指定成下一条语句,尽量不要使用goto语句。

练习:在屏幕上显示以下五行内容

54321

5432

543

54

5

每次只能显示一个个位数
点击查看代码

/*
 *
 *54321
 *5432
 *543
 *54 
 *5
 *每次显示一个个位数
 *
 * */
#include<stdio.h>
int main (){
	int num = 0,num1 = 0;
	for (num = 1;num <= 5;num ++){
		for (num1 = 5;num1 >= num;num1 --){
			printf("%d",num1);
		}
		printf("\n");
	}
	return 0;
}

多重循环

如果一个问题的解决过程中包含多组数字的变化过程并且他们的变化过程互相关联就可以采用多重循环解决,多重循环里外部循环的循环变量负责代表变化慢的数字,内部循环的循环变量负责代表变化快的数字。

练习:假设一种货币包含三种面值,分别是1元,2元,和5元

编写程序找到10元的所有可能的组合并都显示在屏幕上
点击查看代码

/*
 *
 *货币组合显示
 *
 *
 * */
#include<stdio.h>
int main (){
	int num = 0, num1 = 0;
	for (num = 0;num <= 2;num ++){
		for (num1 = 0;num1 <= 5;num1 ++){
			if (5 * num + 2 * num1 <= 10){
				printf("5元有%d张,2元有%d张,1元有%d张\n",num,num1,10 - 5 * num -2 *num1);
			}
		}
	}
	return 0;
}

while关键字

while关键字也可以用来编写循环,不容易用for关键字实现的循环就可以考虑用while关键字实现,while循环格式如下

c 复制代码
while (逻辑表达式){
    反复执行的语句
}

这个结构表示反复执行大括号里面的语句直到逻辑表达式结果为假,如果while循环的逻辑表达式永远为真就成为了死循环,while循环里也可以使用break;和continue;语句;while循环会交替执行逻辑表达式的计算和大括号里面的语句,while循环第一步首先计算逻辑表达式的结果,如果这个时候逻辑表达式结果假就直接结束,while循环有可能不执行大括号里面的语句。

do...while

do...while格式也可以用来编写循环,do...while循环格式如下

c 复制代码
do {
    反复执行的语句
} while (逻辑表达式);

do...while循环小括号后面必须要用分号结束,do...while循环也是交替执行逻辑表达式的计算和大括号里面的语句,do...while循环首先执行大括号里的语句,do...while循环可以保证大括号里里面的语句至少执行一次。

练习:编写程序从键盘得到两个非负整数;计算他们的最大公约数并把结果显示在屏幕上。