用 Haskell 求解 ACM 竞赛题(2):变量及其输入

本文讲解了如何在C和Haskell语言中通过键盘输入进行数据读取,实现数学计算并展示了一个圆柱体表面积计算的示例。讨论了输入输出格式在算法竞赛中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节的程序虽好, 但有一个遗憾: 计算的数据是事先确定的。 为了计算 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 = do
    s <- getLine
    t <- getLine
    let a = read s
    let b = read t
    return (a + b)

说明

  • let :目前可以理解为“赋值”语句。

也可以写成下面这个样子:

main = do
    a <- getLine
    b <- getLine
    return (read a + read b)

说明

  • read 字符串 :把字符串转换成数。

程序 1-5 圆柱体 的 表面积:输入底面半径 r 和高 h, 输出圆柱体的表面积, 保留 3 位小数,格式见样例。样例输入: 3. 59 样例输出:Area = 274. 889

【分析】 圆柱体的表面积由 3 部分组成: 上底面积、 下底面积和侧面积。 由于上下底面积 相等, 完整的公式可以写成:表面积 = 底面积 × 2+ 侧面积。

根据几何知识, 底面积 = πr2\pi r^2πr2, 侧面 积 = 2πrh2\pi rh2π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 = do
    let pi = 3.1415926535
    sr <- getLine
    sh <- getLine
    let r = read sr :: Float
    let h = read sh :: Float
    let s1 = (pi*r*r) :: Float
    let s2 = (2.0*pi*r*h) :: Float
    return (2.0*s1 + s2)

代码与 C 语言相仿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值