//定义的符号名不能和关键字重合

#define _CRT_SECURE_NO_WARNINGS//忽略安全检测

#include <string.h>;

#include <stdio.h>;

#include <windows.h>//sleep 的头文件

#include <stdlib.h>//system的头文件


//int main()

//{

// int i = 0;

// char password[20] = { 0 };

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

// {

//  printf("请输入密码\n");

//  scanf("%s", password);

//  if (strcmp(password, "123456") == 0)//不能用==来判断两个数组是否相等 用一个库函数 strcmp

//  {

//   printf("登录成功\n");

//   break;

//  }

//  else

//  {

//   printf("密码错误\n");

//  }

//

//

// }

// if (i == 3)

// {

//  printf("三次密码错误,退出程序\n");

// }

//

// return 0;

//}




////演示多个字符从两端移动 向中间汇聚

//int main()

//{

// char arr1[] = "i love you";

// char arr2[] = "##########";

// int life = 0;

// int right = strlen(arr1) - 1;

// while (life <= right)

// {

//  arr2[life] = arr1[life];

//  arr2[right] = arr1[right];

//  printf("%s\n", arr2);

//  //休息1秒

//  Sleep(1000);

//  system("cls");//执行系统命令的一个函数 - cls 清空屏幕

//  life++;

//  right--;

// }

// printf("%s\n", arr2);

// return 0;

//}



//二分查找算法 从有序数组中查找指定元素

//int main()

//{

// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

// int k = 7;

// int se = sizeof(arr) / sizeof(arr[0]);//计算元素个数

// int life = 0;//左下标

// int right = se - 1;//右下标

//

// while (life <= right)//说明中间还有元素可以查找

// {

//  int mid = (life + right) / 2;

//  if (arr[mid] > k)

//  {

//   right = mid - 1;

//  }

//  else if (arr[mid] < k)

//  {

//   life = mid + 1;

//  }

//  else

//  {

//   printf("找到了,下标是%d", mid);

//   break;

//  }

// }

// if (life > right)

// {

//  printf("找不到\n");

// }

// return 0;

//}




//算1! + 2!.... + 3!

//int main()

//{

// int i = 0;

// int n = 0;

// int ret = 1;

// int sum = 0;

// for (n = 1; n <= 3; n++)

// {

//   ret = ret * n;

//  sum = sum + ret;

// }

// printf("sum=%d", sum);

// return 0;

//}


//算1!+2!....+3!

//int main()

//{

// int i = 0;

// int n = 0;

// int ret = 1;

// int sum = 0;

// for (n = 1; n<=3; n++)

// {

//  ret = 1;

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

//  {

//   ret = ret * i;

//  }

//  sum = sum + ret;

// }

// printf("sum=%d", sum);

// return 0;

//}




//算n的阶乘

//int main()

//{

// int i = 0;

// int n = 0;

// int ret = 1;

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

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

// {

//  ret = ret * i;

// }

// printf("ret=%d", ret);

// return 0;

//}


//int main()

//{

// int i = 1;

// do

// {

//  printf("%d\n",i);

//  i++;

// }

//

// while (i <= 10);

// return 0;

//}



//int main()

//{

// int x, y;

// for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)

// {

//  printf("hehe\n");

// }

// return 0;

//}

//  




//int main()

//{

// int i = 0;

// int j = 0;

// for (i=0; i< 10; i++)

// {

//  for(;j<10;j++)//i循环第一次的时候 j循环了十次 当i循环第二次时 j等于10为假不在循环

//  //for (j=0; j < 10; j++)//i的for循环每循环一次j的for循环就要循环10次

//  {

//   printf("hehe\n");

//  }

// }

// return 0;

//}




//用for循环打印1-10的数字

//int main()

//{        //第一       第二   第四

// for (int i = 0; i<= 10; i++)

// {

//  if (i == 5)

//  {

//   continue;

//  }//当i=5时跳过第三 执行第四 因此不会陷入死循环

//  printf("%d\n", i);//第三

// }

// return 0;

//}



//int main()

//{

// int ch = 0;

// while ((ch = getchar()) != EOF)

// {

//  if (ch < '0' || ch>'9')

//   continue;

//  putchar(ch);

// }

// return 0;

//}




//int main()

//{

// int i = 0;

// int ch = 0;

// char password[10] = { 0 };

// printf("请输入密码\n");

// scanf("%s", password);//输入密码值为123456(空格)abcd\n(回车) 这里按回车是为了让代码继续执行下去 这些值在输入缓冲区里等待读取

// //scanf读取了123456 这个字符串 输入缓冲区里还剩下 (空格)abcd\n  

// //(空格)abcd\n 被getchar读取走 \nabcd 不等于x 所以会打印 取消确认

// //这里需要将输入缓冲区的剩余字符读取走 让输入缓冲区清空 以准备下一次输入

// while (i=getchar()!='\n')//getchar获取字符 当获取的字符不等于\n时执行循环

// //当获取的字符等于\n时 结束循环 代表输入缓冲区已经清空

// {

//

// };

// printf("请确认密码 x/y\n");

// if (ch = getchar() == 'x')

//  printf("确认成功\n");

// else

//  printf("取消确认\n");

// return 0;

//}




//int main()

//{

// int ch = 0;

// //ctrl+z 会结束此循环

// while ((ch = getchar()) != EOF)//EOF  end of file 是文件结束标志 值为-1

// {

//  putchar(ch);

// }  

// //int ch = getchar();//getchar() 输入一个字符

// //putchar(ch);//输出一个字符

// //printf("%c", ch);

// return 0;

//}







//int main()

//{

// int i = 0;

// while (i <= 9)

// {

//  i++;//修改后的位置

//  if (i == 5)

//   continue;//结束本次循环 回到while重新开始执行

//  //当i=5时 结束本次循环 重回到while i仍然=5 继续跳出 回到while i的值仍然不变=5  

//  //陷入了死循环,所以应当把值的递增放到 continue 前面

//  printf("%d\n", i);

//  /*i++;*///修改前的位置  

// }

// return 0;

//}




//int main()

//{

// int i = 0;

// while (i <= 10)

// {

//  if (i == 5)

//   break;//break 跳出循环 不在执行

//  printf("%d\n", i);

//  i++;

// }

// return 0;

//}




//需求 打印1-10

//int main()

//{

// int i = 1;

// while (i <= 10)

// {

//  printf("%d\n", i);

//  i++;

// }

// return 0;

//}




//需求2 输入1-5 输出工作日 输入6-7 输出 休息日

//int main()

//{

// int day = 0;

// scanf("%d", &day);

// switch (day)

// {

// case 1:

// case 2:

// case 3:

// case 4:

// case 5:

//  printf("工作日\n ");

//  break;

// case 6:

// case 7:

//  printf("休息日\n ");

//  break;

// default:      //default 代表默认处理 当输入的情况不包含在case中时,则执行该函数

//            //一般用来提醒输入错误,default和case的顺序可以变动 不影响执行

//  printf("输入错误\n");

// }

// return 0;

//}




//需求1 输入1-7 输出对应星期

//int main()

//{

//double day = 0;此处报错,因为使用switch循环 数据类型只能是整形或字符,

//double=是双精度浮点型

//int day = 0;

//scanf("%d", &day);//scanf() 输入函数  

/*switch (day)*///switch 后面的表达式只能是整形或字符类型  day只能是(int 或char)

// {

// case 1://情况 当day=1

//  printf("星期一");

//  break;//break关键字 提前结束循环

// case 2://情况 当day=2时

//  printf("星期二");

//  break;//没有break关键字 会一直往后执行 直到遇到break才会跳出循环

// case 3://在case后面 允许有多个语句 可以不用{}起来

//  printf("星期三\n");

//  printf("运动\n");

//  printf("清理内务");

//  break;

// case 4://case 后面必须是整形常量表达式 1不能写成1.0 可以写成1+0 必须是常量 不能是变量

//  //比如写成 case n: 这种写法是错误的

//  printf("星期四");

//  break;

// case 5:

//  printf("星期五");

//  break;

// case 6:

//  printf("星期六");

//  break;

// case 7:

//  printf("星期七");

//  break;

// }

// /*if (1 == day)//输出星期一到星期天

//  printf("星期一");//这种写法太庞杂 用switch语句更简洁

