C语言-分支&循环

目录

1.分支语句(条件判断语句)

 1.1.if语句

1.1.1.if语句的书写

 1.1.2.if语句的简单题目

 1.2.switch语句

1.2.1.default子句

 1.2.2.题目

2.循环语句 

2.1.while 

2.1.1.while语法展示

 2.1.2.while语句中的break

2.1.3.while语句中的continue 

 2.2.do...while

2.2.1.do...while语法 

 2.2.2.do...while的特点

2.2.3.do while循环中的break和continue

 2.3.for

 2.3.1.for的语法

 2.3.2.for的特点

2.3.3.for中的break和continue 

2.3.4.for循环中的注意事项 

 2.3.5.题目

 3.小题目练练手 

3.1.计算1~10的阶乘 

 3.2.在一个有序数组中查找具体的某个数字n。

3.3. 折半查找(二分查找)

4.goto语句

5.整蛊(滑稽)


1.分支语句(条件判断语句)

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

 1.1.if语句

语法结构如下: 

语法结构:
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;

//多分支
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句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");
    }
    return 0;
}

1.从代码中可以知道的是:利用if;else-if;else实现条件判断,划分出每个age大小在每个区间时函数的输出对应的结果。

2.c语言中0表示‘假’,1表示‘真’

3.‘{ }’包裹的是一个代码块

下面来看另一段代码:

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

 输出结果为“haha”,所以我们需要合理利用‘{ }’来标注好代码的逻辑

注意:else和距离它层级最近的if相匹配

1.1.1.if语句的书写

下面我们来看一段代码:

#include <stdio.h>
int main()
{
    int x = 0;
    int y = 0;
    if (condition)
    {
        return x;
    }
    return y;

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

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

    // 代码4
    int num = 1;
    //可以防止输入时少输入一个'='把条件变成'永真'
    if (5 == num)
    {
        printf("123\n");
    }
}

> 代码4格式更好一些,因为将变量放在后面可以在我们输入错误时IDE提醒我们错误位置,如果变量在前面则输入错误时'num = 5'作为一个赋值式,它是永真的,IDE不能帮助我们发现错误

 1.1.2.if语句的简单题目

 1.判断输入的数字是否是奇数

参考答案:

#include<stdio.h>
int main()
{
    int i;
    printf("请输入数字:>");
    scanf("%d", &i);
    if(i%2 == 1)
    {
        printf("%d是奇数\n", i);
    }
    else
    {
        printf("%d不是奇数\n", i);
    }
    return 0;
}

 1.2.switch语句

 switch常用于多分支情况。

例如: 

如果使用if-else的形式书写这个代码,会显得很繁复,用switch则正好

以下switch语句完成上述功能:

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

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

但是如果我们输入的值在这些case中都对不上呢?

 我们可以选择:default语句

1.2.1.default子句

default特点:

1.写在和case标签同级的任何一个位置。

2.每个switch语句中只能出现一条default子句。

default作用:当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。

 1.2.2.题目

int main()
{
    int n = 1;
    int m = 2;
    switch (n)
    {
    case 1:
        m++;//没有break继续向下运行
    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,n各等于几?

答案:m = 5,n = 3


2.循环语句 

1.while

2.do...while

3.for 

2.1.while 

2.1.1.while语法展示

 实现功能:打印1-100数字

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

 2.1.2.while语句中的break

#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10)
    {    
        //i=5时跳出循环
        if(i == 5)
            break;
        printf("%d ", i);
        i = i+1;
    }
    return 0;
}

 打印结果:1 2 3 4

break在while循环中的作用:while中的break是用于永久终止循环的。 

2.1.3.while语句中的continue 

请看第一段代码

#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

请看第二段代码

#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

由这两种情况我们可以知道,在'i'的自加式子到continue语句前面之后,

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

 2.2.do...while

2.2.1.do...while语法 

do
    循环语句;
while(表达式);

 2.2.2.do...while的特点

特点:

1.循环至少执行一次

2.先执行后判断

 例:

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

2.2.3.do while循环中的break和continue

首先我们看两段代码: 

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

结果:1 2 3 4 

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

 结果:1 2 3 4

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {   
        i = i + 1;//换了位置
        if (5 == i)
            continue;
        printf("%d ", i);
    } while (i <= 10);
    return 0;
}

结果 :2 3 4 6 7 8 9 10 11

可知与while中相同

 2.3.for

 2.3.1.for的语法

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

