初学者看C语言中分支和循环


别看目录简单,里面的内容可不简单噢

分支结构

1.分支中的if else语句

C语言中的分支与循环是编程中非常重要的概念,它们让我们能够控制程序的执行流程,实现复杂的功能。

首先,我相信下面的内容,理解起来还是比较容易的,因为知识点本身并不是很难,难的是怎么运用知识点来解决问题,将知识点熟练运用才是我们的目的。

我们来看看分支结构。在C语言中,分支结构主要由if语句来实现。顾名思义,if==如果。

if(a%2==0){
   printf("a是偶数")}

在上面的代码中,如果(a除以2的余数等于0)为真,那么if下面的代码printf(“a是偶数”);就会被执行。否则,这部分代码就会被跳过.(a>0)

有if怎么能没有else呢,else==否则,上代码。

if(a%2==0){
   printf("a是偶数")}else{
   printf("a是奇数")}

我想,这该不需要多做解释了吧哈哈,那么我们可以来尝试一下使用多个if else语句,我们举一个三角形判断的例子来体会if else的嵌套。

#include <stdio.h>
int main() {
    int a, b, c;
    printf("输入三条边:");
    scanf("%d %d %d", &a, &b, &c);
        if (a + b > c && a + c > b && b + c > a) {
            if (a == b || a == c || b == c) {
                if (a == b && b == c) {
                    printf("等边三角形\n");
                }
                else {
                    printf("等腰三角形\n");
                }
            }
            else {
                printf("其他三角形\n");
            }//当然,我们还可以分的更细,在这里再使用一个if语句判断直角三角形,动手试试吧!
        }
        else {
            printf("无法构成三角形\n");
            }
    return 0;
}

在这里,还有一个悬空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 语句对齐,让我们误以为 else 是和第⼀个if匹配的,当 if语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第⼆个 if进行匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成立,嵌套 if 和 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;
}

简言之,写代码带上大括号用处大大滴有,代码逻辑会更加清晰,可读性大大滴提高!

2.分支中的switch语句

除了 if 语句外,C语中还有 switch 语句来实现分支结构。
switch 语句是⼀种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。

我们上代码来体会,输入任意⼀个整数值,计算除3之后的余数

#include <stdio.h>
int main()
{
   	int n = 0;
 	scanf("%d", &n);
 	switch(n%3)
 	{
 		case 0:
 		printf("整除,余数为0\n"); 
 		case 1:
 		printf("余数是1\n"); 
 		case 2:
 		printf("余数是2\n"); 
 	}
 return 0;
}

case(这里有空格)后跟结果和( : ),下面跟相应的执行语句。

注意!
switch 后的 条件 必须是整型表达式
case 后的值,必须是整形常量表达式

当你运行后却发现非你所想
在这里插入图片描述
原因呢?switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。我们修改一哈哈,

#include <stdio.h>
int main()
{
   	int n = 0;
 	scanf("%d", &n);
 	switch(n%3)
 	{
 		case 0:
 		printf("整除,余数为0\n"); 
 		break;
 		case 1:
 		printf("余数是1\n");
 		break; 
 		case 2:
 		printf("余数是2\n");
 		break; 
 	}
 return 0;
}

那如果case后的结果都不匹配switch语句中的值怎么办呢,这时default出现了,举一个判断成绩等级的例子。

#include <stdio.h>
int main()
{
    int a;
    printf("成绩:");
    scanf("%d",&a);
    a = a / 10;
        switch (a) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                printf("E");
                break;
            case 6:
                printf("D");
                break;
            case 7:
                printf("C");
                break;
            case 8:
                printf("B");
                break;
            case 9:
            case 10:
                printf("A");
                break;
            default:
            	printf("请重新输入0-100的数字!\n");
        }
    return 0;
}

那么这时如果你输入一个负数,这个default就发挥作用了。
在这里插入图片描述
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过通常是把 default 子句放在最后处理。

循环结构

1.循环中的while与do while语句

while与do while语句比较简单,只要满足while后括号的条件,那么就执行下面/上面的语句,不过需要注意的是,do while语句中是先执行一次再去判断,while语句是直接判断,看是否可以执行。只要满足条件,那么就会一直循环下去,直至不满足while的条件。
我们通过一个简单的例子来看while与do while,打印1-5。

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

!我们不难发现,while语句while后没有分号!do while中while后有分号!!!
那么如果我们想跳出或者跳过循环该怎么办呢,break又见面啦,还有一个新朋友continue,那么我们直奔主题:
• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。
• continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中是有所差异的。

#include <stdio.h>
int main()
{
 	int i = 1;
 	while(i<=5)
 	{
 		if(i == 3)
 		break;//当i等于3后,就执⾏break,循环就终⽌了
	 printf("%d ", i);
 	i = i+1;
 	}
 return 0;
}

在这里插入图片描述
我们把break换成continue试试看