// else if (2 == day)

//  printf("星期二");

// else if (3 == day)

//  printf("星期三");*/

// //.....

// return 0;

//}


//练习 打印1-100的奇数

//int main()

//{

/*int i = 1;

while (i <= 100)

{

 printf("%d ", i);

 i += 2;

}*/

//

/*while (i <= 100)

{

 if (i % 2 != 0)

 {

  printf("%d ", i);

 }

 i++;

}*/

/*return 0;

}*/



//代码写法的优劣

//int main()

//{

// int num = 4;

// if (5 == num)//这种写法可以避免把== 写成= 如果误写成=会报错

// {

//  printf("haha\n");

// }

//if (num = 5)

//{

// //printf("hehe\n");//= 是赋值 ==是判断是否相等

// ////这种写法容易出错

//}

/*return 0;

}*/




//分支结构之嵌套if-else 语句

//int main()

//{

// int results = 98;//results 结果

// int ranking = 2;//ranking 排名

// if (results > 90)

// {

//  if (ranking <= 3)

//  {

//   printf("%s\n", "吃大餐");

//  }

// }

// else

// {

//  printf("%s\n", "没有奖励");

// }

//

// return 0;

//}



//分支结构之多重if-else语句

//int main()

//{

// int age = 120;

// if (age < 18)

//  printf("未成年");

//  

// else

// {

//  if (age >= 18 && age <= 28)

//   printf("青年");

//  else if (age >= 28 && age <= 50)  

//   printf("壮年");

//  else if (age >= 50 && age <= 100)

//   printf("老年");

//  else

//   printf("神仙");

// }


// else if(18<=age<=28)这种写法是错误的,执行此条代码时 会先判断 18<=age 为假  

// 值为零,0<=28 所以会打印"青年"  

//else if (age >= 18 && age <= 28)//&&按位与 并且关系 一假即假

//  printf("青年");

//else if (age >= 28 && age <= 50)//如果 age大于等于28 且小于等于50  

// printf("壮年");

//else if (age >= 50 && age <= 100)

// printf("老年");

//else

// printf("神仙");


/*return  0;

}*/







//结构体

//常用赋值类型 char int float double....

//当需要定义一个复杂对象的时候,例如人(姓名,年龄,身高,性别....)

//书(书名,出版社,出版时间.....)

//需要用结构体创建出一种类型 用来对复杂对象赋值

//结构体    --->我们自己创建出来的一种类型


//创建一个结构体类型

//struct people//struct 结构体关键字

//{

// char name[20];//小明

// short height;//175

//};

//

//int main()

//{

// //利用结构体类型创建一个该类型的结构体变量

// struct people a = { "小明",175 };

// struct people* dp = &a;

// //第一种打印方法

// //printf("%s\n", dp->name);//->  结构体指针->成员

// //printf("%d\n", dp->height);

// ////利用指针变量打印出人的姓名和身高

// // 第二种

// //printf("%s", (*dp).name);//*dp 就是a地址,*解引用操作符 找到这个地址并对它操作

// //printf("%d", (*dp).height);//  . 结构体变量.成员名

// ////  .  操作符 一般用取成员,对于一个结构体,如果如果想得到结构体内部的成员变量,就需要

// ////结构体变量.成员变量名

// //第三种

// printf("姓名:%s\n", a.name);

// printf("身高:%dcm\n", a.height);

// //修改结构内部成员变量的方法

// a.height = 180;

// strcpy(a.name, "张三");//strcpy--string copy -字符串拷贝-属于库函数-string.h

// //strcpy有两个参数 第一个是拷贝到哪里去a.name  第二个是拷贝内容"张三"(拷贝什么)

// //name 不能直接修改 因为定义name的是一个字符串 (本质是一个地址)

// //凡是字符串 修改都得用strcpy

// printf("改名为:%s\n",a.name );

// printf("两年后:%dcm\n",a.height );

// return 0;

//}




//指针变量类型名举例

//int main()

//{

// char ch = 'w';//变量为字符类型

// char* pc = &ch;//当变量为字符类型,赋值的类型名也要随之改变,赋值指针变量的类型名也改变

// *pc = 's';

// printf("%c\n", ch);

// return 0;

//}

// 指针占位大小:指针是存储地址的,32位的电脑,每个空间的地址是用32位表示

// 所以指针变量占32个bit位 4个字节,64位的电脑,每个空间的地址使用64位表示(1个字节=8个bit位)

// 所以指针变量占64个bit位 8个字节

//int main()

//{

// float x = 3.1;

// float* y = &x;

// printf("%d\n", sizeof(y));//输出结果为8 因为我的电脑是64位。

// *y = 3.5;

// printf("%f\n", x);

// return 0;

//}

//double 类型的打印是 %lf  printf("%lf",变量)



//指针

//1个字节为一个空间单位,指针变量占4个字节(32位) 64位的占8个

//空间单位都有自己的地址

//int a=10; -->创建了一个变量叫a,a的空间里放了一个值是10  这个空间有自己的地址假如为 0010

//int* p=&a;-->创建了一个变量p,p的空间里放的a的地址0010

//*p=20  用*p找回a的地址 并将a空间内的值换为20

//总结 指针是个变量 这个变量是用来存放别的变量的地址的  *解引用操作符 使用解引用操作符,

// 通过指针变量找到被存放的变量并对它进行操作


//int main()

//{

// int  a = 10;

// int* p = &a;//&取地址符 将int给a申请的空间位置取出

// //有一种变量是用来存放地址的--指针变量     p(指针变量)的类型是int*(类型名*)

//  int* 的* 告诉我们这是一个指针变量

// // 定义指针变量的方法1:类型名*指针变量名

// //p里面存的是a的地址,将地址存入p 可以通过p 找到a

// //*p   *-解引用操作符 通过p找到a的位置 /间接引用操作符

// *p = 15;

// printf("%d\n", a);//打印结果为15 因为使用解引用操作符(*)通过指针变量p找到了a  

//     //并对a变量进行了重新赋值

// printf("%p\n", p);

// printf("%p\n", &a);//%d  打印地址  

// return 0;

//}





////函数

//int Max(int x, int y)

//{

// if (x > y)

//  return x;

// else

//  return y;

//}

////#define 定义宏

//#define MAX(x,y) (x>y?a:b)

//int main()

//{

// int a = 12;

// int b = 13;

// int max = Max(a, b);

// printf("max=%d\n", max);

// //宏的方式

// max = MAX(a, b);//(a>b?a:b)a大于b吗,如果为真,则输出a如果为假,则输出b

//  printf("max=%d\n", max);

// return 0;

//}





//static修饰函数

// 改变函数的链接属性,让函数只能在自己所在的源文件内部使用

// 外部链接属性--->内部链接属性

//申明外部函数extern//函数内需要申明数据类型;

//extern int Add(int, int);

//int main()

//{

// int a = 10;

// int b = 17;

// int sum = Add(a, b);

// printf("sum=%d", sum);

// return 0;

//}








//static 修饰全局变量

//改变了变量的作用域--让静态的全局变量只能在自己所在的源文件内部使用


//int main()

//{

// //extern-申明外部符号的

// extern int a;

// printf("%d", a);

// return 0;

//}



//void test()

//{

// static int a = 1;//static 修饰局部变量,使局部变量的生命周期变长

// a++;

// printf("%d\n", a);//打印结果为 2,3,4,5,6

//}


//void test()

//{

// int a = 1;//a为局部变量,作用域仅在变量所在局部范围

// a++;

// printf("a=%d\n", a);//打印结果为5个=2

//}

//int main()

//{

// int i = 0;

// while (i < 5)

// {

//  test();

//  i++;

// }

// return 0;

//}





//int main()//typedef 类型定义 又叫 类型重定义  

//{

// typedef unsigned int u_int;//用typedef 对unsigned int 重新定义名为 u_int

// unsigned int num = 10;//unsigned int 太长不好写,可以用typedef 进行类型重定义

// u_int num = 10;//与上行unsigned int num=10;含义相同

// return 0;

//}



//int main()

//{

// /*int a = 10;*/

// //int 定义的变量是有符号的

// //int 全称signed int 有符号数 signed被省略

// //unsigned  无符号数

