目录
一 分类
库函数
常见的库函数有:
IO函数
字符串操作函数
内存操作函数
时间函数
数学函数
其他库函数
我们不需要将所有的库函数都记住,没必要也不现实,我们要学会在需要时查找并学习使用库函数。推荐一个学习库函数的网站:www.cplusplus.com
这里举两个学习使用的例子:
1 strcpy
首先,要使用库函数,必须要包含对应的#include头文件。strcpy就在头文件string.h中。
例子:
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[] = "brilliantalone";
char ch2[20] = { '0' };
strcpy(ch2, ch1);
printf("%s", ch2);
return 0;
}
2memset
这里value的数据类型是int,但是可以输入字符,因为根据ASC码表每一个字符都对应着一个整数。
例子:
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[] = "brilliantalone";
memset(ch1, 'd', 6);
printf("%s", ch1);
return 0;
}
自定义函数
总有一些问题是库函数不能解决的,需要我们自定义函数。
和库函数一样,自定义函数也需要返回类型,函数名和参数。
函数的结构
返回类型 函数名 (参数,参数...)
{
函数语句;
}
例子:
计算字符串中字符的个数
#include <stdio.h>
#include <string.h>
int count(char* ch)
{
int i = 0;
int k = 0;
for (i = 0;i < strlen(ch);i++)
{
if (ch[i] != '\n')
k++;
}
return k;
}
int main()
{
char ch1[] = "brilliantalone";
int x = count(ch1);
printf("%d", x);
return 0;
}
二 函数的参数
实际参数(实参)
函数调用时,真实传给函数的参数是实参,实参可以是常量,变量,表达式或函数等,但都必须是一个确定的值,以便把这些值传给形参。
形式参数(形参)
形式参数是函数括号后的变量,因为只有在函数被调用时才实例化(分配内存空间),所以叫形式参数。形式参数在函数调用结束后就被销毁,所以形式参数只在函数内起作用。
三 函数的调用
传值调用
将实参的值传给形参。
形参只是实参的一份临时拷贝,所以改变形参的值不改变实参的值。
传址调用
将函数外部变量的内存地址传给形参。
传址调用可以让函数与函数外的变量建立实际的联系,所以函数内部可以直接操作外部变量。
例子:
交换两个数字
因为传值调用,函数只是把x的值赋给a,把y的值赋给b,再对ab的值进行交换,在函数调用结束后ab被销毁,所以x和y的值并没有改变。
传址调用通过指针直接改变实参。
四 函数的嵌套调用和链式访问
嵌套调用:
#include <stdio.h>
void new_line()
{
printf("brilliantalone\n");
}
void three_line()
{
int i = 0;
for (i = 0; i < 3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
函数可以嵌套调用,但是不可以嵌套定义。
链式访问:
#include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int x = 10;
int y = 20;
int z = 30;
int n = max(z, max(x, y));
printf("%d", n);
return 0;
}
五 函数的声明和定义
函数的声明:
函数的声明要在使用前,先声明后使用。
一般函数声明在头文件中。(不少书中为了使用函数声明,在主函数前声明函数,将函数定义放在主函数后面,个人认为这种代码正常人不会写,只是为了使用而使用。)
函数的定义:
函数的定义是指函数的具体实现,交代函数的具体功能实现。
应用:
函数的分文件编写:
第一步:在头文件放置函数的声明
第二步:在源文件中放置函数的定义
第三步:在项目中引用头文件#include"e.h"使用
六 函数递归
函数递归是什么
递归是在一个过程中或函数定义说明中直接或间接调用自身的一种算法,可以将复杂问题逐个分解为多个相似的问题解决,可以大大减少代码量,但是代码未必高效,如果运算量过大还会造成程序崩溃,栈溢出的问题。
递归的两个必要条件
1存在限制条件,在满足这个条件后,递归不再执行;
2在每一次递归调用后,都越来越接近限制条件
例子:
1 接受一个整型值(无符号),按照顺序打印它的每一位。
#include <stdio.h>
int evenum(int n)
{
if (n > 9)
{
evenum(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
evenum(n);
return 0;
}
2 编写函数不允许创建临时变量,求字符串的长度。
#include <stdio.h>
int count(char* str)
{
if (*str != '\0')
return 1 + count(str + 1);
else
return 0;
}
int main()
{
char ch[] = "brilliantalone";
int n = count(ch);
printf("%d", n);
return 0;
}
3 求n的阶乘
int factorial(int n)
{
if(n <= 1)
return 1;
else
return n * factorial(n-1);
}
4 求第n个斐波那契数
#include <stdio.h>
int fib(int n)
{
if (n < 3)
return 1;
else
return fib(n - 1) + fib(n - 2);
}