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