5.31-6.4学习记录

本文详细介绍了C语言的结构化程序设计,重点讲解了选择结构中的if语句和switch语句,以及循环结构的while、for和do...while循环。通过实例解析了悬空else、条件判断小技巧以及各种循环的使用方法,帮助读者深入理解C语言的控制流程。
摘要由CSDN通过智能技术生成

C语言是一门结构化的程序设计语言。C语言三大结构:

1、顺序结构
2、选择结构
3、循环结构

监视窗口无法读取对象解决

在这里插入图片描述
会发现在此我无法对我想要检测的对象进行监测,这是因为还没有进入代码块内,我们再按一次F10进入代码块内就可以解决了
在这里插入图片描述
注意,左边黄色箭头所指的是下一步将要进行的操作,所以现在右侧四个变量的值与我们所赋值现在并不相同。

分支语句-选择结构

什么是语句?

C语言中由一个分号隔开的就是一个语句。

int main()
{
	;//什么都不写称为空语句
	return 0;//这是一个语句
}

if语句

1、if(表达式)
语句;
表示当表达式结果为真时执行语句,否则没有任何作用。
2、if(表达式)
语句1;
else
语句2;
表示当表达式结果为真执行语句1,否则执行语句2。
3、if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
多分支结构,表达式1为真执行语句1,另外若表达式2成立则执行语句2,若两者都不成立执行语句3,中间可以并列多个else if。

int main()
{
	;//什么都不写称为空语句
	int age = 20;
	if (age < 18)
		printf("未成年\n");
	else if (age >= 18 && age < 28)
		printf("青年\n");
	else
		printf("有点大\n");
	return 0;
}

另一种写法

int main()
{
	int age = 100;
	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;
}

有个关键点需要解释,为什么连续的不等式需要分开表示而不能直接写?
拿前一个代码块举例

	int age = 10;
	else if (age >= 18 && age < 28)
		printf("青年\n");

看这一个部分,若我们把else if中的条件改为18<=age<28的话,C语言首先会将age =10的值代入判断左边的等式,即18<=10这个式子成立,会反馈0的值,再进行0<28的判断为真,最后还是会打印“青年”,所以与原来我们期望的判断不同。
若我们要一个条件执行多个语句则需要用花括号括起来

int main()
{
	int age = 10;
	if (age < 18)
	{
		printf("未成年\n");
		printf("不能打游戏\n");
	}

一个花括号就是一个代码块

悬空else

这是一个很有意思的东西

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

	return 0;
}

这个代码块会输出什么呢?

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会默认与其最近的未匹配的if相匹配,而不会根据我们平行的缩进距离来决定,这里它就默认与b == 2条件的if相匹配了,而我们知道,在一开始a == 1的判断之中它就已经为假判断不会再继续往下走了,所以后面无论是hehe还是haha都不会再运行。
而且你会发现在VS2022编译器中hehe那一行编辑完之后按回车它是会默认一开始到下一行和第一个if相平行的竖列,然后输入完else这个词语又立刻与第二个if竖列对齐了。(挺有意思的)所以一定要养成好的习惯不然造成阅读误解!

两种书写形式对比

if (condition) {
	return x;
}
return y;

和一般形式

if (condition) 
{
	return x;
}
else
{
	return y;
}

的执行效应是一样的,只是第一种容易让初学者产生误读,一般也不应使用。

关于做常量与变量判断的小技巧

一般我们想要做一个变量的值的判断,比如num == 5,但是有时我们会做出num = 5这样子少打一个等号的错误,程序运行起来了也发现不了,所以我们可以养成另一种习惯,当要做这样子的判断,我们直接把数值写在前面,变量写在后面,比如 5 == num这样子的语句这样我们一不小心有时遗忘少写了一个=程序就会报错,我们也能发现错误。

switch语句-多分支

基本语法结构:
switch(整型表达式)
{
语句项;
}
语句项由case组成。下面举例:

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("Monday\n");
	case 2:
		printf("Tuesday\n");
	case 3:
		printf("Wednesday\n");
	case 4:
		printf("Thursday\n");
	case 5:
		printf("Friday\n");
	case 6:
		printf("Saturday\n");
	case 7:
		printf("Sunday\n");
	}
	return 0;
}

当我们输入3的运行结果
在这里插入图片描述
为什么周三以后的情况都出现了呢?
因为case相当于是提供了一个入口,若不强调出口的话就会一直沿着第一个正确的case一直向下运行。所以我们若需要在运行到某个case停下的话就需要注明break作为停止的出口。

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("Monday\n");
		break;
	case 2:
		printf("Tuesday\n");
		break;
	case 3:
		printf("Wednesday\n");
		break;
	case 4:
		printf("Thursday\n");
		break;
	case 5:
		printf("Friday\n");
		break;
	case 6:
		printf("Saturday\n");
		break;
	case 7:
		printf("Sunday\n");
		break;
	}
	return 0;
}