// unsigned int a = 10;//a被定义为无符号数,无论赋值为正负,输出结果都为正数

// printf("%d", a);// 输出结果为10

//

// return 0;

//}




//int main()

//{

// register int a = 10;// 建议把变量放到寄存器里面

// return 0;

//}



//int main()

//{

// auto int a = 10;//a局部变量--自动变量  局部变量前有一个auto 但是被省略了

// return 0;

//}






//int Add(int x, int y)

//{

// int z = 0;

// z = x + y;

//

// return z;

//}

//int main()

//{

// int a = 12;

// int b = 13;

// int sum = Add(a, b);//()函数调用操作符

// printf("sum=%d\n", sum);

// return 0;

//}






//int main()//下标引用操作符

//{

// int arr[] = { 1,2,3,4,5,6 };

//            // 0 1 2 3 4 5

// arr[4];//[]下标引用操作符

// printf("arr元素中第四个元素为:%d\n", arr[4]);

// return 0;

//}




//条件操作符 又叫三目操作符

//exp1 ?exp2 :exp3  

//int main()

//{

// int a = 12;

// int b = 15;

// int max = 0;

// max = (a > b ? a : b);//a>b 为真吗?为真,则执行a,else执行b

// printf("max=%d", max);//输出结果为15

//  

// return 0;

//}




//int main()

//{

////逻辑操作符

////真  非0(一般用1表示)

////假   0

////&&  逻辑与 且命题的意思,一假即假

////|| 逻辑或  或命题的意思,一真即真

// int a = 1;

// int b = 2;

// int c = 0;

// int d = a && b;

// int e = a && c;

// int f = a || b;

// int g = a || c;

// printf("%d\n", g);//打印结果为1,表示真

// printf("%d\n", f);//打印结果为1,表示真

// printf("%d\n", e);//打印结果为0,表示假

// printf("%d\n", d);//打印结果为1,表示真

// return 0;

//}



//关系操作符

// >大于   <小于  >=大于等于    <=小于等于

// !=  用于测试不相等   ==用于测试相等

//  

//  

//  

//int main()

//{

// int a = (int)3.14;//double---int

// //3.14属于double类型数据,转换到int,可能丢失数据

// //用(类型) 强制类型转换  

//

// return 0;

//}



//int main()

//{

// int a = 10;

// //int b = a++;//后置++,先赋值,再使用,先把a的值赋给b,然后a的值再加1

// /*int b = ++a;*///前置++,先++,后赋值,a的值先加1,然后把a的值赋给b

// int b = a--;//后置--,先赋值,再使用,先把a的值赋给b,然后a的值再-1

// printf("%d,%d", a, b);//后置++,打印值为a=11,b=10。前置++,打印值为a=11,b=11  

// //后置--,打印值为a=9.b=10,前置--同前置++运算同理。

// return 0;

//}






//int main()

//{

// int a = 0;//4个字节,32个bit位只要是整数,内存中存储的都是二进制的补码

// int b = ~a;//~按位(二进制位)取反  

// printf("%d", b);//printf打印的是这个数的原码

// //00000000000000000000000000000000

// //11111111111111111111111111111111 按位取反后得到的是补码

// // 补码得到反码方法为补码-1

// // 反码为11111111111111111111111111111110

// // 反码得到原码的方法为符号位不变,其他位变反

// // 原码为10000000000000000000000000000001

// // 1表示-,所以原码表示-1

// //  

// //  

// //原码、反码、补码   (概念)

// //原码,也叫符号幅值表示,最左边的为(即最高位)是数的符号

// //+0的原码表示00000000000000000000000000000000    最左位为0 表示正

// //-0的原码表示10000000000000000000000000000000     最左位为1 表示负

// //反码,正整数的反码表示与原码相同,负整数的反码表示方法为将负数的原码除符号位(最左位)

// //以外的每位变反而得到

// //如+0的反码00000000000000000000000000000000

// //-0的反码    01111111111111111111111111111111

// //补码,正整数的补码与原码,反码相同,负整数的补码为反码+1

// //如-0的反码为10000000000000000000000000000000

//

//

// return 0;//返回值是-1

//}





//int main()

//

//{

// int num1 = 9;

