iOS开发之c语言基础Lesson-06 函数 上课笔记及练习试题

  ////////////Lesson 06 函数 随堂笔记  //////////////////

 

//函数功能: 将复杂的逻辑进行拆分,实现代码的模块化管理,每一个函数用来实现它特定的功能

//函数定义: 返回值类型  函数名(形参列表){ 函数体(函数实现的功能)}

//形参 : 函数定义时,指定的参数列表,叫着形参,一个一个的变量, 只有当函数调用时,才能确定形参的值

//实参 : 函数调用时指定的参数列表,叫着实参,指定的是确切的值

//命名规范 :

//1.函数名, 变量名,数组名: 驼峰命名法---有多个英文单词组成,除第一个单词的首字母小写以外,其他单词的首字母全部为大写。

 

/*

 函数使用三部分:

 1.函数的声明:告诉外界文件中有哪些函数。---存放到.h文件中

 2.函数的实现:对应函数的定义,所有声明的函数必须实现。----存放到.m文件中

 3.函数的调用:定义了函数,必须要调用;让函数执行对应的任务。

 */

//函数调用格式:  函数名(实参列表);

//数组作为函数参数, 接收时,需要数组以及元素个数。

//如果在一个文件中,想使用在其他文件中声明的函数,只需要使用#import导入对应的.h文件即可。

 

 

//局部变量:在函数的内部定义的变量或者数组叫做局部变量, 函数调用时开辟空间,函数执行完毕,空间回收,只可在函数内部使用。

//全局变量:在函数外部定义的变量或者数组叫做全局变量,程序运行时开辟空间,程序结束时空间回收,全局可以访问。全局变量很危险,慎用。

//静态变量:被static关键字修饰的变量称为静态变量

//(1)如果静态变量不赋初值,默认为0;

//(2)静态变量,只会初始化一次,程序运行开辟空间,程序结束回收空间

 

//函数定义第一种形式:无参数, 无返回值



void sayHello(){



    printf("Hello\n");



    return; //如果函数没有返回值, 也可以使用return, 直接使用return



}



//函数定义第二种形式: 无参数,有返回值



int getMoney(){



    return 100;  //return的功能:1.将该函数的值,返回给主调函数 2.提前结束函数的执行,return后面的代码是不会执行的,所有代码放到return之后,是不会被执行的



    //printf("执行不到哦~~");



}



 



//第三种, 有参数, 无返回值



void sayHello2(char * who){



    printf("%s: Hello", who);



}



//第四种, 有参数, 有返回值



 



int maxTT(int a, int b){



    return a > b ? a : b;



}



 



//四个个数最大值



int maxFour(int a, int b ,int c, int d){



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



    return maxTT(maxTT(maxTT(a, b), c), d); //调用函数maxTT



}



 
//求5!。

int factorial(int n) {

    return n >= 2 ? n * factorial(n - 1) : n;

}



//计算 s = (1*1)!+(2*2)! + (3*3)!



int sum(int n) {

    return n >=1 ? factorial(pow(n, 2)) + sum(n - 1) : n;

}



//给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和。

//输入描述:

//测试数据有多组,以文件结尾。每行输入a,n(1<=a,n<=1000000)。

//输出描述:

//由于结果可能比较大,所以请输出答案mod 1000000007。

int addSum(int a, int n){

    int sum  = 0, s = 0;

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

        s += a * pow(10, i - 1); //是i减一

        sum += s;

        sum = sum % 1000000007;

    }

    return sum;

}

main.m文件

 

    //    //最大公约数

    //    printf("gcd = %d \n",gcd(18, 12));

    //    //最小公倍数

    //    printf("gbd = %d \n", lcm(13, 18));

    //    //三个数的中间值

    //    printf("三个数的中间值= %d \n", center(5, 9, 8));

    

    //

    //    int a[10] = {0}; //定义一个数组

    //    initArr(a, 10);  //初始化数组

    //    print(a, 10);   //打印原始数组

    //    sortArr(a, 10);  //升序排序

    //    printf("\n");

    //    print(a, 10);    //打印排序后的数

    //

    //    printf("\n");

    //    int b[5] = {0};

    //    initArr(b, 5);

    //    print(b, 5);

    //    sortArr(b, 5);

    //    printf("\n");

    //    print(b, 5);

    //       printf("\n");

 

    //作业

    //1. 写一个函数, 获取数组中的最大值

    int a[10] = {0};

    for (int i = 0; i < 10; i++) {

        a[i] = arc4random() % 100;

        printf("%d ", a[i]);

    }

    printf("\n");

    printf("Max = %d \n",arrMax(a, 10));

    //2. 。。。。最小值

      printf("Min = %d \n",arrMin(a, 10));

    //3. ........第二大值

      printf("secondMax = %d \n",arrSecond(a, 10));

    //4.一维浮点型数组的冒泡排序函数

    float  fArr[5] = {4.4, 5.6, 6.4, 3.5, 9.5};

    sortArrFloat(fArr, 5);

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

        printf("%.2f ", fArr[i]);

    }

    printf("\n");

    //5.1 定义一个结构体变量(包括年、月、日),计算该日在本年中为第 几 天?(注意考虑闰年问题),要求写一个函数 days,实现上面的计算。由主 函数将年月日传递给 days 函数,计算后将日子传递回主函数输出。

    typedef  struct Date{

        int year;

        int month;

        int day;

    }Date;

    Date datetime = {2004, 03, 30};

    printf("%d.%d.%d是一年中的第 %d 天 \n",datetime.year, datetime.month, datetime.day, days(datetime.year, datetime.month, datetime.day));

    //5.2某班有 5 个学生,三门课。分别编写 3 个函数实现以下要求:

    //(1) 求各门课的平均分;

    //(2) 找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;

    //(3) 找出三门课平均成绩在 85-90 分的学生,并输出其学号和姓名

    Student students[5] = {

        {201501, "Ashen", 98, 58, 49},

        {201502, "Ying", 89, 78, 90},

        {201503, "Tom", 87, 89, 88},

        {201504, "Jack", 50, 46, 58},

        {201505, "Rose", 100,100,99}

    };

    avg(students, 5);

    printf("\n");

    fail(students, 5);

    printf("\n");

    threeAvg(students, 5);

    //6 写一个函数,求数组中所有元素的和

    //7 ....偶数和,

    //8  ....奇数和

    //9 输出图案

    //  *

    // * *

    //* * *

    printUpTower(3);

    //10.输出图案

    //  *

    // * *

    //* * *

    // * *

    //  *

    printUpDownTower(9);

    

    //11.耶稣

    int man[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,10 ,11, 12, 13};

    printf("叛徒的序号是: %d ",findTraitor(man));

