【学习ios之路:C语言】函数及递归的简单应用

函数定义: 返回值类型 函数名(形参列表){函数体(函数的实现内容)};

函数定义的四种形式:

//函数定义第一种形式: 无参数, 无返回值
void byMilk() { //如果没有参数,小括号必不可少.
    printf("没钱\n");
}
//函数名的命名规范:由多个英文单词组成,除了第一个单词的首字母小写,其余单词首字母大写.

//函数定义第二种形式,有返回值,无参数
float salary() {
    printf("同志们辛苦了\n");
    return 0.1; //return  将该函数的值返回主调函数.
    //printf("同志们辛苦了\n"); 不能把代码放到return下边,会执行不到.
}

//函数定义第三种形式.无返回值,有参数.
void watch(int money){
    if (money < 10) {
        printf("不买");
    } else {
        printf("买了");
    }
}
//函数定义的第四种方式,有返回值,有参数.
//求两个数的最大值.
int maxValue(int a ,int b) {
    int max = 0;
    if (a > b) {
        max = a;
    } else {
        max = b;
    }
    return max;
}
  //上述求最大值优化
int maxValue1(int a ,int b) {
    int max = 0;
    max = a > b ? a : b;
    return max;
}
 //更简写
int maxValue2(int a ,int b) {
    return a > b ? a : b;
}

函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函数).但不能嵌套定义(不能在一个函数内部定义另外一个函数).

main 函数(主函数) 应用程序执行的入口.

函数相当于公司的部门,每一个部分完成特定的功能,部门与部门之间的并列关系决定了函数与函数之间也是并列关系.

函数功能:实现代码的模块化管理.把复杂的逻辑进行拆分,而主函数只起到宏观调控的作用即可.

例:

//3个数的最大值2
int maxThree1(int a, int b, int c) {
    // int max = 0;//存储最大值
    //方法1
    //max = a > b ? a : b;
    //max = max > c ? max : c;
    //调用函数
    //max = maxValue2(a, b);
    //max = maxValue2(max, c);
    //简
    //max = maxValue2(maxValue2(a, b), c);
    //更简
    return maxValue2(maxValue2(a, b), c);
}

//3个数最小值1
int minThree(int a, int b, int c) {
    return a < b ? a < c ? a : c : b < c ? b : c;
}

//3个数最小值2
int minThree1(int a, int b, int c) {
    //int min = 0;
    //min = minValue3(a, b);
    //min = minValue3(min, c);

    //min = a < b ? a : b;
    //min = min > c ? c : min;

    //min = minValue3(minValue3(a, b), c);

    return minValue3(minValue3(a, b), c);
}

//中间值1
int midThree(int sum, int min, int max) {
    return sum - min - max ;
}
//中间值2
int midThree1(int a, int b, int c) {

    //int max = a > b ? a > c ? a : c : b > c ? b : c;
    //int min = a < b ? b < c ? a : c : b < c ? b : c;

    //int max = maxThree1(a, b, c);
    //int min = minThree1(a, b, c);
    //return a + b + c - max - min;

    return a + b + c - maxThree1(a, b, c) - minThree1(a, b, c);
}

//求四个数的最大值(函数的嵌套应用)
int maxFour(int a, int b, int c, int d) {
    
    //return maxValue2(maxValue2(a, b), maxValue2(c, d));

    //return maxValue2(maxThree1(a, b, c), d);
    
    //return maxValue2(a, b) > maxValue2(c, d) ? maxValue2(a, b) : maxValue2(c, d);
    return maxThree1(maxValue2(a, b), c, d);
}

//求5个数的最大值
int maxFive(int a, int b, int c, int d, int e) {
    
    return maxValue2(maxFour(a, b, c, d), e);
}

 

实参和形参:

实参:函数调用时给定的参数叫做实参,是一个唯一确定的数据.

形参:形式上的参数,在函数定义时,给定的参数叫做形参,一个一个的变量,存储的数据在函数调用之前未知.

实参向行参传递的过程是一个拷贝的过程.

/**
   变量的作用域:变量可以访问的范围.
   局部变量:在函数内部定义的变量叫做局部变量.只在函数内部可访问.函数执行时开辟空间,函数执行结束空间自动回收.
   全局变量:在函数外部定义的变量叫做全局变量,在全局都可以访问,空间不会回收.(注:全局变量非常危险,使用需谨慎)
   静态变量:凡是被static修饰的变量都叫做静态变量.
      特点:1.如果不赋初值,默认为0  2.只初始化一次.(该变量只会定义一次)  3.空间一但开辟不会回收.
 */
int sumTwo(int a) {
    static int sum = 0;
    sum += a;
    return sum;
}

 

函数应用:

//求两个数的最大公约数
int maxGY(int x, int y);

//求两个数的最小公倍数
int minGB(int x, int y);

//给数组元素赋值
void copyArray(int arr[], int count);//arr[]用来接受传入的数组.count,用来接受传入的数组元素的个数.

//对数组进行升序排序
void sortArray(int arr[], int count);

//输出数组元素

void OutputArray(int arr[], int count);
//多数组元素降序排列
void sortArraydesc(int arr[], int count);

 

