C++笔记day4-for循环和数组冒泡排序

59 阅读2分钟

for循环:

for (表达式1; 表达式2 ; 表达式3)	
{
	循环体。
}

表达式1 --》 表达式2 (判别表达式) --》 为真 --》 循环体。--》 表达式3 --》 表达式2 (判别表达式) --》 为真 --》 循环体 --》 表达式3

--》 表达式2 (判别表达式)。。。。

1--100的和: 5050

1+2+3+4+5+6...+100

int sum = 0;
int i = 0;	

for (; ; )
{
	sum = sum + i;
	i++
}

循环因子:

定义在for之外,for循环结束,也能使用。

定义在for之内,for循环结束,不能使用。

for的3个表达式,均可变换、省略。但,2个分号不能省!

for (i = 1, a = 3;i < 10, a < 20; i++, a+=5)
{
	printf("i = %d\n", i);
	printf("a = %d\n", a);
	a += 5;
}

for(;;) == while(1)  无限循环

示例

#include <stdio.h>

int main(void)
{
	int i = 0; //循环因子;
	int sum = 0;
	int a = 0;
	for (i = 1; i <= 100; i++) //也可以前面不定义int i,直接写成 for(int i =1; i<=100;i++)
	{
		sum = sum+i;//sum +=i;
	}
	printf("sum = %d\n", sum);

	for (i = 1, a = 3; i < 10, a < 20; i++, a += 5)//表达式有多个,分号不能省略
	{
		printf("i=%d\n", i);
		printf("a=%d\n", a);
	}

	return 0;
}

练习:猜数字游戏:

1. 生成一个随机数。 

	1)添加一个随机数种子。srand(time(NULL)); 如果不用种子生成的是伪随机(后面运行的数跟第一次一样)

	2) 添加头文件 <stdlib.h> <time.h>

	3) 生成随机数 int n = rand() % 100;  0-99

2. 循环输入数据猜。

	int num;

	while(1)		// 死循环  for(;;)
	{
		接收用户输入 scanf("%d", &num);

		比较用户的数 和 随机生成数 大小。

		if (n > num)

		else
			break;
	}

3. 跳出循环

	break;
		

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>

int main(void)
{
	srand(time(NULL)); //添加一个随机种子;
	int n = rand() % 100; //生成0-99之间的随机数;

	int num;
	int margin1 =0;
	int margin2 = 99;
	while (1) 
	{
		scanf("%d", &num);
		if (n < num)  //for、while、if如果执行语句只有一条,{ }可以省略
		{
			margin2 = num;
			printf("猜大了,范围是%d到%d之间\n",margin1,margin2);

		}
		else if (n > num)
		{
			margin1 = num;
			printf("猜小了,范围是%d到%d之间\n",margin1,margin2);
		}
		else
		{
			("猜中了,数字是:%d\n", n);
			break;
		}
	}
}

break:

作用1: 跳出一重循环。 forwhiledo while

作用2: 防止case穿透。 switch 	

嵌套循环:

外层循环执行一次,内层循环执行一周。

for(i = 0; i < 24; i++)
{
	for(j = 0; j< 60; j++)
	{

		for(k = 0; k< 60; i++)
		{			
		}
	}
}

练习: 模拟电子表打印:

10:23:45
10:23:46
。。。
10:24:00

// 小时
for (i = 0; i < 24; i++)
{
	// 分钟
	for (j = 0; j < 60; j++)
	{
		// 秒
		for (k = 0; k < 60; k++)
		{
			printf("%02d:%02d:%02d\n", i, j, k);
			Sleep(960);					// #include <Windows.h>
			system("cls");  // 清屏
		}
	}
}

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>

int main(void)
{
	int i, j, k;

	// 小时
	for (i = 0; i < 24; i++)
	{
		for (j = 0; j < 60; j++) // 分钟
		{
			for (k = 0; k < 60; k++) // 秒
			{
				printf("%02d:%02d:%02d\n", i, j, k);
				Sleep(1000);// 控制时间间隔是1000ms;
				system("cls"); //清屏
			}
		}
	}
	
	return 0;
}

练习: 打印9x9乘法表:

1x1 = 1
1x2 = 2 2x2 = 4
1x3 = 3 2x3 = 6 3x3 = 9
1x4 = 4
。。。
1x9 = 9 。。。。。。。。。。。。。。。。。。。。9x9 = 81

外层循环执第i行, 内层执行i列。

for(i=1; i<=9; i++)  	// 行
{
	for(j = 1; j <= i; j++)  //列
	{
		printf("%dx%d=%d\t", j, i, j*i);
	}
	printf("\n");  putchar('\n');
}

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	for (size_t i = 1; i <= 9; i++)
	{
		for (size_t j = 1; j <= i; j++) 
		{
			printf("%dx%d=%d\t", j, i, j * i);
		}
		printf("\n");
	}
}

思考题:

如何打印如下99乘法表呢?

1x9= 9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
1x8= 8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x7= 7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x6= 6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x5= 5 2x5=10 3x5=15 4x5=20 5x5=25
1x4= 4 2x4= 8 3x4=12 4x4=16
1x3= 3 2x3= 6 3x3= 9
1x2= 2 2x2= 4
1x1= 1

