gpt4 book ai didi

c++ - 关于程序 C++ 正确设计的困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:57 25 4
gpt4 key购买 nike

我制作了一个生成素数的小程序,让用户检查一个数字,看看它是否是素数。问题是,我不确定如何正确设计它。这是程序:

#include <iostream>
#include <vector>

typedef unsigned long long bigint;

std::vector<bool> sieve(size_t size)
{
std::vector<bool> primelist(size);

primelist[0] = false;
primelist[1] = false;

for (bigint i = 2; i < size; ++i) { primelist[i] = true; }

for (bigint i = 2; i * i < size; ++i)
{
if (primelist[i])
{
for (bigint j = i; j * i < size; ++j)
primelist[i*j] = false;
}
}

return primelist;
}

int main()
{
bigint range;
bigint number;
std::vector<bool> primes;

std::cout << "Enter range: " << std::endl;
std::cin >> range;

primes = sieve(range);

while (1)
{
std::cout << "Enter number to check: " << std::endl;
std::cin >> number;

if (primes[number])
std::cout << "Prime" << std::endl;

else
std::cout << "Not prime" << std::endl;
}

return 0;
}

我要实现的基本流程是:输入范围,/handle input/,输入要检查的数字,/handle input/

我还想为用户提供在任何给定时间更改范围的选项,方法是编写“更改范围 number”之类的命令

我有几个问题:

如果用户输入的范围大于 unsigned long long,并且如果用户基本上超过任何限制(例如,如果他输入的范围是 100,那么如果他检查 101),我希望程序处于受控状态异常将被捕获。我知道这需要使用 try/catch/throw 来实现,但我不知道如何做到这一点,同时保留更改范围的选项并且不使我的代码变成意大利面条式代码。

此外,我希望错误是枚举类型(我读到枚举对异常有好处),比如

enum errors
{
OUT_OF_RANGE = 1, //Out of the range specified by the user
INCORRECT_VALUE, //If user input "one" instead of 1
RANGE_SIGNED, //If user inputs a signed value for range
NUM_LIMITS //Number exceeds unsigned long long
};

我不知道如何使用异常处理,更不用说将它与枚举一起使用了。我到底该如何保证这个程序的安全和运行,同时远离意大利面条代码?

我很困惑。如果有人能帮助我正确地设计这个程序并保持可读性和效率,那将真正改善我 future 的程序设计。

感谢阅读!

最佳答案

你问了很多。

您想验证用户输入。用户不应输入大数字、非整数等。

我将首先回答这绝对不是应该使用异常的场景。异常用于处理异常情况。这些是您无法预料或无法真正处理的问题。

用户输入的数字太大?你可以处理的。告诉他们他们的数字太大,请输入 1 到 X 之间的数字。

用户输入苹果这个词?你可以处理的。告诉他们只能输入整数。

实现此目的的一种方法是创建一个 ValidateInput 函数。您可以让它返回一个数字(或一个枚举,它们基本上是同一个东西)来告诉您是否有错误。

为了进行验证,您很可能必须接收作为 std::string 的输入,然后在将其转换为数字之前对其进行验证。将输入作为 unsigned int 或类似的整数类型并不能真正让您检查错误。

这会增加一些工作量,因为您需要手动验证输入。有一些函数库可以帮助解决这个问题,例如 boost::lexical_cast,但现在这对您来说可能太多了。

下面是一些非常基本的伪代码来说明我的意思。它只是为了让您知道该怎么做,它不会为您编译或完成工作。您可以通过制作一个基于错误代码等返回消息的通用函数来进一步扩展它。

enum error_code {
SUCCESS, // No error
OUT_OF_RANGE, // Out of the range specified by the user
INCORRECT_VALUE, // If user input "one" instead of 1
RANGE_SIGNED, // If user inputs a signed value for range
NUM_LIMITS // Number exceeds unsigned long long
};

// This function will check if the input is valid.
// If it's not valid, it will return an error code to explain why it's invalid.
error_code ValidateInput(const std::string& input) {
// Check if input is too large for an unsigned long long
if (InputIsTooLarge)
return NUM_LIMITS;
// Check if input is negative
if (InputIsNegative)
return RANGE_SIGNED;
// Check if input is not an integer
if (InputIsNotInteger)
return INCORRECT_VALUE;
// If we make it here, no problems were found, input is okay.
return SUCCESS;
}

unsigned long long GetInput() {
// Get the user's input
std::string input;
std::cin >> input;

// Check if the input is valid
error_code inputError = ValidateInput(input);

// If input is not valid, explain the problem to the user.
if (inputError != SUCCESS) {
if (inputError == NUM_LIMITS) {
std::cout << "That number is too big, please enter a number between "
"1 and X." << std::endl;
}
else if (inputError == RANGE_SIGNED) {
std::cout << "Please enter a positive number." << std::endl;
}
else if (inputError == INCORRECT_VALUE) {
std::cout << "Please enter an integer." << std::endl;
}
else {
std::cout << "Invalid input, please try again." << std::endl;
}

// Ask for input again
return GetInput();
}
// If ValidateInput returned SUCCESS, the input is okay.
// We can turn it into an integer and return it.
else {
return TurnStringIntoBigInt(input);
}
}

int main() {
// Get the input from the user
unsigned long long number = GetInput();

// Do something with the input
}

关于c++ - 关于程序 C++ 正确设计的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5197777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com