这些我们再运行输入3的结果
在这里插入图片描述
就得到了我们希望的结果。
注意switch只能判断其是否为整型的表达式!case后面的也只能是整型常量表达式。
若要表示在某几种情况中我们都想输出同样的语句我们可以活用break:

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;
}

这样子输入1-5都会是工作日而6和7为休息日。但是请在最后7的后面也加上break,为了之后再次编辑的便捷。

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;
	default:
		printf("输入错误\n");
	}
	return 0;
}

default语句可以作为当不在上面case中任何一种情况的入口,可有可无,并且可以放在switch之中任何一个位置,不与case冲突。

循环语句

while 循环

基本语法结构:
while(表达式)
循环语句;
表达式为真(非零)就会进入循环。
若表达式恒为真则会进入一个无限循环(死循环)
下面开始举例:

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

这样就会输出1-10十个数字。接下来我们再来介绍

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

这个就很好理解,在i==5的时候程序就停止不再打印5,输出的也就只有1、2、3、4四个数字。

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

在这里插入图片描述
技术原因没有弄gif上去,其实4下面是个闪烁的横杠。而且没有像以前一样写出进程的地址,这是为什么呢?其实,这个程序还在不断运行,并没有停止!continue表示立即再回到while语句,i==5的条件满足之后,程序就一直在while与continue之间的4行不断循环,所以最后只留下一个闪烁的光标表示程序还在运行中。
下面这个例子会更好理解

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

把i++往上提,运行结果就是
在这里插入图片描述
我想就很好理解了吧。
下面我们来看一代码

int main()
{
	int ch = getchar();//getchar即接收我们输入的第一个字符
	putchar(ch);//putchar则与getchar对应。
	printf("%c\n", ch);
	return 0;
}

当我们输入一个a
在这里插入图片描述
第二行就由putchar和printf各打印一个a。

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

这段你输入什么就会输出什么。即使你输入EOF三个字符也不会停止,EOF为end of file的意思,本质为-1的值需要我们按ctrl+z再回车来停止。

for循环

for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量,表达式2为条件判断部分,用于判断循环时候终止。表达式3为调整部分,用于循环条件的调整。
打印1-10数字:

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

从风格上讲其相对while有优势,更加直观展示了各个部分。
for循环中运用break:

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

结果为1234,很好理解,同while循环。

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

结果是除了5以外的另外9个数字。
我们分析一下这个结果。当i为5时,先判断小于10为真,进入循环体内部,if的判断条件为真,进入continue跳过后面,但是这个就不同于while循环进入一开始的循环,而是进入i++的for循环调整条件,这个时候i就变为6了,之后就可以继续进行下去了。

i使用for循环tips

·不在循环体内修改循环变量,防止其失去控制
·建议for语句循环控制变量的取值采用“前闭后开区间”的写法,
比如

for (i = 1; i < 10; i++)

前面有一个i=1的闭,后面有一个i<10的开。如果我们写i<=9虽然效果是一致的,但是没有直观的10次循环的意义。

for循环的两个变种

变种一:

for(;;)

省略即表示条件恒为真,这样子循环体内部就会进入死循环。
下面具体说明一下

int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("haha\n");
		}
	}
	return 0;
}

明显内外各循环十次嵌套就有100个haha打印

int main()
{
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("haha\n");
		}
	}
	return 0;
}

这样乍一看好像还是100个haha,但是实际上只有10个。
i=0进入,j=0进入内层循环体循环10次打印10个haha,当j=10之时判断为假,离开这个循环体重新回到i++,i变为1,再判断i<10为真进入内层循环,但是此时j一直都会保持为10了没有办法继续打印,所以其实只有最初一次的外层循环打印了10个,没有j=0的初始化条件就改变了这个作用。
变种二(双变量):

int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

还是要弄清for循环的三个表达式的意义,不管它有多少个变量认其本质。这段代码其实无论是++x还是x++最终都是执行两次。

do…while循环

do
	循环语句
while(判断)

输出1-10,这个循环就从上往下看就能理解了。

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

	return 0;
}

同样可以配合break使用

练习

计算n的阶乘

int main()
{
	int n = 0;
	int t = 1;
	scanf("%d", &n);
	do
	{
		t *= n;
		n--;
	} while (1 <= n);
	printf("%d", t);
	return 0;
}

计算1!+2!+…+10!

int main()
{
	int i = 0;
	int t = 1;
	int s = 0;
	int n = 1;
	for (n = 1; n <=10; n++)
	{
		for (i = 1,t=1; i <= n; i++)
		{
			t *= i;
		}
		s += t;
	}
	printf("%d", s);
	return 0;
}

我一开始犯了一个错,把for循环中初始条件中t=1漏了,没有这个初始化条件t一直乘下去结果就很奇怪,学会使用监视窗口功能查找错误!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值