程序设计|C语言教学——C语言基础2:计算与控制语句
目录
一、变量
1.变量定义
2.赋值和初始化
3.关于scanf
4.常量与变量
5.总结
二、基本数据类型
三、运算符
1. 算术运算符
2. 关系运算符
3. 逻辑运算符
4. 赋值运算符
四、控制语句
1. 分支语句
2. 循环语句
一、变量
1.变量定义
上一节我们知道了如何输出一个计算的结果,那么新问题是,如何才能在程序运行时输入一个数字,然后计算输出结果?
那就需要有三件事情,第一我们需要有个地方存放我们输入的数字,第二,我们需要一个办法把数据输入进去。第三,我们要能够把存好的数据参与运算。
如下所示就是一个找零程序:
int price = 0;printf("请输入金额:");
scanf("%d",&price);int change = 100 - price;
printf("找零%d元\n",change);
我们可以在DEV-C++中编译运行看一下。
然后我们随意输入一个值30并回车,即可得到结果70。
也就是我们数字的输入和输出一样,都是在我们程序运行的终端窗口里面的。并且输入是以行为单位的,也就是在按下回车键之前,程序不会读到任何东西。
在这个程序中,我们输入的数据放到哪去了呢?放到了一个叫变量的东西里面。其中的“int price=0;”这一行做的事就是定义了一个叫price的变量,int是它的类型,0是它的初始值。在程序中,当我们需要有地方保存一个数据的时候,就需要变量。比如这里我们要保存用户在程序运行中输入进来的数字,才能用它进行运算。
变量定义的一般形式就是:数据类型名+变量名;
比如:int price;int amount;
也可以一次性定义两个同类型的变量,但是中间要用逗号隔开,如:int price,amount;
所有的变量都需要一个名字,变量的名字是一种“标识符”,我们不能把它叫做1号2号3号,我们得要给他起一个名字,用来识别它不同的变量。标识符有它的构造规则,它的基本原则是:只能由字母、数字和下划线组成,数字不可以出现在第一个位置上。除此之外,有一些单词我们是不能用于标识符的,因为他们是C语言的关键字,也叫保留字。如:auto\break\case\char\const\int\for等等。这些关键字我们不需要背,随着学习的深入,这些关键字我们会一个一个地学习到运用到,用过了之后就知道哪些不能用,除此之外,我们的编译器也会自己报错告诉我们这个单词不能用。
2.赋值和初始化
我们继续来研究这一行。这一行定义price这个int型变量时,用了一个等号,等号在这里做的事叫做赋值,赋值的意思是把等号右边的值交给了等号左边,也就是price得到了0这个值。因为是在定义变量的同时进行了赋值,所以这个过程我们也可以叫做初始化。对C语言来说,初始化和赋值的差异不是很大,但是以后在学习其他语言的时候,比如C++,那这里的差异就会比较大。
对应程序来说,等号是一种动作,和数学不一样,数学中等号是一种关系,表示两个数的值相同,而程序设计中等号是让计算机做的一个赋值的动作,是动态的。数学中a=b和b=a没有区别,是等价的,而在程序设计中,他们的差别很大,含义完全相反。
C语言并没有强制要求所有的变量都做初始化,但是所有变量在第一次被使用(指出现在等号右边)之前应该被赋值一次。如果没有变量没有被赋值或初始化,就直接放在等号右边去用,程序就会出错,我们可能会得到一个毫不相关的结果。
组合变量定义的时候,不能一次性给多个变量赋值,要用等号隔开一个一个分别赋值,如:
int price = 0,amount = 100;
如果出现了赋值操作,即出现了等号,那么这种式子就叫做“表达式”,如price = 0;
· C语言是一种有类型的语言,每一个变量都必须要有类型,在使用前必须要做一次定义,所有的变量一旦确定了一种类型之后就不能改变,而类型表示在变量中可以存放什么样的数据。
再回到这个程序中来,再第四行出现了int change = 100 - price ;
也就是在定义第二个变量change的同时,做了一个计算。这个写法是C99的写法,因为C99允许你在程序的任何地方做定义。而传统的ANSI C只能在代码的开头定义变量。一旦你开始其他动作了就不能再定义变量。
而输入变量之后我们的程序怎么把它读进来呢?我们这里用到了另外一个函数scanf(),用于输入。函数中,一开始先要有一个字符串,这个我们叫做格式字符串,在这个字符串里我们可以用一个%d用于说明我们要读一个整数。然后接下来用逗号隔开,后面要加一个符号&和变量名。注意一定要加&,&是一个取地址符。
3.关于scanf
scanf是这样的:出现在格式字符串“”里的所有东西都是它要读的东西,%d表明要读一个整数,%f表示浮点数,其他东西是要你输入的东西。我们输入的东西要严格按照字符串内的格式才能被读到。
比如我们写了一个测试程序:
#include <stdio.h>int main()
{int a = 0;int b = 0; scanf("%d,%d",&a,&b);printf("%d %d",a,b); return 0;
}
我们得到编译运行,输入1 2。
这时我们发现,程序只读到了1,没有读到2。
而如果我们输入1,2。就能成功读取。
所以我们键入的值必须要严格按照printf双引号内部的形式。同理如果我们把程序改成:
printf("%d,%d ",&a,&b),也就是%d后面加了一个空格,那么我们输入值之后也要加空格才能被读到。
所以printf中的双引号内部的东西不是它要输出的,而是你一定要输入的,要特别小心这件事。
4.常量与变量
还是在change.c的程序中,出现了change=100-price这个表达式,这里的100是一个固定不变的数字,在程序运行中,100是不会变化的,price是会变化的,你输入多少它就变成多少。而不会变化的书我们叫做常量,这种直接写在程序里的我们叫直接量,但更好的方式是我们直接定义一个常量,给这个100一个名字。
给这种不变的量定义一个名字就变成了常量,写成:const int amount = 100;
const int AMOUNT = 100;
int price = 0;printf("请输入金额:");
scanf("%d",&price);int change = AMOUNT - price;
printf("找零%d元\n",change);
这种常量的定义一般是在程序一开始的地方,放在变量定义之前。这样将来要去修改这个常量的数值的时候可以很容易找到。
const是一个修饰符,用来修饰int,代表这个变量的值一旦被定义就不能被修改了。如果你const了这个变量后再给它赋值就会报错,因为这个时候它是只读的。
5.总结
变量是用于存储数据的内存空间,使用前需要先声明,声明变量的格式为:数据类型 变量名;
。
变量名的命名规则:只能由字母、数字和下划线组成,且不能以数字开头,不能使用 C 语言的关键字(如int
、float
等)。
初始化:在声明变量的同时给变量赋值,称为初始化。
二、基本数据类型
C 语言的基本数据类型包括:
-
int:
整数类型,用于存储整数,如123
、-45
。 -
float
:单精度浮点类型,用于存储小数,精度较低,如3.14f
。 -
double
:双精度浮点类型,用于存储小数,精度比float
高,如3.1415926
。 -
char
:字符类型,用于存储单个字符,如'a'
、'1'
,在内存中以 ASCII 码形式存储。
#include <stdio.h>int main() {int age; // 声明一个int类型的变量ageage = 20; // 给变量age赋值float height = 1.75f; // 声明并初始化一个float类型的变量heightchar gender = 'M'; // 声明并初始化一个char类型的变量genderprintf("年龄:%d\n", age); // 使用%d格式化输出整数printf("身高:%f\n", height); // 使用%f格式化输出浮点数printf("性别:%c\n", gender); // 使用%c格式化输出字符return 0;
}
三、运算符
C 语言的运算符种类繁多,包括算术运算符、关系运算符、逻辑运算符、赋值运算符等。
1. 算术运算符
+
:加法-
:减法*
:乘法/
:除法,整数相除结果为整数,如5 / 2 = 2
%
:取余,只能用于整数,如5 % 2 = 1
2. 关系运算符
==
:等于!=
:不等于>
:大于<
:小于>=
:大于等于<=
:小于等于
关系运算符的结果为1
(真)或0
(假)。
3. 逻辑运算符
&&
:逻辑与,两边都为真,结果才为真||
:逻辑或,两边有一个为真,结果就为真!
:逻辑非,取反
4. 赋值运算符
=
:赋值,将右边的值赋给左边的变量+=
:如a += b
等价于a = a + b
-=
:如a -= b
等价于a = a - b
*=
:如a *= b
等价于a = a * b
/=
:如a /= b
等价于a = a / b
%=
:如a %= b
等价于a = a % b
四、控制语句
控制语句用于控制程序的执行流程,包括分支语句和循环语句。
1. 分支语句
if
语句:根据条件执行不同的语句块。
#include <stdio.h>int main() {int score = 85;if (score >= 60) {printf("及格了\n");} else {printf("不及格\n");}return 0;
}
switch
语句:用于多分支选择。
#include <stdio.h>int main() {int day = 3;switch (day) {case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;default:printf("其他星期\n");}return 0;
}
break
语句用于跳出switch
语句,default
用于处理其他未列举的情况。
2. 循环语句
while
循环:当条件为真时,重复执行循环体。#include <stdio.h>int main() {int i = 1;while (i <= 5) {printf("%d ", i);i++;}return 0; }
for
循环:形式更简洁,适合已知循环次数的情况。
#include <stdio.h>int main() {for (int i = 1; i <= 5; i++) {printf("%d ", i);}return 0;
}
do-while
循环:先执行一次循环体,再判断条件,至少执行一次循环体。
#include <stdio.h>int main() {int i = 1;do {printf("%d ", i);i++;} while (i <= 5);return 0;
}