到目前位置,我们其实没有真正得编写出一个像样的、可以执行的程序出来。自己编写代码并且执行所带来的成就感是很强的,虽然之前看了很多枯燥又无味的文字,这个时候还是会小兴奋一会。这就是我第一次写出一段代码后的感受。在这一部分,我们将较为正式地开始编写代码,并且学习程序的三种基本结构之一——顺序结构。
计算机的组成原理决定了我们程序指令在局部是顺序执行的。也就是说,只有执行了前一条指令,后一条指令才能够被执行。这就要求我们编写代码时,一定要安排好语句的先后顺序。下面我们设计一个计算长方形的周长和面积的小程序。
我们分析一下程序的流程应该是怎样的。
程序设计的目的是将重复枯燥的工作自动化,不应该只计算一个正方形的周长和面积。相反,程序只要被告知长和宽,就应该能够正确得反馈出计算的结果。所以,程序的第一个步骤是输入长和宽。
得到了长和宽,再依据数学计算公式,程序就可以正确计算结果了。所以,程序的第二个步骤是计算。
程序应该告诉别人它计算的结果。所以,第三个步骤是输出。
简单的来说,我们要编写的这个程序的流程就是:输入->计算->输出。
下面,我们按照之前想好的流程来组织代码。
计算机的数据是以常量或变量的形式出现。每一个常量或是变量都在内存中占据一定的内存空间,否则他们无法保存自己的值。我们来数数这个小程序到底要用到哪些变量呢?作为输入的变量,长方形的长和宽必须得有;而作为输出的变量,长方形的周长和面积也必须得有。这样我们就必须在程序中声明四个变量,以告诉计算机及时分配相关的内存空间:
double length1; // 长方形的长
double length2; // 长方形的宽
double perimeter; // 长方形的周长
double area; // 长方形的面积
定义变量的格式为:数据类型关键字 变量名;
我们一般都会在变量声明后面加上注释,否则别人可能无法理解变量的作用,甚至作为作者的自己,也会忘记为什么要搞这个奇怪的变量。我们会精心地为自己的小孩取一个好听的名字。变量名如人名,我们也不能随便给变量起个abc这样的名字。变量名不用太长,但也要一目了然,一眼就可以明白其含义和发挥的作用。
变量有了,我们就可以输入长和宽了。为了用户的方便,才用问答式的交互更好。所以我们用下面的语句让计算机对人进行提问:
printf("请输入长方形的长:");
这条语句是调用库函数printf()。其本质就是在屏幕上打印出几个字符。下面,我们需要回答,需要就用下面语句。
scanf("%lf", &length1);
这条语句是调用库函数scanf()。其中,"%lf"是个占位符,当要输入double类型的值时需要用到这个占位符。后面的&length1,表示取变量length1的的内存地址。这条语句的意思是,首先从键盘获得数字的输入,然后把它保存到变量length1所在内存空间中去。
同样的,对长方形宽的问答有下面的语句:
printf("请输入长方形的宽:");
scanf("%lf", &length2);
此时,计算机已经知道了我们要计算的长方形的长和宽了。下面就可以进行计算了。依据数学公式就可以有下面的两条语句:
perimeter = (length1 + length2) * 2;
area = length1 * length2;
上面两条语句均为赋值语句,而其中的等号"="是赋值的意思。赋值语句的意思是,首先计算等号右边的表达式的值,然后把表达式的值在保存在等号左边的变量所在的内存空间中。
这时,程序已经计算出结果了,并且长和宽分别保存在变量perimeter和area所在的内存空间中。(以后,除非特殊说明,提到某个变量其实就是指变量所在的内存空间。)接下来的任务就是输出结果了。相关的语句就是:
printf("长方形的周长:%lf\n", perimeter);
printf("长方形的面积:%lf\n", area);
上面两条语句似曾相识,但和之前遇到的那条函数调用有点不一样。引号中出现了"%lf",而且多了", perimeter"。估计你也猜出来了,"%lf"是个占位符,表示这个地方要放一个double类型的值,其值的内容要由后面的变量perimeter决定。(printf()函数和scanf()函数的使用需要注意的地方是,printf()里面的变量名前面是没有"&",而scanf()里面的变量名前面是有"&"的。)
为了告诉人们整个流程结束了,我们可以加上下面这一条语句:
printf("Done!\n");
这一条语句中出现了'\n',这个是换行符,表示到这个地方要换行。其实在程序上,这一条不是必须的,只是我们输出这一句在逻辑上表示程序的结束。同样的,我们也可以在输入长和宽之前加上下面的一句,表示程序的开始:
printf("Begin!\n");
这样,我们把上面的代码片段组合在一起,就得到了下面的代码
============================================================
/* rectangle.c —— 计算长方形的周长和面积 */
#include<stdio.h>
int main(void)
{
double length1; // 长方形的长
double length2; // 长方形的宽
double perimeter; // 长方形的周长
double area; // 长方形的面积
printf("Done!\n");
printf("请输入长方形的长:");
scanf("%lf", &length1);
printf("请输入长方形的宽:");
scanf("%lf", &length2);
perimeter = (length1 + length2) * 2;
area = length1 * length2;
printf("长方形的周长:%lf\n", perimeter);
printf("长方形的面积:%lf\n", area);
printf("Done!\n");
return 0;
}
============================================================
可能还有人对最开始的#include <stdio.h>有疑惑。因为我们用到了库函数printf()和scanf(),所以就必须包含它们的函数原型所在头文件stdio.h。
下面,赶快编译执行吧,看看结构是否正确。