C语言基础篇之分支语句和循环语句(1)

本文详细介绍了C语言中的分支语句,包括if、if...else、if...elseif...else的用法,强调了代码块的重要性,并通过实例解释了switch语句的使用,包括break和default的作用。此外,还探讨了while循环的结构和break、continue关键字的用法,最后讲解了getchar()函数在清除输入缓冲区中的应用,确保程序正确运行。
摘要由CSDN通过智能技术生成

前言

C语言是一门结构化的程序设计语言
有三种基本结构,顺序结构选择结构循环结构。这三种结构也跟现实生活息息相关(这三种结构分别是什么意思呢?)

顺序结构:(从头到尾的干下去)
分支结构:(满足某些条件就走哪条路)
循环结构:(循环的做某些事情,当达到某些条件结束当前循环)

图例:
在这里插入图片描述
本章介绍分支语句和循环语句

一、什么是语句?

; (分号)隔开的语句语句就是一条语句
在这里插入图片描述

二、分支语句(选择结构)

因为有选择也叫选择结构

那if语句的语法结构是怎么样的呢?

1.if语句
语法1
if(表达式)
	语句;

举例:

#include<stdio.h>
int main()
{
	int age = 20;
	if (age >= 18)
		printf("成年\n");
}

在这里插入图片描述

语法2
if(表达式)
	语句;
elae
	语句;

举例

#include<stdio.h>
  int main()
  {
	  int age = 10;
	  if (age >= 18)
		  printf("成年\n");
	  else
		  printf("未成年\n");
  }

在这里插入图片描述

语法3
if(表达式1)
     语句1else if(表达式2)  
     语句2else   
     语句3

举例:

#include<stdio.h>
int main()
{
	int age = 80;
	if (age < 18)
		printf("未成年\n");
	else if (age >= 18 && age < 30)
		printf("青年\n");
	else if (age >= 30 && age < 50)
		printf("中年\n");
	else if (age >= 50 && age < 100)
		printf("老年\n");
	else
		printf("老寿星\n");
	return 0;
}

在这里插入图片描述

这里采用了一个逻辑操作符 &&(并且的意思)两个条件同时成立才能运行

注意:else if (age >= 18 && age < 30)千万不能写成数学表达式18<=age<30
写成这样不是我们想要的结果。

如图
在这里插入图片描述
在C语言中先把18<=age看成一个表达式条件不成立,为0(假)后半部分就变成0<30为真,条件成立执行语句,这是错误代码。在C语言中非0为真(1,2,3,-1,-2等),0为假

总结:在C语言中非0为真,0为假,表达式为0,为假,条件不成立,表达式为非零,为真,条件成立

代码块

代码块({})
在这里插入图片描述
在这里插入图片描述
可以说明不加代码块if语句只控制第一条语句,诺要控制多条语句因加代码块
在这里插入图片描述现在来看下这段代码猜猜答案

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
		printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

结果:什么都不打印
这个else为悬空else,那这个else怎么匹配的了?
原则:else只会与最近的未匹配if进行匹配

改正上图代码应该加代码块

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

再看一下面代码

#include<stdio.h>
int main()
{
	int num = 1;
	if (num = 5)
	{
		printf("hehe\n");
	}
	return 0;
}

这里把5赋值给了num,并不是等于5的时候,结果为真。虽然代码没有报错,但结果不是我们想要的。
这里容易把等于写成赋值,为了避免此类情况应把常量放在左边
(5 == num),养成良好代码风格,成为大牛。

编程练习

判断一个数是否为奇数

思路:输入一个数,%2余1为奇数,余0则偶数

#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)//%2取余法
		printf("%d是奇数\n", num);
	else
		printf("%d不是奇数\n", num);
	return 0;
} 

在这里插入图片描述
输出1-100之间的奇数

思路:首先要利用循环(可用while或for)产生1-100的数字,然后在循环结构里使用if判断

#include<stdio.h>
int main()
{
	int i = 0;
	while (i <= 100)
	{
		if (i % 2 == 1)
		{
			printf("%d ", i);
		}
		i++;
	}
	return 0;
} 

在这里插入图片描述
根据刚刚上面代码可以写另外一种更加简洁方便的代码

思路:i的初始值为1,i+=2,使每次自增时加2.

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 100)
	{
		printf("%d ", i);
		i+=2}
	return 0;
}

在这里插入图片描述


2.switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。
switch语法:

语法结构 switch(整型表达式)
			{
				语句项;
			 }
语句项   case 整型常量表达式:
				语句;

注意:case后面有一个空格。
case后面可以常量也可以整形常量表达式,例case 1:或者case 1+0:
还可以使用字符,字符的ASCII值属于整型,例case ‘A’或’a’。
不能使用浮点数,例case 1.5:或者case 1.5+1:,也不能使用变量case n:或者case n+1。

switch中的break

下面程序由键盘输入数字转换成相应的星期几

#include<stdio.h>
int main()
{

	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
		case 1:
			printf("星期一\n");
			break;
		case 2:
			printf("星期二\n");
			break;
		case 3:
			printf("星期三\n");
			break;
		case 4:
			printf("星期四\n");
			break;
		case 5:
			printf("星期五\n");
			break;
		case 6:
			printf("星期六\n");
			break;
		case 7:
			printf("星期天\n");
			break;
	}
	return 0;
}

那我没写成 if…else if …else if 的形式太复杂,那我们就得有不一样的语法形式。 这就是switch 语句。

假设case 1-3中的break删除会出现什么效果呢?

#include<stdio.h>
int main()
{

	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
		case 1:
			printf("星期一\n");
		case 2:
			printf("星期二\n");
		case 3:
			printf("星期三\n");
		case 4:
			printf("星期四\n");
			break;
		case 5:
			printf("星期五\n");
			break;
		case 6:
			printf("星期六\n");
			break;
		case 7:
			printf("星期天\n");
			break;
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述把break删除或者少打都不是我们想要的结果。说明switch的入口是case,终止是break。
说明:break不一定有,如下面代码。键盘输入1-5输出工作日,6-7输出休息日

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	}
	return 0;
}

在这里插入图片描述

break根据需要代码逻辑或者结果使用。

switch中的default

当用户输入的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。也可以理解成以防用户输入错误,给提示作用

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
	default:
		printf("输入错误,重新输入\n");
		break;
	}
	return 0;
}

在这里插入图片描述
为了养成良好的编程的良好习惯,应在在一个 case 语句的后面加上一条 break语句。 (之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break。

switch嵌套使用

switch本身可以嵌套使用,怎么理解了,看看下面代码,猜一下答案

#include<stdio.h>
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)//switch允许嵌套使用
		{
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	return 0;
}

结果是
在这里插入图片描述

注意:break跳出的是当前switch语句。咋们看看代码是如何执行的

在这里插入图片描述

三.循环语句

循环语句有
while
for
do while

while循环语法

while循环的语法结构

while(表达式)
{
	循环语句;
}

在学习while循环,我们学会了if语句,我们看下代码
在这里插入图片描述
当 if(1)条件为真,语句只执行,现在把if换成while(1)
在这里插入图片描述

while(1)条件为真,语句循环执行,而if语句只会执行一次
那么会使用while循环了。

学会while循环那就来练一题:打印1-10的数字

思路:首先跟上面打印1-100的奇数利用循环产生1-10的数字

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

在这里插入图片描述

咋们一起看看while循环如何运行
在这里插入图片描述

while语句中的break和continue
1.break在while循环的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			break;
		}
		printf("%d\n", i);
		i++;
	}
	return 0;
}

在这里插入图片描述
打印1,2,3,4后i++自增1变成5,if(5==i)条件成立,执行里面的break;所跳出循环即终止整个循环。

1.continue在while循环的作用:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

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

这里代码输出的结果是什么?猜猜答案。
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
2 3 4 6 7 8 9 10


在这里插入图片描述
黄色框部分其实还在运行的,没有出现一句(请按任意键继续…)程序就还在继续运行。这里打印了1 2 3 4后程序进入了死循环状态。在if(5==i)的时候,进入语句,执行continue,continue后面的程序没法执行,固 i 一直是5,程序进入死循环中状态。

四.getchar()函数详解

在学getchar()函数之前先看一段代码看下是什么意思。

#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
		putchar(ch);
	return 0;
}

在这里插入图片描述

执行过程:getchar 从键盘输入获取字符放到ch,putchar打印ch存放的字符。在键盘输入的字符不等于-1就会循环,也使用Ctrl+Z结束

这里为什么会创建int类型的ch呢?

因为ch接收getchar()传过来的字符其实是一ASCLL存放

想这种代码有存在的意义吗?
看下面的代码,模拟用户输入密码,输入Y或N确认密码。

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	int ch = 0;
	printf("请输入密码>:");
	scanf("%s", password);
	printf("请确认密码(Y/N)>:\n");
	ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

在这里插入图片描述
当输入密码123456时还没确认密码就已经确认失败,你们说这是不是胡搞。
那为什么会这样呢?

在这里插入图片描述

当我们发现了这个问题改怎么决绝?

思路:
通过上图我们发现scanf把123456拿走后,输入缓冲区留下\n,导致问题所在,那我们可以加一个getchar()把\n取走,作用:清理缓冲区

在这里插入图片描述
虽然加了一个getchar()加\n(回车键)解决,假设现在密码
输入123456+空格+abcdef+\n(回车键)又会出现问题。因为scanf读取字符串的时候遇到空格就会停止读取,看下图
在这里插入图片描述
用一个getchar无法保证遗留在输入缓冲区的东西全部读取。当出现这种情况就可以利用while循环把scanf读取完缓冲区的剩下的东西清理掉

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	int ch = 0;
	printf("请输入密码>: ");
	scanf("%s", password);
	while ((ch = getchar()) != '\n')
	{
		;
	}
	printf("请确认密码(Y/N)>: ");
	ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}
	return 0;
}

在这里插入图片描述
现在再看下面代码会输出什么?

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch > '9')
		{
			continue;
		}
		putchar(ch);
	}
	return 0;
}

在这里插入图片描述

输出0-9的字符

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值