switch语句的补充和循环语句的讲解

目录

1. switch语句的补充:

1.1在switch语句中的default语句:

1.2在switch语句中的break语句:

2.:循环语句:

2.1 while循环语句:

2.2:for循环

2.3:do while 循环 


1. switch语句的补充:

1.1在switch语句中的default语句:

如果我们输入的值不是我们定义的case的值的时候,我们就使用default语句:

int main() {
	int i = 0;
	scanf("%d", &i);
	switch (i) {
	case 1:
		printf("h");
	case 2:
		printf("hh");
	case 3:
		printf("hhh");
	default: 
		printf("hhhh");
	}
	return 0;
}

 此时我们输入的5,但是我们的case语句中并没有case5,所以他就执行了我们的default语句.

1.2在switch语句中的break语句:

如果有break,把么就会跳出当前的case语句.如果没有break语句,就执行下一条case语句.

int main() {
	int i = 1;
	int j = 1;
	switch (i) {
	case 1:
		i++;
	case 2:
		j++;
	}
	printf("i= %d j= %d", i, j);
	return 0;
}

上面是没有用break语句的代码.我们来看看结果:

int main() {
	int i = 1;
	int j = 1;
	switch (i) {
	case 1:
		i++;
		break;
	case 2:
		j++;
	}
	printf("i= %d j= %d", i, j);
	return 0;
}

当我们使用break语句时:

此时我们发现j的值没有加一,i的值加一了,说明使用break语句之后,程序在遇到break之后就结束了switch,没有进行后面的case.

下面有个例子给大家分析:

int main() {
	int n = 1;
	int m = 2;
	switch (n) {
	case 1:
		m++;//m=3
	case 2:
		n++;//n=2
		//case 1  case 2没有break语句终止,所以会执行后面的语句
	case 3:
		switch (n) {//n=2
		case 1:
			n++;
		case 2:
			m++; n++;//m=4,n=3;
			break;
		}
	case 4:
		m++;//m=5
		break;
	default:
		break;
	}
	printf("m= %d n= %d", m, n);//m=5,n=3;
	return 0;
}

如果上面的switch语句你能够看得懂,并且可以完全理解,那么你的switch语句就可以了.

2.:循环语句:

循环语句有哪些?:while循环  for循环 do while循环.

2.1 while循环语句:

语句的格式:while(条件判断语句){循环体}.如果条件为真 就进入循环体.

int main() {
	int i = 1;
	while (i) {
		printf("hh\n");
	}
	return 0;
}

我们在while循环的条件判断语句中给他的条件是i=1,所以他是一个真的条件,所以就会执行我们的循环体;

 下面我们来简单的用一下我们的while循环打印一下我们的1-9;

//打印数字1-9;
int main() {
	int i = 1;
	while (i<10) {
		printf("%d  ",i);
		i++;
	}
	return 0;
}

while循环中:有两个关键字:break 和 continue;

break:

int main() {
	int i = 1;
	while (i<10) {
		if (i == 5)
			break;
		printf("%d  ",i);
		i++;
	}
	return 0;
}

当我们使用了break时,就终止了我们的循环,break后面的代码就不会执行.

continue:

int main() {
	int i = 1;
	while (i<10) {
		if (i == 5)
			continue;
		printf("%d  ",i);
		i++;
	}
	return 0;
}

 此时我们使用了continue时,程序并没有停止而是出现了死循环.那么我们的continue就是跳过continue后面的代码直接判断是否可以执行下一次循环,我们上面的代码就是在i=5的时候,continue跳过了后面的代码,直接去判断我们的循环条件是否成立,成立就继续进行我们的代码,但是此时是不执行continue后面的代码的.所以我们的程序出现了死循环(此时我们的n是4,条件判断为真)

int main() {
	int i = 1;
	while (i<10) {
		i++;
		if (i == 5)
			continue;
		printf("%d  ",i);
	}
	return 0;
}

当我们的代码修改以后按照上面的代码进行写的时候,就不会出现死循环的结果,因为我们的i++在循环中仍然运行.我们来看一下结果:

