0
点赞
收藏
分享

微信扫一扫

C语言系列——第二节-分支语句和循环语句

Android开发指南 2022-02-12 阅读 27

分支语句和循环语句

1. 什么是语句?

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

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

2.1 if语句

语法结构:
/*第一种*/
	if(表达式)
	{
    语句;
	}
/*第二种*/
	if(表达式)
	{
    语句1;
	}
	else
	{
    语句2;
	}
/*第三种*//*多分支*/    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

实践如下:

#include <stdio.h>
//代码1
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");
   }
}
//代码3
#include <stdio.h>
int main()
{
 int age = 0;
    scanf("%d", &age);
    if(age<18)
   {
        printf("少年\n");
   }
    else if(age>=18 && age<30)
   {
        printf("青年\n");
   }
    else if(age>=30 && age<50)
   {
          printf("中年\n");
   }
    else if(age>=50 && age<80)
   {
        printf("老年\n");
   }
    else
   {
        printf("老寿星\n");
   }
}

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

2.1.1 悬空else

else的匹配:else是和它离的最近的if匹配的。
矛盾代码如下:

#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与哪个if匹配?
答案:
与第二个if匹配,但是代码多了后直接是不容易看出来的,所以有了如下规定:

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#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;
}

2.1.2 if书写形式的对比

//代码1
if (condition) {
    return x;
}
return y;
//代码2
if (condition)
{
    return x;
}
else
{
    return y;
}
//1,2比较得出大括号的位置,应该上下对应,代码才清楚


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

/*3,4对比得出,如果判断语句出现,等于一个数的条件,应该让数字在
前*/
原因是:在代码3中,如果不小心把num==5,写成num=5 那么判断语句也会
通过。原因是if进行判断时,判断的是*括号里的表达式,是否为真。

num = 5 赋值表达式,整体值为赋值值5,(除非赋值值为0时,if不成立
其余都会成立的)并且if无论成不成立,num的值都会改变成为,赋值的值

num == 5 判断表达式,只有01,num值如果等于5,那么这个表达式的值
也就等于1,num如果不等于5,那么这个表达式的值,为0.(并且if不管成
立不成立,num的值不会变)

2.1.3 练习

问题1#include<stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	if (n % 2 == 1)
	{
		printf("%d是奇数\n", n);
	}
	else
	{
		printf("%d不是奇数\n", n);
	}

	return 0;
	
}
问题2#include<stdio.h>
	int main()
	{
		/*方法1*/
		int i;
		for (i = 1; i <= 100; i++) //遍历1-100间的所有数
		{
			if (i % 2 == 1) //判断是否为奇数
			{
				printf("%d ", i);//如果是奇数,输出,别忘记每个数之间要有空格
			}
		}
		return 0
	
	/*方法2*/
		int i;
			for (i = 1; i <= 100; i = i + 2)//直接遍历1-100间的奇数
			{
				printf("%d ", i); //直接输出即可,别忘记每个数之间要有空格
			}
	}

2.2 switch语句

比如:

如果写成if…else if …else if,可以尝试一下,但是switch语句更好,如下:

语句项是什么呢?

2.2.1 在switch语句中的 break

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

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

编程好习惯

2.2.2 default子句

编程好习惯

2.2.3 练习(C语言第5道总例题)

#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);//输出的是m = 5, n = 3
    return 0;
}

3. 循环语句

3.1 while循环

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

if(条件)
     语句;
//while 语法结构
while(表达式)
 循环语句;

比如我们实现:

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

上面的代码已经帮我了解了while 语句的基本语法,那我们再了解一下:

3.1.1 while语句中的break和continue

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

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

总结:

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

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

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

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

再看几个代码:

//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF)
        putchar(ch);
    return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.自行百度,缓冲区

/*1.EOF等于-1,getchar相等于scanf的作用,当gerchar能读取到数据
时,ch = gerchar()表达式的返回值是 1。但是没有读取到值的时候,
返回值是-1。*/

/*所以用 while ((ch = getchar()) != EOF)
作用:持续读入数据。当没有数据读入时,才停止循环
也可以用 while(scanf("%d",&ch) != EOF)
*/

//代码2
#include <stdio.h>
int main()
{
    char ch = '\0';
    while ((ch = getchar()) != EOF)
    {
        if (ch <0|| ch >9)
            continue;
        putchar(ch);
    }
    return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的

3.2 for循环

我们已经知道了while循环,但是我们为什么还要一个for循环呢?
首先来看看for循环的语法:

3.2.1 语法

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

实际的问题:

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

现在我们对比一下for循环和while循环

int i = 0;
//实现相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判断部分
{
	printf("hehe\n");
	i = i + 1;//调整部分
}
//实现相同的功能,使用while
for (i = 1; i <= 10; i++) {
	printf("hehe\n");
}

3.2.2 break和continue在for循环中

在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异:

//代码1
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}
/*最终输出结果是 1 2 3 4.表面for中遇到break就结束*/

//代码2
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}
/*输出结果是1 2 3 4 6 7 8 9 10
表面for中遇到continue是直接再次循环,不继续往下走,但是i++(也就
是每次for循环的,调整语句在continue后还会执行)
*/

3.2.3 for语句的循环控制变量

建议:

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
前闭后开的好处是:可以直接看出循环次数 10-0=10

3.2.4 一些for循环的变种

#include <stdio.h>
int main()
{
 //代码1
 for(;;)
 {
 printf("hehe\n");
 }
    //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是
    //不建议初学时省略,容易导致问
题。
    
    //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?
    for(i=0; i<10; i++)
   {
        for(j=0; j<10; j++)
       {
 printf("hehe\n");
       }
   }
    
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
    for(; i<10; i++)
   {
        for(; j<10; j++)
       {
 printf("hehe\n");
       }
   }
    
 //代码4-使用多余一个变量控制循环
 int x, y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
   {
        printf("hehe\n");
   }
 return 0; }

3.2.5 一道笔试题(C语言第6道总例题)

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}

3.3 do…while()循环(了解即可,不常用)

3.3.1 do语句的语法

do
 循环语句;
while(表达式);/*注意此处while后是有分号的*/

3.3.2 do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用

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

3.3.3 do while循环中的break和continue

#include <stdio.h>
int main()
{
	int i = 10;

	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);
	} while (i < 10);

	return 0;
}
#include <stdio.h>
int main()
{
	int i = 10;

	do
	{
		if (5 == i)
			continue;
		printf("%d\n", i);
	} while (i < 10);

	return 0;
}

3.4 练习

3.4.1 练习参考代码

//代码1
//编写代码,演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main()
{
    char arr1[] = "welcome to bit...";
    char arr2[] = "#################";
    int left = 0;
    int right = strlen(arr1) - 1;
    printf("%s\n", arr2);
    //while循环实现
    while (left <= right)
    {
        Sleep(1000);//了解即可,请百度一下
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        left++;
        right--;
        printf("%s\n", arr2);
    }
    //for循环实现
    for (left = 0, right = strlen(src) - 1;
        left <= right;
        left++, right--)
    {
        Sleep(1000);
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", target);
    }
    retutn 0;
}
//代码2
int main()
{
    char psw[10] = "";
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; ++i)
    {
        printf("please input:");
        scanf("%s", psw);
        if (strcmp(psw, "password") == 0)
            break;
    }
    if (i == 3)
        printf("exit\n");
    else
        printf("log in\n");
}

3.4.2 折半查找算法

实现在主函数内:
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int key = 7;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
			break;
	}
	if (left <= right)
		printf("找到了,下标是%d\n", mid);
	else
		printf("找不到\n");
}

3.4.3 猜数字游戏实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play     **********\n");
	printf("*********** 0.exit     **********\n");
	printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
	int random_num = rand() % 100 + 1; //生成随机数
	int input = 0;
	while (1)
	{
		printf("请输入猜的数字>:");
		scanf("%d", &input);
		if (input > random_num)
		{
			printf("猜大了\n");
		}
		else if (input < random_num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL)); //生成随机数时,必须写的这个
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

4. goto语句

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

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;//跳出多重循环中,用goto
       }
   }
    …
error:

一个关机程序

#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;
}
#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命令的扩展-(请点这里)
本章结束。

举报

相关推荐

0 条评论