1

Тема: Класи

Доброго дня.. Почала вивчати С++ і стикнулась з проблемою, мабуть, зчитування з файлу. Проєкт реалізовано багатофайловим. Спробую якось пояснити по частинах.
Завдання наступне:
https://replace.org.ua/uploads/images/9628/1a6d78e544b3a459e9d01fff93726f13.jpg
Тільки файл не бінарний, а текстовий.
Головний виконавчий файл:

#include "pch.h"
#include "listHouses.h"
#include "houses.h"
using namespace std;
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Houses h;
    HousesList hl;
    ifstream f ("F:\\ООП\\лабораторні\\streets.txt");
    if (f.is_open()==0) 
        cout << "Файл не відкрито!\n\n" << endl;
    for (f >> h; !f.eof(); f >> h) //тут напочатку зчитую дані
        cout << h;
    system("cls");
    h.menu(); //перехід в меню
    f.close();
    return 0;
}

Тут в хедері оголошую клас і методи

#pragma once
#include <vector>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include "Windows.h"
using namespace std;
class Houses //Оголошення класу "Будинки"
{
private:
    string street; // вулиця
    int number_house; //номер будинку
    int kol_meshk; //к-сть жителів
    int year_construct; //рік побудови
    string date; //дата постановки на облік
    string repair; //наявність ремонту за останні 20 років
public:
    //Порожній конструктор
    Houses();
    // конструктор з параметрами
    Houses(string, int, int, int, string, string);
    string getStreet(); // метод передачі значення у поле назви вулиці
    void setStreet(string); // метод повернення значення назви вулиці
    int getHouseNumber(); // метод передачі значення у поле номера будинку
    void setHouseNumber(int); // метод повернення значення
    int getKolMeshk(); // метод передачі значення у поле кількості мешканців
    void setKolMeshk(int); // метод повернення значення
    int getYearConstruct(); // метод передачі значення у поле року побудови
    void setYearConstruct(int); // метод повернення значення
    string getDate(); // метод передачі значення у поле дати постановки на облік
    void setDate(string); // метод повернення значення 
    string getRepair(); // метод передачі значення у поле наявності ремонту
    void setRepair(string); // метод повернення значення наявності ремонту
    //дружні методи вводу виводу даних
    friend ostream& operator << (ostream&, Houses&);
    friend istream& operator >> (istream&, Houses&);
    void line(int n);
    void linee(int n);
    void line1(int n);
    void line2(int n);
    void line3(int n);
    void menu();
    void shapka();
    static struct HousesComparator //статичний метод сортування за зростанням
    {
        bool operator ()(const Houses& house1, const Houses& house2)
        {
            if (house1.year_construct == house2.year_construct)
                return house1.year_construct < house2.year_construct;
            return house1.year_construct < house2.year_construct;
        }
    };
    ~Houses();//деструктор
};

Реалізація методів в окремому файлі:

#include "pch.h"
#include "houses.h"

