上一节的程序虽好, 但有一个遗憾: 计算的数据是事先确定的。 为了计算 1 + 2 和 2 + 3, 下面不得不编写两个程序。 可不可以让程序读取键盘输入,并根据输入内容计算结果呢? 答案是肯定的。 程序如下:
程序 1- 4 a+ b 问题
#include<stdio.h>
int main() { int a, b; scanf("% d% d", &a, &b); printf("% d\ n", a+ b); return 0;
}
该程序比上节的复杂了许多。 简单地说, 第一 条语句“ int a, b” 声明了两个整型( 即整数类型) 变量 a 和 b, 然后读取键盘输入, 并放到 a 和 b 中。 注意 a 和 b 前面 的“&” 符号—— 千万不要漏掉, 不信可以试试( 2)。 现在, 你的 程序已经读入两个整数, 可以在表达式中自由使用它们, 就好比使用 12、 597 这样的常数。 这样, 表达式 a+ b 就不难理解了。
Haskell 代码如下:
main = dos <- getLinet <- getLinelet a = read slet b = read treturn (a + b)
说明
- let :目前可以理解为“赋值”语句。
也可以写成下面这个样子:
main = doa <- getLineb <- getLinereturn (read a + read b)
说明
- read 字符串 :把字符串转换成数。
程序 1-5 圆柱体 的 表面积:输入底面半径 r 和高 h, 输出圆柱体的表面积, 保留 3 位小数,格式见样例。样例输入: 3. 59 样例输出:Area = 274. 889
【分析】 圆柱体的表面积由 3 部分组成: 上底面积、 下底面积和侧面积。 由于上下底面积 相等, 完整的公式可以写成:表面积 = 底面积 × 2+ 侧面积。
根据几何知识, 底面积 = π r 2 \pi r^2 πr2, 侧面 积 = 2 π r h 2\pi rh 2πrh。 不难写出完整程序:
#include <stdio.h>
#include <math. h>
int main() { const double pi = acos(- 1. 0); double r, h, s1, s2, s; scanf("% lf% lf", &r, &h); s1 = pi* r* r; s2 = 2* pi* r* h; s = s1* 2. 0 + s2; printf(" Area = %.3f\ n", s);return 0;
}
这是本书中第一个完整的“竞赛题目”, 因为和正规比赛一样, 题目中包含着输入输出格式规定, 还有样例数据。 大多数的算法竞赛包含如下一些相同的“游戏规则”。 首先, 选手程序的 执行是自动完成的, 没有人工干预。 不要在用户输入之前打印提示信息(例如“ Please input n:”), 这不仅不会为程序赢得更高的“ 界面友好分”, 反而会让程序丢掉大量的( 甚至所有 的) 分数——这些提示信息会被当作输出数据的一部分。
ACM竞赛规则试根据 C 语言输入输出库设计的,这与 Haskell 的输入输出不一样,因此后面我用 Haskell 语言编写代码的时候,不再拘泥于 ACM 竞赛对 IO 格式的要求。
Haskell 代码:
main = dolet pi = 3.1415926535sr <- getLinesh <- getLinelet r = read sr :: Floatlet h = read sh :: Floatlet s1 = (pi*r*r) :: Floatlet s2 = (2.0*pi*r*h) :: Floatreturn (2.0*s1 + s2)
代码与 C 语言相仿。