一. 条件判断

条件判断,其作用就是明确地让计算机知道:在什么条件下,该去做什么。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("如果你想拥有无限的力量和能量,那必须夺得力量宝石\n");
    sleep(2);
    printf("如果你想扭曲时空和任意地传送,那必须夺得空间宝石\n");
    sleep(2);
    printf("如果你想任意地修改现实,无视任何宇宙规律,那必须夺得现实宝石\n");
    sleep(2);
    printf("如果你想到达任何一个时间点,无论是古老的年代还是遥远的未来,那必须夺得时间宝石\n");
    sleep(2);
    printf("如果你想控制生者和死者的灵魂,那必须夺得灵魂宝石\n");
    sleep(2);
    printf("如果你想拥有不朽的精神力量并操控任何人的思维,那必须夺得心灵宝石\n");
    sleep(2);

    printf("\n");
    printf("那么,如果让你来选择的话,你想要获得拿颗宝石呢?\n");
    sleep(2);

    printf("请在以下六个选项【1 力量宝石;2 空间宝石;3 现实宝石;4 时间宝石;5 灵魂宝石;6 心灵宝石;】中,选择你最想获得的宝石吧: ");
    sleep(3);
    
    int choice = 0;
    scanf("%d" , &choice);

    if(choice == 1)
    {
        printf("我告诉你哦,力量宝石保存在山达尔星的新星军团的总部基地\n");
        sleep(5);
    }
    else if(choice == 2)
    {
        printf("空间宝石在洛基手里\n");
        sleep(5);
    }    
    else if(choice == 3)
    {
        printf("雷击已将现实宝石交给收藏家保管\n");
        sleep(5);
    }
    else if(choice == 4)
    {
        printf("奇异博士愿意用时间宝石换取钢铁侠的性命\n");
        sleep(5);
    }
    else if(choice == 5)
    {
        printf("获取灵魂宝石需要献祭自己心爱之人\n");
        sleep(5);
    }
    else if(choice == 6)
    {
        printf("幻视头上的心灵宝石被绯红女巫摧毁,但可用时间宝石复原\n");
        sleep(5);
    }
    else
    {
        printf("没有这个宝石哦!\n");
        sleep(5);
    }
    return 0;
}

单向判断

// 只有 exp 为 true 才会执行条件语句
if(exp)
{
   ...
}
#include <stdio.h>

int main(void)
{
    int num_1 = 0;
    int num_2 = 0;
    printf("Please enter two numbers: ");
    scanf("%d , %d" , &num_1 , &num_2);

    if(num_1 > num_2)
    {
        printf("num_1 > num_2\n");
    }
    return 0;
}

双向判断

// exp 为 true 执行 if 里的语句块,否则为 false 执行 else 里的语句块
if(exp)
{
   ...
}
else
{
   ...
}
#include <stdio.h>

int main(void)
{
    int num_1 = 0;
    int num_2 = 0;
    printf("Please enter two numbers: ");
    scanf("%d , %d" , &num_1 , &num_2);

    if(num_1 > num_2)
    {
        printf("num_1 > num_2\n");
    }
    else
    {
        printf("num_1 <= num_2\n");
    }
    return 0;
}

多向判断

// 如果满足 exp1 执行第一个语句块,在不满足 exp1 的基础上,如果满足 exp2,则执行第二个语句块,如果 exp1,exp2 都不满足,则执行第三个语句块,以此类推,否则,执行最后 else 的语句块
if(exp1)
{
   ...
}
else if(exp2)
{
   ...
}
else if(exp3)
{
   ...
}

...

else
{
    ...
}
#include <stdio.h>

int main(void)
{
    int num_1 = 0;
    int num_2 = 0;
    printf("Please enter two numbers: ");
    scanf("%d , %d" , &num_1 , &num_2);

    if(num_1 > num_2)
    {
        printf("num_1 > num_2\n");
    }
    else if(num_1 < num_2)
    {
        printf("num_1 < num_2\n");
    }
    else
    {
        printf("num_1 == num_2\n");
    }
    return 0;
}

条件运算符 ?:

条件表达式是 if else 语句的一种快捷方式,该表达式使用 ?: 条件运算符。需要 3 个运算对象

#include <stdio.h>

int main(void)
{
    int num_1 = 7;
    int num_2 = 10;

    int max = (num_1 > num_2) ? num_1 : num_2;
    printf("Max: %d\n" , max);
    return 0;
}

二. 循环

顾名思义,把一件事重复执行很多遍

for 循环

用于在执行循环之前就知道要重复执行多少次

for 循环将下述三个行为组合在一起

  1. 必须初始化计数器
  2. 计数器与有限值做比较
  3. 每次循环时递增计数器
