标签:acm-icpc 位置 乐趣 答案 语句 不能 题集 acm ack
题目:编写程序,提示用户输入两个整数,打印输出这两个整数所指定范围内的所有整数。
这道题对于任何 C++ 新手程序员来说都不难,问题在于它出现的位置在书中 while
知识点后,而关于 if-else
语句和 ==
运算符是在后面才提到的。后面也有对应的练习要求使用 if-else
语句重写此题,所以这题只能用 while
来写。我在网上,包括 C++ Primer 的中文习题集中都没有看到一个让自己满意的答案,索性自己写了一个。
这一题对于纯编程新手来说可能更简单一些,因为程序顺序执行,所以可能会更加自然地想到使用两个 while
语句。不过如果你忽略了对输入的两个值的大小情况分析的话,这题是写不对的。有经验的程序员由于思维定势,对于多情况的情景,会直接去使用 if-else
语句,当然这样的代码可读性更强,可换个角度来看,只使用 while
和一些小技巧来实现同样的效果,是不是更有助于理解它的使用呢?
我们先看看使用了 if-else
的写法,比较直接:
#include <iostream>
int main()
{
std::cout << "Please enter two number: ";
std::cout << std::endl;
int v1, v2;
std::cin >> v1 >> v2;
if (v1 <= v2)
{
while (v1 <= v2)
{
std::cout << v1 << " ";
v1++;
}
}
else // v1 > v2
{
while (v1 >= v2)
{
std::cout << v1 << " ";
v1--;
}
}
return 0;
}
当强迫你不能用 if-else
时,便需要利用语句的特性了:
#include <iostream>
int main()
{
std::cout << "Please enter two number: ";
std::cout << std::endl;
int v1, v2;
std::cin >> v1 >> v2;
while (v1 < v2){
std::cout << v1 << " ";
v1++;
}
while (v1 >= v2){
std::cout << v1 << " ";
v1--;
}
return 0;
}
注意到了吗,如果 v1 < v2
,两个 while
都会被执行,而且第二个 while
只执行一次(针对 v1==v2
)的情况。如果 v1 >= v2
,前一个 while
被跳过,后面的语句并不难理解。为什么要这样写呢?这就是考虑到程序顺序执行的特点而做的一些小技巧,其它的写法要么不够简洁,要么不好处理 v1==v2
的情况。如果你一开始就能想到这种写法,说明你的思路还是很敏捷的。大部分 ACM-ICPC 选手会经历一个阶段,热衷于将代码量压缩到极致,虽然牺牲了可读性(避免被 Hack),但是其中的乐趣还是很多的。
标签:acm-icpc 位置 乐趣 答案 语句 不能 题集 acm ack
原文地址:https://www.cnblogs.com/accepteddoge/p/cpp-primer-ex01-11.html