#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//函数可以嵌套调用,不能嵌套定义
//函数里面不能再定义一个函数
错误案列
//int main()
//{
// int Add(int x int y)
// {
// x + y;
// int OOX(int x int y)
// }
//
// return 0;
//}
//链式访问
//int main()
//{
// int len = strlen("abcdef");
// printf("%d\n", len);//6
//
// //链式访问
// printf("%d\n", strlen("abcdef"));//6
// // 返回1 返回2 43
// printf("%d",printf("%d",printf("%d",43))); //4321
// //最后一个打印43,printf是一个返回值,43是两个字符
//}
//函数不写返回值类型的时候,默认类型是int
//错误写法
//没有返回值
//int Add(int x, int y)
//{
// printf("hehe\n");//打印5 hehe\n 5个字符
//}
//
// //没有定理类型
//Add(int x, int y)
//{
// return x + y;
//}
//上面代码再一些编译器上返回的是函数在执行过程中最后一图指令执行的结果
//
//int main()
//{
// int a = 10;
// int b = 20;
// int c=Add(a,b);
// printf("%d", c);
// return 0;
//}
//明确说明main函数不要参数
//int main(void)
//{
// return 0;
//}
//如果把函数放在下面的话
//要进行函数的声明
//int Add(int x,int y)//声明函数
//
//int main()
//{
// int a = 10;
// int b = 20;
// scanf("%d %d", &a, &b);
// int sum = Add(a, b);
// printf("%d", sum);
//}
//
//int Add(int x, int y)
//{
// return 0;
//}
//模块化编程 公司经常这样
//add.c add.h sub.c sub.h
//#include"add.h" ///函数声明的效果 相当于//int Add(int x,int y);
//#include"sub.h"
//
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int sum = Add(a, b);
// printf("%d\n", sum);
// int ret = sub(a, b);
// printf("%d\n", sum);
//
// }
//可以了解一些
//导入静态库
//可以把这个add.c和add.h 右键属性进行设置为lib
//卖给其他人的时候,使用静态库
//#pragma comment(lib,"add.lib")
//函数递归()///存在限制条件,每次递归之后越来越接近条欧锦
//接受一个整型值(无符号)按照顺序打印它的每一位
//例如
//1234 ---1 2 3 4
//%d打印有符号的整数(会有正负数)
//%u打印无符号的整数
//void print(unsigned int n)
//{
// if (n > 9)//递归条件
// {
// print(n / 10);//1234 这里又调用了print函数 调用完之后再执行下面打印
// }
// printf("%d ", n % 10);
//
//}
//
//int main()
//{
// unsigned int num = 0;
// scanf("%u", &num);//1234
// //1234
// print(num);
//
// return 0;
//}
//实参是地址,形参应该用指针变量接收
//打印字符数量strlen
//递归 先递再归
#include<string.h>
//第一种写法
//int my_strlen(char str[]) //参数部分写出数组的形式 无区别
//int my_strlen(char* str)//参数部分写出指针的形式
//{
// int count = 0;//j计数,临时变量
// while (*str != '\0')//条件是没到最后一个字符
// {
// count++;///计数
// str++;//找下一个字符
// }
// return count;
//}
//第二种写法 //不使用临时变量
//
//my_strlen("abc");
//1 + my_strlen("bc");
//1 + 1 + my_strlen("c");
//1+1+1+0
//int my_strlen(char* str)
//{
// if (*str != '\0')
//
// return 1 + my_strlen(str+1);
// else
// return 0;
//}
//
//
//int main()
//{
// char arr[] = "abc";
// int len = my_strlen(arr);
// printf("%d\n", len);
// return 0;
//}
//n的阶乘 (用递归的方式)
//int fac(int n)
//{
// if (n <= 1)
// return 1;
// else
// return n * fac(n - 1);
//}
//n的阶乘 (用迭代(循环)的方式)--非递归
//int fac(int n)
//{
// int i = 0;
// int ret = 1;
// for (i = 0; i < n; i++)
// {
// ret *= i;
// }
// return ret;
//}
//int main()
//{
// int a = 0;
// scanf("%d", &a);
// int ret = fac(n);
// printf("%d\n", ret);
// retur n 0;
//}
//求第n个斐波那契数
//把前面两个数加起来
// 1 1 2 3 5 8 13
//递归的方式
//int Fib( int n)
//{
// if (n <= 2)
// return 1;
// else
// return Fib(n - 1) + Fib(n - 2);
//}
//
//int main()
//{
// int n = 0;
// int ret = Fib(n);
// printf("%d\n", ret);
// return 0;
//}
//
//
非递归(效率快 比较好用)
//
//
//
//int Fib(int n)
//{
// int a = 1;
// int b = 1;
// int c = 0;
// while (n >= 3)
// {
// c = a + b;
// a = b;
// b = c;
// n--;
// }
//}
//
//
//int main()
//{
// int n = 0;
// int ret = Fib(n);
// printf("%d\n", ret);
// return 0;
//}