Function.h文件

/*

 函数使用三部分:

 1.函数的声明:告诉外界文件中有哪些函数。---存放到.h文件中

 2.函数的实现:对应函数的定义,所有声明的函数必须实现。----存放到.m文件中

 3.函数的调用:定义了函数,必须要调用;让函数执行对应的任务。

 */













//求两个数的和

int sum(int a, int b);

//两个数的商

float con(int a, int b);

//两个数的最大公约数

int gcd(int a, int b);

//两个数的最小公倍数

int lcm(int a ,int b);

//三个数的中间值

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



//给数组初始化

void initArr(int *a, int n); //*a可以换成 a[];

//对数组升序排序

void sortArr(int *a, int n);

//打印数组元素

void print(int * a, int n);





















































///////////////////作业练习////////////////////

//1. 写一个函数, 获取数组中的最大值

int arrMax(int a[], int n);

//2. 。。。。最小值

int arrMin(int a[], int n);

//3. ........第二大值

int arrSecond(int a[], int n);

//4一维浮点型数组的冒泡排序函数,

void sortArrFloat(float a[], int n);

//5 .1  (**)定义一个结构体变量(包括年、月、日),计算该日在本年中为第几 天?(注意考虑闰年问题),要求写一个函数 days,实现上面的计算。由主 函数将年月日传递给 days 函数,计算后将日子传递回主函数输出。

int days(int year, int month, int day);



//5.2某班有 5 个学生,三门课。分别编写 3 个函数实现以下要求:

//(1) 求各门课的平均分;

//(2) 找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;

//(3) 找出三门课平均成绩在 85-90 分的学生,并输出其学号和姓名

typedef struct Student{

    int num;//学号

    char name[20];//姓名

    float engScore;//英语成绩

    float mathScore;//数学成绩

    float chinScore;//语文成绩

}Student;



void avg(Student stu[], int n); //每门课的平均分

void fail(Student stu[], int n);

void threeAvg(Student stu[], int n);

//

//6 写一个函数,求数组中所有元素的和

//7 ....偶数和,

//8  ....奇数和



//9 输出图案

//  *

// * *

//* * *

void printUpTower(int n);

//10.输出图案

//  *

// * *

//* * *

// * *

//  *

void printUpDownTower(int n);

//11.耶稣

int findTraitor(int a[]);

Function.m文件

//两个数的和

int sum(int a, int b){

    return a + b;

}

//两个数的商

float con(int a, int b){

    return  b == 0 ? b : a / b * 1.0;

}

//两个数的最大公约数

int gcd(int a ,int b){

    //    int r = a % b;

    //    while(r != 0){

    //        a = b;

    //        b = r;

    //        r = a % b;

    //    }

    return b == 0 ? a : gcd(b, a % b);

}

//最小公倍数

int lcm(int a ,int b){

    return (a * b)/ gcd(a, b);

}

//三个数的中间值

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

    int max = a > b ? a : b;

    max = c > max ? c : max;

    int min = a < b ? a : b;

    min = c < min ? c : min;

    return a + b + c - max - min;

}



//给数组初始化

void initArr(int *a, int n) {  //*a 可以换成 a[];

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

        a[i] = arc4random() % (40 - 10 + 1) + 10;

    }

}

//对数组升序排序

void sortArr(int *a, int n) {

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

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

            if (a[j] > a[j + 1]) {

                int temp = a[j];

                a[j] = a[j + 1];

                a[j + 1] = temp;

            }

        }

    }

}

void print(int *a, int n) {

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

        printf("%d ", a[i]);

    }

}

