目录
1 函数
定义:大型程序代码中的一部分,具有相对独立性,可以封装
分类:库函数和自定义函数
库函数可以在网站中学习:Reference - C++ Reference
例如:
strcpy:字符串复制(在复制时,\0也会被复制)
memset:内存设置
2 函数的调用
传值调用----值
传址调用----地址
(见习题3函数形式)
3 函数的嵌套调用和链式访问
3.1 链式访问
下例可以合并:
int len = strlen("abc");
printf("%d\n", len);
如下:
printf("%d\n", strlen("abc"));
典型的链式访问例子:
printf("%d", printf("%d", printf("%d", 43)));
结果:4321
原因:第一个printf肯定打印43,然后printf的返回值是字符的个数
4 函数的声明和定义
1)在使用前,需要告诉主函数,有这么个函数。函数叫什么,参数是什么,返回类型是什么。
int add(int,int);//函数声明
int a=add(a,b);
int add(int x,int y){}//函数定义
2)通常将函数放在主函数之前,可以不用单独定义。
3)函数的声明一般放在头文.h中。函数的定义一般放在.c文件中。
5 导入静态库
#include "sub.h"
#pragma comment ( lib, "sub.lib")//双引号中内容是现有的文件
6 函数递归
函数直接或间接调用自己
6.1 主要思考方式
把大化小
举例1:
把输入的1234,按顺序在屏幕上打印出“1”、“2”、“3”、“4”
#include<stdio.h>
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d\t",n % 10);
}
int main()
{
unsigned int num = 0;
scanf_s("%u", &num);//1234
//递归自己调用自己
print(num);
return 0;
}
6.2 递归必要条件
1.有条件的情况下递归,否则会死循环。
2.每次递归调用后会越来越靠近限制条件。
6.3 调用递归时会出现的问题
栈溢出
注意:除了必要条件,递归条件不能太深。
分享一个网站:Stack Overflow - Where Developers Learn, Share, & Build Careers (相当于一个程序员的知乎)
举例2:
模拟实现一个strlen函数
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "bit";
//模拟实现一个strlen函数
printf("%d\n", my_strlen(arr));
return 0;
}
改一下:不允许创建临时变量,也就是不允许创建count。
int my_strlen(char* str)
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
return 0;
}
int main()
{
char arr[] = "bit";
//模拟实现一个strlen函数
printf("%d\n", my_strlen(arr));
return 0;
}
建议不要用++。
6.4 递归与迭代
举例1:求n的阶乘
int f(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * f(n - 1);
}
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int i = 0;
int ret = f(n);
printf("%d", ret);
return 0;
}
根据公式来写递归。
举例2:(递归)
求第n个斐波那阶数(不考虑溢出,也就是超出整型范围,数值不对)
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = fib(n);
printf("%d", ret);
return 0;
}
当输入50的时候,没有立即出现结果是因为效率太低。重复算某一次的次数太多。
改一下:(迭代---循环)
int fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n>2)
{
c = a + b;
b = c;
a = b;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
注意:递归和迭代看情况使用。
一些经典问题:
汉诺塔
青蛙跳台阶
7 注意
7.1 快捷键
F11----逐语句
F10---逐过程
7.2 一些错误
在写if语句的时候,末尾千万不要加分号!!!这样会导致if语句变成了一句单独的语句,并且编译的时候没有逻辑上的错误,但是此时{}里面的内容不起作用,而出现错误!!!