C ++ if else chain和nest用于变量比较

时间:2016-03-09 04:34:03

标签: c++ if-statement

我正在编写一个程序,该程序将取一个8位数字作为用户的输入,并将对其进行评估,以便如果任何出现3次以上的数字将标记为"不可接受&#34 ;;如果所有数字出现3次或更少次,则标记为"可接受"。

所以这些数字:

  

41124535,13134113,24255411

都会被标记为可接受,但这些

  

34233332,311111412,5551122

会被标记为不可接受。

我的方法是if ...... else链和巢。到目前为止,我已经设法完成链条工作,但它只能比较重复最多2次的数字。然后我有一个嵌套,但它只有在我每一步都写下else部分时才有效,而不是在最后留下一个其他的。这是至关重要的,因为最后的else部分将把算法带到一个新的if else嵌套,它将评估8位长数的其余部分。

该计划的开始:

cout << "\n\n\t Input 1st digit:";
cin >> A;
cout << "\t Input 2nd digit:";
cin >> B;
cout << "\t Input 3rd digit:";
cin >> C;
cout << "\t Input 4th digit:";
cin >> D;
cout << "\t Input 5th digit:";
cin >> E;
cout << "\t Input 6th digit:";
cin >> F;
cout << "\t Input 7th digit:";
cin >> G;
cout << "\t Input 8th digit:";
cin >> H;

cout << "\n\t The number is: [";
cout << A;
cout << B;
cout << C;
cout << D;
cout << E;
cout << F;
cout << G;
cout << H;
cout << "]";

if ... else链:

if (A==B)
cout << " Unacceptable!";
else
if (B==C)
cout << " Unacceptable!";
else
if (C==D)
cout << " Unacceptable!";
else
if (D==E)
cout << " Unacceptable!";
else
if (E==F)
cout << " Unacceptable!";
else
if (F==G)
cout << " Unacceptable!";
else
if (G==H)
cout << " Unacceptable!";
else
cout << " Acceptable";

然后是带有其他几个命令的嵌套:

if (A==B)
{
if (A==C)
{
if (A==D)
cout << " Unacceptable!";
else
cout << " Acceptable";
}
else
cout << " Acceptable";
}
else
cout << " Acceptable";

所以我的猜测是一个if ... else链,每个变量都有if ... else个嵌套,但我无法工作进行。

2 个答案:

答案 0 :(得分:1)

我不确定您是否因特定原因使用嵌套if语句 - 质疑等?我假设你没有。

你可以将数字读作一个字符串 - 你可以读作一个int,但是你必须从那里提取数字。

std::string input;
std::cin >> input;
/* validate input, make sure that it's 8 digits, 
 * that they are all digits, etc. - hint: int isdigit(int c) 
 */

您可以使用std::map来保留数字的直方图。

std::map< char, int > digit_histogram;
    for (auto ch : input) 
        digit_histogram[ch]++;

然后,任何数字dig的计数均可用作digit_histogram[dig]。您可以循环浏览地图,或从0-9循环播放,并丢弃任何> 3

这适用于任意数量的数字,并且它的长度为5行,无需进行错误检查。编程的目的是让计算机为你工作;)

答案 1 :(得分:1)

从一些测试开始。这有助于您了解您的要求,并阐明您的界面以及如何调用该函数。由于这不是单元测试的教程,我只是编写一个简单的程序来检查所有测试用例是否成功:

#include <cstdlib>
int main()
{
    // these should all return true
    if (!validate("41124535")) return EXIT_FAILURE;
    if (!validate("13134113")) return EXIT_FAILURE;
    if (!validate("24255411")) return EXIT_FAILURE;

    // these should all return false
    if (validate("34233332")) return EXIT_FAILURE;
    if (validate("31111412")) return EXIT_FAILURE;
    if (validate("55551122")) return EXIT_FAILURE;

    return EXIT_SUCCESS;
}

显然这不会编译,因为你还没有声明validate()。所以,在main()之前添加它:

#include <string>

bool validate(const std::string& s)
{
    return true;
}

它现在编译,但当然它失败了因为它永远不会返回false。现在我们可以编写解决方案。我们可以使用std::map

计算每个字符的出现次数
#include <map>
#include <string>

static const int max_repeats = 3;
bool validate(const std::string& s)
{
    std::map<char,int> counts;
    for (char c: s)
        if (++counts[c] > max_repeats)
            return false;
    return true;
}

现在,这会运行,但在第二次测试时失败(通过评论此测试并观察传递找到 - 一个真正的单元测试框架将为您识别失败的测试)。

失败的测试中有四个1,因此失败。它为什么要成功?啊,也许我们误解了这个要求!也许它的意图是字符串不超过三个连续相同的字符?我们也可以这样做,通过记录最近看到的角色和重复次数。

#include <string>

static const int max_repeats = 3;
bool validate(const std::string& s)
{
    char last_seen = 0;
    int repeats = 0;
    for (char c: s) {
        if (c != last_seen) {
            // reset the matcher
            last_seen = c;
            repeats = 1;
        } else {
            // have we seen too many?
            if (++repeats > max_repeats)
                return false;
        }
    }
    return true;
}

有一些事情需要清理,例如具有三个连续相同字符的测试用例,并且(可能)您可能想要验证参数字符串的长度。

然后您可以将其转换为完整的程序:

#include <iostream>

int main(int argc, char **argv)
{
    while (*++argv)
        std::cout << *argv << (validate(*argv) ? " OK" : " FAIL") << std::endl;
}