Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
1

Инициализация экземпляров класса из файла

17.09.2014, 06:58. Показов 2478. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Люди добрые, подскажите как написать метод класса для инициализации объектов из файла:

Apt.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// apartment(residential_taxes)_ver_2_2
//  Apt.h
#ifndef APT_H
#define APT_H
 
class Apt
{
    private:
        int aptNum_ ;   // номер квартиры
        int numPers_;   // количество проживающих в квартире людей
        int aptArea_;   // площадь квартиры в квадратных метрах
        int stage_  ;   // этаж
        bool isVet_ ;   // является ли жилец ветераном
        bool isInv_ ;   // является ли жилец инвалидом
 
    public:
        int stage_rebate(int stage);                   // скидка за этажность
        int overnorm_tax(int numPers, int aptArea);    // двойной тариф за лишние метры
        int norm_tax(const int SOME_REBATE);           // обычный тариф
        int res_tax(int stageRebate, int overnormTax, bool isVet, bool isInv); // квартирный налог
};
 
#endif // APT_H


Apt.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/// apartment(residential_taxes)_ver_2_2
//  Apt.cpp
#include "Apt.h"
#include "MY_CONST.h"
// Реализация методов класса Apt
/*
// Конструктор:
Apt::Apt(int aprNum, int numPers, int aptArea, int stage, bool isVet, bool isInv)
{
    int  aptNum_  = aptNum;  // номер квартиры
    int  numPers_ = numPers; // количество проживающих в квартире людей
    int  aptArea_ = aptArea; // количество квадратных метров в квартире
    int  stage_   = stage;   // этаж
    bool isVet_   = isVet;   // является ли жилец ветераном
    bool isInv_   = isInv;   // является ли жилец инвалидом
}
 
// Деструктор:
Apt::~Apt()
{
    //dtor
}
*/
 
// Считаем дополнительную скидку за этажность:
int Apt::stage_rebate(int stage)
{
            if (stage == 1) // жилец живёт на 1 этаже
                return (NORM_AREA * SQ_M_TAX)/ST1_REBATE; // 20% скидка
            else if (stage == 2) // и живёт на 2 этаже
                return (NORM_AREA * SQ_M_TAX)/ST2_REBATE; // 10% скидка
            else // если живёт выше
                return 0; // нет скидки за этажность
}
 
// Считаем вычеты за площадь сверх санитарной нормы:
int Apt::overnorm_tax(int numPers, int aptArea)
{   // если жилец в квартире один
    if (numPers == 1)
        return 0; // не нужно платить за лишние кв. метры
 
    // если жильцов в квартире больше одного
    else // площадь сверх санитарной нормы умножаем на удвоенный тариф
        return (aptArea - (NORM_AREA * numPers)) * (SQ_M_TAX * 2);
}
 
// Считаем тариф за 1 кв. метр за вычетом льгот ветеранов и инвалидов:
int Apt::norm_tax(const int SOME_REBATE)
{
    return (NORM_AREA * SQ_M_TAX)/SOME_REBATE;
}
 
// Считаем итоговый квартирный налог:
int Apt::res_tax(int stageRebate, int overnormTax, bool isVet, bool isInv)
{
    int normTax;
    if (isVet == true) // если жилец ветеран (или и ветеран и инвалид одновременно)
        normTax = norm_tax(VET_REBATE);
 
    else if (isInv == true) // если не ветеран, но инвалид
        normTax = norm_tax(INV_REBATE);
 
    else // если не ветеран и не инвалид
        normTax = norm_tax(NO_REBATE);
 
    return normTax - stageRebate + overnormTax;
}


main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/// apartment(residential_taxes)_ver_2_2
//  main.cpp
/*
Соглашения, терминология, условия:
01. Величина квартирного налога определяется количеством кв. метров площади,
    умноженную на тариф за 1 кв. метр.
02. Если в квартире имеется излишек площади относительно санитарной нормы он
    оплачивается по двойному тарифу.
03. Считайте что санитарная норма = 18 кв.метра на 1 человека.
04. Стоимость 1 кв.м. произвольная.
05. Если в квартире проживает 1 человек, то за площадь сверх санитарной нормы
    (если таковая имеется) он не платит.
06. Некоторым категориям жильцов положено льготы при оплате.
    Инвалиды имеют льготу в 25%, а ветераны ВОВ - 50%. Льготы считаются только
    на одного человека и не суммируются. То есть если жилец одновременно и
    инвалид и ветеран, при подсчётах принимается во внимание только большая
    льгота (за ветеранство, в нашем случае).
07. Для жильцов первых двух этажей имеется дополнительная скидка за
    то, что они не пользуются лифтом - для них квартирный налог снижен:
    для жителей 1 этажа на 20%, а для жителей 2 этажа на 10%.
08. Обратите внимание: дополнительная скидка (скидка за этажность) суммируется
    с основными льготами (льготы для инвалидов и ветеранов).
09. Не забудьте учесть возможное наличие излишков жилплощади.
10. Сумма квартирного налога с учётом всех льгот, скидок и вычетов
    называется фактическим тарифом.
11. Сумма квартирного налога без учёта  льгот, скидок, но с учётом вычетов
    называется общим тарифом.
12. Общей суммой квартирного налога называется сумма налога для всех жильцов
    дома.
 
Задача:
1. Найдите общую сумму квартирного налога по общему тарифу.
2. Найдите общую сумму квартирного налога по фактическому тарифу.
3. Найдите общую сумму всех льгот и скидок.
4. Найдите общее количество льготников.
5. Найдите сумму квартирного налога по общему тарифу всех инвалидов
   и ветеранов дома.
6. Найдите сумму квартирного налога по фактическому тарифу всех
   инвалидов и ветеранов дома.
7. Найдите квартиру с максимальной суммой квартирного налога по
   фактическому тарифу.
*/
 
#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include "Apt.h"
#include "MY_CONST.h"
 
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    using std::ifstream;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Apt house[APT_QTY];  // создаём массив дом (массив объектов типа "квартира")
 
//==============================================================================
    ///// Чтение данных из файла и запись их в массив (вектор) /////
 
    cout << "Желаете считать данные из текстового файла в массив? (да/нет): ";
    char userAnswer;
    cin >> userAnswer;   // записываем ответ пользователя
    while (cin.get() != '\n'); // освобождаемся от мусора в потоке
 
    if (userAnswer == 'д' || userAnswer == 'Д' ||
        userAnswer == 'y' || userAnswer == 'Y')
    {
        cout << "Введите имя файла: ";
        string filename;        // house.txt
        getline(cin, filename);
        ifstream fin;           // создание объекта fin типа ifstream
 
        fin.open(filename);     // ассоциирование создание объекта fin
                                // c файлом filename
        if (!fin.is_open())
            exit(EXIT_FAILURE);
 
        // используем созданный нами объект fin по аналогии с объектом cin
        for (int i=0; i<APT_QTY; ++i)
        {
            fin >> house[i].aptNum_  ;
            for (char ch; ch == ' ' || '\n'; ) fin.get(ch);
            fin >> house[i].numPers_ ;
            for (char ch; ch == ' ' || '\n'; ) fin.get(ch);
            fin >> house[i].aptArea_ ;
            for (char ch; ch == ' ' || '\n'; ) fin.get(ch);
            fin >> house[i].stage_   ;
            for (char ch; ch == ' ' || '\n'; ) fin.get(ch);
            fin >> house[i].isVet_   ;
            for (char ch; ch == ' ' || '\n'; ) fin.get(ch);
            fin >> house[i].isInv_   ;
            for (char ch; ch == ' ' || '\n'; ) fin.get(ch);
        }
        fin.close ();   // закрытие соединения ввода с файлом
    }
    else
    {
        cout << "Ваш ответ принят. Программа будет завершена.";
        return 0;
    }
 
 
//=========================================================================
 
    cout << "Для обработки информации в массиве и вывода результатов\n"
            "на экран выберите один из пунктов меню:";
    // тут будет меню с оператором switch и возможность выбора пунктов меню
    // после выбора пользователем одного из вариантов, будет применён
    // соответствующий метод класса для подсчёта нужного значения и вывода
    // результата на экран монитора
 
    return 0;
}


MY_CONST.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// apartment(residential_taxes)_ver_2_2
//  MY_CONST.h
#ifndef MYCONST_H_INCLUDED
#define MYCONST_H_INCLUDED
 
const int APT_QTY    = 12  ;   // количество квартир
const int SQ_M_TAX   = 100 ;   // налог за кв. метр
const int NORM_AREA  = 18  ;   // количество кв. метров положенных на человека
const int INV_REBATE = 4   ;   // льгота инвалидам
const int VET_REBATE = 2   ;   // льгота ветеранам
const int ST1_REBATE = 5   ;   // льгота живущим на первом этаже
const int ST2_REBATE = 10  ;   // льгота живущим на втором этаже
const int NO_REBATE  = 1   ;   // если не ветераны и не инвалиды (без льгот)
 
#endif // MYCONST_H_INCLUDED


Добавлено через 47 минут
Блин, вечно я так. Ищу, не могу найти. Как только на форуме вопрос запощу, сразу ответ в книжке как по волшебству находится. Нашёл у Липпмана на 340 странице методы
C++
1
istream &read(istream &is, Sales_data &item)
и
C++
1
ostream &print(ostream &os, const Sales_data &item)
Попробую переделать под свой класс.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2014, 06:58
Ответы с готовыми решениями:

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

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

Объявление класса, создание экземпляров класса. Наследование классов
Вообщем начал делать программу:&quot;Создать класс Матрицы, обеспечивающего размещение матрицы...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1;...