for (i = 9; i >= 1; i--)		// 行
{
	for(j = 1; j <= i; j++)		// 列
	{
		printf("%dx%d=%d\t", j, i, j*i);

	}
	putchar('\n');
}

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	for (size_t i = 9; i >= 1; i--)
	{
		for (size_t j = 1; j <= i; j++) 
		{
			printf("%dx%d=%d\t", j, i, j * i);
		}
		printf("\n");
	}
}

跳转语句:

break:【重点】

作用1: 跳出一重循环。 forwhiledo while

作用2: 防止case 穿透。 switch 	

continue:【重点】

作用:结束【本次】循环, continue关键字,之后的循环体,这本次循环中,不执行。

示例

#include <stdio.h>

int main(void)
{
	for (size_t i = 0; i < 5; i++)
	{
				printf("i = %d\n", i);
		if (i == 3)
		{
			continue; //
		}
		printf("123\n");
	}
	int num = 5;
	while (num--) // 当num自减为0时循环终止;等价于while(num-- !=0)
	{
		printf("num = %d\n", num);
		if (num == 3)
		{
			continue;
		}
		printf("123\n");
	}
}

goto: 【了解】

1. 设定一个标签

2. 使用“goto 标签名” 跳转到标签的位置。(只在函数内部生效)

数组:

相同数据类型的有序连续存储。

int arr[10] = {1, 2, 23, 4, 5, 6 , 10, 7, 8, 9};

各个元素的内存地址 连续。

数组名为地址。是数组首元素的地址。 arr == &arr[0];

printf("数组大小:%u\n", sizeof(arr));

printf("数组元素的大小:%u\n", sizeof(arr[0]));

printf("数组元素个数:%d\n", sizeof(arr)/ sizeof(arr[0]));

数据的第一个元素下标: 0

数据的最后一个元素下标: sizeof(arr)/ sizeof(arr[0]) - 1

数组初始化:

int arr[12] = { 1, 2 ,4, 6, 76, 8, 90 ,4, 3, 6 , 6, 8 }; 【重点】

int arr[10] = { 1, 2 ,4, 6, 76, 8, 9 };  剩余未初始化的元素,默认 0 值。 【重点】

int arr[10] = { 0 }; 初始化一个全为 0 的数组。【重点】

int arr[] = {1, 2, 4, 6, 8}; 	编译器自动求取元素个数  【重点】

int arr[] = {0};  只有一个元素,值为0

int arr[10]; 
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;	其余元素未被初始化,默认值 随机数。

练习: 数组元素逆序:

int arr[] = {1, 6, 8, 0, 4, 3, 9, 2};  // {2, 9, 3, 4, 0, 8, 6, 1}
int len = sizeof(arr) / sizeof(arr[0]); //数组元素个数

int i = 0;				// i表示数组的首元素下标
int j = len - 1;		// 表示数组的最后一个元素下标
int temp = 0;		// 临时变量 

// 交换 数组元素,做逆序
while (i < j)
{
	temp = arr[i];		// 三杯水法变量交换
	arr[i] = arr[j];
	arr[j] = temp;
	i++;
	j--;
}

示例

#include <stdio.h>

int main(void)
{
	int arr[] = { 1,6,8,0,4,3,9,2 };
	int len = sizeof(arr) / sizeof(arr[0]);//数组个数
	int i = 0; // 数组的首元素下标
	int j = sizeof(arr) / sizeof(arr[0]) - 1; //表示数组的最后一个元素小标
	int temp = 0;

	for (size_t m = 0; m < len; m++) //打印原始数组
	{
		printf("%d", arr[m]);
	}
			printf("\n");
	while (i<j) //交换数组元素做逆序
	{
		temp = arr[j];
		arr[j] = arr[i];
		arr[i] = temp;

		i++;
		j--;

	}
	for (size_t m = 0; m < len; m++) //打印交换后的数组
	{
		printf("%d", arr[m]);
	}
	printf("\n");
	return 0;
}

练习: 冒泡排序:

int arr[10] = {12, 32, 14, 62, 27, 8, 89};  --> 8 12 14 27 32 62 89

for (size_t i = 0; i < n-1; i++)		// 外层控制行
{
	for (size_t j = 0; j < n - 1 - i; j++)	// 内层控制列
	{
		if (arr[j] > arr[j + 1])		// 满足条件 三杯水交换
		{
			temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
	}
}
	

冒泡排序.png

示例

#include <stdio.h>

int main(void)
{
	int arr[] = { 25,623,33,85,47,6,17,888,46,28 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int i;
	int j;
	int temp = 0;
    
	for (int m = 0; m < len; m++) 
	{
		printf("%d,", arr[m]);
	}
	printf("\n");
	for (i = 0; i < len - 1; i++)//排序算法,外层控制行
		{
			for (j = 0; j < len - 1 - i; j++)//排序算法,内层控制列
			{
				if (arr[j] > arr[j + 1])
				{
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j + 1] = temp;
				}
			}
		}
	for (int m = 0; m < len; m++)
	{
		printf("%d,", arr[m]);
	}
	printf("\n");

}