Houses::Houses() //Конструктор
{
}
//Конструктор ініціалізації
Houses::Houses(string street, int number_house, int kol_meshk, int year_construct, string date, string repair)
{
    this->setStreet(street);
    this->setHouseNumber(number_house);
    this->setKolMeshk(kol_meshk);
    this->setYearConstruct(year_construct);
    this->setDate(date);
    this->setRepair(repair);
}
//Методи Get
string Houses::getStreet()
{
    return this->street;
}
int Houses::getHouseNumber()
{
    return this->number_house;
}
int Houses::getKolMeshk()
{
    return this->kol_meshk;
}
int Houses::getYearConstruct()
{
    return this->year_construct;
}
string Houses::getDate()
{
    return this->date;
}
string Houses::getRepair()
{
    return this->repair;
}
//Методи Set
void Houses::setStreet(string street)
{
        this->street = street;
}
void Houses::setHouseNumber(int number_house)
{
    this->number_house = number_house;
}
void Houses::setKolMeshk(int kol_meshk)
{
    this->kol_meshk = kol_meshk;
}
void Houses::setYearConstruct(int year_construct)
{
    this->year_construct = year_construct;
}
void Houses::setDate(string date)
{
    this->date = date;
}
void Houses::setRepair(string repair)
{
    this->repair = repair;
}
Houses::~Houses() //деструктор
{
}
//Дружні функції введення-виведення
ostream& operator<<(ostream& out, Houses& h)
{
    /*int numb = i + 1;
    cout << "  " << setw(8) << right << numb << "|";*/
    out << " " << setw(26) << left << h.street << "|";
    out << setw(16) << right << h.number_house << " |";
    out << setw(20) << right << h.kol_meshk << " |";
    out << " " << setw(13) << right << h.year_construct << "|";
    out << " " << setw(25) << right << h.date << "|";
    out << " " << setw(26) << left << h.repair;
    return out;
}
istream& operator>>(istream& in, Houses& h) //тут чомусь при валідації відбувається зациклення 
{
    cout << "Назва вулиці: ";
    while (1)
    {
        in >> h.street;
        if (h.street[0] >= '0' && h.street[0] <= '9' || h.street[0] == '!' || h.street[0] == '~' || h.street[0] == '@' || h.street[0] == '#' || h.street[0] == '№' || h.street[0] == '$' || h.street[0] == '%' || h.street[0] == '^' || h.street[0] == '&' || h.street[0] == '*' || h.street[0] == '(' || h.street[0] == ')' || h.street[0] == '+' || h.street[0] == '=' || h.street[0] == '[' || h.street[0] == ']' || h.street[0] == '{' || h.street[0] == '}' || h.street[0] == ';' || h.street[0] == ':' || h.street[0] == '"' || h.street[0] == '<' || h.street[0] == '>' || h.street[0] == ',' || h.street[0] == '.' || h.street[0] == '?' || h.street[0] == '/' || h.street[0] == '|')
            cout << "У назві вулиці присутні неприпустимі символи!Введіть її заново.." << endl << endl;
        else
            break;
    }
    cout << "Номер будинку: ";
    while (1)
    {
        in >> h.number_house;
        if (cin.fail() || h.number_house <= 0 || h.number_house > 10000)
        {
            cin.clear();
            cin.sync();
            cout << "Номер будинку введено неправильно! Введіть його заново.." << endl;
        }
        else
            break;
    }
    cout << "Кількість жителів: ";
    while (1)
    {
        in >> h.kol_meshk;
        if (cin.fail() || h.kol_meshk < 0 || h.kol_meshk > 10000)
        {
            cin.clear();
            cin.sync();
            cout << "Введено неправильне значення кількості жителів у будинку! Введіть його заново.." << endl;
        }
        else
            break;
    }
    cout << "Рік побудови будинку: ";
    while (1)
    {
        in >> h.year_construct;
        if (cin.fail() || h.year_construct < 0 || h.year_construct > 10000)
        {
            cin.clear();
            cin.sync();
            cout << "Введено неправильне значення року побудови будинку! Введіть його заново.." << endl;
        }
        else
            break;
    }
    cout << "Дата постановки на облік: ";
    while (1)
    {
        in >> h.date;
        if ((h.date[2] == '.') && (h.date[5] == '.') && ((((h.date[0] - '0') * 10) + (h.date[1] - '0')) <= 30) && ((((h.date[3] - '0') * 10) + (h.date[4] - '0')) <= 12) && ((((h.date[6] - '0') * 1000) + ((h.date[7] - '0') * 100) + ((h.date[8] - '0') * 10) + ((h.date[9] - '0'))) <= 2020) && ((((h.date[6] - '0') * 1000) + ((h.date[7] - '0') * 100) + ((h.date[8] - '0') * 10) + ((h.date[9] - '0'))) >= 1950))
            break;
        else
            cout << "Введено неправильне значення дати постановки на облік! Введіть її заново.." << endl;
    }
    cout << "Наявність ремонту (так/ні): ";
    while (1)
    {
        in >> h.repair;
        if (h.repair == "так\0" || h.repair == "ні\0" || h.repair == "Ні\0" || h.repair == "Так\0")
            break;
        else
            cout << "Введено некоректнy відповідь щодо наявності ремонту! Введіть її заново.." << endl;
    }
    return in;
}
void Houses::shapka()
{
    cout << "       ";
    line(150);
    cout << endl;
    cout << "       ";
    line2(1);
    cout << " № запису |      Назва вулиці        |  Номер будинку  | Кількість мешканців | Рік побудови | Дата постановки на облік | Ремонт за останні 20 років  ";
    line2(1);
    cout << endl << "       ";
    line2(1);
    linee(150);
    line2(1);
    cout << endl << "       ";
}

В цьому файлі йде оголошення списку:

#pragma once
#include <list>
#include "houses.h"
#include <iostream>
class HousesList //Оголошення класу
{
private:
    list<Houses> houses;
    Houses h;
public:
    HousesList(); //Порожній конструктор
    void addHouses(Houses); // метод введення інформації про будинки
    void printByGrowth(); // метод виведення інформації про будинки за зростанням за роком побудови
    void printHouses(); // метод виведення інформації про будинки без ремонту за останні 20 років, які побудовані до 1941 року та к-сть мешканців в яких більше 50
    ~HousesList(); //деструктор
};

Тут реалізація методів з попереднього файлу:

#include "pch.h"
#include "listHouses.h"
HousesList::HousesList()//Конструктор
{
}
void HousesList::addHouses(Houses h)// метод введення інформації про аварійні будинки
{
    houses.push_back(h);
    cin.get();
}

void HousesList::printByGrowth() // метод виведення інформації про будинки
{
    system("cls"); // очищення екрану
    system("color 70"); // встановлення кольору за замовчуванням
    ofstream ft ("recordSort.txt");
    this->houses.sort(Houses::HousesComparator());
    if (this->houses.size() <= 0) {
        cout << "Список порожній!"<<endl;
    }
    else 
    {
        h.shapka();
        for (auto i : this->houses) {
            cout << i;
            ft << i;
        }
    }
    ft.close();
    cin.get();
}

void HousesList::printHouses() //метод виведення інформації про будинки без ремонту за останні 20 років, які побудовані до 1941 року та к-сть мешканців в яких більше 50
{
    system("cls"); // очищення екрану
    system("color 70"); // встановлення кольору за замовчуванням
    ofstream ft("printHouses.txt");
    list<Houses> withoutRepair;
    for (auto i : this->houses) 
    {
        if (i.getKolMeshk() > 50 && i.getYearConstruct() < 1941 && (i.getRepair() == "Ні\0" || i.getRepair() == "ні\0" || i.getRepair()=="no\0" || i.getRepair()== "No\0"))
            withoutRepair.push_back(i);
    }
    withoutRepair.sort(Houses::HousesComparator());
    if (withoutRepair.size() <= 0) {
        cout << "Список порожній!"<<endl;
    }
    else {
        h.shapka();
        for (auto i : withoutRepair) {
            cout << i;
            ft << i;
        }
    }
    ft.close();
    cin.get();
}

HousesList::~HousesList() //деструктор
{
}

Кілька днів не можу знайти помилку. Можливо, не до кінця зрозуміла тему, адже жодних пояснень в коледжі не було. Припускаю, що або проблема в мене з файлами, або я десь неправильно звертаюсь. Надіюсь на допомогу. Дякую)

2

Re: Класи

Akos_Bond написав:

Кілька днів не можу знайти помилку.

"Вони шукають те, чого нема, щоб довести, що цього не існує." (с)

Прихований текст

Може поділитесь, що шукаєте? Бо, боюсь, телепати у відпустці.

Подякували: koala1

3

Re: Класи

wander написав:
Akos_Bond написав:

Кілька днів не можу знайти помилку.

"Вони шукають те, чого нема, щоб довести, що цього не існує." (с)

Прихований текст

Може поділитесь, що шукаєте? Бо, боюсь, телепати у відпустці.

Звісно, поділюсь:) Я не знаю, де і в чому помилка.. Програма не працює, тобто не виводить нічого там, де повинен опрацьовуватися файл. Постійно спрацьовує умову, що список порожній

4 Востаннє редагувалося wander (19.12.2020 15:38:20)

Re: Класи

Akos_Bond написав:

тобто не виводить нічого там

А там то де? Можна детальніше? Конкретний файл, рядок. Це в main функції ви маєте на увазі?

Подякували: koala1

5

Re: Класи

Я взагалі не бачу, як це може зібратися.
Виклик

     h.menu();

є, проголошення цієї функції є, а тіла немає.
Крім того, ви чомусь проголосили

    HousesList hl;

але ніде його не використовуєте. Гадаю, компілятор вам пише попередження, але ви замість їх читати питаєте на форумі.

6

Re: Класи

я завжди знав, що їх викрадають і стирають пам'ять. Бо як ще пояснити "Почала вивчати С++" від акаунту, який ще рік тому як мінімум

Akos_Bond написав:

Почала вивчати С++

Я бачу прогрес у матеріалі, але зовсім не бачу прогресу у його розумінні.

Хоча за рік можна було б дещо освоїтися у програмуванні.

Я бачу типові помилки початківця. І це складний момент: якщо відразу не засвоїти базові навички, то ставатиме дедалі складніше просуватися вперед.

Головне що не змінилося - рівень здатності опрацювати посталену задачу. Тому будь які поради вважаю безглуздими.

Я взагалі не розумію, на що можна було сподіватися, створюючи цю тему?  Що хтось скопіює текст у файли, створить проект, намагатиметься побудувати виконуваний файл, отримає помилки у логу компілятора, проаналізує їх, і видасть звідну відомість по всіх помилках? Не забагато? Може ще цицьку мамкину дати?

За рік  треба було усвідомити, що ніхто чужу роботу безкоштовно за тебе працювати не буде.

Не бачу ніякої різниці між безглуздими закриттями тем "без коду" і цим свинством.

Мене тут вважають занадто жорстким, але змушений зізнатись: рік тому я скоїв велику помилку, бо не облишив штовхати мертве теля. Тоді ще можна було повернутися на світлу сторону, зараз вже ні. Бо є велика різниця між тим, коли ти хочеш навчитися щось робити, і тим, коли ти змушений щось робити. В першому випадку це працює, в другому - ні.

Дівчино, чи хто ти там є... Цей форум тобі не допоможе, бо рівень порад на будь якому форумі - "замість оте, встав оце". А в тебе архітектурна нісенітниця. А це майже найвищий рівень дурні.

Прихований текст

Є ще концептуальна дурня, але навряд чи її викладають у коледжі

Re: Класи

ur_naz написав:

я завжди знав, що їх викрадають і стирають пам'ять. Бо як ще пояснити "Почала вивчати С++" від акаунту, який ще рік тому як мінімум

Akos_Bond написав:

Почала вивчати С++

Я бачу прогрес у матеріалі, але зовсім не бачу прогресу у його розумінні.

Хоча за рік можна було б дещо освоїтися у програмуванні.

Я бачу типові помилки початківця. І це складний момент: якщо відразу не засвоїти базові навички, то ставатиме дедалі складніше просуватися вперед.

Головне що не змінилося - рівень здатності опрацювати посталену задачу. Тому будь які поради вважаю безглуздими.

Я взагалі не розумію, на що можна було сподіватися, створюючи цю тему?  Що хтось скопіює текст у файли, створить проект, намагатиметься побудувати виконуваний файл, отримає помилки у логу компілятора, проаналізує їх, і видасть звідну відомість по всіх помилках? Не забагато? Може ще цицьку мамкину дати?

За рік  треба було усвідомити, що ніхто чужу роботу безкоштовно за тебе працювати не буде.

Не бачу ніякої різниці між безглуздими закриттями тем "без коду" і цим свинством.

Мене тут вважають занадто жорстким, але змушений зізнатись: рік тому я скоїв велику помилку, бо не облишив штовхати мертве теля. Тоді ще можна було повернутися на світлу сторону, зараз вже ні. Бо є велика різниця між тим, коли ти хочеш навчитися щось робити, і тим, коли ти змушений щось робити. В першому випадку це працює, в другому - ні.

Дівчино, чи хто ти там є... Цей форум тобі не допоможе, бо рівень порад на будь якому форумі - "замість оте, встав оце". А в тебе архітектурна нісенітниця. А це майже найвищий рівень дурні.

Прихований текст

Є ще концептуальна дурня, але навряд чи її викладають у коледжі

Тебе походу в дитинстві палкую хуярили всі підряд... Таким токсичним бути чел ты... Я хоча і не довго на цьому форумі, але замітив який ти душний. Ні одної конкретної відповіді або поради. Просто називаєш людей "дибілами і це кінцева". Особи, з слабким характером, можуть насправді подумати, що вони бездарні (хоча, можливо, насправді це не так) і забити на справу назавжди. Дивно що тобі не дали пермач на цьому сайті...

8

Re: Класи

От і ще один віталік спалився. Чому цей акаунт ще не заблокований за порушення правил п.1.1, не знаю. Мабуть хабаря дав...

9 Востаннє редагувалося Львовский сырник в мульти (19.12.2020 23:22:07)

Re: Класи

ur_naz написав:

От і ще один віталік спалився. Чому цей акаунт ще не заблокований за порушення правил п.1.1, не знаю. Мабуть хабаря дав...

Буває... Буду ось так писати: 'ь','І'.

10

Re: Класи

всі бездарі мають слабкий характер за визначенням. ті, що мають сильний характер, здатні навчатися попри перешкоди і насмішки. До того ж я вже неодноразово писав конкретно про задачі саме цього типу про клас і контейнер класу. Є пошук, хочеш навчитись - користуйся

Подякували: leofun011

Re: Класи

ur_naz написав:

всі бездарі мають слабкий характер за визначенням. ті, що мають сильний характер, здатні навчатися попри перешкоди і насмішки. До того ж я вже неодноразово писав конкретно про задачі саме цього типу про клас і контейнер класу. Є пошук, хочеш навчитись - користуйся

Так в цьому і проблема твоїх повідомлень. В тебе фетіш принижувати людей? Чи це травма дитинства, яку я описав раніше. Так допоможи їм стати сильнішими, а не бий інваліду по костилям, щоб він більше ніколи не зміг стати на ноги. З твоїм мисленням можна людей, які вкрали цукерку в магазині, навічно вішати клеймо злодія. Повторюсь чел тьl...

12

Re: Класи

Прихований текст

це проблема твого сприйняття. Чи може ти заздриш, що я тебе не "принижував". ну, вибачайте вас багато, а мене один. До того ж такі безглузді випади лише характеризують відсутність виховання. а мені не цікаво з'ясовувати відношення лише заради боротьби за рейтинг. Люди, що не здатні сприймати інших людей, які вони є створюють третій райх в його найпотворнішому відображенні. Глянь на мапу, там є 1/9 суші. Тобі туди.

Re: Класи

Ти стверджуєш що я росіянин, хоча не маєш фактів.
У тебе фетіш принижувати людей. У мене - писати літеру 'ы'... Мені тебе шкода, насправді. Походу мій жарт про твоє складне дитинство ,нажаль, являється істиною... Як і в дитинстві тобі не дали шансу стати сильнішими і хуярили всі, кому не ліньки, так і ти зараз " відстрілюєшся" на слабших... Сходи до психолога ( це не жарт,насправді), мені тебе шкода. Удачі.

Подякували: grinyuk3091

14

Re: Класи

ur_naz написав:
Прихований текст

це проблема твого сприйняття. Чи може ти заздриш, що я тебе не "принижував". ну, вибачайте вас багато, а мене один. До того ж такі безглузді випади лише характеризують відсутність виховання. а мені не цікаво з'ясовувати відношення лише заради боротьби за рейтинг. Люди, що не здатні сприймати інших людей, які вони є створюють третій райх в його найпотворнішому відображенні. Глянь на мапу, там є 1/9 суші. Тобі туди.

Твої репліки на цьому форумі огидні кожному користувачу і на цей раз я просто максимально а****вав коли читав все, що ти висрав тут. Людина самотужки опановує новий матеріал, не спить ночами в той час коли викладачі лінуються провести пару від початку і до кінця. І коли вона у відчаї звертається до користувачів форуму за допомогою, то отримує такий ніж в серце від супер вихованого бога програмування. Я знаю, що мої слова нічого не змінять у голові всяких умніків, але терпіти мовчки вже набридло. Яким би тупим не було питання не можна висирати все, що захочеш

15

Re: Класи

ти прийшов на форум, щоб задавати питання, відповіді на які легко знайти в гуглі. Попри це навіть я не знищив тебе, а намагався допомогти. І це твоя подяка? о пів на другу ночі ти сидиш і пишеш нецензурні пасквілі?

16

Re: Класи

koala написав:

Я взагалі не бачу, як це може зібратися.
Виклик

     h.menu();

є, проголошення цієї функції є, а тіла немає.
Крім того, ви чомусь проголосили

    HousesList hl;

але ніде його не використовуєте. Гадаю, компілятор вам пише попередження, але ви замість їх читати питаєте на форумі.

Я не скинула сюди всі файли, тому що переконанана, що там все правильно. Компілятор жодних повідомлень про помилку не видавав. Помилку виправила сама, тому можете видаляти цю тему. Писала по допомогу сюди, бо очікувала, що досвідчені програмісти зможуть вказати, через що могли пункти меню не спрацьовувати і я змогла би набагато швидше її усунути й, можливо, щось краще зрозуміти з вашого досвіду. Дякую тим, хто писав суто по темі.
Окремо хотіла би звернутися до пана ur_naz. Хто вам дав право робити передчасні висновки та, дуже м'яко кажучи, критикувати інших, нічого не знаючи?? Те, що акаунт зареєстровано рік тому, ні про що не говорить. Я не настільки геніальна, щоб вивчати по 10 мов на рік, як, мабуть, ви, панове. Навчаюсь, як можу, рада, що є бажання це робити і розвиватись з хорошою перспективою на майбутнє. Впевнена, що мої слова, на жаль, не вплинуть на ваше виховання, якого очевидно не було. Дійсно, було б неможливо, напевно, від хама сподіватись нормального відношення...

Подякували: Lata1

17

Re: Класи

Краще не видаляти тему. Може, потім мені пригодиться :D
Мене здивував цей скандал :o
koala і wander значно мені більше допомогли, ніж уз наз. Але, думаю, він хоче допомагати, просто не вміє пояснити нормально. :D
Зате намагається мотивувати)

18 Востаннє редагувалося koala (21.12.2020 00:33:26)

Re: Класи

Akos_Bond написав:

Я не скинула сюди всі файли, тому що переконанана, що там все правильно

Наступного разу одразу пишіть, що це не весь код, і пояснюйте, чому саме ви переконані, що проблема в цьому коді, а не в тому. Відсутність повідомлень від компілятора не гарантує очікуваної поведінки коду.

Akos_Bond написав:

Помилку виправила сама, тому можете видаляти цю тему.

Ну і напишіть, яка ж була помилка, для наступних поколінь. Форум зроблено не для того, щоб теми видаляти.

Подякували: Lata1