首页 > 其他分享 >分支和循环语句1

分支和循环语句1

时间:2023-09-09 17:02:35浏览次数:33  
标签:语句 case int else break 循环 printf day 分支

C语言是一门结构化的程序设计语句:

1.顺序结构

2.选择结构

3.循环结构


1.if(选择结构):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int age = 10;
	if (age < 18)
		printf("未成年\n");
	else if (age > 18 && age < 28)
    //&&-逻辑与(并且), &&左右两边条件同时成立时为真
		printf("青年\n");
	else if (age > 28 && age < 50)
		printf("壮年\n");
	else if (age > 50 && age < 90)
		printf("老年\n");
	else
		printf("长寿\n");

	return 0;
}

上述代码块时if的一种多分支结构,

注意在表示范围时要注意不可如下图代码块所撰(错误示范):

if(18<age<28);

这里if的条件判断顺序是先判断 "18<age" 是否成立,

若不成立再判断 "age>28" 是否成立,

判断的条件就不再是闭区间 (18, 28) 了


2.else的悬空:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	if (a == 1)
		if (b == 1)
			printf("hehe\n");
		else
			printf("haha\n");

	return 0;
}

此时打印结果为空白

因为 else 与离它最近的未匹配的 if 进行匹配。

由于 if(a == 1) 条件不成立,所以就不会再继续执行下面的 if...else... 语句,

也就不会打印“hehe” / “haha” 了。

如果想要 else 与 if(a == 1) 匹配,则可以写成如下形式:

int main()
{
	int a = 0;
	int b = 0;
	if (a == 1)
	{
		if (b == 1)
			printf("hehe\n");
	}
	else
			printf("haha\n");

	return 0;
}

 此时的打印结果就为 haha

3.练习:

打印出1~100的奇数

法一:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 100)
	{
		if (i%2 == 1)
			printf(" %d", i);
		i++;
	}

	return 0;
}

法二:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 100)
	{
		printf(" %d", i);
		i += 2;
	}

	return 0;
}

输出结果均为:

分支和循环语句1_getchar


3.switch分支语句:


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	if (day == 1)
		printf("星期一");
	else if (day == 2)
		printf("星期二");
	else if (day == 3)
		printf("星期三");
	else if (day == 4)
		printf("星期四");
	else if (day == 5)
		printf("星期五");
	else if (day == 6)
		printf("星期六");
	else (day == 7);
		printf("星期天");
	return 0;
}

由上述代码块我们可以看到,当存在很多个分支条件时,像这样用 if 选择语句

写代码显得比较繁琐,那么这时候我们就可以尝试使用 switch 条件分支语句

来实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

像这样的话用 switch 相对来说就显得简洁一些,

注意 switch( ) 括号中的内容必须是整形! 即 switch(整形)

且case语句中必须是常量表达式,即 “case 常量”


缺省break的情况:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

在 switch 语句中,如果表达的值与所有的 case 标签的值都不匹配则

执行 default 子句。 default 可以出现在 switch 语句列表的任何位置,

但一般都放在末尾。


熟悉 switch语句执行流程:

#define _CRT_SECURE_NO_WARNINGS
#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(" n= %d\n m= %d\n", n, m);
	return 0;
}

上述代码块的输出结果为 n=3  m=5

switch语句可以嵌套使用。


4.while循环语句:

while语句执行流程:

分支和循环语句1_getchar_02

①打印数字1~10:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

打印结果为:

分支和循环语句1_if_03

②while 语句中加 break:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

打印结果为:

分支和循环语句1_if_04

即当 i == 5 时while循环终止

③while 语句中加 continue:

分支和循环语句1_getchar_05

如图所示,当 i == 5 时,将一直重复如图的执行顺序,不会再往下打印

因此此时的打印结果为:

分支和循环语句1_scanf_06

可见 continue 在while 循环中的作用是:

continue 是用于终止本次循环的,

也就是本次循环中 continue 后面的代码不会再执行,

而是直接跳转到 while 语句的判断部分。进入下一次循环的入口判断。

5.getchar() , putchar() :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a = getchar();
	printf("%d\n", a);
	putchar(a);

	return 0;
}

getchar()是最简单的一次读一个字符的函数,

每次调用时从文本流中读入下一个字符,并将其作为结果值返回。

6.EOF:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a = 0;
	while ((a = getchar()) != EOF)
	//EOF - end of file 文件结束标志 - Ctrl+Z
	{
		putchar(a);
	}
	return 0;
}

分支和循环语句1_分支和循环_07

如图所示,不管输出任意一个字符型字符,程序都不会停下来。

当输入 Ctrl+Z 时,程序才会停下。

代表的是文件的结束标志,类似于字符 \0

EOF的值为 -1


实际应用:

顺便解释一下scanf()函数吞回车/n的问题:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");//输入密码,并存放在password数组中
	scanf("%s", password);
	printf("请确认密码Y/N");
  a = getchar();
	if (a == 'Y')
		printf("确认成功");
	else
		printf("确认失败");

	return 0;
}

这里假设我们输入密码:123456

当执行程序输入密码敲回车后,

会出现用户还未输入 Y/N 就自动打印“确认失败”的问题:

分支和循环语句1_if_08

原因也很简单:

分支和循环语句1_代码块_09

首先这里需要注意的一些重点:

  • scanf()在读取数字时会跳过空格、制表符和换行符!
  • scanf("%s",s);这里不能有&符号

scanf遇到 回车(enter),空格,TAB 就会结束一次输入,空格不会接收

并且

scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在数据缓冲区中)


当我们输入密码123456并敲下回车键后,此时输入缓冲区中存储的字符为

123456\n,scanf() 函数只把字符串123456读取走了,剩下\n,

然后接着 getchar() 把\n读取走了,导致最后还未等用户输入Y/N就直接打印了确认失败。


那应该如何解决这个问题呢,只需要我们把剩下的\n读取走或者清空缓冲区就可以了。

我们可以在scanf("%s", password);下面再加上一行代码,比如:

getchar();

或者像这样:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a,b;
	char password[20] = { 0 };
	printf("请输入密码:>");//输入密码,并存放在password数组中
	scanf("%s", password);
	while ((b = getchar()) != '\n')
	{
		;
	}
	printf("请确认密码Y/N");
	a = getchar();
	if (a == 'Y')
		printf("确认成功");
	else
		printf("确认失败");

	return 0;
}

此时程序就能正常运行了:

分支和循环语句1_代码块_10


如果理解有差错,还请斧正,谢谢!

标签:语句,case,int,else,break,循环,printf,day,分支
From: https://blog.51cto.com/u_16247982/7420171

相关文章

  • 创建一个滚动到页面底部的循环,然后检查该元素
    fromselenium.common.exceptionsimportNoSuchElementException,TimeoutExceptionfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC#create......
  • MySQL查询语句及练习题
    查询记录查询数据库表中列的数据SELECT*,列名FROM表名WHERE条件GROUPBY分组HAVING过滤ORDERBY排序LIMIT分页查询分组查询GROUPBY子句用于根据一个或多个列对结果进行分组--统计员工表中职位的分类信息SELECTJ职位FROM员工表GROUPBY职位;--统计员工表......
  • 初识python--python的选择分支结构
    python选择结构语句一、if选择结构1、ifelse结构在日常业务中,经常需要进行多条件判断,为了这种场景,引入多分支结构age=int(input('请输入你的年龄:'))ifage<18:print(f"年龄{age},未到18岁,不可使用童工!")elifage>=18&age<=60:print('年龄为%d,合法年龄......
  • 顺序、选择、循环
    title:顺序、选择、循环index_img:https://tuchuangs.com/imgs/2023/07/22/860e4047323f0b1c.pngtags:-JavaSEcategories:-JavaSEhide:falseexcerpt:StringBuilder、常用方法、链式编程顺序结构程序按从上到下的顺序执行。publicclassMain{public......
  • JS基础-分支语句
    分支语句是流程控制语句当中的一种可以简单理解为是一种控制条件,当达到某个条件时,执行相应的代码IFIF多条件分支例如:当变量a>b时,则执行语句块1,如果a等于b时,则执行语句块2;最后,如果a>b时,则执行语句块3ifelse语句当中的语句块一般具有排斥作用。如果执行了......
  • oracle查看表锁以及对应语句
    setlinesize400pagesize999\rcolmachinefora20\rcolsql_idfora20\rcolprev_sql_idfora20\rcolobject_namefora20\rcolobject_typefora20\rcoloracle_usernamefora15\rSELECTs.inst_id,\rs.sql_id,\rs.prev_sql_id,\......
  • sql集合-查询语句
    1,张飞借阅书的籍-子查询SELECTb.book_nameFROMbookinfobINNERJOINbook_borrowbbONb.book_id=bb.book_idWHEREbb.card_id=(SELECTcard_idFROMreaderWHEREname="张飞")2,左/右链接查询SELECTb.book_name,bb.borrow_dataFROMbookinfobRIGHTJOINbook_borrowb......
  • hashMap产生的循环依赖问题
    转:hashMap产生的循环依赖问题 这样就是一个很经典hashMap线程不安全导致的循环依赖,因为是个循环链表,就会导致数组一直重复扩容,导致集合的一个无限大,但是JDK1.8的时候,把头插法改成了尾插法,同时引进了红黑树,当连续扩容32次的时候会转换成红黑树,解决这个循环依赖的问题,但是还是......
  • 循环冗余校验(CRC)算法入门引导
    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC算法对各种数据进行校验。因此,掌握基本的CRC算法应是嵌入式程序员的基本技能。可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,......
  • MySQL查询语句汇总附练习带注释(二)
    数据库查询语句包含条件查询语法:SELECT*/列名FROM表名WHERE条件ORDERBY列名1ASC/DESC,列名2ASC/DESC;--条件可以包含关系运算符、逻辑运算符、特殊情况等--是--在几个选项之中--betweenand在一定范围内--要求查询emp表中员工编号大于等于50的员工编号SELEC......