小言_互联网的博客

【C语言基础学习笔记】二、分支与循环语句(1)

398人阅读  评论(0)

说明:我是一个初学c语言的小白,很多地方都不是很理解,所以就会自己动手敲代码进行相应的推理验证,希望可爱的你在看到这些步骤时,不要嫌弃我啰嗦。本篇文章内容相对较多,干货满满,有条件的小伙伴可以将文章中的练习和代码动手敲一敲。(吐槽环节:这作者咋这样呀,这么简单的还要敲代码验证,真菜呀!…我:好吧,我不装了,我摊牌了,我确实菜,真的菜,咋滴啦,还不允许初学者菜呀!)



前言

c语言是一门结构化的程序设计语言
有三种基本结构(生活中的所有问题都可以归纳总结到这三种结构或其变式和组合中)
顺序结构、选择结构、循环结构(这三种结构分别是什么意思呢?)
顺序结构就是按照既定的步骤依次执行,从头做到尾。
选择结构就是执行到特定的语句(选择语句),会进行相应的判断,满足条件执行一种路径,不满足条件执行另一种路径。
循环结构就是重复、不间断的执行特点的语句(循环体),满足条件执行或不执行。
画图理解:① 顺序结构 ②选择语句 ③ 循环语句

本章内容包括:
选择结构-- - 分支语句:if | switch
循环结构-- - 循环语句:while | for | do while goto语句


1、什么叫做语句?

概念:C语言中由一个; (分号)隔开的就是一条语句。

int main()
{
   
	int a = 1; //由;隔开的程序句子叫做语句  
	;//只有一个;没有其它内容,也是一条语句,叫做空语句
	return 0;
}

2、分支语句

也叫做选择语句,有选择才会有分支,分支语句可以理解为存在选择的语句。


if的语法结构表达

if(表达式)  
      语句;

eg(举例):

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

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

eg :

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


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

eg :

#include<stdio.h>
  int main()
  {
   
	  int age = 140;
	  if (age < 18)
		  printf("young pepole\n");//少年
	  else if (age >= 18 && age < 26)
		  printf("youth\n");//青年
	  else if (age >= 26 && age < 50)
		  printf("wrinkly\n");//中年
	  else if (age >= 50 && age < 100)
		  printf("older pepole\n");//老年
	  else
		  printf("the god of longevity!\n");//寿星
	  return 0;
  }


详解:逻辑操作符: && 表示 “且”
eg : if(age >= 18 && age < 26) 这个地方切记不可以直接写成18 <= age < 28,虽然数学中我们是这样书写的,但是在c中会先将(18 <= age)看作一个整体,若条件成立则为真,值为1,条件不成立则为假,值为0,而不管值为1还是0,1 / 0 < 26 恒成立,程序执行得不到我们想要的结果。


为了更好的理解学习分支语句,我们要了解C语言中是如何表示真和假,非0就是真(比如 1、2、3、 - 1等非0,就是真),0就是假

总结:c语言中 0表示假 非0表示真

  所以表达式为0,则表示假,条件不成立
  表达式非0,则表示真,条件成立

if语句中,单条语句可以直接写,多条语句需要用代码块{}括起来。如果多条语句不带大括号{ }则默认执行第一条语句。


看一下下面这个代码,猜猜会打印什么?(先猜一下,然后对着结果)

结果:什么都不打印

上面的case就是一个悬空else的问题,即else是如何进行匹配的?
else匹配原则: else跟离得最近的未匹配的if进行匹配


再看看下面这个case,猜猜结果是什么?

= 赋值符号 /易与 == 判断相等符号弄混淆

虽然语法不报错,但是结果却不是想要的
为了避免将 == 写成 = 可以将 num == 5 写成 if (5 == num) 若缺少 = 就会报错
将常量放到 == 左边 (好的代码风格,编程老司机)


编程练习题1:

判断一个数是否为奇数(建议先自己动手完成相应的练习,再对照答案)
思路:如何判断一个数是奇数呢?—> % 2 余1 则为奇数,不为1则不是奇数

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


编程练习题2:

输出1 - 100之间的奇数(建议先自己动手完成相应的练习,再对照答案)
思路:要想输出1 - 100之间的奇数,首先我们要产生1 - 100之间的数字(利用循环产生),判断这里面哪些是奇数,将奇数打印出来。

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

switch的语法结构表达

这个地方除了刚刚的思路外,还有另外一种思路:根据已有的数学知识,我们知道第一个奇数是1,后面的奇数都是前一个奇数 + 2(这样 % 2之后余数仍然为1),根据这个思路,我们可以这样写:

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


当存在多个分支或选择的情况时,如果这时候我们继续选择使用if…else if…else if……就会显得很繁琐。这种语法形式太复杂了,这时候我们可以使用switch语句,用来解决这一类问题非常简单和明了。

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

case后面的整型常量表达式可以常量,也可以是表达式,比如:可以是 case 1,或case 1 + 0;
另外,字符也属于整型(字符存储的是ASCII值),可以为字符,如case ‘a’: 或 case ‘A’ + 1:
但是不能是变量或变量表达式,比如:不能是 case n;或 case n + 0;也不能是小数(浮点型)比如:不能是 case
1.1、case 0.0 或case 1.1 + 0等 整型(计算机中的一个基本的专业术语,指没有小数部分的数据)即可。


看下面这个例子:通过键盘输入数字将其转换输出成相应的星期

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


switch的入口是case ,出口是break。
break;直接跳出switch语句,不执行后续操作
default:当case中所有的整型变量表达式均不满足时,执行default中的语句,default可以写在任意case语句可以出现的位置,没有顺序可言,没有强规定将default只能放到前面或后面。(不过一般习惯将default放到后面)

说明:这里的break不一定要有,是否添加break需要根据我们想要达到的效果和程序运行逻辑来定。比如说刚刚那个例子,如果我们想要在输入1,2,3,4,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;
			  default:
				  printf("输入错误\n");
				  break;
			  }
			  return 0;
		  }


编程好习惯:
①最后一个break要不要加上?
我们知道最后一个break加不加,程序执行到这里都会跳出去,但是建议加上,为了代码以后的扩展性考虑。(比如后面还需要加上case 8: 若之前case 7:处未添加break,添加case 8:的代码后,程序执行可能会得不到想要的效果。)
②default语句要不要加?
建议加上default:语句,用来处理异常值,并给出相应的提示。


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跳出的是break所在的switch语句。


3、循环语句

循环语句的结构有三种 for\while\do while

while的语法结构

	while语句
	语法结构:while(表达式)
		     {
   
		      循环语句;
		     }

在学习循环语句while之前,我们先来看一个例子:

我们知道if(1) 1表示条件为真,所以打印haha(条件成立,执行后面语句)
现在我们将if换成while,再来看这个例子:

会发现执行之后,死循环打印haha。可以看出来while(表达式),只要表达式为真,就会一直执行循环体(条件成立,循环执行后面语句),跟if选择语句的区别是一个条件成立执行一次,一个条件成立一直执行。
再看下面这个例子:


break在while循环的作用:

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

eg:

打印0,1,2,3,4后 i = 5 if条件成立,break跳出程序。所以打印结果为0 1 2 3 4


continue在while循环的作用:

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

eg:

实际效果红框部分还在执行,光标还在闪动(程序结束的时候后面会有一句话:按任意键结束程序,这里没有出现),也就是说打印 0 1 2 3 4
后进入死循环了

那么为什么会出现死循环呢?

i = 5之后,if条件成立,执行continue,后面的语句跳过不执行,进入下一次循环,但是在进入下一次循环的时候i没有进行调整,值一直为5,所以进入死循环了!


转载:https://blog.csdn.net/QIYICat/article/details/115691000
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场