IOS开发OC基础知识(六) 循环形式

250 阅读17分钟

Switch循环

/*
 if格式:
 if (条件表达式) {
    语句;
 }

switch格式:
 switch (条件表达式) {
    case 整数: // case可以有一个或多个
        语句;
        break;
    case 整数: // case可以有一个或多个
         语句;
         break;
    default:
        语句;
        break;
 }

 1.拿到条件表达式的返回值(注意返回值必须是整型)
 2.利用条件表达式的返回值和switch后面大括号中的每一个case进行比较, 判断条件表达式的返回值和case后面的整数是否相等   条件表达式 == 整数
 3.如果条件表达式的返回值等于某一个case后面的整数, 那么就会执行该case后面的语句
 4.执行完语句之后如果遇到break就会结束整个switch语句, 也就是说后面的所有语句都不会被执行
 5.如果前面的case不满足, 也就是前面的case的整数和条件表达式的返回值不相等就会继续判断后面的case
 6.如果前面所有的case都不满足, 就会执行default后面的语句

 if (条件表达式)  {

 }else if(条件表达式)  {

 }else {

 }
 */

int main(int argc, const char * argv[]) {
    int age = 6;
    /*
     结束switch语句:
     1.遇到break
     2.执行到switch对应的大括号的结束 }
     */
    switch (age) {
        case 3: // 3 == 6
            printf("该上幼儿园了\n");
            break; // break的作用就是用于结束switch语句
        case 6: // 6 == 6
            printf("该上小学了\n");
            // 没有写break
            // 注意: 如果switch中有一个case满足了条件, 那么其它所有的case和default都会失效
        case 12: // 12 == 18
            printf("该上中学了\n");
        default:
            printf("该上高中了\n");
            break; // 某些情况下default后面的break可以省略, 因为default后面就是}
    }

Switch注意点

/*
    // 1.Switch得条件表达式注意点
    // Switch的条件表达式必须是返回整数的表达式, 也就是说()中只能放整数
    // 或者写能够转换为整数的类型也可以, 例如char, 因为char类型可以转换为int类型, 所以写char也可以
    switch ('A') {
        case 6:
            printf("6");
            break;
        case 8:
            printf("8");
            break;
        default:
            printf("other");
            break;
    }
     */

    /*
    // 2.case的取值
    // Switch中, case后面只能放返回值是整数的表达式或者整数, 或者能够转换为整数的类型
    // case的取值不能重复
    // case后面不能放变量, 因为系统在编译的时候会对Switch后面所有的case进行优化, 会根据case后面的常量值, 生成一张取值表
    int number = 7;
    switch (6) {
        case 3 + 3:
            printf("6");
            break;
        case 'A':
            printf("8");
            break;
//        case number:
//            printf("8");
//            break;
        default:
            printf("other");
            break;
    }
     */
     
    // default的位置问题
    // Switch中的default可以随便放
    // 无聊default写到什么地方, 它都会最后执行(只有前面所有的case都不满足的情况才会执行)
    // 只要某一个case满足, 那么后面所有的case和default都会失效
    // 同理: 只要default满足, 那么所有的case都会失效
    switch (20) {
        default:
            printf("other\n");
//            break;
        case 6:
            printf("6");
            break;
        case 8:
            printf("8");
            break;
    }

Switch练习

// 要求用户输入一个数, 如果用户输入的数大于100, 那么就输出牛逼
    // 1.提示用户输入一个整数
    printf("请输入一个整数, 以回车结束\n");
    // 2.定义变量保持用户输入的分数
    int number = -1;
    // 3.接收用户输入的值
    scanf("%i", &number);
    // 4.根据用户输入的值输出结果
    /*

    if (number > 100) {
        printf("NX");
    }
     */

    /*
    switch (number) {
        case 101:
            printf("NX");
            break;
        default:
            break;
    }
     */

    /*
     什么时候用switch, 什么时候用if
     在开发中一般情况下用if, if比较灵活
     如果说是对一些固定的值进行判断, 并且这些值得数量不多的情况, 可以使用switch
     从理论上来说, switch的性能效率比if高
     */
    return 0;
}

