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

Prior to 2009 the bar code on an envelope used by the U.S. Postal Service represented
a five (or more) digit zip code using a format called POSTNET. The bar
code consists of long and short bars as shown here:
For this program, we will represent the bar code as a string of digits. The digit 1
represents a long bar, and the digit 0 represents a short bar. Therefore, the bar code
shown would be represented in our program as follows:
110100101000101011000010011
The first and last digits of the bar code are always 1. Removing these leave 25 digits.
If these 25 digits are split into groups of five digits each then we have the following:
10100 10100 01010 11000 01001
Next, consider each group of five digits. There always will be exactly two 1’s in
each group of digits. Each digit stands for a number. From left to right, the digits
encode the values 7, 4, 2, 1, and 0. Multiply the corresponding value with the digit
and compute the sum to get the final encoded digit for the zip code. The following
table shows the encoding for 10100.
Bar Code Digits 1 0 1 0 0
Value 7 4 2 1 0
Product of
Digit * Value
7 0 2 0 0
Zip Code Digit = 7 + 0 + 2 + 0 + 0 = 9
Repeat this for each group of five digits and concatenate to get the complete zip
code. There is one special value. If the sum of a group of five digits is 11, then this
represents the digit 0 (this is necessary because with two digits per group it is not
possible to represent zero). The zip code for the sample bar code decodes to 99504.
While the POSTNET scheme may seem unnecessarily complex, its design allows
machines to detect if errors have been made in scanning the zip code.
Write a zip code class that encodes and decodes five-digit bar codes used by the
U.S. Postal Service on envelopes. The class should have two constructors. The first
constructor should input the zip code as an integer, and the second constructor
should input the zip code as a bar code string consisting of 0’s and 1’s as described
above. Although you have two ways to input the zip code, internally, the class
should only store the zip code using one format. (You may choose to store it as a
bar code string or as a zip code number.) The class also should have at least two
public member functions: one to return the zip code as an integer and the other
to return the zip code in bar code format as a string. All helper functions should be
declared private. Embed your class definition in a suitable test program.

Это то что пока сделал — не работает )

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <string>
using namespace std;


class ZipCode
{
public:
    ZipCode(int zip); // CONSTRUCTOR 1
    //Input Zip Code as Integer

    ZipCode(string zip); // CONSTRUCTOR 2
    //Input Zip Code as String of 1's and 0's


    int getZipCodeAsInt();
    string getZipCodeAsString();

    void input();
    void output();

    void setZipCodeAsInt(int p_zip);
    void setZipCodeAsString(string p_zip);




private:

    int zipcode;
    int zipCodeAsInt;
    string zipCodeAsString;




};

int main()
{   
    int zipint;
    string zipstring;

    cout << "Please Enter a ZIP - ";
    cin >> zipint;
    cout << endl;


    ZipCode test1(zipint);
    cout << "account1 initialized as follows:\n";
    test1.output();


    /*account1 = ZipCode(999, 99, 5.5);
    cout << "account1 reset to the following:\n";
    account1.output();

    cout << "Enter new data for account 2:\n";
    account2.input();
    cout << "account2 reset to the following:\n";
    account2.output();

    account2.update();
    cout << "In one year account2 will grow to:\n";
    account2.output();*/

    cin.get();
    cin.get();
    return 0;
}



ZipCode::ZipCode(int zip)
{
    setZipCodeAsInt(zip);
}

ZipCode::ZipCode(string zip)

{
    setZipCodeAsString(zip);
}




void ZipCode::output()
{

    cout << "zipcode - " << zipcode << endl;
    cout << "ZipCodeAsInt - " << zipCodeAsInt << endl;
    cout << "ZipCodeAsString - " << zipCodeAsString << endl;

}



int ZipCode::getZipCodeAsInt()
{
    return zipCodeAsInt;
}

string ZipCode::getZipCodeAsString()
{
    return zipCodeAsString;
}



void ZipCode::setZipCodeAsInt(int ZipCode)
{
    zipcode = zipCodeAsInt;
}


void ZipCode::setZipCodeAsString(string ZipCode)
{
    /*zipcode = zipCodeAsString;*/
}
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <string>
using namespace std;


class ZipCode
{
public:
    ZipCode(int zip); // CONSTRUCTOR 1
    //Input Zip Code as Integer

    ZipCode(string zip); // CONSTRUCTOR 2
    //Input Zip Code as String of 1's and 0's


    int getZipCodeAsInt();
    string getZipCodeAsString();

    void input();
    void output();

    void setZipCodeAsInt(int p_zip);
    void setZipCodeAsString(string p_zip);




private:

    int zipcode;
    int zipCodeAsInt;
    string zipCodeAsString;




};

int main()
{   
    int zipint;
    string zipstring;

    cout << "Please Enter a ZIP - ";
    cin >> zipint;
    cout << endl;


    ZipCode test1(zipint);
    cout << "account1 initialized as follows:\n";
    test1.output();




    cin.get();
    cin.get();
    return 0;
}



ZipCode::ZipCode(int zip)
{
    setZipCodeAsInt(zip);
}

ZipCode::ZipCode(string zip)

{
    setZipCodeAsString(zip);
}





