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;
}

 

posted @ 2015-03-27 10:06  我死在了编程的路上  阅读(262)  评论(0编辑  收藏  举报