2. 顺序结构程序设计

像按顺序买装备、放技能、普攻一样,程序从上到下一条一条执行。本节对应考纲 2。

这一章在学什么(衔接第 1 章)

第 1 章你已经知道:程序从 main 开始、到 return 0; 结束,中间写「要做的事」。这一章就是学:在 main 里面怎么「存数据」和「把数据输出到屏幕」。

具体会学:怎么定义变量(存血量、金币这类会变的数)、怎么用 printf 把内容打出来、怎么用 scanf 从键盘读入。都是「从上到下一条一条执行」的顺序结构,没有分支、没有循环,先把这个练熟。

本节考纲要点

本节代码里的英文词

常量与变量(游戏联想)

常量是什么

常量:程序运行过程中不会变的数或字,比如回城固定 7 秒。写代码时可以直接写数字,如 7

变量是什么与怎么定义

变量:会的数据,比如当前血量、金币、蓝量——对局里一直在变。我们要先在代码里“申请一个格子”、起个名字,之后才能往里面存数、改数。这就是“定义变量”。

定义变量的格式: 类型 变量名 = 初值;

分三步记:(1) 想好要存什么类型的数(整数用 int、小数用 float、单字符用 char);(2) 起个名字(如 hero_hp);(3) 写 = 初值 和分号。例如 int hero_hp = 3000; 表示:开一个存整数的格子,名字叫 hero_hp,一开始是 3000。后面可以再写 hero_hp = 2500; 把血量改成 2500。

数据类型(用游戏里的东西来记)

整型、浮点型、字符型

整型 int:存整数,比如血量 3000、金币 500。浮点型 float:存带小数的数,比如伤害系数 1.5、技能加成百分比。字符型分两种:

别弄混:字符 '1' 和 整数 1

char key = '1'; 时,单引号里的 1 是“字符 1”——相当于键盘上按了一个 1 键,是一个符号,不能拿来算 1+1。
int n = 1; 时,没有引号的 1 才是“整数 1”——可以参与加减乘除。
记法:单引号 = 一个字符/按键没有引号 = 数字(整型或浮点型)

下面代码里的 hero_hpgoldhero_name 是英文变量名,分别表示血量、金币、英雄名。不懂英文没关系,记这组对应就行;更多词可以回第 1 节看「代码里的英文词是什么意思」。

下面代码里 /* ... */注释(给人看的,电脑不执行),忘了可以回第 1 节看「什么是注释」。

int hero_hp = 3000;           /* 整数:血量,可以参与运算 */
int gold = 500;               /* 整数:金币 */
char hero_name[] = "貂蝉";     /* 英雄名字,直接写中文 */
char skill_key = '1';         /* 单字符:'1' 是“按键1”,不是整数 1,外面有单引号 */
float damage_rate = 1.5f;     /* 小数:伤害系数,写 1.5 时后面加 f */

float 初值要加 f

注意:float 类型赋初值时,如果写小数要在后面加 f,如 1.5f,这样编译器才知道是 float 而不是 double(更高精度的小数,了解即可)。

运算符与表达式(游戏里怎么算)

常用运算符

要让电脑“算数”,就要用运算符。常用的有:

用运算符把变量、常量连起来就是表达式,表达式会算出一个结果。例如:

damage = base_damage * damage_rate;   /* 实际伤害 = 基础伤害 × 系数 */
cd_remain = 10 - elapsed;             /* 剩余 CD = 总 CD(10秒) - 已过时间 */
gold = gold + 100;                    /* 金币加 100,也可以写成 gold += 100 */

表达式是什么

表达式会算出一个结果,可以赋给变量(如上面的 damage、gold),也可以用在 printf 里直接输出。

输出:printf(在“战斗信息”里显示)

printf 的写法和占位符

第一次写 printf 可以只打一句话:比如 printf("Hello, 王者!\n"); 运行后就会在屏幕上出现 Hello, 王者! 然后换行。\n 表示“从这里换一行”。

想让屏幕显示变量的值,就要在双引号里用占位符(如 %d、%f),后面用逗号写上对应的变量。基本写法:printf("要显示的内容", 变量1, 变量2, ...);

格式字符(占位符):在双引号里用占位符表示“这里放某个变量的值”,后面用逗号按顺序写上对应的变量。常用占位符:

例子:

printf("当前血量:%d\n", hero_hp);   /* 把 hero_hp 的值填到 %d 的位置,然后换行 */
printf("%s 金币:%d,按了技能键 %c\n", hero_name, gold, skill_key);

第二行会按顺序:第一个 %s 用 hero_name,第二个 %d 用 gold,第三个 %c 用 skill_key,所以输出类似:貂蝉 金币:500,按了技能键 1

易错点

占位符的个数和后面变量的个数、顺序必须一致,类型也要对上(整数用 %d,小数用 %f),否则结果会错或报错。

输入:scanf(玩家输入数据)

scanf 的写法和取地址 &

让用户从键盘输入一个数或字符,存到变量里,用 scanf。写法:scanf("格式", &变量1, &变量2, ...);

格式字符和 printf 一样:%d 整数,%f 小数,%c 字符,%s 字符串。

为什么要写 &(取地址):scanf 需要知道“把输入的数存到哪个变量的格子里”,&变量名 就是告诉电脑“这个格子的地址”。所以除了字符串(如 hero_name)有时可以省略外,普通变量前面都要加 &,忘了会出错。

scanf("%d", &hero_hp);              /* 从键盘读一个整数,存到 hero_hp */
scanf("%d %c", &gold, &skill_key);   /* 先读一个整数给 gold,再读一个字符给 skill_key */

输入时怎么分隔:上面第二行要输入两个值,可以用空格或回车隔开,比如输入 500 1 然后回车,或输入 500 回车再输入 1 回车。

输入时怎么分隔、易错

scanf 里格式串如果有逗号(如 "%f,%d"),键盘输入时也要打逗号,和格式串一致;忘记写 & 是最常见的错误

本章总示例(含 main)

本章讲的是顺序结构:变量、printf、scanf 都在 main 里从上到下执行。下面是一段完整可运行的程序。

#include <stdio.h>
int main() {
    int hero_hp = 3000;
    int gold = 500;
    printf("血量:%d 金币:%d\n", hero_hp, gold);
    return 0;
}

下面练习区已预填了这段代码,可修改后点击「运行」。

练习区域

提示:注释可以暂时不写,等以后学熟了再慢慢加。请仿照上面代码在下面框里输入或修改,点击「运行」查看结果。

运行结果:

(点击「运行」后显示在这里)

易错知识(避免踩坑)

小结