// int arr[] = {1,2,3,4,5,6,7 ,9};

// printf("%d\n", sizeof(num1));//4

// printf("%d\n", sizeof(arr));//32

// printf("%d\n", sizeof(arr) / sizeof(arr[0]));//8  

//

//

//

// return 0;

//}

//  





//int Max(int x, int y)

//{

// if (x > y)

//  return x;

// else

//  return y;

//}

//int main()

//{

// int num1 = 15;

// int num2 = 25;

// int max = 0;

// max = Max(num1, num2);

// printf("max=%d\n", max);

// return 0;

//}

//  





//int main()

//{

// int num1 = 3;

// int num2 = 5;

// if (num1 > num2)

//  printf("%d", num1);

// else

//  printf("%d", num2);

//

//

//

//

// return 0;

// }

//  

//  




//int main()

//{

//

//}

//int main()

//{

// int arr[] = { 1,2,3,4,5,1,3,4 ,5};

// int i = 0;

// int sz = sizeof(arr) / sizeof(arr[0]);

// for (i = 0;i < sz;i++)

// {

//  int count = 0;

//  int j = 0;

//  for (j = 0;j < sz;j++)

//  {

//   if (arr[i] == arr[j])

//   {

//    count++;

//   }

//  }

//  if (count == 1)

//  {

//   printf("单身狗:%d", arr[i]);

//   break;

//  }

// }

// return 0;

//}






//int main()

//{

// int arr[] = { 1,2,3,4,5,1,2,3,4 };//找出单身狗

// int i = 0;

// int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数

//

// for (i = 0;i < sz;i++);

// {

//  //统计ARR【i】在arr数组中出现了几次

//  int count = 0;//计数器

//  int j = 0;

//  for (j = 0;j < sz;j++);

//  {

//   if (arr[i] == arr[j])

//   {

//    count++;

//   }

//  }

//  if (count == 1)

//  {

//   printf("单身狗:%d", arr[i]);

//   break;

//

//  }

// }

//

// return 0;

//}//错误代码





//int main()

//{

// int a = 3;

// int b = 5;

// printf("打印前%d,%d\n", a, b);

// a = a ^ b;

// //a 011  ^按位异或,相同为0, 相异为一  

// //b 101  a^b  110

// b = b ^ a;

// //b^a 011

// a = a ^ b;

// //a^b 101

// printf("打印后%d,%d\n", a, b);

// return 0;

//}




//int main()

//{

// int input = 0;

// printf("419的黄流益\n");

// printf("他是我儿子吗?(1/0)>:");

// scanf("%d", &input);

// if (input == 1)

//  printf("是的\n");

// else

//  printf("没错\n");

//

// return 0;

//

//}





//int main()

//{

// char arr1[] = "abc";

// char arr2[] = { 'a','b','c' };

// printf("%d\n", strlen(arr1));//strlen --string length-计算字符串长度的

// printf("%d\n", strlen(arr2));

//

//

//

//

//

// return 0;

//}




//int main()

//{

// int num1 = 0;

// int num2 = 0;

// int sum = 0;

// scanf("%d %d", &num1, &num2);

// sum = num1 + num2;

// printf("sum=%d\n", sum);

//

// return 0;

//}





//int main()

//{

// int a = 0;

//int b = 0;

//

// scanf_s("%d", &a);//vs 编译器认为scanf()不安全,它自己定义了一个scanf_s

// scanf_s("%d", &b);//这里用scanf()会报错解决方法这里写了两种

//printf("a+b=%d\n", a+b);

//  

//  

//

// return 0;

//

//

//}

//int main()

//{

//

// printf("%d\n", sizeof(char));

// printf("%d\n", sizeof(short));

// printf("%d\n", sizeof(int));

// printf("%d\n", sizeof(long));

// printf("%d\n", sizeof(long long));

// printf("%d\n", sizeof(float));

// printf("%d\n", sizeof(double));

//

// return 0;

//}




/*int num1 = 0;

int num2 = 0;

int sum = 0;

scanf("%d %d", &num1, &num2)


printf("sum=%d/n", sum)

return 0;*/



//i/*nt main(void)

//{

// printf("你好,c语言\n");

// return 0;

//}*/