void test()
{
    /*
     要求用户输入一个分数,根据输入的分数输出对应的等级
     A 90~100 // 90/10 = 9 99/10 = 9 98/10 = 9   9|10 == A
     B 80~89 // 8
     C 70~79 // 7
     D 60~69 // 6
     E 0~59 //
     */

    // 1.第一种实现方式 if
    // 1.提示用户输入一个分数
    printf("请输入一个0~100的分数, 以回车结束\n");
    // 2.定义变量保持用户输入的分数
    int score = -1;
    // 3.接收用户输入的值
    scanf("%i", &score);
    // 4.根据用户输入的值输出对应的结果
    /*

     if (score >= 90 && score <= 100) {
         printf("A\n");
     }else if (score >= 80 && score <= 89)  {
         printf("B\n");
     }else if (score >= 70 && score <= 79) {
         printf("C\n");
     }else if (score >= 60 && score <= 69) {
         printf("D\n");
     }else {
         printf("E\n");
     }
     */

    /*
     if (score < 0 || score > 100) {
         printf("youtube\n");
     }else if (score >= 90 && score <= 100) { // 70
         printf("A\n");
     }else if (score >= 80) {
         printf("B\n");
     }else if (score >= 70) {
         printf("C\n");
     }else if (score >= 60)  {
         printf("D\n");
     }else  {
         printf("E\n");
     }
     */

    /*
     // 2.第二种实现方式 switch
     switch (score/10) {
     case 10:
     //            printf("A\n");
     //            break;
     case 9:
         printf("A\n");
         break;
     case 8:
         printf("B\n");
         break;
     case 7:
         printf("C\n");
         break;
     case 6:
         printf("D\n");
     default:
         printf("E\n");
         break;
     }
     /*

    // 从键盘输入一个月份,输出对应季节 12~2 冬季 3~5 春季 6~ 8 夏季 9~11 秋季(用switch)
    printf("请输入一个1~12的月份, 以回车结束\n");
    int number = -1;
    scanf("%i", &number);
    switch (number) {
        case 12:
        case 1:
        case 2:
            printf("冬季");
            break;
        case 3:
        case 4:
        case 5:
            printf("春季");
            break;
        case 6:
        case 7:
        case 8:
            printf("夏季");
            break;
        case 9:
        case 10:
        case 11:
            printf("秋季");
            break;
        default:
            printf("USB\n");
            break;
    }
     */
    // 做一个计算器
    // 1.提示用户输入一个值
    printf("请输入第一个数\n");
    // 2.定义变量接收用户输入的值
    int number1 = -1;
    // 3.接收用户输入的值
    scanf("%i", &number1);// 10 \n
    char temp;
    scanf("%c", &temp);
//    getchar(); // 专门用来获取字符, 会从输入缓冲区中获取字符
    // 4.提示用户输入一个操作符号
    printf("请输入你要进行的运算符 + - * / \n");
    // 5.定义变量接收用户输入的操作符号
    char op;
    // 6.接收用户输入的操作符号
    scanf("%c", &op); // 会有问题
    // 7.提示用户再输入一个值
    printf("请输入第二个数\n");
    // 8.定义变量接收用户输入的值
    int number2 = -1;
    // 9.接收用户输入的值
    scanf("%i", &number2);
    // 10.根据用户的输入计算结果

    // 10.1判断用户输入的到底是什么操作符, 然后进行对应的计算
    int result = -1;
    switch (op) {
        case '+':
            result = number1 + number2;
            break;
        case '-':
            result = number1 - number2;
            break;
        case '*':
            result = number1 * number2;
            break;
        case '/':
            result = number1 / number2;
            break;
        default:
            break;
    }
    // 11.输出结果
    printf("result = %i\n", result);

while循环


/*
 if (条件表达式)
 {
    语句;
    ...
 }
 if是对给定的条件进行判断, 如果条件满足, 就执行if后面大括号中的内容
 
 while (条件表达式)
 {
     语句;
     ...
 }
 while是对给定的条件进行判断, 如果条件满足, 就执行while后面大括号中的内容, 执行完毕之后会再次判断条件表达式, 如果满足会再次执行while后面大括号中的内容, 直到条件表达式不满足位置
 术语: while后面大括号中的内容, 称之为 循环体
 
 while的应用场景: 当我们需要反复的执行某一段代码的时候就可以使用while
 */

int main(int argc, const char * argv[]) {
    /*
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    printf("发射子弹\n");
    */

    // 0.先将while的格式写好
    // 1.找到需要重复执行的代码, 将需要重复执行的代码放到循环体中
    // 2.确定结束条件(确定条件表达式)
    int count = 100;
    while (count > 0) {
        printf("发射子弹 %i\n", count);
//        count = count - 1;
//        count -= 1;
        count--;
    }
    // 注意点: 和if一样, 如果条件表达式一开始就不满足, 那么循环体就不会被执行

while练习1

// 提示用户输入一个正整数n, 计算1 + 2 + 3 + ...n的和
    // 1.写代码之前应该先分析需求, 分析完需求再开始写代码
    // 2.一般情况下, 在做企业级开发时, 不会直接实现复杂的功能, 而且先实现一个简化的功能
    /*
       1 + 2 + 3 + 4 + 5
   0 + 1
(0 + 1)1 + 2
    (1 + 2)3 + 3
        (3 + 3)6 + 4
            (6 + 4)10 + 5
     规律 : 每一次都是用上一次的和加上一个数, 而且加上的这个数是一个递增的数

     */
    /*
    // 1.定义变量保存上一次的和
    int sum = 0;
    // 2.定义变量保存递增的数
    int count = 1;
     */
    /*
    // 3.计算
    //    0 + 1
    sum = sum + count;
    count++;
    //     1 +  2
    sum = sum + count;
    count++;
    //      3 + 3
    sum = sum + count;
    count++;
    //      6 + 4
    sum = sum + count;
    count++;
    //      10 + 5
    sum = sum + count;
    count++;
     */

    /*
    // 1.先写一个while
    // 2.找到需要循环执行的代码
    // 3.确定约束条件(结束条件)
    while (count <= 5) {
        printf("%i + %i\n", sum , count);
        sum = sum + count;
        count++;
    }
    printf("sum = %i\n", sum);
     */

    /*
    // 1.提示用户输入一个整数
    printf("请输入一个整数\n");
    // 2.定义变量保存用户输入的整数
    int number = -1;
    // 3.接收用户输入的整数
    scanf("%i", &number);
     */
    
    // 4.安全校验
    /*
    if (number <= 0) {
//        return 0; // 结束函数
//        break; // 注意: break只能用在switch和循环结构中, 离开这两个东西没有任何效果
    }
     */

    // 2.定义变量保存用户输入的整数
    int number = -1;
    while (number <= 0) {
        // 1.提示用户输入一个整数
        printf("请输入一个整数\n");
        // 3.接收用户输入的整数
        scanf("%i", &number);// -5 -10 5
    }

    // 4.根据用户输入的整数计算结果
    // 1 + 2 + 3 +.. +n, 规律, 用上一次的和加上一个递增的数
    // 1.先写一个while
    // 2.找到需要循环执行的代码
    // 3.确定约束条件(结束条件)
    int sum = 0;
    int count = 1;
    while (count <= number) {
//        int sum = 0; // 注意, 不能写到这个地方, 因为写到这里是一个局部变量, 作用域是从定义的这一行开始, 一直到循环体结束, 每次进来都会重新定义一个
//        int count = 1;
     printf("%i + %i\n", sum , count);
        // 思想: 累加思想, 通过循环来进行累加
        sum = sum + count;
        count++;
    }
    printf("sum = %i\n", sum);
    printf("other");

while练习2

// 获取1~100之间 7的倍数的个数并打印,并统计个数
    // 1.分析
    // 1.获取0~100之间所有的数
    // 2.判断当前拿到的数是否是7的倍数, 没有余数
    // 3.定义变量保存7的倍数的个数(每次只要发现当前的数是7的倍数就加1)
    // 修改变量名称的快捷键 command + control + e
    int number = 0;
    int count = 0;
    while (number <= 20) {
        printf("%i\n", number);
        if (number % 7 == 0) {
            // 证明当前的数是7的倍数
            count++;// 计数器思想, 如果以后开发中项获取什么中有多少个什么, 第一个时间就要想到计数器思想
            printf("7的倍数是 %i\n", number);
        }
        number++;
    }
    printf("sum = %i\n", count);

while练习3

// 帅哥要和靓女搭讪, 想搞定这个靓女的陌陌号码
    // 靓女的要求, 要求男生猜她的年龄, 给这个男生3次机会
    // 1.男生猜多少? 用户输入
    // 2.女生的真实年龄? 随机数
    // 3.根据用户的输入, 判断是否和女生的真实年龄一样
    /*
    // 1.让男生猜
    printf("请猜猜我得年龄\n");
    int age = -1;
    scanf("%i", &age);
    */

    // 2.确定女生的年龄
    int girl = arc4random_uniform(20);
    /*

    // 3.判断是否猜对了
    if (age == girl) {
        printf("陌陌号码是: shijijiayuan");
    }else if (age > girl)
    {
       printf("你会不会说话, 我有那么老吗?\n");
    }else if (age < girl)
    {
        printf("我太开心了``你真会聊天\n");
    }
     */
    int count = 3;
    while (count > 0) {
        // 1.让男生猜
        printf("请猜猜我得年龄\n");
        int age = -1;
        scanf("%i", &age);
        // 3.判断是否猜对了
        if (age == girl) {
            printf("陌陌号码是: shijijiayuan\n");
            system("say shijijiayuan");
            break; // break可以用在switch和循环结构中
            // 只要执行到break那么就不会再次回去判断条件了
        }else if (age > girl)
        {
            printf("你会不会说话, 我有那么老吗?\n");
            system("say 你会不会说话, 我有那么老吗?");
        }else if (age < girl)
        {
            printf("我太开心了``你真会聊天\n");
            system("say 我太开心了``你真会聊天");
        }
        count--; // 减少他得机会
    }

while注意点

// 任何数值都有真假性
//    while (998) {
//        printf("lnj");
//    }
    /*
    int age = 10;
    if (age = 5) {
        printf("success\n");
    }
     */
    /*
    int age = 10;
    while (age = 5) {
        printf("success\n");
    }
     */

    /*
    if (1)
        printf("lnj");
     */

    /*
    // 和if一样, while也可以省略大括号, 省略大括号之后, while只会执行离他最近的一条语句
    while (1)
        printf("lnj\n");
    printf("-----------\n");
     */

    /*
    if (1)
        int a = 10;
    printf("a = %i\n", a);
    */

    /*
    while (1)
        int a = 10;
    printf("a = %i\n", a);
     */

    /*
    // 其实用{}包裹起来的代码, 称之为代码块
    // ;是一条空语句
    if (0);
        printf("lnj");
     */

    /*
    while (1);
        printf("lnj");
     */

    

    // 最简单的死循环
    while (1);

break关键字

// 打十发子弹之后就不打了(打不动了)
    int number = 100;
    while (number > 0) {
        printf("发射子弹 %i \n", number);
        number--;
        if (number < 90) {
            printf("不打了\n");
            break;// break用于跳出循环
        }
    }

continue关键字

/*
    int number = 100;
    while (number > 0) {
        printf("发射子弹 %i\n", number);
        number--;
        if (number % 10 == 0) {
            printf("休息一下\n");
        }
        // 这些操作, 如果是休息就不做
        printf("还有很多复杂的操作\n");
    }
     */

    /*
    int number = 100;
    while (number > 0) {
        printf("发射子弹 %i\n", number);
        number--;
        if (number % 10 == 0) {
            printf("休息一下\n");
            continue; // 跳过本次循环, 进去下一次循环
            // 只要看到continue 那么后面的所有语句都不会执行, 会执行再次去判断条件表达式
        }
        // 这些操作, 如果是休息就不做
        printf("还有很多复杂的操作\n");
    }
     */

    // 把100~200之间的不能被3整除的数输出
    int number = 99;
    while (number < 200) {
        /*
        number++;
        // 当前输出语句, 并不是所有情况都需要输出, 只有当前获取到得数不能被3整除才输出
        // 如果当前获取到得数能被3整数, 就不执行printf语句
        if (number % 3 == 0) {
            continue;
        }
        printf("number = %i\n", number);
         */
        number++;
        if (number % 3 != 0) {
            printf("number = %i\n", number);
        }
    }

dowhile

/*
 while (条件表达式)
 {
    语句;
    ...
 } 
 
 do
 {
    语句;
    ...
 }while (条件表达式);


 do while和while的区别: 
 while如果条件表达式一开始就不满足, 那么循环体永远不会被执行
 do while如果条件表达式一开始就不满足, 同样会执行一次循环体
 也就是说: 无论条件表达式是否满足, do while始终会执行一次循环体
 */

int main(int argc, const char * argv[]) {
    /*
    int i = 0;
    while (i < 0) {
        printf("%i\n", i);
        i++;
    }
    
    printf("------------\n");
    int j = 0;
    do{
        printf("j = %i\n", j);
        j++;
    }while (j < 0);
     */

    // 一般情况下, 能用while就用while
    // do while一般用于校验
    // 2.定义变量保存用户输入的整数
    int number = -1;
    // 无论如何都需要用户输入一次数据
    /*
    while (number <= 0) {
        // 1.提示用户输入一个整数
        printf("请输入一个整数\n");
        // 3.接收用户输入的整数
        scanf("%i", &number);// -5 -10 5
    }
     */
    do {
        // 1.提示用户输入一个整数
        printf("请输入一个整数\n");
        // 3.接收用户输入的整数
        scanf("%i", &number);// -5 -10 5
    } while (number <= 0);
    // 4.根据用户输入的整数计算结果
    int sum = 0;
    int count = 1;
    while (count <= number) {
        printf("%i + %i\n", sum , count);
        sum = sum + count;
        count++;
    }
    printf("sum = %i\n", sum);

for循环

/*
 while (条件表达式)
 {
    语句;
    ...
 }
 
 for (初始化表达式;条件表达式;循环后增量表达式)
 {
    语句;
    ...
 }
 条件表达式: 和while, dowhile一样, 只有条件满足才会执行循环体
 初始化表达式: 在整个for循环的生命周期中, 初始化表达式只会执行一次
 循环后增量表达式: 会在每次循环体之后完毕之后调用一次
 */

int main(int argc, const char * argv[]) {
    /*
    int count = 100; // 用于控制循环什么时候结束
    while (count > 0) {
        printf("发射子弹 %i\n", count);
        count--; // 控制循环的次数, 当每次循环执行完毕之后都会执行一次
    }
     */
    // 能用while做得用for都能做, for相当于while的升级版
    // 以后如果定义的便利仅仅用于控制循环什么时候结束, 循环结束之后就不在使用了, 那么可以使用for循环
    // 如果将用于控制循环的变量定义在for循环中, 那么循环结束了, 变量也释放了
//    int number = 100;
//            1            2/5/8/11        4/7/10
    for (int number = 100;number > 0;number--)
    {
        // 3/6/9
        printf("发射子弹 %i\n", number);
//        number--;
    }
//    printf("%i", number);

for和while的对比

// 什么时候用while?
    // 如果用于控制循环的增量在循环执行完毕之后还需要使用, 那么可以使用while
    int count = 100; // 用于控制循环什么时候结束
    while (count > 0) {
        printf("发射子弹 %i\n", count);
        count--; // 控制循环的次数, 当每次循环执行完毕之后都会执行一次
    }
    printf("count = %i\n", count);
    
    // 如果用于控制循环的增量在循环执行完毕之后不需要使用了, 那么可以使用for
    for (int number = 100; number > 0; number--) {
        printf("发射子弹%i\n", number);
    }
//    printf("number = %i\n", number);
    
    // 其实在企业开发中, 只要会用for就可以了, while能做的for都能做

for注意点

/*
    // 1.任何数值都有真假新
    for (; 1; ) {
        printf("lnj");
    }
     */
    /*
    // 2.for也可以省略大括号, for省略大括号的时候, 只会执行离他最近的一条语句
    for (;0;)
        printf("lnj");
    printf("other");
     */

    /*
    // 3.作用域混乱
    for (;1;)
        int a = 10;
    printf("a = %i\n", a);
     */

    /*
    // 5.;空语句
    for (;0;);
    {
        printf("lnj");
    }
     */

    /*
    // 6.其实, 初始化表达式和循环后增量表达式可以写多条语句, 语句之间用,号连接
    for (int i = 0, j = 0; i < 2; i++, j++)
    {
        printf("i = %i j = %i\n", i, j);
    }
     */ 

    // 7.作用域问题
    /*
    int a = 10;
//    int a = 20;
    {
        int a = 20;
        printf("a = %i\n", a);
    }
     */

    /*
    for (int i = 0; i < 3; i++) {
        int i = 5;
        printf("i = %i\n", i);
    }
     */
     
    /*

    for (int i = 0; i < 2; j++) {
        int j = 0;
    }
     */ 

    // 最简单的死循环
//    for(;1;);
    for(;;); // 注意: for循环中的条件表达式默认为真
    printf("lnj");

循环嵌套

/*
什么是循环嵌套:
 while ()
 {
    while()
     {
     
     }
 }
 
 while()
 {
    do{
    }while();
 }
 
 do
 {
    while()
     {
     }
 }while(); 

 for (;;)
 {
    for(;;)
    {
    }
 }

*/
int main(int argc, const char * argv[]) {
    /*
    // 问题: 会打印几次
    // 结论: 循环嵌套执行的次数等于 : 外循环执行的次数 * 内循环执行的次数
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("i = %i , j = %i\n", i, j);
        }
    }
     */
    
    /*
     好友列表1
         好友1
         好友2
     好友列表2
         好友1
         好友2
     好友列表3
         好友1
         好友2
     */

    /*
    printf("好友列表1\n");
    printf("    好友1\n");
    printf("    好友2\n");
    
    printf("好友列表2\n");
    printf("    好友1\n");
    printf("    好友2\n");
    
    printf("好友列表3\n");
    printf("    好友1\n");
    printf("    好友2\n");
     */

    for (int i = 0; i < 3; i++) {// 1
        printf("好友列表%i\n", i + 1 );
        /*
        printf("    好友1\n");
        printf("    好友2\n");
        printf("    好友3\n");
        printf("    好友4\n");
        printf("    好友5\n");
        printf("    好友6\n");
        printf("    好友7\n");
         */

        for (int j = 0; j < 2; j++) {// 2
            printf("    好友%i\n", j + 1);
        }
    }

循环嵌套练习1

/*
     ***
     ***
     ***
     */

//    printf("***\n");

    /*
    printf("*");
    printf("*");
    printf("*\n");
     */

    /*
    printf("*");
    printf("*");
    printf("*");
    printf("\n");
     */

    /*
    for (int i = 0; i < 3; i++) {
        printf("*");
    }
    printf("\n");

    for (int i = 0; i < 3; i++) {
        printf("*");
    }

    printf("\n");

    for (int i = 0; i < 3; i++) {
        printf("*");
    }

    printf("\n");
     */

    // 外循环控制行数
    // 内循环控制列数

    for (int j = 0 ; j < 2; j++) {
        for (int i = 0; i < 3; i++) {
            printf("*");
        }
        printf("\n");
    }

循环嵌套练习2

/*

     ***

     **

     *

     */

    // 只要以后看到很多行很多列, 那么第一时间就要想到循环嵌套
    // 定义一个变量保存当前需要输出的星星的个数
    /*

    int couon = 3;
    for (int i = 0; i < 3; i++) {
//        printf("count = %i", couon);
        for (int j = 0; j < couon; j++) {
            printf("*");
        }
        printf("\n");
        couon--; // 每输出一行就让列数减一
    }
     */

    /*
    int count = 0;
    for (int i = 0; i < 3; i++) {
        printf("i = %i", i);
//        printf("count = %i", count);
        for (int j = count; j < 3; j++) {
            printf("*");
        }
        printf("\n");
        count++;
    }
     */

    /*
//    int count = 0;
    for (int i = 0; i < 3; i++) {
//        printf("i = %i", i);
        for (int j = i; j < 3; j++) {
            printf("*");
        }
        printf("\n");
//        count++;
    }
     */

    /*
    
     *
     **
     ***
     
     */

    /*

    int count = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j <= count; j++) {
            printf("*");
        }
        printf("\n");
        count++;
    }
     */

    

//    int count = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j <= i; j++) {
            printf("*");
        }
        printf("\n");
//        count++;
    }

    

    /*
     尖尖朝上: 修改内循环的 条件表达式
     尖尖朝下: 修改内循环的 初始化表达式
     */

循环嵌套练习3

/*
     1
     12
     123
     */

    /*
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j <= i; j++) {
            printf("%i", j + 1);
        }
        printf("\n");
    }
     */
    

    /*
     1
     22
     333
     */

    /*
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j <= i; j++) {
            printf("%i", i + 1);
        }
        printf("\n");
    }
     */
    
    /*
     --*
     -***
     *****
    
     --
     -
     
      *
     ***
    *****
     */
    for (int i = 0; i < 3; i++) {
        for (int j = i; j < 2; j++) {
            printf("-");
        }
        
        //                   0 * 2 = 0
        //                   1 * 2 = 2
        //                   2 * 2 = 4
        for (int n = 0; n <= i * 2; n++) {
            printf("*");
        }
        printf("\n");
    }