Bootstrap

分支与循环语句(上)

目录

分支语句与循环语句

1.语句类别

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

2.1 if语句

2.1.1 悬空else

2.1.2 if书写形式的对比

2.1.3 练习

2.2 switch语句

2.2.1 在switch语句中的break

2.2.2 default子句

2.2.3 练习

3. 循环语句

3.1 while循环

3.1.1 while语句中的break和continue


分支语句与循环语句

分支语句

  • if
  • switch

循环语句

  • while
  • for
  • do while

goto语句


1.语句类别

1.条件判断语句也叫分支语句:if语句、switch语句;

2.循环执行语句:do while语句、while语句、for语句;

3.转向语句:break语句、goto语句、continue语句、return语句。


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

2.1 if语句

if语句的语法结构:

if(representation)
    statement1; 这里只有一个,若语句比较多需要加大括号,一对括号就是一个代码块
else
    statement2;

多分支:
if(representation1)
    statement1;
else if(representation2)
    statement2;
else
    statement3;

ex:

#include<stdio.h>

int main()
{
	int line = 0;

	while (line<=20000)
	{
		printf("敲代码: %d\n", line);
		line++;
	}

	if (line > 20000)
		printf("好offer\n");
	else
		printf("好好学习,天天编程\n");
	return 0;
}
int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age < 16)
        printf("少年\n");
    else if (age >= 16 && age < 30)
        printf("青年\n");
    else if (age >= 30 && age < 40)
        printf("中年\n");
    else if (age >= 40 && age < 56)
        printf("壮年\n");
    else if (age >= 56 && age < 80)
        printf("老年\n");
    else
        printf("老寿星\n");
    return 0;
}

&&表示并且,不能写成18<=age<30
这样写会先判断18<=age为假,即为0<30即为真

如果表达式representation结果为真,则语句执行,而在C语言中,0表示假,非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;
}

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书写形式的对比
int main()
{
    //风格1
    int condition = 1;
    if (condition) 
    {        
        return x;
    }
    return y;
    //风格2
    if (condition)
    {
        return x;
    }
    else
    {
        return y;
    }
    return 0;
}
#include<stdio.h>

int main()
{
    int num = 5;
    if (10 == num)
    {
        printf("hehe\n");
    }
    return 0;
}

比较一个变量和一个常量是否相等的时候,建议把常量放在等号的左边,这样可以避免少一个等号造成的bug,便于发现错误,不过我在熟练使用赋值与判断之后也没有这样用了。

2.1.3 练习

1.判断一个数是否为奇数

#include<stdio.h>

int main()
{
    int num = 0;
    scanf("%d", &num);
    //判断是否为奇数
    if (num % 2 == 1)
        printf("奇数\n");
    else
        printf("不是奇数\n");
    return 0;
}

2.输出1-100间的奇数

int main()
{
    //1. 循环先产生1~100的数字
    //2. 判断产生的数字是否为奇数
    //3. 是奇数打印
    int i = 1;
    while (i <= 100)
    {
        if (i % 2 == 1)
        {
            printf("%d ", i);
        }
        i++;
    }
    return 0;
}

2.2 switch语句

switch语句常用于多分支的情况

如果一周7天判断某天是星期几,写成if...else语句太过冗杂

这时就需要switch语句

其中switch(整形表达式),case 整形常量表达式:

2.2.1 在switch语句中的break
int main()
{
    int day = 0;
    scanf("%d", &day);
    int n = 2;
    switch (day)
    {
    default:
        printf("选择错误\n");
        break;
    case 1:
        printf("星期1\n");
        break;
    case 2:
        printf("星期2\n");
        break;
    case 3:
        printf("星期3\n");
        break;
    case 4:
        printf("星期4\n");
        break;
    case 5:
        printf("星期5\n");
        break;
    case 6:
        printf("星期6\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    }
    return 0;
}

有时我们的需求变了,输入1-5,输出weekday;输入6-7,输出weekend

int main()
{
    int day = 0;
    scanf("%d", &day);
    int n = 2;
    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语句实际上是把语句列表划分为不同的分支部分。

在最后一个case语句后面加上一条break语句是一个好习惯。

2.2.2 default子句

如果表达式的值与所有case标签都不匹配,结果就是所有语句被跳过,程序不会终止也不会报错,但是如果并不想不符合case的情况被跳过就需要添加default子句

default:

写在任意一个case标签可以出现的位置。当switch表达式的值不匹配所有case标签时,这个default语句便会被执行,所以每个switch语句只能出现一条default语句,但是它可以出现在语句列表的任意位置。

2.2.3 练习
#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;
}

结果为m = 5,n = 3


3. 循环语句

  • while
  • for
  • do while

3.1 while循环

if语句的特点是,条件满足的情况下,if语句只会执行一次,但是生活中很多时候同一件事需要完成很多次,所以C语言中引入了while语句

while(表达式)
    循环语句;

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

#include <stdio.h>

int main(void)
{
    int i = 1;
    while(i<=10)
    {
        printf("%d ",i);
        i = i+1;
    }
    return 0;
}
3.1.1 while语句中的break和continue

break介绍:

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

结果为1 2 3 4

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

continue介绍:

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

结果为:1 2 3 4

当i=5时,continue执行,跳过后面的代码,跳回while判断部分,判断是否进入循环。

int main()
{
	//1 2 3 4 5 6 7 8 9 10
	int n = 1;
	while (n <= 10)
	{
        n++;
		if (n == 5)
		{
			continue;
		}
		printf("%d ", n);
	}
	return 0;
}

结果为:1 2 3 4 6 7 8 9 10

总结:continue是用于终止本次循环的,也就是本次循环中的continue后面的代码不会执行,而是跳到while语句的判断部分,进行下一次判断。

int main()
{
	int ch = 0;
	while ((ch=getchar()) != EOF)
    EOF:end of file 文件结束标志
	{
		putchar(ch);
	}
	return 0;
}

getchar()即获取一个字符,若输入不为EOF(即不为空)就输入一个正常字符

这个代码经过适当的修改是可以用来清理缓冲区的:

int main()
{
	char password[20] = { 0 };
	int ch = 0;

	printf("请输入密码:>");
	scanf("%s", password);//123456

	//消除\n - 清理缓冲区
	while (getchar()!='\n')
	{
		;
	}
		
	printf("请确认密码(Y/N):>");
	ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");
	return 0;
}

若没有中间清除缓冲区,则输入密码+回车后直接会打印确认失败,而没有输入Y/N的环节了。

#include <stdio.h>

int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch > '9')
			continue;
		putchar(ch);
	}
	return 0;
}

这个代码的作用是只打印数字字符,跳过其他字符。


悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;