您的位置:首页 > 编程语言 > C语言/C++

前期C语言回顾 函数

2014-11-12 14:27 134 查看
// 函数

// 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语言允许函数实现体内再次调用函数本身。这种调用方式称为递归调用,这个函数称为递归函数

// 在计算机中阶乘就可以使用递归调用

// 注意:递归一定要有出口

// 变量的作用域

// 变量分为两种:全局变量、局部变量

// 全局变量(外部变量):文件作用域,从变量被声明的点开始一直到所在文件的末尾

// 局部变量:块作用域,从变量被声明的点开始一直到第一个大括号的结尾处

// 定义在函数外面的都称为全局变量,作用域很大

// 局部变量就是定义在函数大括号内部的变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: