库函数
学会查看 英文文档
sizeof 返回的类型 为 size_t
memset();填充
char arr[] = "abcdefg";
memset(arr,'X',5);
//输出为 "XXXXXfg"
char arr[] = "abcdefg";
memset(arr+1,'X',5);
//输出为 "aXXXXXg"
注意:1.设置内存的时候是以字节为单位的
2.每个内容都是一样的。
自定义函数
先写怎么用,在写如何实现
自定义函数中存在 实际参数(实参)形式参数(形参)
可以用指针,建立两者的联系。
当自定义函数想改变实参时,则使用指针。
传值调用、传址调用
1. 写一个函数可以判断一个数是不是素数。
#include <stdio.h>
#include <math.h>
//判断一个数是不是素数
int is_prime(int i)
{
//2-sqrt(i)试除
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i < 200; i++)
{
if (is_prime(i) == 1)
{
printf("%d ", i);
}
}
}
TDD
测试驱动开发
先写函数怎么使用
写的函数 尽量 单一 !
练习2
int binary_search(int arr[], int k, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1; //找不到的情况
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k); //要查找的元素
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr,k,sz);
if (-1 == ret)
{
printf("找不到");
}
else
{
printf("找到了,下标是 %d\n",ret);
}
return 0;
}
函数可以嵌套调用,但不可嵌套定义。
函数:链式访问:把一个函数的返回值作为另外一个函数的参数
printf("len = %d\n",strlen("abcdef"));
printf("%d", printf("%d", printf("%d", 43)));
1 2 3
结果是啥?
是 4321
查表可得,printf 的返回值的是字符大小;
3 返回 43
2 返回 2 由于43,只有两个字符,所以返回2
1 返回 1 由于2,只有1个字符,所以返回1
如果想 分享函数代码 但又不愿意让人看见函数代码的内容。
则可以编译成静态库。
首先鼠标右击项目名称,点击属性
在常规的配置类型里面,选择静态库
在重新生成一边,便生成来lib文件。
使用的时候:
add.h 和 add.lib 。
add.lib 相当于隐藏内容的add.c文件
lib文件在工程中不用引入文件。
#pragma comment(lib,"add.h")
函数递归
程序调用自身的编程技巧。主要思想:大事化小。
一步一步递出去,在归回来
每次调用都会分配一个栈空间,结束后释放。
递归的两个必要条件
存在限制条件,当满足限制条件,递归不再继续。
每次递归后越来越接近限制条件
练习:不允许创建 临时变量 ,计算出字符串长度
数组传递给函数时, 传递的是地址。
#include "stdio.h"
int my_strlen(char* str)
{
if(*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
练习:求n的阶乘
//求 n的阶乘
int fac(int n)
{
if (n <= 1)
return 1;
else
return n * fac(n - 1);
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = fac(num);
printf("n的阶乘为: %d\n", ret);
}
练习:求斐波那契数列的 第n个数字
//求第n个斐波那契数
//递归 求第50个数字时,会消耗很长的时间。效率出现了问题。
//因为 每次递归都会全部计算一遍。
int fib(int n)
{
if (n <= 2)
return 1;
else
return (n - 2) + (n - 1);
}
// 当递归出现了明显的效率问题,就换非递归。
int fib_1(int n)
{
int a = 1;
int b = 1;
int c = 0;
if (1 == n || 2 == n)
{
return 1;
}
while(n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
练习,汉诺塔和青蛙跳梯子问题。