2. 顺序结构程序设计
像按顺序买装备、放技能、普攻一样,程序从上到下一条一条执行。本节对应考纲 2。
这一章在学什么(衔接第 1 章)
第 1 章你已经知道:程序从 main 开始、到 return 0; 结束,中间写「要做的事」。这一章就是学:在 main 里面怎么「存数据」和「把数据输出到屏幕」。
具体会学:怎么定义变量(存血量、金币这类会变的数)、怎么用 printf 把内容打出来、怎么用 scanf 从键盘读入。都是「从上到下一条一条执行」的顺序结构,没有分支、没有循环,先把这个练熟。
本节考纲要点
- 了解 常量及变量的定义
- 掌握 整型、字符型、浮点型数据的定义和使用
- 掌握 运算符和表达式的使用方法
- 掌握 输入函数及格式字符
- 掌握 输出语句及格式字符
本节代码里的英文词
hero_hp— 英雄血量gold— 金币hero_name— 英雄名字skill_key— 技能键(按的哪个键)damage_rate— 伤害系数base_damage— 基础伤害cd_remain— 剩余冷却时间elapsed— 已经过的时间printf— 输出到屏幕scanf— 从键盘读入int— 整数类型char— 字符类型float— 小数类型
常量与变量(游戏联想)
常量是什么
常量:程序运行过程中不会变的数或字,比如回城固定 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、技能加成百分比。字符型分两种:
- 英雄名、技能名这种“一串字”——用字符数组,双引号里直接写中文,比如
char hero_name[] = "貂蝉";就表示当前英雄是貂蝉。 - 技能键、单个字母或符号——用
char单字符,必须用单引号,比如char skill_key = 'A';表示按了 A 键,char key = '1';表示按了数字键 1(这里是“字符 1”,不是整数 1)。
别弄混:字符 '1' 和 整数 1
写 char key = '1'; 时,单引号里的 1 是“字符 1”——相当于键盘上按了一个 1 键,是一个符号,不能拿来算 1+1。
写 int n = 1; 时,没有引号的 1 才是“整数 1”——可以参与加减乘除。
记法:单引号 = 一个字符/按键;没有引号 = 数字(整型或浮点型)。
下面代码里的 hero_hp、gold、hero_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(更高精度的小数,了解即可)。
运算符与表达式(游戏里怎么算)
常用运算符
要让电脑“算数”,就要用运算符。常用的有:
+加、-减、*乘、/除(整数除以整数结果还是整数,如 7/2=3)。%取余数(如 7%2=1,用来算“整除后剩多少”,游戏里算 CD 还剩几秒常用)。
用运算符把变量、常量连起来就是表达式,表达式会算出一个结果。例如:
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, ...);
格式字符(占位符):在双引号里用占位符表示“这里放某个变量的值”,后面用逗号按顺序写上对应的变量。常用占位符:
%d— 整数(int)%f— 小数(float),默认会显示很多位小数,想保留 2 位可以写%.2f%c— 单个字符(char)%s— 字符串(如英雄名)\n— 换行(不算占位符,但常用,表示输出完这一行后光标到下一行)
例子:
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;
}
下面练习区已预填了这段代码,可修改后点击「运行」。
练习区域
提示:注释可以暂时不写,等以后学熟了再慢慢加。请仿照上面代码在下面框里输入或修改,点击「运行」查看结果。
运行结果:
(点击「运行」后显示在这里)
易错知识(避免踩坑)
- scanf 忘记写 &:除字符串外,变量前必须加
&,如scanf("%d", &x);,写成scanf("%d", x);会错。 - float 初值没加 f:写小数初值要加 f,如
1.5f,否则可能报警告或结果不对。 - 占位符和变量类型对不上:整数用 %d、小数用 %f、单字符用 %c,用错会输出乱码或报错。
- 字符必须用单引号:
'1'是字符,1是整数,别混。
小结
- 顺序结构:程序从上到下一条条执行。
- 定义变量:
类型 变量名 = 初值;;int 存整数,float 存小数,char 存单字符,字符数组存字符串(英雄名直接写中文如 "貂蝉")。 - 运算符:+ - * / %;表达式会算出一个结果。
- printf:双引号里用 %d、%f、%c、%s 当占位符,后面按顺序写变量;\n 换行。
- scanf:格式和 printf 对应,变量前要加 &(取地址),输入时用空格或回车分隔多个值。