//定义的符号名不能和关键字重合
#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;
//}*/