// 函数
// printf()输出函数,用于输出一个信息
printf("输出函数\n");
// scanf()输入函数,用于从键盘输入一个信息
int a = 0;
scanf("%d", &a);
// strlen()求字符串长度函数,用于求出指定字符串的长度
unsigned long strLength = strlen("I Love You");
printf("strLength = %lu\n", strLength);
// strcpy()字符串拷贝函数,用于实现字符串的赋值
char str1[] = "I Like iOS";
char str2[] = "";
strcpy(str2, str1);
printf("str2 = %s\n", str2);
// 以上总结:
// 这些都是函数,都实现了某一特定的功能,并且这些函数都是系统提供了,我们除了使用系统提供的函数之外,我们也可以使用自定义的函数
// 那么,什么是函数呢? 答:函数是具有某段功能的代码片段
// 通俗的讲:我们把一连串得语句放在一起,实现了某一个功能,然后我们给这些代码起一个名字。之后我们想使用这段代码的时候直接使用他们的名字
// 使用函数,可以省去大量的重复代码,大大简化程序,提高我们的开发效率
// 函数的分类
// 从函数的定义上来区分,函数可以分为两类函数
// 库函数:系统提供的函数,例如:printf() / scanf() / strlen() ...
// 自定义函数:开发者自己写的函数
// 库函数我们直接拿过来使用就可以了,那么,我们如何自己写函数???呢
// 函数的一般形式
// 返回值类型 函数名(形式参数列表)
// {
// 执行语句;
// return 返回值;
// }
// 返回值类型: 函数可以有一个返回值,也可以没有,函数处理完之后,返回给你一个信息,你可以接收后使用,这个数据是函数给我们的
// 函数名: 我们可以写很多的函数,如何区别出这些函数,我们就可以给函数命不同的名字,使用函数名找到函数
// 形式参数列表: 让函数处理一些数据,我们使用参数的方式传递给函数,这里的数据是我们给函数的
// 执行语句: 函数拿到数据后,进行处理,主要是函数的内部实现语句
// return 返回值: 函数处理好数据之后,需要把结果返回。!注意:这里的返回值类型,需要与上面标注的返回值类型一致
// 函数如果细致分的话可以分为4种:
// 1. 无返回值无参数
// 2. 无返回值有参数
// 3. 有返回值无参数
// 4. 有返回值有参数
// 例如:
// 无返回值,无函数(功能:打印Hello World !)
void hello1()
{
printf("Hello World !");
}
// 无返回值,有参数(功能:输出参数内容)
void hello2(char str[])
{
printf("%s", str);
}
// 有返回值,无参数(功能:返回圆周率π的值)
float PI()
{
return 3.1415925;
}
// 有返回值,有参数(功能:计算两个参数的和并返回)
int sum(int a, int b)
{
return a + b;
}
// 再来解释下什么是返回值:
// 函数的返回值称为函数的值,只能通过return语句返回给主调函数
// 注意:一个函数只能有一个返回值
// 如果一个函数没有返回值,也可以使用return语句来结束函数的执行,return后面的代码不再执行。回到主调函数
// 写好了函数,下面开始使用函数了,也就是函数的调用。想一下,库函数是如何使用的?
printf("形式参数列表");
// 上面的代码是调用了系统提供的输出函数,直接是函数名+小括号+传递的数据+小括号+分号
// 我们自己写的函数调用方式也是一样的
hello1();
hello2("形式参数列表");
// 当代码执行到函数的调用的时候,就会去执行函数内部的代码,当函数内部执行完毕之后,再回来继续执行函数下面的代码
// 我们成功的调用了函数,那么,我们就给函数一些数据,让函数帮助我们处理数据,How do?
// 提到了参数,其实是分为两种的:
// 1. 实参(实际参数):出现在函数调用中的表达式
// 2. 形参(形式参数):出现在函数定义中,以假名字来表示函数调用时需要提供的值
// 注意:在函数调用中,形参会拷贝实参内容,传递参数是给函数传送信息的一种方式
// 概念基本都介绍完了,下面是练习部分
// 1、编写函数int sumValue(int n):计算1到n的和。
int sumValue(int n)
{
int result = 0;
for (int i = 0; i < n; i++) {
result += i;
}
return result;
}
// 2、编写函数dayOfYear(year, mouth,day),使得函数返回由这三个参数确定的那一天是一年中的第几天。
int dayOfYear(int year, int month, int day)
{
int result = 0;
//1 2 3 4 5 6 7 8 9 10 11 12
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
BOOL isBissextile = (year % 400 == 0) || (year % 4 == 0 && year % 1 != 0);
days[1] = isBissextile ? 29 : 28;
for (int i = 0; i < month - 1; i++) {
result += days[i];
}
result += day;
return result;
}
// 3. 编写函数,返回三个数的中间数
int midValue(int a, int b, int c)
{
int maxValue = (a > b ? a : b) > c ? (a > b ? a : b) : c;
int minValue = (a < b ? a : b) < c ? (a < b ? a : b) : c;
printf("maxValue = %d\n", maxValue);
printf("minValue = %d\n", minValue);
return a + b + c - maxValue - minValue;
}
// Implicit declaration of function'midValue' is invalid in C99
// 暗示的 宣布、宣告、声明 函数 无效的
// 函数是需要声明的???
// 严格意义上来讲,函数通常包含3部分:函数声明、函数定义、以及函数的调用
// 函数声明:指的就是函数的描述,也叫函数原型
// 函数声明的位置:
// 1. 函数定义放在主函数的上面,不需要函数的声明
// 2. 函数定义放在主函数的下面,需要函数的声明
// 注意:函数声明虽然可以省略,但是在规范上来讲,函数的声明尽量加上
// 重点!!!!
// 函数声明的文件和位置:
// 我们把函数的声明和定义分别放在不同的文件中
// xxx.h:头文件: 存放函数的声明部分
// xxx.m:实现文件: 存放函数的定义部分
// 注意:需要在xxx.m文件中
// 数组作为函数参数
// 如果是数组元素作为参数:与普通变量一样
// 如果是数组作为参数,把数组名传入,即数组的首地址
// 注意,此时,形参和实参实际上是同一个变量,是同一段内存
// 函数的嵌套调用
// C语言不允许函数嵌套定义,但是允许函数嵌套调用
// 注意:避免出现函数的嵌套定义
// 练习3:求N个数的最大值
int aaa[] = {12, 43, 32, 5, 23};
printf("\nMaxValue = %d", maxValue(aaa, 5));
// 练习3,求N个数的最大值
int maxValue(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;
}
}
}
return arr[0];
}
// 练习4
// 计算 s = (1*1)!+(2*2)! + (3*3)!
// 练习4,求一个数的阶乘
int square(int a)
{
return a * a;
}
int factorial(int a)
{
int result = 1;
for (int i = 1; i <= a; i++) {
result *= i;
}
return result;
}
// 函数的递归调用(了解即可)
// C语言允许函数实现体内再次调用函数本身。这种调用方式称为递归调用,这个函数称为递归函数
// 在计算机中阶乘就可以使用递归调用
// 注意:递归一定要有出口
// 变量的作用域
// 变量分为两种:全局变量、局部变量
// 全局变量(外部变量):文件作用域,从变量被声明的点开始一直到所在文件的末尾
// 局部变量:块作用域,从变量被声明的点开始一直到第一个大括号的结尾处
// 定义在函数外面的都称为全局变量,作用域很大
// 局部变量就是定义在函数大括号内部的变量