表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。

使用效果:

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

 2.3.2.for的特点

查找和修改更加集中方便 

for循环和while循环的对比

for(i=1; i<=10; i++)
{
    printf("hehe\n");
}

int i = 0;
i=1;//初始化部分
while(i<=10)//判断部分
{
    printf("hehe\n");
    i = i+1;//调整部分
}

2.3.3.for中的break和continue 

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


//continue
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
    {
        if(i == 5)
            continue;
        printf("%d ",i);
    }
return 0;
}
break和continue的意义和while循环中是一样的

2.3.4.for循环中的注意事项 

1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。 

两种写法: 

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}

//两边都是闭区间
for(i=0; i<=9; i++)
{}

 2.3.5.题目

#include <stdio.h>
int main()
{
    int i = 0;
    int k = 0;
    for(i =0,k=0; k=0; i++,k++)
        k++;
    return 0;
}

问:循环次数

答案:0次

 因为k = 0,恒为假,所以循环0次


 3.小题目练练手 

3.1.计算1~10的阶乘 

 答案:

int main()
 {
     int n = 5;
     int count = 1;
     int sum = 0;
     int i = 0;
     printf("请输入n的值");
     scanf("%d", &n);
     for (int j = 1; j <= n;j++)
     {
         count = 1;//防止在算之后的阶乘中count的初始值是上一个值的阶乘数值,导致计算结果错误
         for (i = 1; i <= j; i++)
         {
             count = count * i;
         }
         sum += count;
     }
     printf("%d\n", sum);
     return 0;
 }

 3.2.在一个有序数组中查找具体的某个数字n。

 答案:

int main(){//首先是简单的遍历方法(低效率)
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int k = 0;
    scanf("%d", &k);
    int i = 0;
    int flag = 0;
    for (i = 0; i < 10;i++)
    {
        if(arr[i]==k)
        {
            printf("找到了,下标是:%d\n", i);
            flag = 1;
            break;
        }
    }
    if(flag == 0){
        printf("没找到");
    }
        return 0;
}

3.3. 折半查找(二分查找)

特点:效率比较高但是需要有序数组中才能使用。

问题:输入一个数字查找它在数组中的位置 

答案:

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
    int k = 0;
    scanf("%d", &k);
    int left = 0;
    int right = sz-1;//下标是数组个数减一

    int flag = 0;
    while (left <= right)
    {
        int mid = (left + right) / 2;//此条语句要放在循环里面mid才会更新
        if (arr[mid] < k)
            left = mid + 1;
        else if (arr[mid] > k)
            right = mid - 1;
        else
        {
            printf("找到了,下标是:%d\n", mid);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
        printf("找不到\n");
}

 如果不知道数组中的元素个数,可以使用以下方法

printf("%d\n",sizeof(arr)); - 数组的总大小,单位是字节
printf("%d\n",sizeof(arr[0])); - 数组中单位数据的大小
printf("%d\n",sizeof(arr)/sizeof(arr[0]));,可用于计算数组中元素的个数

4.goto语句

 C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。(而且还需要设置限制条件)

 演示:

// goto语句,可以自由的跳转到想要去的代码行,但是不能跨函数跳转

void test()
{
flag:
    printf("321\n");
}

int main()
{
    printf("123\n");
    goto flag;//只能在同一个函数内部跳转,不能跨函数
    return 0;
}

5.整蛊(滑稽)

 学习之余娱乐一下

// goto语句适合跳出多层循环使用比break方便(break需要一些理由跳出该层循环)

// 关机程序
// 程序运行起来后一分钟内关机
// 如果输入"我是猪八戒",则取消关机
// 如果不听话则立即关机
int main()
{
    char input[20] = {0};
    system("shutdown -s -t 60"); //-t表示设置时间,倒计时60秒关机
again:
    printf("你的电脑即将在一分钟后关机,如果输入'我是猪'则停止关机程序\n");
    scanf("%s", input);
    if (strcmp(input, "我是猪八戒") == 0)
    {
        system("shutdown -a");
        printf("有惊无险,已经停止了关机程序\n");
    }
    else
    {
        printf("很抱歉你不配合,重启见\n");
        system("shutdown -a");
        system("shutdown -s -t 3");
    }
    return 0;
}

代码都可在我的gitee仓库中找到,链接如下: 

c/2024-3-26/ifwhile.c · 梓树/个人学习记录 - Gitee.com

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L_梓树

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值