练气八层 —— 分支和循环

一.修炼必备

  1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)

  2.趁手武器:印象笔记/有道云笔记

  3.修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

  4.雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

  注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)

二.分支语句详解(一)

  1.C语言的结构类型

   1)顺序结构:按照顺序从上到下执行C语句

   2)选择结构:执行具有选择的C语句

   3)循环结构:循环的执行某些C语句

   2.什么是语句?

    —— C语言由一个分号(;)隔开的就是一条语句

#include <stdio.h>

int main()
{
	//C语言由一个分号(;)隔开的就是一条语句
	;//空语句
	int a = 10;//语句
	return 0;//这就是一条语句
}

  3.分支语句(if)详解

   1)单分支:if(表达式){}

#include <stdio.h>

int main()
{
	int a = 1;
    //单分支{}
	if (a)
	{
		printf("a = %d\n", a);//1
	}
	return 0;
}

   2)双分支:if(表达式){ } else{ }

    —— 如果if的表达式为真,执行if{ }里面的语句,反之执行else{ }里面的语句

#include <stdio.h>

int main()
{
	int a = 0;
    //双分支:if(){} else {}
	if (a)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");//haha
	}
	return 0;
}

   3)多分支:if(表达式){ } else if(表达式){ } else if(表达式){ } …… else { }

    —— 那个的表达式为真则执行那个,如果都不为真,则执行最后的else{ }中的代码

#include <stdio.h>

//多分支:if(表达式){} else if(表达式){} else if(表达式){} …… else {}
//—— 那个的表达式为真则执行那个,如果都不为真,则执行最后的else{}中的代码

int main()
{
	int a = 10;
	int b = 11;
	int c = 10;

	if (a == b)
	{
		printf("a等于b\n");
	}
	else if (b == c)
	{
		printf("b等于c\n");
	}
	else if (a == c)
	{
		printf("a等于c\n");//a等于c
	}
	else
	{
		printf("三个数均不相等!!!\n");
	}
	return 0;
}

   4)if中的相互嵌套 

#include <stdio.h>
//if中的相互嵌套
int main()
{
	int age = 0;
	scanf("%d", &age);

	if (age > 18)
	{
		if (age > 30)
		{
			printf("中年\n");
		}
		else
		{
			printf("青年\n");
		}
	}
	else
	{
		printf("未成年\n");
	}
	return 0;
}

   5)判断以下代码的输出(悬空else)

#include <stdio.h>

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

   注:什么也不会打印,因为else只会和离它最近的那个if进行匹配

   正确代码如下:

#include <stdio.h>

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

   6)小tips

    i.C语言中,0和NULL表示假,非0表示真
    ii.一对{}就是一个代码块

#include <stdio.h>

int main()
{
	int a = 0;
	int* p = NULL;

	if (a)
	{
		printf("hello\n");
	}
	else
	{
		printf("see you\n");//see you
	}

	if (p)
	{
		printf("null\n");
	}
	else
	{
		printf("true\n");//true
	}
	return 0;
}

   7)practice

    i.判断一个数是不是奇数

#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);

	if (num % 2 == 0)
	{
		printf("%d是偶数\n", num);
	}
	else
	{
		printf("%d是奇数\n", num);
	}
	return 0;
}

    ii.判断一个数是不是素数

#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);

	int i = 0;
	for (i = 2; i < num; i++)
	{
		if (num % i == 0)
		{
			printf("%d不是素数\n", num);
			return 0;
		}
	}
	printf("%d是素数\n", num);
	return 0;
}

三.分支语句详解(二)

  1.switch语句的形式

switch(整型表达式)
{
    case 整型常量表达式;
        语句;
    case 整型常量表达式;
        语句;
    case 整型常量表达式;
        语句;
    case 整型常量表达式;
        语句;
    ……
    default:
        语句;
}

//解释:case匹配switch整型表达式中的值,和那个case匹配则执行那个case中的语句,
//如果都不匹配,则执行default中的语句

  2.一个小case快速上手switch

