C++排雷:2.算法完整性的思考——以小题为例

本文通过对比初解与正解,详细解析了如何使用C++编写一个程序,该程序能接受用户输入的任意两个整数,无论大小顺序,都能正确输出两者之间的所有整数,展示了代码鲁棒性的重要性。

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

题目:
写一个程序,提示用户输入两个整数,然后自动打印出两整数所指定范围内的所有整数。
初解
看到这个题目,大脑一秒水出了答案。cin两个数,借助自加自减运算符,用for 或while 循环输出:

#include<iostream>
using namespace std;
int main()
{
int a,b;
cout<<"请输入两个整数\n";
cin<<a<<b;
while (a<=b)
{
	cout<<a<<endl;
	a++
}

return 0;
}

洋洋洒洒写了1分钟,心里想,这种小问题都不用编译就知道过了。
鄙人本着负责任的态度,还是编译了一下,结果- -发现错误若干。。。

  • 写Python写多了有的语句掉了分号
  • cin的流入符号方向写反
  • while的条件语句忘带括号
    这些错误无伤大雅,毕竟整体思路是对的,这就行了叭。。。。
    结果看了一下小试题的答案,发现自己too young

正解:
前面的解法,输入1 和 5测试,得到了期望的结果:

请输入两个整数
1
5
1
2
3
4
5

但输入并不是只有这一个逻辑,我们只是请求输入两个整数,但并没有指定两个整数孰大孰小,所以输入的情况会有,a<b ,a>b和a=b。
一个合格的程序应该是有足够强的鲁棒性,考虑到用户可能的所有操作,并相应地采取解决方案,在这里如果用户输入的不是1 5而是5 1:

请输入两个整数
5
1

E:\Code\code19\输出整数范围\Debug\输出整数范围.exe (进程 17336)已退出,代码为 0

并不会返回我们期望的结果。
因此一个考虑较全面的解题代码应该如下:

#include<iostream>
using namespace std;
int main()
{
	int a, b;
	cout << "请输入两个整数\n";
	cin >> a >> b;
	if (a <= b)
	{
		while (a <= b)
		{
			cout << a << endl;
			a++;
		}
	}
	else
	{
		while (a >= b)
		{
			cout << a << endl;
			a--;
		}
	}
}

以上代码,满足了题目的基本需求。
需要注意的是else的应用,else认为是前面所有判断条件以外的所有可能,因此需要思考的是,所有的可能是哪些、else会执行哪些,以免其他特殊情况误入else的执行语句中。

此外,在满足了基本需求后,应该考虑的是进一步优化。

  • 代码的可读性,变量命名有实际含义,如a,b可修改为int01,int02或者inpu_int1,inpu_int2等让大家都能理解其含义的名称。此外还要在关键语句加上必要的注释
  • 代码的时效性, 在满足条件的情况下考虑更简洁更高效的运算方式
  • 代码的功能性延伸,可以考虑循环地录入用户的输入,用户输入非整数时提示错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值