循环语句

while

for

do while


while

重点:break是用于永久的终止循环

continue跳过本次循环后面的代码,直接去判断部分进行下一次循环的判断


练习题

int main()
{
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);

	int ch = 0;
	/*ch = getchar();*/

	//前面输入密码后,遗留了空格后的字符,用getchar字符吸收,直到遇到\n后,再继续往下走
	while ((ch = getchar()) != '\n')  
	{
		;
	}

	printf("请确认密码(Y/N):>");
	int ret = getchar();      //获取输入的字符,保存到变量ret
	if('Y' == ret)		//如果输入的是Y,则打印yes
	{
		printf("yes\n");
	}
	else
		printf("no\n");		//如果不是,则打印no
	return 0;
}


for循环

为什么有了while循环还需要for循环呢?

因为for循环增加了初始化变量部分和循环条件的调整部分。

for循环的语法:  for(表达式1;表达式2;表达式3;)

循环语句:

 表达式1为初始化部分,用于初始化循环变量

 表达式2为条件判断部分

 表达式3为调整部分,用于循环条件的调整


练习题--循环打印出数组中的每一个元素

//sizeof(arr) 数组的总大小,单位是字节

//sizoof(arr[0]) 数组元素的大小

练习题--循环打印出数组中的每一个元素

int main()
{
	int arr[] = {21,25,32,4,53,15,35,65,68,79,84,31};
	int i = 0;

//sizeof(arr) 数组的总大小,单位是字节
//sizoof(arr[0]) 数组元素的大小
	int sz = sizeof(arr)/sizeof(arr[0]);

	while (i < sz)
	{
		printf("%d ", arr[i]);
		i++;
	}
	return 0;
}


练习题--出生日期输入输出

 //使用%4d,可以指定输入数据域宽

 //输出数据使用%0d格式控制符,输出数值时指定前面的空位置填0

int main()
{
	//输入数据
	int year = 0;
	int month = 0;
	int date = 0;
	//使用%4d,可以指定输入数据域宽
	scanf("%4d%2d%2d", &year, &month, &date);


	//输出数据使用%0d格式控制符,输出数值时指定前面的空位置填0
	printf("year=%d\n", year);
	printf("month=%02d\n",month);
	printf("date=%02d\n", date);

	return	0;
}

练习题--学生信息输入输出

//0.0 后面的f表示这个 0.0 的类型是flaot,如果一个浮点数后面后没有加f,那么C语言默认它是double类型的。

//%.2f是float后的小数只输出两位

int main()
{
	int stu = 0;
	float a = 0.0f;   //0.0 后面的f表示这个 0.0 的类型是flaot,如果一个浮点数后面后没有加f,那么C语言默认它是double类型的。
	float b = 0.0f;
	float c = 0.0f;
	printf("请输入您的学号和各科目成绩:");
	scanf("%8d;%f,%f,%f", &stu,&a,&b,&c);

	//%.2f是float后的小数只输出两位
	printf("The each subject score of NO.%8d is %.2f,%.2f,%.2f.\n",stu,a,b,c);

	return 0;
}


练习--找最大数

int main()
{
	int a = 0;
	int i = 1;
	int max = 0;

	scanf("%d", &max);
	while (i < 4)
	{
		scanf("%d", &a);
		if (a > max)
			max = a;
		i++;
	}
	printf("%d", max);
	return 0;
}


练习--计算球体的体积

球体体积公式为V=4/3*Πr³,Π=3.1415926
//计算球体面积

int main()
{
	//球体体积公式为V = 4 / 3 * Πr³,Π = 3.1415926
	double r = 0.0;
	printf("请输入球体的半径:");
	scanf("%lf",&r);

	//输出
	double v = 0.0;
	v = 4 / 3.0 * 3.1415926 * r * r * r;
	printf("球体的体积为:%.3lf\n",v);
	return 0;
}


do...while()循环

do语句的特点:循环至少执行一次,使用的场景优先,所以不是经常用。

语法结构:

do
	循环语句;
  while(表达式);
例:
int main()
{
	int i = 1;
  
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
  
	return 0;
}
练习题:计算n的阶乘;

int main()
{
	int i = 1;
	int n = 0;
	int ret = 1;

	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret = ret * i; //循环的数字乘以之前的乘积
	}
	printf("%d ", ret);
	return 0;
}
//练习题--在有序数组中查找某个数字(二分查找)

int main()
{
	int i = 0;
	int k = 0;
	int arr[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("请输入要查找的数字:");
	scanf("%d", &k);

	int left = 0;
	int right = sz - 1;

	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
			right = mid - 1;
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
	return 0;
}
练习题--//编写代码,演示多个字符从两端移动,向中间汇聚

#include<windows.h>
int main()
{
	char a[] = {"Hello,World!"};
	char b[] = { "************" };

	int sz = sizeof(a) / sizeof(a[0]); //也可以写做:strlen(a);
	int right = sz - 2; //为什么要减2? 因为要算上/0的位置
	int left = 0;

	printf("%s\n", b);

	while (right >= left)
	{

			b[left] = a[left];
			b[right] = a[right];
			printf("%s\n", b);
			Sleep(1000);  //休眠
			//system("cls"); //清空屏幕 system是库函数,可以执行系统命令
			left++;
			right--;
	}
	
	return 0;
}


//编写代码实现模拟用户登录情景,只能登录3次(3次错误,退出)
//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
//如果返回值为0,表示两个字符串相等;
#include <string.h>

int main()
{
	char password[10] = "0755";
	int i = 0;
	char input[10] = {0};

	for (i = 1; i <= 3; i++)
	{
		printf("请输入您的登录密码:");
		scanf("%s", input);
		if (strcmp(input,password) == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
			printf("输入有误,请再次输入\n");
	}
	if (i > 3)
	{
		printf("三次密码均输入错误,退出程序\n");
	}

	return 0;
}
练习题
//猜数字游戏
#include <stdlib.h>
#include <time.h>
#include<windows.h>

void menu()   //游戏菜单
{
	printf("******************************\n");
	printf("*********   1.play   *********\n");
	printf("*********   0.exit   *********\n");
	printf("******************************\n");
}

void game()  //游戏函数
{
	srand((unsigned int)time(NULL)); //生成跟随系统时钟的随机函数
	int guess = 0;
	//1.生成随机数
	int ret = rand()%100+1; // x/100的余数一定小于100,从而生成小于100的随机数
	//printf("%d\n", ret);
	//2.猜数字
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);
  
	return 0;
}



go to语句

goto语句为无条件转向语句。它的作用是无须任何条件,直接就可以使得程序跳转到该语句标号(Label)所标识的语句处去执行,

语句标号代表goto语句转向目标位置

在多层循环这种场景下使用break是达不到目的的,它只能从最内层循环退出到上一层的循环

语法
int main()
{
	again:
  		printf("123\n");
    	printf("456\n");
    	goto again;  //跳转到again位置一直循环打印
    return 0;
}
练习题--一个关机程序

#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char input[10] = { 0 };
	system("shutdown -s -t 60");  //设置60秒关机
again:
	printf("电脑将在1分钟内关机,如果输入:123 就取消关机\n请输入:");
	scanf("%s", input);
	if (strcmp(input, "123") == 0)
	{
		system("shutdown -a");
	}
	else
		goto again;
	return 0;
}