C语言基础知识讲解二:让程序和你互动起来
上一期我们学习了C语言的变量、数据类型和输出语句,已经能让程序按照我们的指令"说话"了。这一期,我们要学习更厉害的技能——让程序能"听"懂我们的话,还能进行各种计算,就像给程序装上了耳朵和大脑!
一、输入语句:让程序听你指挥
想象一下,如果你问机器人"我叫什么名字",机器人却答不上来,是不是很尴尬?输入语句就是给程序装上"耳朵",让它能接收我们输入的信息。
在C语言中,最常用的输入函数是scanf
,它和我们上期学的printf
是一对好搭档——printf
负责"说",scanf
负责"听"。
1、基本用法
案例代码:
#include <stdio.h>
int main() {
// 定义一个变量存储年龄
int age;
// 先提示用户输入
printf("请输入你的年龄:");
// 接收用户输入的数据,存储到age变量中
// 注意:变量名前要加&符号,就像告诉程序"把数据放到这个盒子里"
scanf("%d", &age);
// 验证一下程序是否真的"听"到了
printf("我知道了,你今年%d岁!\n", age);
return 0;
}
运行这段代码,你会看到程序先显示"请输入你的年龄:",当你输入数字并按回车后,程序会重复出你输入的年龄。
2、输入多个数据
scanf
还能一次接收多个数据,用空格或回车分隔就行:
#include <stdio.h>
int main() {
int math, chinese;
printf("请输入数学和语文成绩(用空格分开):");
// 同时输入两个整数
scanf("%d %d", &math, &chinese);
printf("数学:%d分,语文:%d分\n", math, chinese);
printf("总分:%d分\n", math + chinese);
return 0;
}
小提示:
scanf
的格式符要和变量类型严格对应(%d
对应整数,%f
对应浮点数)- 变量名前一定要加
&
符号,这是告诉程序数据要存放在内存的哪个位置 - 输入字符串时不用加
&
(这个我们以后会学到)
3、易错点分析
在使用scanf
语句时,双引号中的内容不可随意书写,引号中写了什么在输入变量值时就需要原样输入什么,例如:
#include <stdio.h>
int main() {
int a, b;
printf("请输入a和b:");
// 同时输入两个整数
scanf("%d,%d", &a, &b);
printf("a=%d,b=%d\n", a,b);
return 0;
}
当代码写成scanf("%d,%d", &a, &b);
时,在输入a和b的值的时候需要先输入a的值,再输入“,”
最后输入b的值,才能结束输入。
二、数据类型转换:不同盒子间的"液体转移"
我们知道不同的数据类型就像不同大小的盒子,专门用来存放特定类型的数据。但有时候,我们需要把一个盒子里的数据放到另一个盒子里,这就需要用到数据类型转换。可以把它想象成不同容量的杯子之间倒水。
1、数据类型的大小关系
在了解转换规则前,我们先搞清楚各种基本数据类型的"容量"大小(以常见的32位或64位系统为例):
数据类型 | 占用内存(字节) | 比喻 |
---|---|---|
char | 1字节 | 小药瓶 |
short | 2字节 | 易拉罐 |
int | 4字节 | 矿泉水瓶 |
long | 4或8字节 | 大瓶装饮料 |
float | 4字节 | 牛奶盒 |
double | 8字节 | 大牛奶桶 |
它们的容量从小到大排序为:
char < short < int ≤ long < float < double
就像不同大小的容器,容量小的只能装少量数据,容量大的能装更多数据。例如:char类型只能存储-128到127之间的整数,而int类型可以存储更大范围的整数(约-20亿到20亿)。
2、自动转换(隐式转换)
当小杯子往大杯子倒水时,不会有任何问题,C语言会自动完成转换:
#include <stdio.h>
int main() {
int a = 5; // 小杯子(整数)
float b = 2.5f; // 大杯子(浮点数)
// 整数会自动转换为浮点数,再进行计算
float result = a + b;
printf("%d + %.1f = %.1f\n", a, b, result); // 输出:5 + 2.5 = 7.5
return 0;
}
3、强制转换(显式转换)
当大杯子往小杯子倒水时,可能会有损失,这时候需要我们手动指定转换:
#include <stdio.h>
int main() {
float a = 7.8f; // 大杯子(浮点数)
// 强制将浮点数转换为整数,会丢失小数部分
int b = (int)a; // 注意语法:(目标类型)变量名
printf("转换前:%.1f,转换后:%d\n", a, b); // 输出:转换前:7.8,转换后:7
return 0;
}
就像把一杯100ml的水倒进50ml的杯子,只能装下50ml,剩下的就丢失了。所以强制转换要谨慎使用哦!
三、运算符与表达式:程序的"计算器"
运算符就像程序的计算器,能对数据进行各种运算。让我们来认识一下最常用的几类运算符:
1. 算术运算符:做数学题
运算符 | 功能 | 例子 | 结果 |
---|---|---|---|
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 除法 | 5 / 2 | 2(整数相除) |
/ | 除法 | 5.0 / 2 | 2.5(浮点数相除) |
% | 取余(求余数) | 5 % 3 | 2 |
案例代码:
#include <stdio.h>
int main() {
int num1 = 10, num2 = 3;
printf("%d + %d = %d\n", num1, num2, num1 + num2); // 10 + 3 = 13
printf("%d - %d = %d\n", num1, num2, num1 - num2); // 10 - 3 = 7
printf("%d * %d = %d\n", num1, num2, num1 * num2); // 10 * 3 = 30
printf("%d / %d = %d\n", num1, num2, num1 / num2); // 10 / 3 = 3(整数除法)
printf("%d %% %d = %d\n", num1, num2, num1 % num2); // 10 % 3 = 1(取余)
// 浮点数除法
printf("%.1f / %.1f = %.1f\n", 10.0f, 3.0f, 10.0f / 3.0f); // 10.0 / 3.0 = 3.3
return 0;
}
注意:printf
中要输出%
符号时,需要写两个%%
2. 赋值运算符:给变量赋值
最基本的赋值运算符是=
,它不是"等于"的意思,而是"把右边的值放到左边的变量里"。
除此之外,还有一些简化的赋值运算符:
#include <stdio.h>
int main() {
int a = 10; // 把10放到变量a中
a += 5; // 相当于 a = a + 5,现在a是15
printf("a += 5 后:%d\n", a);
a -= 3; // 相当于 a = a - 3,现在a是12
printf("a -= 3 后:%d\n", a);
a *= 2; // 相当于 a = a * 2,现在a是24
printf("a *= 2 后:%d\n", a);
a /= 2; // 相当于 a = a / 2,现在a是12
printf("a /= 2 后:%d\n", a);
a %= 5; // 相当于 a = a % 5,现在a是2
printf("a %%= 5 后:%d\n", a);
return 0;
}
3. 比较运算符:做判断
比较运算符用来比较两个值的大小,结果只有两种:真(1)或假(0)
运算符 | 说明 | 例子 | 结果(真=1,假=0) |
---|---|---|---|
> | 大于 | 5 > 3 | 1 |
< | 小于 | 5 < 3 | 0 |
>= | 大于等于 | 5 >= 3 | 1 |
<= | 小于等于 | 5 <= 3 | 0 |
== | 等于 | 5 == 3 | 0 |
!= | 不等于 | 5 != 3 | 1 |
案例代码:
#include <stdio.h>
int main() {
int score = 85;
printf("是否及格(≥60):%d\n", score >= 60); // 输出1(真)
printf("是否满分(=100):%d\n", score == 100); // 输出0(假)
printf("是否大于90分:%d\n", score > 90); // 输出0(假)
return 0;
}
注意:==
才是"等于"的意思,而=
是赋值运算符,不要混淆哦!
4. 逻辑运算符:组合判断
逻辑运算符可以把多个判断条件组合起来:
&&
:逻辑与(并且),两边都为真,结果才为真||
:逻辑或(或者),至少一边为真,结果就为真!
:逻辑非(不是),取相反的结果
#include <stdio.h>
int main() {
int math = 92;
int chinese = 88;
// 数学和语文都及格了吗?
printf("两科都及格:%d\n", math >= 60 && chinese >= 60); // 1(真)
// 数学或语文有一门满分吗?
printf("至少一科满分:%d\n", math == 100 || chinese == 100); // 0(假)
// 数学不是不及格
printf("数学及格:%d\n", !(math < 60)); // 1(真)
return 0;
}
四、趣味练习题
1. BMI计算器
编写程序,输入身高(厘米)和体重(千克),计算BMI指数(BMI = 体重 ÷ (身高÷100)²)。
2. 时间转换器
输入一个整数表示总分钟数,计算并输出对应的小时和分钟。例如:输入130分钟,输出"2小时10分钟"。
提示:使用除法/
计算小时,使用取余%
计算剩余分钟。
小结
今天我们学习了如何让程序接收输入、进行数据类型转换,以及使用各种运算符进行计算。这些知识让程序从简单的"说话"变成了能"听"能"算"的小助手。
下一期,我们将学习如何让程序做判断和重复操作,让它变得更智能!如果在练习中遇到问题,欢迎在评论区留言讨论哦~