函数定义: 返回值类型 函数名(形参列表){函数体(函数的实现内容)};
函数定义的四种形式:
//函数定义第一种形式: 无参数, 无返回值
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;
}