//////////////////////

///////////////////作业练习////////////////////

//1. 写一个函数, 获取数组中的最大值

int arrMax(int a[], int n){

    int max = 0;

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

        if(a[i] > max){

            max = a[i];

        }

    }

    return max;

}

//2. 。。。。最小值

int arrMin(int a[], int n){

    int min = a[0];

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

        if(a[i] < min){

            min = a[i];

        }

    }

    return min;

}

//3. ........第二大值

int arrSecond(int a[], int n){

    int max = 0;

    int secondMax = 0;

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

        if(a[i] > max){

            secondMax = max;

            max = a[i];

        }else if(a[i] < max && secondMax < a[i]){

            secondMax = a[i];

        }

    }

    return secondMax;

}





//4一维浮点型数组的冒泡排序函数,升序

void sortArrFloat(float a[], int n){

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

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

            if (a[j] > a[j + 1]) {

                float temp = a[j];

                a[j] = a[j + 1];

                a[j + 1] = temp;

            }

        }

    }

}





//5 .1  (**)定义一个结构体变量(包括年、月、日),计算该日在本年中为第几 天?(注意考虑闰年问题),要求写一个函数 days,实现上面的计算。由主 函数将年月日传递给 days 函数,计算后将日子传递回主函数输出。

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

    int isLeap = 29;

    isLeap = ((year % 4 == 0)&&(year % 100 != 0))||(year % 400 == 0) ? 29 : 28;

    int mon[12] = {31, isLeap, 31, 30, 31, 30, 31, 31, 30 ,31, 30 ,31};

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

        day += mon[i];

    }

    return day;

}



//5.2某班有 5 个学生,三门课。分别编写 3 个函数实现以下要求:

//(1) 求各门课的平均分;

//(2) 找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;

//(3) 找出三门课平均成绩在 85-90 分的学生,并输出其学号和姓名

void avg(Student stu[], int n){

    float sumChine = 0.00;

    float sumMath = 0.00;

    float sumEng = 0.00;

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

        sumChine = sumChine + stu[i].chinScore;

        sumMath = sumMath + stu[i].mathScore;

        sumEng = sumEng + stu[i].engScore;

    }

    printf("语文平均分:%.2f, 数学平均分:%.2f,英语平均分:%.2f", sumChine /5.0, sumMath / 5.0, sumEng / 5.0);

}

void fail(Student stu[], int n){

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

        bool isChin = NO, isEng = NO, isMath = NO;

        int failNum = 0;

        stu[i].chinScore < 60 ? isChin = YES, failNum++ : isChin;

        stu[i].engScore < 60 ?  isEng = YES, failNum++ : isEng;

        stu[i].mathScore < 60 ? isMath = YES, failNum++ : isMath;

        

        if(failNum >= 2){

            printf("学号:%d 有 %d 门不及格 \n", stu[i].num, failNum);

            if (isChin) {

                 printf("语文:%.2f ",stu[i].chinScore);

            }

            if (isEng) {

                printf("英语:%.2f ",stu[i].engScore);

            }

            if (isMath) {

                printf("数学:%.2f ",stu[i].mathScore);

            }

            printf("\n");

        }

    }

}

void threeAvg(Student stu[], int n){

    

    float sum = 0;

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

        sum = stu[i].mathScore + stu[i].engScore + stu[i].chinScore;

        float avg = sum / 3.0;

        if (avg > 85 && avg < 90) {

            printf("学号:%d,姓名:%s, avg = %.2f\n", stu[i].num, stu[i].name, avg);

        }

        sum = 0;

    }

}

//

//6 写一个函数,求数组中所有元素的和

//7 ....偶数和,

//8  ....奇数和



//9 输出图案

//  *

// * *

//* * *

void printUpTower(int n){

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

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

            printf(" ");

        }

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

            printf("* ");

        }

        printf("\n");

    }

}

//10.输出图案

//  *

// * *

//* * *

// * *

//  *

void printUpDownTower(int n){

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

        if (i <= n / 2) {

            for (int j = 0; j < n / 2 - i + 1; j++) {

                printf(" ");

            }

            for (int k = 0; k < i; k++) {

                printf("* ");

            }

        }else{

            for (int j = 0; j < i - n/2 - 1; j++) {

                printf(" ");

            }

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

                printf("* ");

            }

        }

        printf("\n");

    }

}

//11.耶稣

int findTraitor(int a[]){

    

    int personNum = 13;  //13人数

    int call = 0;        //记录报数

    int i = 0;

    while (personNum > 1) {

        if (a[i] != 0) {   //a[i] 不等于0 ,说明此人,还没有报过3

            call++;

        }

        if (call == 3) {   //报到3的

            a[i] = 0;      //将报到3的人的状态,变成0

            call = 0;

            personNum--;   //人数减1

        }

        i++;   //i++必须放到 i==13 之前

        if (i == 13) {

            i = 0;

        }

        

    }

    int traitor = 0;

    

    for (int i = 0; i < 13; i++) {

        if (a[i] != 0) {

            traitor = i + 1;

        }

    }

    return traitor;

}

 

你可能感兴趣的:(ios开发)