一. 条件判断
条件判断,其作用就是明确地让计算机知道:在什么条件下,该去做什么。
#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 循环将下述三个行为组合在一起
- 必须初始化计数器
- 计数器与有限值做比较
- 每次循环时递增计数器
#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 个表达式,分别用两个分号隔开。
- 第一个表达式是初始化,只会在 for 循环开始时执行一次
- 第二个表达式是测试条件,在执行循环之前对表达式求值,如果表达式为假,循环结束
- 第三个表达式执行更新,在每次循环结束时求值
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;
}
三. 初探数组
数组:存放在连续存储空间上的相同类型数据的集合
注意:
- 数组下标都是从 0 开始的
- 数组内存空间的地址是连续的
创建数组
// 完全初始化
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)第二个箱子上写有 “这个箱子是空的” (2)第三个箱子上写着 “宝藏在第二个箱子中” 从来不撒谎的皇后告诉你只有一个提示是真的,而其它两句都是假的。你会选择哪个箱子来赢得宝藏。编写程序来解这道题
-
输入一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以及90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。