在这给大家讲一下一个C语言中的一个函数.getchar (获取字符 ASCII码值)和 putchar (输出一个字符)

int main() {
	int ch = getchar();//获取一个字符:从键盘中获取
	printf("%c\n", ch);
	putchar(ch);
	return 0;
}

为什么我们定义的ch是一个int型,不是一个char型?因为它所获取的是这个字符的ASCII码值,所以就是需要int型.putchar就是输出这个字符的ASCII值的数值所代表的是字符.

c语言中的EOF(end of file)字符结束.

int main() {
	int ch = 0;
	while ((ch = getchar())!=EOF) {//表示我们获取的是一个字符的话就是真值进去循环
		putchar(ch);
	}
	return 0;
}

以上代码进去以后就是一个循环,我们输入一个字符他就会打印一个字符,那么我们发现此时是一个死循环,程序没有办法停止.那么我们只需要输入CTRL+z,就会输入一个EOF,程序就会停止.

在这给大家举个例子让大家更加好的理解

//判断密码是否正确
int main() {
	char password [20] = { 0 };//定义一个密码是一个字符数组
	printf("请输入密码\n");
	scanf("%s", password);//输入一个字符
	printf("请判断密码是否正确->(Y/N)\n");
	int ret = getchar();//获取判断的字符
	if (ret == 'Y') {
		printf("YES\n");
	}
	else {
		printf("NO");
	}
	return 0;
}

 为什么我输入以后还没有判断,他就输出了?

 那么怎么解决这个问题呢:

 

 那么这就是我们很好的一个解决方案.代码如下:

//判断密码是否正确
int main() {
	char password [20] = { 0 };//定义一个密码是一个字符数组
	printf("请输入密码\n");
	scanf("%s", password);//输入一个字符
	printf("请判断密码是否正确->(Y/N)\n");
	//getchar();//让他把\n拿走,那么后面的getchar就获取的是我们判断密码的Y\N.
	int flag = 0;
	while ((flag=getchar())!='\n') {
		getchar();
	}
	int ret = getchar();//获取判断的字符
	if (ret == 'Y') {
		printf("YES\n");
	}
	else {
		printf("NO");
	}
	return 0;
}

 

下面一个代码只打印我们的数字字符:

int main() {
	char ch = '\0';
	while ((ch = getchar()) != EOF) {
		if (ch < '0' || ch > '9') {//ASCII码值是字母
			continue;//如果是字母就跳过
		}
		putchar(ch);//只打印数字
	}
	return 0;
}

2.2:for循环

for循环的语法:

表达式1:初始化部分,用来初始化变量

表达式2:条件判断部分,用来判断循环终止

表达式3:调整部分,用来调整循环

我们来打印1~10,分别使用for循环和while循环

//打印1~10
//首先while循环
int main() {
	int i = 1;
	while(i <= 10) {
		printf("%d ", i);
		i++;
	}
	return 0;
}
//for循环
int main() {
	int i = 1;
	for (i = 1; i <= 10; i++) {
		printf("%d ", i);
	}
	return 0;
}

 

在这我么看到两个循环的本质是一样的,都有三条语句,只不过他们的语法不同.

在for循环中也存在break和continue

int main() {
	int i = 1;
	for (i = 1; i <= 10; i++) {
		if (i == 5) {
			break;
		}
		printf("%d ", i);
	}
	return 0;
}

int main() {
	int i = 1;
	for (i = 1; i <= 10; i++) {
		if (i == 5) {
			continue;
		}
		printf("%d ", i);
	}
	return 0;
}

 

 在这为什么使用了continue之后,程序只是跳过了5,而不是死循环呢?在我们的while循环中出现死循环,为什么for循环没有出现呢?

 强调:在for循环中,建议不要在循环体中更改循环变量;

提醒:在for循环中,条件判断,前闭后开(这是一个比较合理的公用的一个规则)注意灵活使用

 for循环几种情况:1.循环中的判断条件省略

