#import "Fuction.h"

//#import <>: 引入系统头文件

//#import "": 引入自定义头文件

 

#import "ArrayOperation.h"

#import <Foundation/Foundation.h>

  //1.无返回值无参数

  //: a.没有返回值类型写void, void空类型

  //b.没有参数小括号不能省略

 

void buyBeer(){

    printf("没钱买不了!\n");

    

}

 

  //2.无返回值有参数

  //int money = 11

void buyBeer2(int money){

    printf("%d元被狗咬了钱被狗狗叼走了!\n", money);

}

 

  //3.有返回值无参数

  //有返回值使用return返回

 

int buyBeer3(){

    printf("都是自己人给什么钱啊一瓶啤酒算什么咱们兄弟谈钱伤感情!\n");

    return6;

    //printf("O(∩_∩)O~\n");

}

 

//4.有返回值有参数

int buyBeer4(int money, int count);//函数声明

int buyBeer4(int money, int count){

    int price = 3;

    printf("花了%d买了%d\n", price *count, count);

    return money - price * count;

}

int sumValue(int n);

int sumValue(int n){

    int sum = 0;

    for (int i = 1; i <= n; i++) {

        sum += i;

    }

    return  sum;

}

int middle(int a, int b, int c);

int middle(int a, int b, int c){

    //1.

    int mid = (a > b) ? ( b > c ? b : ( c > a ? a : c ) ) : ( a > c ? a : ( c > b ? b : c ) );

    //2.

//    int max = 0, min = 0;

//    //求最大值

//    //max = a > b ? (a > c ? a : c) : (b > c ? b : c);

//    if (a > b) {

//        if (a > c) {

//            max = a;

//            

//        } else {

//            max = c;

//        }

//    } else {

//        if (b > c) {

//            max = b;

//        } else {

//            max = b;

//            }

//        }

//

//    //求最小值

//    min = a < b ? (a < c ? a : c) : (b < c ? b : c);

//    

    //求中间值

    //return a + b + c - min - max;

    return  mid;

}

 

//求最大公约数gcd

int maxDiv(int a, int b){

    //辗转相除法

    int res = a % b;

    while (res != 0) {

        a = b;

        b = res;

        res = a % b;

    }

    return  b;

}

 

 

int dayOfYear(int year, int month, int day){

int a[12] = {312831303130313130313031};

    int sum = 0;

    if (year >= 0 && year <= 2016) {

        if (month >= 1 && month <= 12) {

            if (day > 0 && day <= a[month - 1]) {

                if (year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0)) {

                    a[1] = 29;

                }

                for (int i = 0; i < month - 1; i++) {

                    sum += a[i];

                }

            } else {

                printf("日期错误!");

            }

        } else {

            printf("日期错误!");

        }

    } else {

        printf("日期错误!");

    }

    return sum + day;

}

 

//全局变量

int t = 10;

 

void printHello();

 

void change(int m, int n){

    int temp;

    temp = m;

    m = n;

    n = temp;

    printf("a = %d b = %d",m, n);

}

 

 

 

 

int main(int argc, constchar * argv[]) {

    

   //函数具有特定功能的代码段

    

   //函数定义创建一个函数

   //格式

    /*

   返回值的数据类型函数名(数据类型参数名1, 数据类型2, 参数名2, ...)

    {

        函数体(执行的语句)

    }

    */

   //函数和函数之间是并列的关系函数不能嵌套定义

   //参数的数据类型相同数据类型也不能够省略

    

   //函数定义的形式

    //根据函数有无返回值和有无参数

    //1.无返回值无参数

    //2.无返回值有参数

    //3.有返回值无参数

    //4.有返回值有参数

    

    //函数调用执行函数体的代码

    //格式

    //函数名(参数1, 参数2, ...)

    

    //主调函数如果在函数A中调用了函数B, 函数A就称为函数B的主调函数

    //函数调用的过程先回到函数定义中执行函数体中的代码执行完后回到主调函数

    /*

    //1.无返回值无参数的调用

    //没有参数括号不能够省略

    buyBeer();

    

    //2.无返回值有参数的调用

    //有参数参数要写一个确切的值这个会拷贝到函数定义的参数中

    buyBeer2(100);

   

    //3.有返回值无参数的调用

    //定义变量来接收返回值

    int count = buyBeer3();

    printf("买了%d瓶酒\n", count);

    

    //4.有返回值有参数的调用

    int money = buyBeer4(100, 30);

    printf("还剩%d\n", money);

    

    //return的作用

    //1.return用于返回某个数值(有返回值的函数定义)

    //2.return终止当前函数的执行重新返回到主调函数

    

    //break作用

    //1.break跳出switch...case语句

    //2.在循环中使用跳出本层循环

    

    //continue作用

    //在循环中使用跳出本次循环加速循环的执行

    */

    /*

    //1、编写函数int sumValue(int n):计算1n的和。

//    int sum = sumValue(9);

    int n = 0, sum = 0;

    printf("Input n:");

    scanf("%d", &n);

    sum = sumValue(n);

    printf("sum = %d\n", sum);

   */

    //函数的好处

    //1.重复利用某些代码

    //2.具有良好的移植性

    

    //编写函数返回三个整数的中间数

    //printf("mid = %d\n", middle(3, 2, 4));

    

    //编写函数求两个数的最大公约数

    //printf("maxDiv = %d\n", maxDiv(8, 4));

    

    //2、编写函数dayOfYear(year, month, day),使得函数返回由这三个参数确定的那一天是一年中的第几天。

    

    //printf("这是今年的第%d", dayOfYear(2000, 3, 3));

    

    //一个严格的函数包含:

    //函数定义

    //函数调用

    //函数声明

    

    //函数声明对函数功能的说明不具有实质性的代码

    //格式

    //返回值的数据类型函数名(数据类型参数名1, 数据类型2, 参数名2, ...);

    

    //当函数定义在主调函数的下方时必须在主调函数上方写函数声明

    //printHello();

    

    //形参形式参数函数定义时的参数没有固定的值当函数调用时才能确定

    //实参实际参数函数调用时的参数有确定的值

//    int i = 10;

//    sumValue(i);//在函数调用时实参把值传递给形参

    

    //编写函数实现交换两个变量的值

//    int a = 10, b = 20;//错误!只是改变了函数里的m n

//    change(a, b);

  

    

    //局部变量定义在函数内部的变量从变量定义开始到下一个大括号结束

    //全局变量定义在函数外部的变量作用域从变量丁一开始到这个文件结束

    //尽量不使用全局变量全局变量不好管理

    

    

    if (YES) {

        int x = 10;

        x = 20;

    }

 

    

    //把函数定义在其他文件中

    //调用函数需要引入头文件

    printf(": %d\n"add(34));

    printf(": %d\n"sub(45));

    printf(": %d\n"mul(45));

    printf(": %.2f\n"divide(45));

    

    

    int array[5] = {13245};

//    for (int i = 0; i < 5; i++) {

//        printf("%d ", array[i]);

//    }

//    printf("\n");

    printArray(array, 5);

    sortArray(array, 5);

    printArray(array, 5);

    //写一个函数实现打印数组

    //数组作为函数参数