Конвертация почтового индекса в штриховой код

0

Доброе утро, я все время пытаюсь завершить свой код, который конвертирует почтовые индексы в штрих-коды. Мне нужно ввести, как правильно создать последнюю цифру, которая является контрольной цифрой. для контрольной цифры вы должны добавить каждое индивидуальное значение почтового индекса и добавить контрольную цифру, которая делает это значение кратным 10. Например, 90210 равно 9 + 0 + 2 + 1 + 0 = 12, поэтому контрольная цифра будет 8, чтобы сделать значение 20. Этот код отлично работает, за исключением того, что он неправильно вычисляет контрольную цифру, что мне здесь не хватает? Я полностью застрял здесь, и любой совет будет замечательным.

Код

#include <iostream>
#include <string>


int error;
char a [] = ":::||";
char b [] = "::|:|";
char c [] = "::||:";
char d [] = ":|::|";
char e [] = ":|:|:";
char f [] = ":||::";
char g [] = "|:::|";
char h [] = "|::|:";
char i [] = "|:|::";
char j [] = "||:::";
int digit1 = 0;
int digit2 = 0;
int digit3 = 0;
int digit4 = 0;
int digit5 = 0;
int digit6 = 0;
int temp1 = 0;

int main()
{
\
std::cout << "Enter the zipcode! \n";
std::cin >> temp;

//The initial if statement determines if the number entered has more than 5 digits and decides which procedure to use
if (temp / 10000 > 9){
    temp1 = temp;

//Set each digit to a seperate variable
if (temp % 10 > 0){
    do{ 
    (temp1 = temp1 / 10);
    }
    while (temp1 / 10 > 0);
}
digit1 = temp1;

    temp1 = temp;
if (temp % 10 > 0){
    do{ 
    (temp1 = temp1 / 10);
    }
    while (temp1 / 10 > 10);
}
digit2 = temp1 - (digit1 * 10);

        temp1 = temp;
if (temp % 10 > 0){
    do{ 
    (temp1 = temp1 / 10);
    }
    while (temp1 / 10 > 100);
}
digit3 = temp1 - ((digit1 * 100)+(digit2*10));

    temp1 = temp;
if (temp % 10 > 0){
    do{ 
    (temp1 = temp1 / 10);
    }
    while (temp1 / 10 > 1000);
}
digit4 = temp1 - ((digit1 * 1000)+(digit2*100)+(digit3*10));

    temp1 = temp;
if (temp % 10 > 0){
    do{ 
    (temp1 = temp1 / 10);
    }
    while (temp1 / 10 > 10000);
}
digit5 = temp1 - ((digit1*10000)+(digit2*1000)+(digit3*100)+(digit4*10));


}else {
digit5 = temp % 10;
temp = temp / 10;
digit4 = temp % 10;
temp = temp / 10;
digit3 = temp % 10;
temp = temp / 10;
digit2 = temp % 10;
temp = temp / 10;
digit1 = temp % 10;}


//this portion checks to see if there are more than five digits and puts a boolean value into error accordingly
if ((temp / 10) > 0) error = 1;
else error = 0;
std::cout << "If the following value is the same as the first five digits of the value entered, the digit distribution worked properly.\n";
std::cout << digit1 << digit2 << digit3 << digit4 << digit5 << "\n";

//COnvert digits to barcodes
std::cout << "|";

if (digit1 == 1) std::cout << a;
else if (digit1 == 2) std::cout << b;
else if (digit1 == 3) std::cout << c;
else if (digit1 == 4) std::cout << d;
else if (digit1 == 5) std::cout << e;
else if (digit1 == 6) std::cout << f;
else if (digit1 == 7) std::cout << g;
else if (digit1 == 8) std::cout << h;
else if (digit1 == 9) std::cout << i;
else if (digit1 == 0) std::cout << j;

if (digit2 == 1) std::cout << a;
else if (digit2 == 2) std::cout << b;
else if (digit2 == 3) std::cout << c;
else if (digit2 == 4) std::cout << d;
else if (digit2 == 5) std::cout << e;
else if (digit2 == 6) std::cout << f;
else if (digit2 == 7) std::cout << g;
else if (digit2 == 8) std::cout << h;
else if (digit2 == 9) std::cout << i;
else if (digit2 == 0) std::cout << j;

if (digit3 == 1) std::cout << a;
else if (digit3 == 2) std::cout << b;
else if (digit3 == 3) std::cout << c;
else if (digit3 == 4) std::cout << d;
else if (digit3 == 5) std::cout << e;
else if (digit3 == 6) std::cout << f;
else if (digit3 == 7) std::cout << g;
else if (digit3 == 8) std::cout << h;
else if (digit3 == 9) std::cout << i;
else if (digit3 == 0) std::cout << j;

if (digit4 == 1) std::cout << a;
else if (digit4 == 2) std::cout << b;
else if (digit4 == 3) std::cout << c;
else if (digit4 == 4) std::cout << d;
else if (digit4 == 5) std::cout << e;
else if (digit4 == 6) std::cout << f;
else if (digit4 == 7) std::cout << g;
else if (digit4 == 8) std::cout << h;
else if (digit4 == 9) std::cout << i;
else if (digit4 == 0) std::cout << j;

if (digit5 == 1) std::cout << a;
else if (digit5 == 2) std::cout << b;
else if (digit5 == 3) std::cout << c;
else if (digit5 == 4) std::cout << d;
else if (digit5 == 5) std::cout << e;
else if (digit5 == 6) std::cout << f;
else if (digit5 == 7) std::cout << g;
else if (digit5 == 8) std::cout << h;
else if (digit5 == 9) std::cout << i;
else if (digit5 == 0) std::cout << j;

//Check digit calculation

if (error == 0){
int temporary = digit1 + digit2 + digit3 + digit4 + digit5;
int temporary1 = temporary;
if (temporary % 10 != 1){
do {
    temporary1++;
}while (temporary1 % 10 != 1);
}
digit6 = temporary1 - temporary;

if (digit6 == 1) std::cout << a;
else if (digit6 == 2) std::cout << b;
else if (digit6 == 3) std::cout << c;
else if (digit6 == 4) std::cout << d;
else if (digit6 == 5) std::cout << e;
else if (digit6 == 6) std::cout << f;
else if (digit6 == 7) std::cout << g;
else if (digit6 == 8) std::cout << h;
else if (digit6 == 9) std::cout << i;
else if (digit6 == 0) std::cout << j;
}
else
    std::cout << "error - you entered more than 5 digits \n";

//lastly, the closing | for the barcode
std::cout << "| \n";

return 0;
}
  • 1
    Пожалуйста, научитесь правильно использовать массивы, условия и циклы.
  • 0
    Уменьшенная версия (циклы добавлены, любые другие ошибки и т. Д. Не исправлены): dumptext.com/rqRPOLKA
Теги:
zip

3 ответа

0
Лучший ответ

Пожалуйста, исследуйте таблицы поиска. При преобразовании таблицы поиска - это благо, особенно простые структуры массивов.

static const char barcodes[] =
{
  /* a */ ":::||",
  /* b */ "::|:|",
  /* c */ "::||:",
  /* d */ ":|::|",
  /* e */ ":|:|:",
  /* f */ ":||::",
  /* g */ "|:::|",
  /* h */ "|::|:",
  /* i */ "|:|::",
  /* j */ "||:::",
};

Чтобы получить штрих-код для письма:

char letter;
std::string barcode_string;

//...
if ((letter >= 'a') && (letter <= 'j'))
{
  unsigned int table_index = letter - 'a';
  barcode_string = barcodes[table_index];
}

Извините, что упростил ваш код, но мне было досадно читать.

Вы можете обрабатывать цифры (как символы) аналогичным образом:

   table_index = digit_character - '0';

Если вы хотите обрабатывать целые числа,

  • используйте /10 чтобы сдвинуть число вправо.
  • используйте % 10 чтобы получить значение самой правой цифры.

Поместите внутри цикла for для обработки многих цифр:

int number;
//...
while (number > 0)
{
  int digit = number % 10;
  std::string digit_barcode_text = digit_barcodes[digit];
  std::cout << digit_barcode_text "\n";
  // Shift number right
  number = number / 10;
}

Обратите внимание, что вышеуказанный цикл обрабатывает цифры в обратном порядке. Вы можете нажать их на стек, а затем вытащить их, чтобы отменить порядок.

Я предлагаю обрабатывать число в виде символов, это проще.

0

Комментарий стиля в сторону, вы захотите чего-то подобного вместо этого, там есть простая математическая связь между контрольной цифрой и суммой цифр:

        if (error == 0){
            int digitSum = (digit1 + digit2 + digit3 + digit4 + digit5) % 10;
            digit6 = 10 - digitSum;
            digit6 %= 10;
        }
-2

Сначала попробуйте сохранить ваши коды как можно меньше, например, все эти
std :: cout <<;
заявления могут быть заменены включением
использование пространства имен std;
сразу после
#include string
более того, разделите свои коды только на раздел с проблемой для простого определения ошибок.

  • 0
    Нет, таким образом вы не можете избавиться от всего std::cout , и это не отвечает на вопрос.
  • 0
    @deviantfan что ты имеешь ввиду не можешь?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню