note_9


#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//***写一个函数 每一次调用 num增加1

一,不行

void add(int n)

{

n++;

}

int main()

{

int num = 0;

add(num);

printf("%d\n", num);

add(num);//传址不会加

printf("%d\n", num);

return 0;

}

void add(int* p)

{

*p = *p + 1;

}

int main()

{

int num = 0;

add(&num);

printf("%d\n", num);

add(&num);//传址不会加

printf("%d\n", num);

return 0;

}

三,啰嗦

int add(int n)

{

n++;

return n;

// return n++;

//后置++不行先返回后++

//++n,可以

}

int main()

{

int num = 0;

num = add(num);

printf("%d\n", num);

num = add(num);//传址不会加

printf("%d\n", num);

return 0;

}

//函数返回类型

//void - 无返回

//char int float

void test1()

{

return;//可以用

printf("hehe\n");

}

int main()

{

return 0;

}

//***函数的嵌套调用和链式访问

void new_line()

{

printf("hehe\n");

}

void three_line()

{

int i = 0;

for (i= 0; i < 3; i++)

{

new_line();

}

}

//不能嵌套定义

void test1()

{

void test2()

{

}

}//错误

//***链式访问

//一个函数函数值作为另一个函数的参数

#include<string.h>

int main()

{

int len = strlen("abc");

printf("%d\n", len);

printf("%d\n", strlen("abc"));

//结果相同

return 0;

}

//例

int main()

{

printf("%d", printf("%d", printf("%d", 43)));

//结果43 2 1

//printf---return value(返回值)字符打印的个数

return 0;

}

//***函数的声明和定义

//函数声明一般放在头文件.h中

//#include "add.h"

//在公司写代码不会把所有代码放在.c文件

//而是分模块写

int Add(int x, int y);//函数声明

int main()

{

int a = 10;

int b = 20;

int ret = Add(a, b);

printf("%d\n", ret);

return 0;

}

int Add(int x, int y)//函数定义

{

int z = x + y;

return z;

}

//***函数递归

1.递归必须有限制条件

2.每次递归n接近限制条件

//函数自己调用自己就是递归

//大规模问题转化为小问题

int main()

{

printf("hehe\n");

main();//递归但是死递归

return 0;

}//错误栈溢出

练习

接受一个无符号整型数 按顺序打印

1234

1 2 3 4

Print(1234)

Print(123) 4

Print(12) 3

Print(1) 2

void Print(unsigned int n)

{

if (n > 9)//没有if就会一直递归

{

Print(n / 10);//接近限制条件

}

printf("%d ", n % 10);

}

int main()

{

unsigned int num = 0;

scanf("%u", &num);//1234

Print(num);

return 0;

}

***不允许创建临时变量,求字符长度

int main()

{

//求字符串长度

char arr[] = "abc";

int len = strlen(arr);

printf("%d\n", len);

return 0;

}

//模拟实现strlen

int my_strlen(char*s)

{

int count = 0;

while (*s != '\0')

{

count++;

s++;//s(char)+1就是b的地址

}

return count;

}

int main()

{

//求字符串长度

char arr[] = "abc";

//arr是数组名,数组名是数组首元素地址

int len = my_strlen(arr);//char*的地址

printf("%d\n", len);

return 0;

}

//不用临时变量

int my_strlen(char*s)

{

if (*s == "\0")

return 0;

else

return 1 + my_strlen(s + 1);

}

int main()

{

//求字符串长度

char arr[] = "abc";

//arr是数组名,数组名是数组首元素地址

int len = my_strlen(arr);//char*的地址

printf("%d\n", len);

return 0;

}

***迭代

求n的阶乘

f(n) = n * f(n-1)

int main()

{

int n = 0;

int ret = 0;

scanf("%d", &n);

//循环产生1-n的数字

int i = 0;

for (i = 1; i <= n; i++)

{

ret = ret * i;

}

printf("ret = %d\n", ret);

return 0;

}

//二

int fac(int n)

{

if (n <= 1)

{

return 1;

}

else

{

return n * fac(n - 1);

}

}

int main()

{

int n = 0;

scanf("%d\n", &n);

int ret = fac(n);

printf("%d\n", ret);

return 0;

}

第n给斐波那契数

前两个数之和=第三个数

fib(n) = 1 n<=2

fib(n) = fib(n-1) + fib(n-2)

//效率低

int fib(int n)

{

if (n <= 2)

{

return 1;

}

else

{

return fib(n - 1) + fib(n - 2);

}

}

int main()

{

int n = 0;

scanf("%d", &n);

int ret = fib(n);

printf("%d", ret);

}

//优化

int fib(int n)

{

int a = 1;

int b = 1;

int c = 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", ret);

}

上一篇:《汇编语言》chapter3 note


下一篇:POJ 3254 状压DP