//Uses iostream:
//void ZipCode::input()
//{
//  int zipCodeAsInteger;
//  cout << "zipCodeAsInteger - ";
//  cin >> zipCodeAsInteger;
//  accountDollars = dollarsPart(balanceAsDouble);
//  accountCents = centsPart(balanceAsDouble);
//  cout << "Enter interest rate (NO percent sign): ";
//  cin >> rate;
//  setRate(rate);
//}


void ZipCode::output()
{

    cout << "zipcode - " << zipcode << endl;
    cout << "ZipCodeAsInt - " << zipCodeAsInt << endl;
    cout << "ZipCodeAsString - " << zipCodeAsString << endl;

}



int ZipCode::getZipCodeAsInt()
{
    return zipCodeAsInt;
}

string ZipCode::getZipCodeAsString()
{
    return zipCodeAsString;
}



void ZipCode::setZipCodeAsInt(int ZipCode)
{
    zipcode = zipCodeAsInt;
}


void ZipCode::setZipCodeAsString(string ZipCode)
{
    /*zipcode = zipCodeAsString;*/
}

Во-первых, исправь ошибки:

void ZipCode::setZipCodeAsInt(int p_zip) // здесь
{
    zipcode = p_zip;  // и здесь
}

Во-вторых, метод output() не будет работать правильно, поскольку в конструкторе не инициализируются свойства

    int zipCodeAsInt;
    string zipCodeAsString;

В-третьих, твоё описание класса ZipCode не соответствует заданию.

Спасибо Алан! Именно по этому я и здесь, что мне нужно немного помощи.

Не мог бы ты помочь выполнить это задание правильно ?

Так вроде уже немножко помог ))

Я бы тебе посоветовал для начала ещё раз внимательно прочитать задание:

Write a zip code class that encodes and decodes five-digit bar codes used by the
U.S. Postal Service on envelopes. The class should have two constructors. The first
constructor should input the zip code as an integer, and the second constructor
should input the zip code as a bar code string consisting of 0’s and 1’s as described
above. Although you have two ways to input the zip code, internally, the class
should only store the zip code using one format. (You may choose to store it as a
bar code string or as a zip code number.) The class also should have at least two
public member functions: one to return the zip code as an integer and the other
to return the zip code in bar code format as a string. All helper functions should be
declared private. Embed your class definition in a suitable test program.

А затем написать объявление класса, которое ему точно соответствует.

Потом спроектировать работу класса, добавить в объявление класса необходимые закрытые helper functions и, наконец, написать код для методов.

Твоя главная ошибка, что ты не спроектировал класс, а сразу попытался его написать. Так не получится.

ТС, а что конкретно не работает, и каком образом оно не работает? :-)

И да, советую хранить почтовый индекс в одном варианте, в виде строки. А преобразования осуществлять уже при вызове соотв. методов. Это, кстати в ТЗ написано.

Ну я задание прочел, правда быстро и невнимательно. И родил пару строк. Может быть, это как-то поможет. Удачи.

#include <iostream>
#include <string>
#include <sstream>


class ZipCode
{

public:

    ZipCode(std::string str_value)
    {
        value = str_value;
    }

    ZipCode(int int_value)
    {
        std::stringstream buf;
        buf << int_value;
        value = buf.str();
    }

    int number()
    {
        int int_value;
        std::stringstream buf;
        buf << value;
        buf >> int_value;
        return int_value;
    }

    std::string str()
    {
        return value;
    }

private:

    std::string value;
};


int main(int argc, char* argv[])
{
    std::string zipcode = "12412"; 
    int zipcode2 = 12411;

    ZipCode zip1(zipcode);
    ZipCode zip2(zipcode2);

    std::cout << zip1.number() << std::endl;
    std::cout << zip2.str() << std::endl;

    return 0;
}

selevit, на счет «прочёл быстро и невнимательно» — это ты точно подметил )) В задании под «строкой» имеется ввиду строка бар-кода, а не строковое представление целого числа. Т.е. один конструктор должен принимать почтовый индекс в виде числа (int), а второй — в виде строки, содержащей бар-код. Весь цимес задания в написании функций-перекодировщиков int -> бар-код и обратно. Это во-первых.

Во-вторых, в ТЗ написано, что внутри класса почтовый индекс надо хранить в одном из двух видов: либо в виде строки бар-кода, либо в виде целого числа. То, что это обязательно должна быть строка не указано. Лично я бы предпочёл хранить в виде int: меньше места занимает, да и при необходимости сериализации быстрее, компактнее и хлопот меньше.

Алан, +1. Полностью поддерживаю. Сначала надо внимательно прочитать ТЗ, потом подумать, а уж после этого приниматься за код. Кстати, на счёт внимательности есть хороший старый анекдот.

Лекция на первом курсе мединститута. Преподаватель:
    - Товарищи студенты, врач должен быть внимательным и небрезгливым. Вот (показывает баночку с жёлтой жидкостью) анализ мочи. Кто сможет это повторить?
    Обмакивает палец в мочу, вынимает, демонстрирует палец студентам, а затем его облизывает. В аудитории тишина. Наконец выходит один студент, суёт палец в банку, а затем, с отвращением на лице, облизывает. Преподаватель:
    - Хорошо, но если бы вы были внимательны, то заметили бы, что я обмакивал в мочу один палец, а облизывал - другой.

Ждём открректированную версию класса от Serhii.
А то мы сейчас человеку весь кайф от поиска решения обломаем.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.