《C语言学习笔记:从函数设计到小项目实战(二分查找、猜数字关机程序)》

16 阅读4分钟

1.在写一个函数时,先想好这个函数该怎么用 也就是将传几个实参,返不返回值,如果要返回值,这个返回值的作用是什么 然后再去设计函数。 比如下面实现二分查找功能的函数:

#include <stdio.h>

int binary_search(int arr[], int n, int sz)
{
    //左右下标
    int left = 0;
    int right = sz - 1;

    while (left <= right)
    {
        int mid = left + (right - left) / 2; //防溢出的中间下标计算方法

        if (arr[mid] > n)
        {
            right = mid - 1;
        }
        else if (arr[mid] < n)
        {
            left = mid + 1;
        }
        else
        {
            return mid; //找到后直接返回下标
        }
    }

    return -1; //找不到返回-1,输出找不到
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};
    int sz = sizeof(arr) / sizeof(arr[0]);

    int n = 0;
    printf("输入:");
    scanf("%d", &n);

    int ret = binary_search(arr, n, sz); //将数组、要找到数以及数组的总元素个数传参

    //函数返回不同值时的处理情况
    if (-1 == ret)
    {
        printf("找不到");
    }
    else
    {
        printf("该数的下标为%d", ret);
    }

    return 0;
}

2.数组的传参 错误示范:

int binary_search(int arr[], int n, int sz)
{
    //不能在函数内部计算数组的元素个数
    //因为实参如果是数组的话,传给形参的只是这个数组首元素的地址
    //这里的形参"int arr[]"本质上是一个指针变量,用于接收原数组首元素的地址
    //形参可以根据这个数组首元素的地址,找回原数组
    //所以这里的arr是一个指针变量,我们知道,指针变量在32位机器中的大小为4个字节
    //这里就是4个字节去除以4个字节,无法计算原数组的元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);
    int left = 0;
    int right = sz - 1;

    while (left <= right)
    {
        int mid = left + (right - left) / 2; //防溢出的中间下标计算方法

        if (arr[mid] > n)
        {
            right = mid - 1;
        }
        else if (arr[mid] < n)
        {
            left = mid + 1;
        }
        else
        {
            return mid; //找到后直接返回下标
        }
    }

    return -1; //找不到返回-1,输出找不到
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};

    int n = 0;
    printf("输入:");
    scanf("%d", &n);

    int ret = binary_search(arr, n); //将数组、要找到数以及数组的总元素个数传参

    //函数返回不同值时的处理情况
    if (-1 == ret)
    {
        printf("找不到");
    }
    else
    {
        printf("该数的下标为%d", ret);
    }

    return 0;
}

正确示范:

//运用函数实现二分查找的功能

#include <stdio.h>

int binary_search(int arr[], int n, int sz)
{
    
    int left = 0;
    int right = sz - 1;

    while (left <= right)
    {
        int mid = left + (right - left) / 2; //防溢出的中间下标计算方法

        if (arr[mid] > n)
        {
            right = mid - 1;
        }
        else if (arr[mid] < n)
        {
            left = mid + 1;
        }
        else
        {
            return mid; //找到后直接返回下标
        }
    }

    return -1; //找不到返回-1,输出找不到
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10};
    int sz = sizeof(arr) / sizeof(arr[0]);

    int n = 0;
    printf("输入:");
    scanf("%d", &n);

    int ret = binary_search(arr, n, sz); //将数组、要找到数以及数组的总元素个数传参

    //函数返回不同值时的处理情况
    if (-1 == ret)
    {
        printf("找不到");
    }
    else
    {
        printf("该数的下标为%d", ret);
    }

    return 0;
}

3.猜数字游戏练习:

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

void menu()
{
    printf("**************************\n");
    printf("********  1.Play  ********\n");
    printf("********  0.Exit  ********\n");
    printf("**************************\n");
}

void game()
{
    int random = rand() % 100 + 1;
    int guess = 0;
    int count = 0;

    for (count = 0; count < 10; count++)
    {
        printf("请输入你猜的数:");
        scanf("%d", &guess);

        if (guess > random)
        {
            printf("猜大了\n");
        }
        else if (guess < random)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜你,猜对了,该数为%d\n", random);
                
            if (random % 2 == 1)
            { 
                printf("恭喜你,该随机数为奇数,将取消关机程序\n");
                system("shutdown -a");
            }
            else
            {
                printf("但是很遗憾,该随机数为偶数,电脑将在三秒后关机\n");
                system("shutdown -s -t 3");
            }
            break;
        }
    }


    if (10 == count)
    {
        printf("你猜的次数超过了10次,将在3秒后关机!\n");
        system("shutdown -s -t 3");
    }
    

}

int main()
{
    system("shutdown -s -t 80");

    printf("注意:你的电脑将在80秒后关机\n\n");
    printf("接下来将进行猜数字游戏,如果猜对且数字为奇数,将取消关机\n");
    printf("规则:\n");
    printf("系统会在1~100的范围内随机给一个数字,你有10次猜数字的机会\n");
    printf("如果10次全部猜错,将直接执行关机程序\n");
    printf("如果10次之内猜对且数字为奇数,将取消关机程序\n");
    printf("注意!如果系统给出的随机数为偶数,即使你猜对了,也将直接执行关机程序!\n");
    
    int input = 0;
    srand((unsigned int)time(NULL));

    do
    {
        //菜单系统
        menu();
        printf("请选择:");
        scanf("%d", &input);

        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出程序\n");
            break;
        default:
            printf("选择错误,请重新选择\n");
            break;
        }
    } while (input);
    
    return 0;
}