#include <stdio.h>

int main(void)
{
    const int times = 7;
    for(int i = 0; i < times; ++i)
    {
        printf("Be my Valentine!\n");
    }
    return 0;
}

关键字 for 后面的圆括号有 3 个表达式,分别用两个分号隔开。

  1. 第一个表达式是初始化,只会在 for 循环开始时执行一次
  2. 第二个表达式是测试条件,在执行循环之前对表达式求值,如果表达式为假,循环结束
  3. 第三个表达式执行更新,在每次循环结束时求值

while 循环

用于在执行循环之前不知道要执行多少次

while(exp)
{
    ...
}
#include <stdio.h>

int main(void)
{
    int time = 7;
    while(time > 0)
    {
        printf("Be my Valentine!\n");
        --time;
    }
    return 0;
}

循环辅助:continue 和 break

一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。但 continue 和 break 语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环

break 的意思是 “打破”,是用来结束循环的。和 if 语句配合使用,如果满足了某一个条件,就提前结束循环。注意,这个只能在循环内部使用。

#include <stdio.h>

int main(void)
{
    const int times = 7;
    for(int i = 0; i < times; ++i)
    {
        if(i == 3)
        {
            printf("End loop\n");
            break;
        }
        printf("Be my Valentine!\n");
    }
    return 0;
}
#include <stdio.h>

int main(void)
{
    int times = 7;
    while(times > 0)
    {
        printf("Be my Valentine!\n");
        --times;
        if(times == 4)
        {
            printf("End loop\n");
            break;
        }
    }
    return 0;
}

continue 的意思是“继续”。这个也只能在循环内部使用。也常和 if 语句配合使用。当某个条件被满足时,触发 continue 语句,将跳过之后的代码,直接回到循环的开始

#include <stdio.h>

int main(void)
{
    int times = 7;
    while(times > 0)
    {   
        --times;
        if(times == 3)
        {
            printf("Continue\n");
            continue;
        }
        printf("Be my Valentine!\n");
    }
    return 0;
}
#include <stdio.h>

int main(void)
{
    const int times = 7;
    for(int i = 0; i < times; ++i)
    {
        if(i == 3)
        {
            printf("Continue\n");
            continue;
        }
        printf("Be my Valentine!\n");
    }
    return 0;
}

三. 初探数组

数组:存放在连续存储空间上的相同类型数据的集合

注意:

  1. 数组下标都是从 0 开始的
  2. 数组内存空间的地址是连续的

创建数组

// 完全初始化
int arr[7] = {1, 2, 3, 4, 5, 6, 7};

// 不完全初始化,剩下的元素默认为 0
int arr[7] = {1, 2, 3};

// 不指定数组的大小初始化,数组大小根据初始化的内容来确定
int arr[] = {1, 2, 3};

// 二维数组,行可以省略的,列不能省略;若不完全初始化,则剩下的元素默认为 0
int arr[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

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

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

访问数组中的元素

#include <stdio.h>

int main(void)
{
    int arr[7] = {1, 2, 3, 4, 5, 6, 7};
    for(int i = 0; i < 7; ++i)
    {
        printf("%d " , arr[i]);
    }
    printf("\n");
    return 0;
}
#include <stdio.h>

int main(void)
{
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    for(int i = 0; i < 3; ++i)
    {
        for(int j = 0; j < 3; ++j)
        {
            printf("%d " , arr[i][j]);
        }
        printf("\n");   
    }
    return 0;
}
#include <stdio.h>

int main(void)
{
    int arr[7] = {1, 2, 3, 4, 5, 6, 7};
    for(int i = 0; i < 7; ++i)
    {
        printf("%d " , arr[i]);
    }
    printf("\n");

    arr[0] = 7;
    arr[1] = 6;
    arr[2] = 5;
    for(int i = 0; i < 7; ++i)
    {
        printf("%d " , arr[i]);
    }
    printf("\n");
    return 0;
}

作业

  1. 将讲义中的程序自己敲一遍,理解程序为何会这样运行

  2. 作为把公主从海盗那里营救回来的报酬,国王给你机会来赢得隐藏在三个箱子中的宝藏,但只有一个箱子中有宝藏,另外两个箱子是空的。要想赢,你必须选对箱子。 (1)第一个箱子上写有 “这个箱子是空的” (2)第二个箱子上写有 “这个箱子是空的” (2)第三个箱子上写着 “宝藏在第二个箱子中” 从来不撒谎的皇后告诉你只有一个提示是真的,而其它两句都是假的。你会选择哪个箱子来赢得宝藏。编写程序来解这道题

  3. 输入一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以及90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。