我正在编写一个程序,该程序将取一个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
个嵌套,但我无法工作进行。
答案 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;
}