C语言中分支和循环语句

目录

1.什么是语句?

2.分支语句(选择结构)

2.1 if语句

2.1.1 悬空else

2.1.2 if书写形式的对比

2.2 switch语句

2.2.1 在switch语句中的break

2.2.2 default子句

3.循环语句

3.1 while循环

 3.1.1 while语句中的break和continue

3.2 for循环

3.2.1 语法

3.3 do...while循环

3.3.1 do语句的语法

3.4 练习

4.goto语句


1.什么是语句?

C语言可分为以下五类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句 
  5. 空语句

 控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有九种控制语句。

可分成以下三类:

  1. 条件判断语句也叫分支语句:if语句、switch语句; 
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句(选择结构)

2.1 if语句

语法结构:

        if(表达式)  

                 语句;

        if(表达式)   

                 语句1;

         else

                 语句2;

//多分支    

        if(表达式1)    

                语句1;

        else if(表达式2)    

                语句2;

        else    

                语句3;

相关代码:

//代码1
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
}
//代码2
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("未成年\n");
   }
    else
   {
        printf("成年\n");
   }
}

解释一下:

如果表达式的结果为真,则语句执行。

在C语言中如何表示真假?

0表示假,非 0表示真。

 如果条件成立,要执行多条语句,怎应该使用代码块。

#inlcude<stdio.h>
int main()
{
    if(表达式)
    {
        语句列表1;
    }
    else
    {
        语句列表2;
    }
    return 0;
}

这里的一对{ }就是一个代码块。

2.1.1 悬空else

当你写了这个代码:

#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 a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
        {
            printf("hehe\n");
        }
    }    
    else 
    { 
            printf("haha\n");
    } 
    return 0;
}

 else的匹配:else是和它离的最近的if匹配的。

2.1.2 if书写形式的对比

//代码1
if (condition) {
  return x;
}
return y;


//代码2
if(condition)
{
  return x;
}
else
{

 return y;
}


//代码3
int num = 1;
if(num == 5)
{
  printf("hehe\n");
}


//代码4
int num = 1;
if(5 == num)
{
  printf("hehe\n");
}

代码2和代码4更好,逻辑更加清晰,不容易出错。 

2.2 switch语句

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

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日

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

switch(整型表达式)
{
  语句项;
}

而语句项是什么呢? 

//是一些case语句:
//如下:
case 整形常量表达式:
          语句; 

2.2.1 在switch语句中的break

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
比如:

#include <stdio.h>
int main()
{
  int day = 0;
  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;
}

有时候我们的需求变了:

1. 输入1-5,输出的是“weekday”;
2. 输入6-7,输出“weekend” ;

 所以我们的代码就应该这样实现

#include <stdio.h>
//switch代码演示
int main()
{
  int day = 0;
  switch(day)
 {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
      printf("weekday\n");
      break;
    case 6:
    case 7:
      printf("weekend\n");
      break;
 }
  return 0;
}

break语句 的实际效果是把语句列表划分为不同的分支部分。

编程好习惯

在最后一个 case 语句的后面加上一条 break语句。
(之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。 

2.2.2 default子句

如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签

default

写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行case标签一样执行default子句。

编程好习惯

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。 

3.循环语句

  • while
  • for
  • do while

3.1 while循环

我们已经掌握了,if语句:

if(条件)
  语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?
C语言中给我们引入了: while 语句,可以实现循环。

//while 语法结构

while(表达式)
        循环语句; 

比如我们实现:

在屏幕上打印1-10的数字 

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

 3.1.1 while语句中的break和continue

break介绍

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

这里代码输出的结果是什么 ?

1 2 3 4

总结: 

break在while循环中的作用:

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


continue介绍 

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

这里代码输出的结果是什么 ?

1 2 3 4

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

这里代码输出的结果是什么 ?

2 3 4 6 7 8 9 10 11

总结: 

continue在while循环中的作用:

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

3.2 for循环

3.2.1 语法

for(表达式1; 表达式2; 表达式3)
                循环语句;

 表达式1
 表达式1为初始化部分,用于初始化循环变量的。

 表达式2
 表达式2为条件判断部分,用于判断循环时候终止。

 表达式3
 表达式3为调整部分,用于循环条件的调整。


实际的问题:

 使用for循环在屏幕上打印1-10的数字

#include <stdio.h>
int main()
{
    int i = 0;
    //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
    for(i=1; i<=10; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

3.3 do...while循环

3.3.1 do语句的语法

do

        循环语句;

while(表达式);

3.4 练习

  1. 计算n的阶乘
  2. 计算 1!+2!+3!+...+10!
  3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
  4. 编写代码,演示多个字符从两端移动,向中间汇聚。
  5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
//1.计算n的阶乘
#include<stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int ret = 1;
	//1*2*3*4*5 = 120
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d\n", ret);

	return 0;
}
//2.计算 1!+2!+3!+...+10!
#include<stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int ret = 1;
	int sum = 0;
	for (n = 1; n <= 10; n++)
	{
		ret *= n;
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}
//3.在一个有序数组中查找具体的某个数字n。(讲解二分查找)
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;//要查找的数字
	//在arr这个有序的数组中查找k(7)的值
	int sz = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
	int left = 0;
	int right = sz-1;
	while (left<=right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到了\n");
	}
	return 0;
}
//4.编写代码,演示多个字符从两端移动,向中间汇聚。
#include <string.h>
#include <windows.h>
int main()
{
	char arr1[] = "welcome to bit!!!!!!";
	char arr2[] = "####################";
	int left = 0;
	int right = strlen(arr1)-1;
	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//睡眠1秒
		system("cls");//清空屏幕
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

4.goto语句

C语言提供了可以随意滥用的goto语句和标记跳转的标号。

例如:一次跳出两层或者多层循环

多层循环这种情况使用break是达不到目的的,他只能从内层循环跳到上一层循环。

goto语句真正适合的场景如下:

for(...)

        for(...)

        {

              for(...)

              {

                if(disaster)

                       goto error;

              }

        }

.......

error:

        if(disaster)

              //处理错误情况

下面是使用goto语句的一个例子,然后使用循环的方式替换goto语句:

一个关机程序 

#include <stdio.h>
int main()
{
	char input[10] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
	scanf("%s", input);
	if (0 == strcmp(input, "我是猪"))
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}

如果不用goto语句,可以用循环语句:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  char input[10] = {0};
  system("shutdown -s -t 60");
  while(1)
 {
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
   {
      system("shutdown -a");
      break;
   }
 }
  return 0;
}

关于shutdown命令的拓展 (请点击这里)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值