• 函数


    我们知道C语言是面向过程的编程语言,函数是C语言中模块化编程的最小单位,学编程的都会知道,所以,没有什么难点,但是对于C的函数,里面还是有一些需我们注意的地方,下面正式开始学习。

    先来看一个例子,由于它太熟悉了,所以就不从头开始学习了:

    运行结果:

    对于这个简单的程序,其中蓝色说明部分是我们需要注意的,对于函数,是需要提前声明的,有以下几点:

    ①如果将声明给去掉,则会给出警告:

    ②如果函数写在调用方之前,则可以省去声明,如下:

    编译也是能通过的:

    ③ 函数的声明的形参可以省略形参名,只要形参数据类型既可:

    编译也是能通过的:

    下面以一个小例子来做为练习---------猜数游戏

     下面先贴出简单的流程图:

    具体实现:

    #include <stdio.h>
    #include <stdlib.h>//提供rand()随机函数
    #include <ctype.h>//提供isspace判断字符为空的函数
    
    void guess(int number);//根据一个系统生成的数字进行猜测,功能核心
    int next();//是否还要继续参与猜字游戏
    int getnumber();//输到一个数字,需在1~100之间
    
    int main(void)
    {
        do
        {
            int unknown = rand() % 100 + 1;//系统随机生成一个数字,供用户进行猜测
            guess(unknown);//把所有的猜测的逻辑都封装成一个函数,体现了函数的意义,模块化
        } while (next());
        return 0;
    }
    
    void guess(int number)
    {
        int count = 0;
        do
        {
            int guess_number = getnumber();
            if (guess_number > number)
                printf("Too high\n");
            else if (guess_number < number)
                printf("Too low\n");
            else
            {
                printf("Congratulation: you win!\n");
                break;
            }
        } while (++count != 10);
    }
    
    int getnumber()
    {
        int n;
        while (1)
        {
            printf("Your guess: ");
            if (scanf("%d", &n) != 1 || n < 1 || n > 100)
            {
                //说明输入的数字是无效的,给出错误提示
                printf("Wrong number,need a number 1 ~ 100\n");
                while (getchar() != '\n')//这时需用户输入回车才能重新输入
                    ;
            }
            else
                break;
        }
    
        return n;
    }
    
    int next()
    {
        int c;
        printf("Next game? (y/n): ");
        while (isspace(c = getchar()))//如果输入的是空字符,则不断循环,直到不是空字符
            ;
    
        if (c == 'y')
            return 1;
    
        return 0;
    }

    运行结果:

    注意看下面第二次运行的结果:

    而我们生成随机数的是用库函数randon(),在计算机中,随机数都是伪随机数,达不到现实中的真正意义上的随机数,这是由于算法是确定性来决定的,它的随机数是依赖于种子,所以通过man来查看其帮助:

    而如果要实现每次运行生成的随机数不一样,那我们可以把当前时间做为种子,这样生成的随机数就应该不是一样的了,如下:

    #include <stdio.h>
    #include <stdlib.h>//提供rand()随机函数
    #include <ctype.h>//提供isspace判断字符为空的函数
    #include <time.h>//提供了time()获取当前时间的函数
    
    void guess(int number);//根据一个系统生成的数字进行猜测,功能核心
    int next();//是否还要继续参与猜字游戏
    int getnumber();//输到一个数字,需在1~100之间
    
    int main(void)
    {
        srand(time(NULL));//设置随时数的种子为当前时间,保证每次运行都不一样
        do
        {
            int unknown = rand() % 100 + 1;//系统随机生成一个数字,供用户进行猜测
            guess(unknown);//把所有的猜测的逻辑都封装成一个函数,体现了函数的意义,模块化
        } while (next());
        return 0;
    }
    
    void guess(int number)
    {
        int count = 0;
        do
        {
            int guess_number = getnumber();
            if (guess_number > number)
                printf("Too high\n");
            else if (guess_number < number)
                printf("Too low\n");
            else
            {
                printf("Congratulation: you win!\n");
                break;
            }
        } while (++count != 10);
    }
    
    int getnumber()
    {
        int n;
        while (1)
        {
            printf("Your guess: ");
            if (scanf("%d", &n) != 1 || n < 1 || n > 100)
            {
                //说明输入的数字是无效的,给出错误提示
                printf("Wrong number,need a number 1 ~ 100\n");
                while (getchar() != '\n')//这时需用户输入回车才能重新输入
                    ;
            }
            else
                break;
        }
    
        return n;
    }
    
    int next()
    {
        int c;
        printf("Next game? (y/n): ");
        while (isspace(c = getchar()))//如果输入的是空字符,则不断循环,直到不是空字符
            ;
    
        if (c == 'y')
            return 1;
    
        return 0;
    }

    运行结果:

    函数递归

    下面通过实例来应用函数递归

    ①利用递归求阶乘【这个比较简单】
    #include <stdio.h>
    unsigned int factorial(unsigned int);
    int main(void)
    {
        printf("factorial(5)=%u\n", factorial(5));
        return 0;
    }
    //递归求一个数的阶乘
    unsigned int factorial(unsigned int number) 
    {
        if ( number == 0)
              return 1;
           else
              return (number*factorial(number-1));
    }

    运行结果:

    通常递归实现的都能将它改为循环来实现,但是反过来就不一定了,如下:

    判断一个字符串是否是回文

     定义:称正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”、12321、123321是“回文”,“abcde”和“ababab”则不是“回文”。

    实现方式一:循环的方式来实现:

    #include <stdio.h>
    #include <string.h>
    
    //判断一个字符串是否是回文
    int palindrome(const char* str)
    {
        int first = 0;
        int last = strlen(str) - 1;
        
        while (first < last)
        {
            if (str[first] != str[last])
                return 0;
    
            ++first;
            --last;
        }
    
        return 1;
    }
    
    int main(void)
    {
    
        if (palindrome("abcdcba"))
            printf("abcdcba is palindrome\n");
        else
            printf("abcdcba is not palindrome\n");
            
        if (palindrome("abcd"))
            printf("abcd is palindrome\n");
        else
            printf("abcd is not palindrome\n");
    
        return 0;
    }

    实现方式二:递归的方式来实现:

    #include <stdio.h>
    #include <string.h>
    
    //利用递归来判断一个字符串是否是回文
    int palindrome_r(const char* str, int first, int last)
    {
        if (first >= last)
            return 1;
    
        if (str[first] != str[last])
            return 0;
    
        return palindrome_r(str, first+1, last-1);
    }
    
    int palindrome(const char* str)
    {
        return palindrome_r(str, 0, strlen(str)-1);
    }
    
    int main(void)
    {
    
        if (palindrome("abcdcba"))
            printf("abcdcba is palindrome\n");
        else
            printf("abcdcba is not palindrome\n");
            
        if (palindrome("abcd"))
            printf("abcd is palindrome\n");
        else
            printf("abcd is not palindrome\n");
    
        return 0;
    }

    运行结果:

    好了,关于函数的先学到这。

  • 相关阅读:
    基于方便使用的所见即所得架构方式
    linux操作笔记
    TreeView获取目录下的所有文件
    treeList获取目录下的所有文件
    简单字符串处理 hdu2532 Engine
    简单字符串处理
    Luogu P1648 看守
    【深入理解Linux内核架构】第3章:内存管理
    【深入理解Linux内核架构】6.6 资源分配
    题解 P1888 【三角函数】
  • 原文地址:https://www.cnblogs.com/webor2006/p/3454664.html
Copyright © 2020-2023  润新知