#include <stdio.h>
int main()
{
 	int i = 1;
 	while(i<=5)
 	{
 		if(i == 3)
 		continue;
 		//当i等于5后,就执⾏continue,直接跳过continue后面的代码,去循环判断的地⽅(i<=5),这⾥跳过了i = i+1,所以i⼀直为3,程序陷⼊死循环,没法结束
 	printf("%d ", i);
 	i = i+1;
	}
 return 0;
}

在这里插入图片描述
while与do while中的break和continue几乎一模一样,可以自己试试看噢。
那么for语句中又会是什么样呢,让我们接着往下看。

2.循环中的for语句

我为什么把for语句放在最后呢,我认为呢for语句算是里面比较复杂的,使用频率也是最高的。那么先让我们看看它的形式。

for(表达式1; 表达式2; 表达式3)

表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
我们用简单的例子来理解

#include<stdio.h>
int main()
{
	int i;
	for (i = 0; i <= 10; i++) //这里的i++相当于i=i+1
	{
		printf("%d ", i);
	}
	return 0;
}

在这里插入图片描述
看起来也没有多难嘛,让我们升级一下难度,把for语句嵌套用一下
来一个实例:打印一个可以自己规定大小的倒三角形

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int n, i, j;
    printf("size:");
    scanf("%d", &n);
    if (n <= 0) {
            printf("Bye!\n");
            return 0;//若输出的n小于等于零,直接打印bey!,然后结束程序
        }
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= i - 1; j++)
            {
                printf(" ");//打印每一行前面的空格
            }
            for (j = 1; j <= 2 * (n - i) + 1; j++)//
            {
                printf("*");//打印每一行的*用来组成图案
            }
            printf("\n");//换行n次,既有n行
        }
    return 0;
}

在这里插入图片描述
这个for语句的嵌套怎么样呢,还不错吧,和上一个相比是不是有点难度呢。好好康康,我相信你会理解的。
那么接下来,就来看for语句中的continue到底和while语句中的有什么不同呢?上代码

#include <stdio.h>
int main()
{
 	int i = 1;
 	for(i=1; i<=10; i++)
 	{
 		if(i == 5)
 		continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
 		printf("%d ", i);
 	}
 return 0;
}

在这里插入图片描述
的确跳过了5的打印
我们不难发现,for语句中只是跳过了i为5这一次循环,不影响后面的循环,而while语句中跳过后面的代码后,i始终为3,就会一直停在判断上面,进而陷入死循环。这就是他俩的区别,你get到了吗?

分支与循环嵌套的几个实例

这里有几个嵌套的实例,大家可以自己体会体会
1.打印中空菱形

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int n, i, j;
    while (1) {//括号中的1表示这里为真
        printf("size:");
        scanf("%d", &n);
        if (n <= 0) {
            printf("Bye!\n");
            break;
        }
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }
            for (j = 1; j <= 2 * i - 1; j++)
            {
                if (j == 1 || j == 2 * i - 1)
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n");
        }
        for (i = 2; i <= n; i++)
        {
            for (j = 1; j <= i - 1; j++)
            {
                printf(" ");
            }
            for (j = 1; j <= 2 * (n - i) + 1; j++)
            {
                if (j == 1 || j == 2 * (n - i) + 1)
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

2.指定年月日季节

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	printf("YYYYMM:");
	int y, b;
	scanf("%4d%2d", &y, &b);
	if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
		printf("a leap\n");
	else printf("not a leap\n");
	if (b >= 3 && b <= 5)
		printf("spring\n");
	if (b >= 6 && b <= 8)
		printf("summer\n");
	if (b >= 9 && b <= 11)
		printf("autumn\n");
	if (b == 12 || b <= 2)
		printf("winter\n");
	if (b == 1 || b == 3 || b == 5 || b == 7 || b == 8 || b == 10 || b == 12)
		printf("31\n");
	if (b == 4 || b == 6 || b == 9 || b == 11)
		printf("30\n");
	if (b == 2)
	{
		if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
			printf("29\n");
		else printf("28\n");
	}
	return 0;
}

3.正正负累加

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int n;
	double a, sum = 0;
	printf("n:");
	scanf("%d", &n);
	if (n <= 0) {
		return 0;
	}
	for (int i = 1; i <= n; i++) {
		if (i % 3 == 0) {
			a = -1.0 / i;
		}
		else {
			a = 1.0 / i;
		}
		sum += a;
	}
	printf("sum=%5.2lf\n", sum);
	return 0;
}

对于分支与循环语句,不仅仅是上面举的那些例子,还有其他很多很多的问题都能用到它们哦。自己要多写代码来体会,熟能生巧嘛。

在这里,我小小提醒一下,用VS编译程序时,如果有scanf这个函数的话记得在第一行加上#define _CRT_SECURE_NO_WARNINGS 1 不然vs是会报错的哦。

最后来给大家附上一张前几天下午拍的夕阳哈哈哈
在这里插入图片描述

  • 37
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值