#include <stdio.h>

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;
		default:
			printf("我也不知道什么day啦~\n");
			break;
	}
	return 0;
}

  3.switch的细节讨论

   1)switch(表达式)中的表达式必须是整型表达式,若是使用其他类型,则报错

         整型表达式包括:char、short、int、long、long long

#include <stdio.h>

int main()
{
	char ch = 'a';
	scanf("%c", &ch);
	switch (ch)
	{
		case 'a':
			printf("a\n");
			break;
		case 'b':
			printf("b\n");
			break;
		case 'c':
			printf("c\n");
			break;
		case 'd':
			printf("d\n");
			break;
		default:
			printf("error\n");
			break;
	}

	//double db = 0;
	//scanf("%lf", &db);
	//switch (db){} //错误,表达式不能是除整型外的其他类型
	return 0;
}

   2)case的后面只能跟整型常量表达式,不能是变量或其他类型的常量值

#include <stdio.h>

int main()
{
	int day = 0;
	int opt = 10;
	scanf("%d", &day);

	switch (day)
	{
		//case opt://错误,opt是变量名,而不是整型常量值
		//case 1.3://错误,1.3是浮点数,而不是整型常量值
		case 1://正确,1是整型常量值
			printf("Monday\n");
			break;
	}
	return 0;
}

   3) 编程好习惯:case/defaul语句的结束都应加上break语句跳出switch语句,除非有特别要求

#include <stdio.h>

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;
		default:
			printf("我也不知道什么day啦~\n");
			break;
	}
	return 0;
}

   4)switch允许嵌套使用

#include <stdio.h>

int main()
{
	int num = 1;
	int a = 0;
	int b = 10;

	switch (num)
	{
		case 1:
			switch (b)
			{
				case 10:
					a++;
					break;
				case 20:
					b++;
					a++;
					break;
				default:
					b++;
					break;
			}
			break;
		default:
			break;
	}
	printf("%d %d\n", a, b);//1 10
	return 0;
}

  4.思考以下的代码输出什么?

#include <stdio.h>

int main()
{
	int n = 1;
	int m = 2;
	
	switch (n)
	{
		case 1:
			m++;
		case 2:
			n++;
		case 3:
			switch (n)
			{
				case 1:
					n++;
				case 2:
					n++;
					m++;
					break;
			}
		case 4:
			m++;
			break;
		default:
			break;
	}
	printf("%d %d\n", m, n);// 5 3
	return 0;
}

    !!!恭喜你,成功突破至练气七层!!!

四.循环语句详解

  1.循环语句形式

//1.while循环
    while (条件)
    {
        语句;
    }
解释:while里面的条件为真才会执行while循环里面的语句

//2.do-while循环
    do
    {
        语句;
    } while (条件);
解释:do-while循环,先执行一次循环里面的所有语句,然后在进行判断while里面的条件

//for循环
    for(初始值;条件判断;调整部分)
    {
        语句;
    }
解释:for循环只进行初始化一次,然后进行条件判断,为真则执行for循环里面的语句,为假则跳出循环,
执行完for循环里面的所有语句后,进行调整部分,然后在进行条件判断。一直执行到条件为假时跳出循环。

  2.一个小case带你快速了解循环

#include <stdio.h>

//使用三种循环打印1-10的值
int main()
{
	int i = 1;
	//while循环
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	printf("\n");

	i = 1;
	//do-while循环
	do
	{
		printf("%d ", i);
		i++;
	}while (i <= 10);
	printf("\n");

	//for循环
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

  3.循环语句细节讨论

   1)while循环、do-while循环、for循环中的条件判断不为0或NULL才会执行里面的语句,但是do-while循环会执行一次

#include <stdio.h>

int main()
{
	int i = 0;
	int* p = NULL;
	while (i) 
	{
		printf("haha\n");
	}

	do
	{
		printf("hehe\n");//hehe
	} while (p);

	for (i = 0; i == 0; i++)
	{
		printf("hihi\n");
	}
	return 0;
}

   2)死循环

//while的死循环
	while (1){}
	
//do while的死循环
do
{
} while (1);