2.函数实现.

//求两个数的最大公约数
int maxGY(int x, int y){
    int rem1 = rem(x, y);
    while (rem1 != 0) {
        x = y;
        y = rem1;
        rem1 = rem(x, y);
    }
    return y;
}

//求两个数的最小公倍数
int minGB(int x, int y){
    return (x * y) / maxGY(x, y);
}
//函数内只写与本函数功能相关的代码.
//给数组元素赋值
//arr[]用来接受传入的数组.count,用来接受传入的数组元素的个数.
void copyArray(int arr[], int count) {
    for (int i = 0; i < count; i++) {
        arr[i] = arc4random() % (40 - 20 + 1) + 20;
        //printf("%d ",arr[i]);
    }
    //printf("\n");
}
 //对数组进行升序排序
void sortArray(int arr[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

}

//对数组元素进行降序排列
void sortArraydesc(int arr[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (arr[j] < arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

}

//输出数组元素

void OutputArray(int arr[], int count) {
    for (int i = 0; i < count; i++) {
        printf("%d ",arr[i]);
    }
    printf("\n");
}

3.主函数调用:


    int max = maxGY(30, 6);
    int min = minGB(30, 6);
    printf("%d,%d", max, min);
    int a[10] = {0};
    copyArray(a, 10);//当数组作为函数参数时,传递数组名即可.
    OutputArray(a, 10);
    sortArray(a, 10);
    OutputArray(a, 10);

4.递归

例子:

1.函数声明:

//函数模拟吃苹果
void eatApple(int n);

//输入54321倒序输出
void reverse(int number);

<span style="font-size:18px;"></span><pre name="code" class="cpp">//正序输出
void noReverse(int number)
//阶乘求一个数的阶乘n!
int str(int number);

2.函数的实现,及递归方法的封装

void eatApple(int n) {

    //一旦发现苹果个数为0,则通过return结束当前函数执行
    //递归一定要有出口, 否则或造成死循环

    if(n  == 0) {
        return;//返回空
    }
    //如果不为0
    //1.留一个苹果
    n--;
    //2.找下一个人来吃苹果
    eatApple(n);

    //3.吃自己手里的苹果.
    printf("第 %d 个人吃苹果\n", 10 - n);
}

//倒序
void reverse(int number) {
    if (number == 0) {
        return;
    }
    //留下个数
    int n =number % 10;
    //报数
    printf("%d ", n);
    reverse(number / 10);
    //找下一个人报数.
}

//正序输出
void noReverse(int number) {
    if (number == 0) {
        return;
    }
    reverse(number / 10);
    int n = number % 10;
    printf("%d ",n);
}

//阶乘

int  str(int  n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * str(n - 1);
}

 

3.函数的调用

#import <Foundation/Foundation.h>
     //吃苹果操作
     eatApple(10);

     //倒序输出
     reverse(54321);
     printf("\n");
     noReverse(12345);
     int x = str(5);
     printf("%d", x);

四.结构体数组与函数之间的应用

1.函数声明

void studentNameAsc(Student str[], int count);
<pre name="code" class="cpp">void studentAsc(Student str[], int count);
void studentAgeDesc(Student str[], int count);
void allOutputStudent(Student str[], int count);
void OutputStudent(Student s);


2.函数实现

//输出单个学生信息
void OutputStudent(Student s) {
    printf("%s,%d,%.1f \n", s.name, s.age, s.score);
}

//输出所有学生的信息
void allOutputStudent(Student str[], int count) {
    for (int i = 0; i < count ; i++) {
        //printf("%s,%d,%.1f \n",str[i].name, str[i].age, str[i].score);
        OutputStudent(str[i]);
    }
}

//将学生按照成绩升序排列
void studentAsc(Student str[], int count) {
    
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (str[j].score > str[j + 1].score) {
                Student temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
        }
    }
    
}

//讲学生按照年龄降序排列
void studentAgeDesc(Student str[], int count) {
    
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (str[j].age < str[j + 1].age) {
                Student temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
        }
    }
    
}

//讲学生按照姓名升序排列
void studentNameAsc(Student str[], int count) {
    
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (strcmp(str[j].name, str[j + 1].name) > 0) {
                Student temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
        }
    }
    
}

3.函数调用

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  //定义学生结构体数组
    Student stu[5] = {
        {"hh", 10, 30},
        {"hehe", 22 ,89},
        {"heihei", 32,59.0},
        {"hiahia", 34, 86},
        {"hihi", 23, 77}
    };
    //输出所有学生的信息

    allOutputStudent(stu, 5);
    //按照学生姓名升序
    printf("------按照姓名升------\n");
    studentNameAsc(stu, 5);
    allOutputStudent(stu, 5);
    //按照年龄降序
    printf("-------按照年龄降-----\n");
    studentAgeDesc(stu, 5);
    allOutputStudent(stu, 5);
    //按照分数升序
    printf("------按照分数升-----\n");
    studentAsc(stu, 5);
    allOutputStudent(stu, 5);

    return 0;

}
时间: 2024-10-11 17:17:41

【学习ios之路:C语言】函数及递归的简单应用的相关文章

【学习ios之路:C语言】C语言中容易出错的试题整理.

注:此类题都是比较基础的试题,但是都容易让人忽视,或者平常不在意的. 1.表达式3.6-5/2+1.2+5%2的值是(D). A. 4.3  B. 4.8  C.3.3  D. 3.8 2.设有说明:char w;int x;float y;double z;则表达式w*x+z-y值的数据类型为:(D) A. float   B. char  C. int  D. double 3.以下关于运算符优先顺序的描述中正确的是:(C) A.关系运算符<算术运算符<赋值运算符<逻辑与运算符  

【学习ios之路:C语言】总结整理:学好Object-C---C语言必备知识点

一.基本数据类型.常量.变量.运算符 1.数据类型 int. short.char.long.float.double. 2.常量的分类.(1).整型常量 (2)浮点型常量 (3)字符常量 (4)字符串常量. 3.常量的特性:常量存储在常量区,常量区的内容不可被更改. 4.变量的定义与本质.数据类型 变量名 = 初值 . 本质变量就是一个容器. 5.变量名的命名规范 6.运算符. (1)赋值运算符 = (2)算数运算符 +  -  *  /  %  ++  -- (3)复合运算符  +=  -+

【学习ios之路:C语言】指针函数

指针函数int max(int a, int b); *   函数指针:指向一个函数的指针变量.' *   函数的类型:返回值类型+参数 *   函数指针变量类型: int (*)(int x, int y) *   指针变量的名字:max *   初始值:NULL *   max 可以指向一个返回值是int型并且有两个int型的参数的函数. 应用:学生结构体按照姓名,年龄,分数升序排序 1.函数的声明 typedef struct student{ char name[20]; int age

【学习ios之路:C语言】一维数组,数组排序,字符数组

1.数组 数组,快速定义多个变量. 数组定义: 数据类型 数组名[数组元素的个数] = {值1, 值2, 值 3}; 数组所占存储空间大小 = 数组元素个数 * 每个元素所占的存储空间大小. %lu  unsigned long 无符号的长整型. 无符号 >=0 sizeof 存储大小值  //用来计算一个变量,类型,以及数组所占存储空间的大小. int a[5] = { 2, 7, 4, 3, 6 };  printf("%lu\n", sizeof(arr)); //5 in

【学习ios之路:C语言】②高级指针应用

1.指针与字符数组 <span style="font-size:14px;"> /** 定义字符串的2种方式 * 1.利用数组 * char name[] = "itcast" * *特点:字符串里面的字符是可以修改的 * *使用场合:字符串的内容需要经常修改. * 2.利用指针 * char *name = "itcast"; * *特点:字符串其实是一个常量字符串,里面的字符是不能修改的; * *使用场合:字符串内容不需要修改,

【学习ios之路:C语言】存储区内存划分

一. 内存存储区的划分: 1.栈区:栈区主要存放函数内部定义的变量,数组.函数调用时,开辟空间,函数执行完毕,回收空间,空间的开辟与回收有系统管理. 2.堆区:堆区最大的特点:空间的开辟与释放有开发人员手动管理. 3.全局区静态区:主要存放函数外部定义的全局变量以及静态变量,空间一旦开辟,就不会回收.直到应用程序执行结束. 4.常量区:存储常量.1.整形常量.2.浮点型常量.3,字符串常量.4.字符串常量. 5.代码区:存放程序编译之后生成的cpu指令. 二.malloc,在堆区开辟空间. //

【学习ios之路:C语言】小程序:实现类似ATM取款机功能.

小程序:模拟ATM机取款的过程 1).定义两个能保存5个整形数的数组,一个用于保存5个人的卡号,一个用于保存对应卡号的密码 2).判断输入的卡号是否在数组中. 3).如果在数组中就让输入密码,判断是否和卡号对应的密码匹配. 4).判断密码,24小时内只允许输入3次错误的密码.输入错误应该提示还剩下的输入次数,3次都输入错误提示24小时内不允许操作该卡. 5).密码正确就让用户对该账户进行相应的操作. 6).注意取款的限制. 7).述功能对于一个ATM机是循环的过程,也就是说每个客户都会按照上面的

【学习ios之路:C语言】指针

指针 1.指针定义,即简单用法. <span style="font-size:14px;"> //指针变量:专门用来存储地址的变量. int *p = NULL;//NULL == 0 /** * 变量定义时: * (int *):指针类型 * p: 变量名 NULL:初始值. * NULL(指向了一个无效的区域) * *的作用: 告诉编译器,后面变量是指针变量,用来存储地址. * int作用: 1.当通过指针变量取数据时,一次性读取几个字节的数据. 2.当指针变量+1时

【学习ios之路:C语言】循环方面试题

1.打印出如下所示图形  : * *  * * * * 代码如下: for (int i = 0; i < 3; i++) { for (int j = 2; j > i; j--) { printf(" "); } for (int k = 0; k < i + 1; k++) { printf(" *"); } printf("\n"); } 2. 打印出如下图形: * *   * *  *  * *   * * 代码如下: