选择和循环控制语句

基础语法就不讲述了,只写一些自己觉得关键和易错的地方

选择语句:if、if……else、if……elseif……else、switch
循环语句:for、while、do……while
goto语句:跳转到指定的标签位置,从标签位置开始执行代码(一定要慎用),且只能在函数内部进行跳转

// 关机程序,程序运行起来后,1分钟内关机,如果输入我是猪,就取消关机
int main(void)
{
    char arr[20] = {0};

    system("shutdown -s -t 60");
    printf("你的电脑还有一分钟关机,输入我是帅哥,将取消关机\n");

renew:   // goto跳转标签
    printf("请输入我是帅哥>");
    scanf("%s", &arr);
    
    if (strcmp(arr, "我是帅哥") == 0)
    {
        system("shutdown -a");
    }
    else
    {
        goto renew; // goto语句
    }

    return 0;
}

 

 

1. 不论在上面的哪个语句的条件判断中,0为假,非0为真
2. 条件判断中,判断一个变量是否等于一个常量,可以写为常量 == 变量;的形式,这样可以最大限度保证条件判断语义正确,  例:变量 = 常量,理论上只要常量不是0那么都会进入控制语句中
3. 使用switch语句时,每一个case都要注意写break;,防止出现穿刺现象;当然不同题目要具体分析,但是加上break;是不会出现穿刺问题的
4. switch的条件参数,只能接受整型或者字符型(字符型本质上也是整型ASCII码)以及其类型的变量,而case的值只能是整型常量或字符常量
5. default子句的作用:当case中没有一个能与条件参数匹配上的时候,就执行default子句中的代码,有一个能兜底的
6. break;退出,但是注意只能退出一层,不能退出多层控制语句。同时也有一个例外的控制语句if,在if中使用break会直接跳过if后退出一层
7. continue;继续,跳过当前循环continue语句后面的代码,直接执行下一次循环
8. 明确知道循环次数使用for循环,不知道循环次数使用while循环
9. for(;;)  for循环中判断部分省略会导致判断恒成立,循环将进入死循环
10. 可以使用多个变量控制循环     例:for(int x = 0, int y = 0; x < 2 && y < 5; ++x, y++){}

 补充
float类型的初始化      float i = 0.0f;    后面需要加f,因为0.0默认是double类型,只有加上f编译器才会认为是float类型
scanf()函数的输入域宽      scanf("%2d", a);  %2d的意思是从输入中获取两个整型,其余的不要
printf()函数的输出域宽       printf("%02d", a);    %02d的意思是打印两个整型,如果不够两个则从左边依次补0
float保留小数输出       printf("%.2f", i);       %.2f的意思是输出一个float类型的数,且输出保留两位小数
%lf 表示的是double类型的格式化字符
时间戳:计算机内部的时间到至今有多少秒

 

也学习到了两个新的函数getchar()和putchar()
getchar():读取输入缓冲区中的一个字符并将其返回出去,如果是文件末尾或读取错误,则返回一个EOF,  接收返回值的类型标准规定是int
putchar(参数1):打印输出

getchar()的原理:执行到之后会去输入缓冲区获取字符,如果缓冲区有字符,直接读取;如果没有则需要用户从键盘输入回车后再从输入缓冲区读取;此时千万注意,输入缓冲区中有至少两个字符,一个你输入的,另外一个是回车\n。   你从键盘输入只是显示出来,并没有进入输入缓冲区,只有当你按下回车键,才会真正进入输入缓冲区,这个时候就会有两个

deepseek_mermaid_20260604_8e4763

 


getchar()的作用:通过循环语句的配合,清空输入缓冲区里的数据

 

 

 

二分查找法(非常重要的一个查找思想)
使用二分查找法有一个非常重要的前提:必须是一个有序的数组
二分查找法的原理:直接从中间开始判断是否是我要找的数,如果不是,提示大还是小,缩小范围,而后继续在更新后的范围内查找中间值,比较大小,再次缩小范围,直到整个数组都被排除掉

下面是一个案例,根据自己的理解标注代码注释

// 在一个有序数组中查找一个数,使用二分查找
int main(void)
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    // 定义并初始化一个int数组,必须是有序的
    int sz = sizeof(arr) / sizeof(arr[0]);            // 获取数组的长度
    int l = 0;                                        // 定义左边界,数组的最小下标0
    int r = sz - 1;                                   // 定义右边界,数组的最大下标sz - 1
    int n = 0;                                        // 用来接收你想要查找的数
    int mid = 0;                                      // 用来接收中间的下标值

    scanf("%d", &n);                                  // 获取用户的输入

    while (l <= r)                                    // 当左边界大于右边界时,证明整个数组已经查找完毕可以退出循环
    {
        /*mid = (r + l) / 2;*/                        // 这是第一种获取中间值的办法,左边界+右边界   再除2,但是这样的方法有一个隐藏问题,如果r+l超过int类型的范围
        mid = l + ((r - l) / 2);                      // 第二种办法,(大-小)除2后再+小,这样就能最大程度上保证不会超过int类型的范围
        if (arr[mid] > n)                             // 如果中间值大于想要查找的值,证明我们猜大了,右边界可以缩小
        {
            r = mid - 1;                              // 将右边界的下标范围缩小,为什么是mid-1,因为arr[mid]的值已经判断过了,所以-1可以避免重复
        }
        else if (arr[mid] < n )                       // 如果中间值小于想要查找的值,证明我们猜小了,左边界可以增大
        {
            l = mid + 1;                              // 将左边界的下标范围增大,为什么mid+1,原因同上
        }
        else
        {
            printf("%d的下标是%d", n, mid);            // 如果既不大于也不小于,那么就只能是等于了,等于就证明我们找到了,打印输出并且退出循环
            break;
        }
    }

    if (l > r)                                       // 如果左边界大于右边界了,那么证明上面的while循环中没有找到我们想要的值
    {
        printf("找不到");                             // 打印输出信息
    }

    return 0;
}

 

posted on 2026-06-05 00:11  绝情世家  阅读(8)  评论(0)    收藏  举报