13
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2014, 11:35 2
Цитата Сообщение от gru74ik Посмотреть сообщение
Как только на форуме вопрос запощу, сразу ответ в книжке
Часто бывает, что для получения ответа (от самого себя) достаточно лишь сформулировать вопрос.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
18.09.2014, 17:02 3
Цитата Сообщение от gru74ik Посмотреть сообщение
Нашёл у Липпмана на 340 странице
Или можно перегрузить операторы >> и <<. Однако, в этом случае, инициализации не будет. Сначала создаётся объект по умолчанию, а потом присваиваются поля. Можно написать метод который будет создавать и возвращать объект и им инициализировать, но тогда много копирования.
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
18.09.2014, 18:57  [ТС] 4
IGPIGP, пока вот так сделал.
0
Заблокирован
18.09.2014, 19:14 5
Цитата Сообщение от gru74ik Посмотреть сообщение
istream &read(istream &is, Sales_data &item)
Пардон мисье, а о чём собственно речь? Да, из бинарного файла можно считать определённый блок байт и если предполагается, что этот блок является каким - то объектом - можно к нему его привести, но это только для POD данных, если в классе есть хоть один указатель - всё, пиши пропало, надо стерилизовать уже по другому.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
18.09.2014, 19:25  [ТС] 6
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
надо стерилизовать уже по другому
Всё это прекрасно, но где же код? (с)
0
Заблокирован
18.09.2014, 19:30 7
Цитата Сообщение от gru74ik Посмотреть сообщение
Всё это прекрасно, но где же код?
Честно говоря я не очень понял, чего тебе надо... Ты хочешь свой класс с простыми типами данных записать в бинарный файл, а потом оттуда его считать и перевести эти байты в экземпляр класса ?
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
18.09.2014, 19:48  [ТС] 8
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
я не очень понял, чего тебе надо...
Считать из файла данные в массив (или вектор) объектов класса Apt, проигнорировав лишние символы (например, символы пробела или перевода строки).
0
Заблокирован
18.09.2014, 19:57 9
Цитата Сообщение от gru74ik Посмотреть сообщение
проигнорировав лишние символы (например, символы пробела или перевода строки).
Ты о чём?
Ты что объект сереализуешь в текстовый файл что ли ?
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
18.09.2014, 23:55 10
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
если в классе есть хоть один указатель - всё, пиши пропало, надо стерилизовать уже по другому
Указатель записывать и считывать не нужно, конечно. Но можно сохранить то, чем его инициализировать, а потом можно создать объект с указателем.
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
19.09.2014, 09:51  [ТС] 11
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Ты о чём?
Есть код. Есть текстовый файл (см. вложение - файл house.txt). Есть вектор объектов. Объекты - экземпляры класса Apt. Надо открыть текстовый файл для чтения, считать из него данные в этот вектор объектов.
А потом над этими объектами будут уже методы класса Apt (их я чуть позже напишу) издеваться по всякому (см. ТЗ).

Вернёмся, так сказать, к нашим баранам. Scrooge McDuck, хоть строчка кода-то будет или только надувание щёк и пальцы во все стороны?

upd. Уже сам всё сделал. Всех благодарю за внимание и советы. Тему можно закрывать.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
19.09.2014, 12:37 12
gru74ik, вот это и есть хорошо:
Цитата Сообщение от gru74ik Посмотреть сообщение
Уже сам всё сделал.

Не по теме:


А про щёки это Вы горячитесь. Каждый помогает по-своему. Играют роль и обстоятельства такие как время, наличие компилятора в кармане и т.п.
Посмотрите отличия текстового и бинарного режима открытия файлового потока. Это то, что хотел сказать Scrooge McDuck. Хотя для начала уже и так неплохо. (имхо) :)

1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
19.09.2014, 13:05  [ТС] 13
Цитата Сообщение от IGPIGP Посмотреть сообщение
А про щёки это Вы горячитесь.
Возможно. Просто одно и то же можно сказать по-разному. Высокомерный тон, на мой взгляд, не к лицу даже профессионалу. Может, конечно, у меня воспалённое воображение, но мне так показалось. Если я неправ, приношу свои извинения.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Посмотрите отличия текстового и бинарного режима открытия файлового потока. Это то, что хотел сказать Scrooge McDuck.
Благодарю.
0
Scrooge McDuck
19.09.2014, 13:14     Инициализация экземпляров класса из файла
  #14

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
приношу свои извинения.
Утка не в обиде :D

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2014, 13:14

Инициализация переменных класса из статического метода этого же класса
Такой вопрос. Есть класс: class C1 { public: static void* Function(void *ptr) { ... ...

Инициализация членов дочернего класса членами класса родителя
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами...

Инициализация экземпляра класса, как поле другого класса
Всем доброго времени суток ! Есть класс: class a{ public: a(int _type): type(_type) {} ...

Вывод экземпляров класса
Есть вот такой класс: class matrix { public: matrix() { width = 0; height = 0; values...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru