分支和循环语句(1)
  mfv4jpsXLy5V 2023年11月02日 41 0

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)_代码块


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)_代码块_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)_getchar_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)_getchar_04

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

③while 语句中加 continue:

分支和循环语句(1)_getchar_05

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

因此此时的打印结果为:

分支和循环语句(1)_代码块_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)_scanf_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)_getchar_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


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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
mfv4jpsXLy5V