//for循环的死循环
for(;;){}

//解释:只要要条件判断恒为真,则会导致死循环

   3)不建议在循环中修改循环变量,这会导致程序走向不可估计的方向

五.break、continue语句

  1.break、continue的形式

//一般情况下就是加分号就使用

break;//使用在switch和循环中使用

        1)break在switch中的作用:跳出switch语句

        2)break在循环中的作用:终止循环,执行循环后面的语句

continue;//只能在循环中使用

        1)跳过本次循环,也就是说本次循环后面的代码不会执行,在while、do-while循环中直接跳到条件判断,for循环中跳到调整部分,然后才到条件判断部分

  2.一个小case让你快速上手break、continue语句

    break代码:

#include <stdio.h>

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

	i = 1;
	do
	{
		if (i == 4)
			break;
		printf("%d ", i);//1 2 3
		i++;
	} while (i <= 10);
	printf("\n");

	for (i = 1; i <= 10; i++)
	{
		if (i == 4)
		{
			break;
		}
		printf("%d ", i);//1 2 3
	}
	return 0;
}

     continue代码:

#include <stdio.h>
//代码一:
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);// 1 2 3 4 死循环
		i++;
	}
	printf("\n");
	return 0;
}


//代码二:
int main()
{
	int i = 1;
	do
	{
		if (i == 4)
			continue;
		printf("%d ", i);//1 2 3 死循环
		i++;
	} while (i <= 10);
	printf("\n");
	return 0;
}

//代码三:
int main()
{
	for (i = 1; i <= 10; i++)
	{
		if (i == 4)
		{
			continue;//跳过后面的语句后还会执行i++
		}
		printf("%d ", i);//1 2 3 5 6 7 8 9 10
	}
	return 0;
}

  3.break、continue在循环中的细节讨论

   1)break在switch和循环中使用,使用后跳出switch和循环

//break在switch中的使用
int main()
{
	int month = 1;
	scanf("%d", &month);

	switch (month)
	{
		case 12:
		case 1:
		case 2:
			printf("冬季\n");
			break;
		case 3:
		case 4:
		case 5:
			printf("春季\n");
			break;
		case 6:
		case 7:
		case 8:
			printf("夏季\n");
			break;
		case 9:
		case 10:
		case 11:
			printf("秋季\n");
			break;
		default:
			printf("输入的月份有误\n");
			break;
	}
	return 0;
}

   2)continue只能在循环中使用

  4.思考以下代码的结果

#include <stdio.h>

int main()
{
	int i = 0;
	int k = 0;
	//问:循环执行多少次?0次,k=0后直接跳出循环,因为0为假
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}

六.goto语句

  1.goto语句介绍

C语言提供了可以随意滥用的goto语句和标记跳转的标号,goto语句常用于跳出多层循环

注:我们在万不得已的情况下,才会使用goto语句,因为goto语句会打乱程序和可读性较差

goto语句的语法:goto 标记;

  2.一个小case让你快速了解goto语句

#include <stdio.h>

int main()
{
	int i = 1, j = 1, k = 1, m = 1, n = 1;
	for (i = 1; ;i++)
	{
		for (j = 1; ;j++)
		{
			for (k = 1; ;k++)
			{
				for (m = 1; ;m++)
				{
					for (n = 1; ;n++)
					{
						goto here;
					}
				}
			}
		}
	}
here:
	printf("haha\n");
	return 0;
}

  3.使用goto语句完成关机

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

int main()
{
	char arr[10] = { 0 };
	system("shutdown -s -t 60");//电脑60s后关机

again:
	printf("电脑在一分钟后关机,如果输入:我是pig,则取消关机!\n请输入:");
	scanf("%s", arr);
	if (0 == strcmp("我是pig", arr))//字符串比较需要使用strcmp,相等则返回0
	{
		system("shutdown -a");//取消关机命令
	}
	else
	{
		goto again;
	}
	return 0;
}

    !!!恭喜你,成功达到练气八层!!!

猜你喜欢

转载自blog.csdn.net/qq_63200557/article/details/128568745
今日推荐