//C++语法篇 - D01
//Day1 - 顺序结构
 1. 基本框架
    (1) 头文件: #include<bits/stdc++.h>//万能头,可以只写这个
    (2) 命名空间
    (3) 主函数: 有且只有一个
 2. 数据类型
    (1) 整型
    ①int : 整型 范围:-21亿~21亿 -231~231-1
    ②long long : 长长整型 范围:-1018~1018 左右
    (2) 浮点型
    ①float : 单精度浮点型 (基本不用)
    ②double : 双精度浮点型 (小数就用这个)
    (3) 字符型
    ①char : 定义单个字符
    字符 : 字母,数字,符号等,用 '单引号' 包起来的 '单个' 符号
    ②ASCII码
    'A'-65 'a'-97 '0'-48 '空格'-32
    (4) 字符串类型 string
    ①头文件 #include<string>
    ②计算长度 s.size(); s.length();
    ③输入字符串
    a) cin >> s;(不带空格)
    b) getline(cin,s); (带空格)
    ④比较大: 字典序(从小到大)
    比较方法: 按位数一个个比较过去,直到第一个不相同,谁大就谁大
    "123" < "2" "121" > "12"
 3. 输入输出
    (1) 输入
    ①单个变量或字符串: cin >> 变量名;
    ②数组: 循环输入
    (2) 输出
    ①cout << endl;
    ②printf: 格式化输出
    a) 小数: printf("%.2f"变量名); 保留两位小数
    b) 右对齐-空格: printf("%5d", 123);
    c) 右对齐-补0: printf("%05d", 123);
 4. 条件分支语句
    (1) 单分支语句; 如果 条件 成立, 执行语句
    if(条件){
    语句;
    }
    (2) 双分支语句: 如果 条件 成立,执行语句1; 否则语句2
    if(条件){
    语句1;
    } else{
    语句2;
    }
    (3)三目运算符: 条件?语句1; 语句2
    如果 条件 成立, 执行语句1; 否则语句2
    例如:
    int day =10;
    day == 10? cout << "老师真帅":cout<<"张斌真帅";
(4)多分支语句
if(){
} else if(){
} else if(){
} else{
}
 5. 循环
    (1)for(初始值;条件;变化量){
    循环体
    }
    初始值 -> 条件 -> 循环体 -> 变化量 -> ...
    for(int i = 1;i <= 10; i++){
    cout<<"老师真帅! ! ! "<< endl;
    }
(2) while循环
while(条件){
循环语句;
}
int day = 10;
while (day == 10){
cout << "老师真帅" <<endl;
}
(3)do-while: 相比while循环,如果条件不成立,至少执行一次
do{
cout << "老师真帅" <<endl;
} while(0);
 6.  数组
     (1) 定义: 变量类型 数组名[数组空间]; //数组空间=n的最大值+5~10
     (2) 遍历范围: 0~n-1 或者 1-n => 注意循环范围
 7.  数位分离
     (1)分离各位
     int n=12345;
     while (n){
     cout << n % 10;
     n/=10;
     }
     (2) 求和
     int n = 12345,s = 0;
     while (n){
     s+=n%10;
     n/=10;
     }
 8.  函数
     (1)函数声明 - 省略
     (2)函数定义
     函数类型 函数名(函数类型 变量名1, 变量类型 变量名2,...){
     函数内容;
     }
     函数类型 - 返回(int/double/string...) 无返回(void)
     (3)函数调用
     函数名(变量名1,变量2,...) => 注意: 类型需要一一对应
 9.  sort
     (1) 头文件: algorithm
     (2) 模板:sort(数组名+开始下标,数组名+结束下标+1,排序方式);
     (3) 升序:从小到大 sort(a,a+n);
     (4) 降序:从大到小
     bool cmp(int x,int y){
     return x > y;
     }
     sort(a,a+n,cmp);
 10. 结构体
     struct 结构体类型名{
     变量类型 变量名1;
     变量类型 变量名2;
     变量类型 变量名3;
     } 结构体变量名/数组;
     //结构体类型 结构体变量名;
     例如:
     struct student{
     string name;
     int id;
     int cls;
     int age;
     }a[105],b,c;
     //等同于 student a[105],b,c => 类似于 int a[105],b,c;
 11. 结构体排序
     /*
     题目:学生语文,数学,英语成绩,总分,输入顺序是学号
     (1) 根据成绩从大到小
     (2) 如果成绩相同,语文成绩从大到小
     (3) 如果语文成绩相同,学号从小到大
     */
     struct student{
     int yw,sx,yy,sum,id;
     }a[305];
     bool cmp(student x,student y){
     //1. 如果成绩不相同,成绩从大到小
     if(x.sum != y.sum) return x.sum > y.sum;
     //2. 否则(成绩相同)如果语文成绩不同,语文成绩从大到小
     else if(x.yw != y.yw) return x.yw > y.yw;
     //3. 否则(语文成绩相同),根据学号从小到大
     else return x.id < y.id;
     }
     int main(){
     int n;
     cin>>n;
     for(int i = 1;i <= n; i++){
     cin>>a[i].yw >> a[i].sw >> a[i].yy;
     a[i].id = i;
     a[i].sum =a[i].yw + a[i].sw + a[i].yy;
     }
     sort(a+1,a+n+1,cmp);
     }