int main() {
	for (;;) {
		printf("hehehe\n");
	}
	return 0;
}

此时我们运行时发现,出现了死循环;

 

上面的代码只是为了给大家强调,在我们的for循环中,三条语句不要省略,防止出错。

2.3:do while 循环 

 用do while循环打印1~10;

int main() {
	int i = 1;
	do {
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

do while 循环中也有break和continue。

int main() {
	int i = 0;
	do {
		if (i == 5) 
			break;
		printf("%d ", i);
		i++;
	} 
	while (i < 10);
	return 0;
}

此时跳过5,只打印了0,1,2,3,4;

int main() {
	int i = 0;
	do {
		if (i == 5) 
			continue;
		printf("%d ", i);
		i++;
	} 
	while (i < 10);
	return 0;
}

此时出现死循环,continue跳过后面的循环体,所以i=5,在while循环中一直为真。

例题:计算1!+2!+3!+。。。。+10!

int main() {
	int n = 0;
	int i = 1;
	int sum = 0;
	int ret = 1;
	int T = 0;
	scanf("%d", &T);//输入T=10;就是10 1到10的阶乘的和
	for (n = 1; n <= T;n++) {
		for (i = 1; i <= n; i++) {
			ret = ret * i;
		}
		sum = sum + ret;
	}
	printf("%d", sum);
	return 0;
}

那么上面的代码我们使用了两层for循环,比较麻烦,那我们进行简化:

int main() {
	int n = 0;
	int sum = 0;
	int ret = 1;
	int T = 0;
	scanf("%d", &T);//计算的阶乘的数字
	for (n = 1; n <= T; n++) {
		ret = ret * n;
		sum = sum + ret;
	}
	printf("%d", sum);
	return 0;
}

在某个数组中查找某个具体的数字:

int main() {
	int k = 0;
	scanf("%d", &k);
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++) {
		if (arr[i] == k) {
			printf("找到了第 %d 个元素\n", i);
			break;
		}
		if (i == sz) {//判断i的值有没有到数组的最后一个元素的下角标
			printf("找不到\n");
		}
	}
	return 0;
}

 折半查找元素角标位置:

int main() {
	int k = 0;
	scanf("%d", &k);
	int arr[] = { 1,2,3,4,5,6,7,8,9};
	int left = 0;//做下标
	int sz = sizeof(arr) / sizeof(arr[0]);
	int right = sz - 1;//右下标
	int mid =left + (right - left ) / 2;//中间角标
	while (left <= right) {
		if (arr[mid] < k) {
			left = mid + 1;
		}
		else if (arr[mid] > k) {
			right = mid - 1;
		}
		else {
			printf("第 %d 个元素是",mid);
			break;
		}
	}
	if (left > right) {
		printf("找不到元素"); 
	}
	return 0;
}

 猜字谜游戏;

void menu() {//菜单方法
	printf("*************************\n");
	printf("********* 1.play ********\n");
	printf("********* 2.exit ********\n");
	printf("*************************\n");
}
void game() {
	int guess = 0;
	srand((unsigned int)time(NULL));//利用时间戳生成一个随机数
	int ret = rand()%100+1;//生成随机数,对100取余再加1范围就是1-100
	printf("请猜数字");
	scanf("%d", &guess);
	while (1) {
		if (guess < ret) {
			printf("猜小了\n");
		}
		else if (guess > ret) {
			printf("猜大了\n");
		}
		else {
			printf("恭喜你猜对了\n");
			break;
		}
	}

}
int main() {
	//打印菜单
	int input = 0;
	srand((unsigned int)time(NULL));//利用时间戳生成一个随机数
	do {
		menu();
		printf("请输入选择的模式");
		scanf("%d", &input);
		switch(input){
		case1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("没有该选项请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

如果说上面的代码,你都可以理解,并且你能够在不看我的代码的情况下敲出代码,就说明你的逻辑思维和循环和条件语句已经可以了。

那么我们本次的分享到此就结束了,期待我们的下次见面。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小白~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值