#include<stdio.h>

//函数的 !!!!!递归 !!!!!(一个函数自己调用函数)

//递归条件 :存在限制条件 ,当满足递归条件的时候递归不在进行;  每一次递归调用之后越来越接近限制条件 !!!!

 //最简单的递归函数

int main()
{
printf("hellow word\n");
main();//调用 main()函数

return 0;
//但是 这个递归函数是有问题的 其最后会出现 “0xC00000FD: Stack overflow" -叫 栈溢出!!!!!
//每次调用函数都会占用内存空间 的栈空间
//"stackoverflow.com" 的求解网站!!!!!(程序员的知乎)}

////打印无符号整形变量 (unsigned)的每一个值!!!!!!!!!!?
//
//void print(n)//因为不用返回其值给main()函数 所以使用 void 类型 2
//{
// if (n > 9)//证明是两位数!!!!!
//
// {
// print(n / 10);//递归调用函数 循环调用 1
// }
// printf("%d\n", n % 10); //其返回的是 (1)当中 的函数 后逻辑图见相册!!!!!
//}
//int main(){
//
// unsigned int num = 0;
// scanf_s("%d", &num);
// //递归
// print(num);
// return 0;
//}



////求字符串long度
//#include<string.h>
//int main()
//{
// char arr[] = "wdyks985";
// int len = strlen(arr);//strlen() -求字符串长度 到、0,但\0不算字符串长度 前面加#include<string.h>!!!!!!!!!!
// printf("%d\n", len);
// return 0;
//}

//编写程序 不允许!创建临时变量 求字符串long度(模拟实现函数 自己写一个函数求字符串长度)

//int my_strlen(char *str) //传过来的是 地址arr 赋给地址变量-str 返回的是一个整数(count) !!!!!
// //str 指的是第一个字符的地址
//// 用临时变量的 //{
// // int count = 0;
// // while(*str != '\0')
// // {
// // count++;
// // str++;//地址加一 向右移一位
// // }
// // return count;
// //}
////不用临时变量的
//{
// if(*str != '\0')
// {
// return 1 + my_strlen(str + 1);
// }
// else{
// return 0;
// }

//}


//int main()
//{
// char arr[] = "wdyks985";

// int len = my_strlen(arr);//数组传参 传过去的不是整个数组!!!!! 传过去的是第一个元素的地址!!!!!
// printf("%d\n", len);
// return 0;
//}


//!!!!!递归与迭代!!!!!
//迭代 重复的实行某个事情

//求n! 不考虑溢出


//int FAC1(int n) //循环方法
//{
// int sum = 1; //求阶层 要注意 不能让初始量=0;
// int i = 1;
// for (i = 1; i <= n; i++)
// {
// sum *= i;
// }
// return sum;
//}

//int FAC2(int n)//递归方法
//{
// if (n <= 1)
// {
// return 1;//n<=1;
// }
// else
// {
// return n*FAC2(n-1);//n*FAC2(n-1)
// }
//}

//int main()
//{
// int ret = 0;
// int n = 0;
// scanf_s("%d", &n);
// ret = FAC2(n);
// printf("%d\n", ret);

// return 0;
//}

//递归的溢出 :并不是满足两个限制条件就不会溢出 !!!!!




//!!!!!数组!!!!! “ 数组元素类型 数组名[一个常量表达式 用来指定数组大小];”

//一组相同类型元素的集合
//不完全创建时 其余元素为 “0” (字符数组:char a[]={'a','b','我'..} 等价于 a[]="ab我";)
//数组名 -就是首元素的地址 !!!!!!(除:sizeof(数组名)表示整个数组 其计算的是整个数组的大小 单位是字节!!!!!!
// :取地址数组名的时候 &数组名 取出的是整个数组的地址!!!!!

// sizeof(a); 与 strlen(a) 表示的意思 ;sizeof(a) 只关注 计算其所占空间的大小 n个元素*其类型的大小 (如char ~1) “\0"算一个空间大小 !!!!!
//计算变量数值类型的大小 单位是字节 -还是库函数 -使用的引用头文件
// strlen(a) 求字符串长度 找到 "\0"则停止 并且\0不算字符串长度 (只能求字符串的长度 !!!!!)
//是一个 -操作符-
//上面二者没有关联 !!!!!

//一维数组在内存当中的存储 数组在内存当中是连续存放的 (低地址-》高地址)
//int main()
//{
// int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// int sz = sizeof(a) / sizeof(a[0]);
// int i = 0;
// for (i = 1; i <= sz; i++)
// {
// printf("&a[%d]=%p\n",i,&a[i]);//取其各个元素的地址 ; 打印地址 “%p"!!!!! -每一位相邻元素相差 4 因为每一个元素都是整形 并且 一个整形是4个字节
// }
// return 0;
//}

//二维数组 int a[行][列]; 类似于一个表格 int a[][]={} 一行放满后会自然而然放到下一行当中去 !!!!!
//二维数组当中必须不能省略 列 的数目!!!!!!!! (行可以省略) //int a[][]={{第一行},{第二行},{。。。}
//二维数组 行 与 列 的下标仍然是从 0 开始的
//int main()
//{
// int a[3][4] = { { 1,2,3 }, { 4,5,6 } };//记得数组元素之间要加 “,”!!!!!
// //1230
// //4560
// //0000
// int i, j = 0;
//
// for (i = 0; i < 3; i++)
// {
// for (j = 0; j <4; j++)
// {
// printf("%d",a[i][j]);//打印的是一行的元素
// }
// printf("\n");
// }
// return 0;
//}
////二维数组的存储
//int main()
//{
// int a[3][4] = { { 1,2,3 }, { 4,5,6 } };
//
// int i, j = 0;
//
// for (i = 0; i < 3; i++)
// {
// for (j = 0; j <4; j++)
// {
// printf("&a[%d][%d]=%p",i,j,&a[i][j]); //打印地址
// //二维数组当中 是连续的 把每一行当做一维数组!!!!!
// }
// printf("\n");
// }
// return 0;
//}



//定义 冒泡排序函数 bubble_sort();
// 两两相邻的元素进行比较 看要求交换顺序
//定义一个数组 {9,8,7,6,5,4,3,2,1,0}改为升序

void bubble_sort(int a[],int sz)//排完序就可以了 不要反回类型
{
//确定几次 n个元素 n-1次
int i = 0;
for (i = 0; i < sz; i++)
{
int flag = 1;//假设这一次的数组已经是升序的了

//每一次冒泡排序
int j = 0;
for (j = 0; j <sz-1-i ; j++)//确定一次比较几趟
{
if (a[j] >a[j + 1])//因为要是升序的 所以比较前一个元素与后一个元素的大小
{
int temp = a[j];//如满足则交换顺序 !!!!!
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 0;//本次排序的数据不完全有序
}
}
if (flag == 1)
{
break;
}
}
}

int main()
{
int a[] = { 9, 8, 7, 6, 0, 1, 2, 3, 4, 5 };
int sz = sizeof(a)/ sizeof(a[0]);
bubble_sort(a,sz);//实际上传过去的是a首元素的地址 所以 sz也要传递过去 !!!!!
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",a[i]);

}
return 0;
}