У меня нет ошибок компиляции, но мой код не работает. В чем дело?

Я делаю простую программу, в которой я принимаю первые четыре цифры телефонного номера и должен сгенерировать все возможности для остальных цифр. Последние 6 цифр должны быть добавлены равными 33. Если четвертая цифра нечетная, пятая должна быть четной, а если четвертая цифра четная, то пятая должна быть нечетной.

Я установил, что это не сложение чисел и циклы for в функции plotNumbers () на самом деле не зацикливаются. Я полностью потерян. У кого-нибудь есть идеи?

#include "stdafx.h"#include <iostream>
#include <vector>

using namespace std;

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4);
bool findTrueFalse(vector<int> vec);

int _tmain(int argc, _TCHAR* argv[])
{
int digit1, digit2, digit3, digit4;
vector<int> number;

cout << "Enter the first four digits:\n";
cin >> digit1;
cin >> digit2;
cin >> digit3;
cin >> digit4;

if (digit4 == 0 || digit4 == 2 || digit4 == 4 || digit4 == 6 || digit4 == 8)
{
number.push_back(1);
plotNumbers(number, digit1, digit2, digit3, digit4);
}
else if (digit4 == 1 || digit4 == 3 || digit4 == 5 || digit4 == 7 || digit4 == 9)
{
number.push_back(0);
plotNumbers(number, digit1, digit2, digit3, digit4);
}
else
{
cout << "\nYou entered an illegal value.  Good-bye.\n\n";
}

system("pause");
return 0;
}

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4)
{

for ( ; number1[0] < 10; number1[0] += 2)
{
number1.push_back(0);for ( ; number1[1] < 10; ++number1[1])
{
number1.push_back(0);for ( ; number1[2] < 10; ++number1[2])
{
number1.push_back(0);for ( ; number1[3] < 10; ++number1[3])
{
number1.push_back(0);for ( ; number1[4] < 10; ++number1[4])
{
number1.push_back(0);for ( ; number1[5] < 10; ++number1[5])
{

bool total33 = findTrueFalse(number1);

if (total33)
{
cout << "(" << digit1 << digit2 << digit3 << ") ";
cout << digit4 << number1[0] << number1[1] << " - ";
cout << number1[2] << number1[3] << number1[4] << number1[5] << endl;
}
}
}
}
}
}
}
}

bool findTrueFalse(vector<int> vec)
{
int total = 0;
vector<int>::iterator postIt;

for (postIt = vec.begin(); postIt != vec.end(); ++postIt)
{
total += *postIt;
}

if (total == 33)
{
return true;
}
else
{
return false;
}

}

2

Решение

Прежде всего, попробуйте использовать короткие коды, чтобы избежать ошибок, таких как:

if (digit4 % 2 == 0)

вместо

if (digit4 == 0 || digit4 == 2 || digit4 == 4 || digit4 == 6 || digit4 == 8)

Во-вторых, вам нужно сделать number1.pushback(0) только один раз, но вы делаете это несколько раз. Знаете ли вы, что происходит, когда вы бежите number1.pushback(0)? Я думаю, нет:

  • это добавляет новый элемент со значением 0 в конце вашего вектора number1

Я предлагаю следующий код (вы делаете отступ):

#include "stdafx.h"#include <iostream>
#include <vector>

using namespace std;

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4);
bool findTrueFalse(vector<int> vec);

int _tmain(int argc, _TCHAR* argv[])
{
int digit1, digit2, digit3, digit4;
vector<int> number;

cout << "Enter the first four digits:\n";
cin >> digit1;
cin >> digit2;
cin >> digit3;
cin >> digit4;

if (digit4 % 2 == 0)
{
number.push_back(1);
for (int i=0; i<5; i++)
number.push_back(0);
plotNumbers(number, digit1, digit2, digit3, digit4);
}
else if (digit4 % 2 == 1)
{
number.push_back(0);
for (int i=0; i<5; i++)
number.push_back(0);
plotNumbers(number, digit1, digit2, digit3, digit4);
}
else
{
cout << "\nYou entered an illegal value.  Good-bye.\n\n";
}

system("pause");
return 0;
}

void plotNumbers(vector<int> number1, int digit1, int digit2, int digit3, int digit4)
{

for ( ; number1[0] < 10; number1[0] += 2)
{
number1[1] = 0;for ( ; number1[1] < 10; ++number1[1])
{
number1[2] = 0;for ( ; number1[2] < 10; ++number1[2])
{
number1[3] = 0;for ( ; number1[3] < 10; ++number1[3])
{
number1[4] = 0;for ( ; number1[4] < 10; ++number1[4])
{
number1[5] = 0;for ( ; number1[5] < 10; ++number1[5])
{

bool total33 = findTrueFalse(number1);

if (total33)
{
cout << "(" << digit1 << digit2 << digit3 << ") ";
cout << digit4 << number1[0] << number1[1] << " - ";
cout << number1[2] << number1[3] << number1[4] << number1[5] << endl;
}
}
}
}
}
}
}
}

bool findTrueFalse(vector<int> vec)
{
int total = 0;
vector<int>::iterator postIt;

for (postIt = vec.begin(); postIt != vec.end(); ++postIt)
{
total += *postIt;
}

if (total == 33)
{
return true;
}
else
{
return false;
}

}
1

Другие решения

Как вы точно проверили, работают ли они? Потому что в моей программе они есть, но я думаю, что вы не понимаете, как они на самом деле работают (без обид означает).

Рассмотрим этот фрагмент:

int i = 0;
int j = 0;

for (; i < 10; i += 1) { //OUTER for
cout << "i == " << i << endl;

for (; i < 10; j += 1;) { //INNER for
cout << "j == " << j << endl;
}
//THIS POINT
}

Эта программа войдет в цикл OUTER, распечатает «i == 0», затем введет ВНУТРЕННЮ петлю, напечатав 10 строк с «j == …». Теперь в ЭТОЙ ТОЧКЕ j == 10, поэтому, когда код выполняет еще один цикл для ‘i’ и проверяет условие для INNER, он видит j == 10, поэтому 10 не ниже 10, поэтому он пропускает INNER для.

Это именно то, что происходит в вашей программе. Когда вы выходите из цикла INNER с заданной переменной управления, как это, вы должны помнить, чтобы изменить ее значение на то, что соответствует условию, если вы хотите ввести цикл INNER в следующем цикле цикла OUTER.

Я изменил ваш код, чтобы сделать это так, и, похоже, он работает нормально. Все, что вам нужно сделать, это добавить 4 строки кода после того, как INNER зацикливается в вашем коде, чтобы обнулить их управляющие переменные.

РЕДАКТИРОВАТЬ :
Кроме того, рассмотрите ответ Emabs, так как ваш вектор обслуживания довольно плох.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector