С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 78
1

Класс Книги

08.03.2015, 23:07. Показов 2720. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте , не могу доделать программку , буду признателен за помощь .
Надо сделать класс , который вводит данные о книге и выводит их.
Мой код :
Файлик с классом(book.h) :
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef BOOK_H
#define BOOK_H
#include <iostream>
#include <string>
 
using namespace std;
int const N = 1024;
int count_book;
class book {
    string name;
    int count_auth;
    string author;
    int year;
    int count_page;
 
 
public :
    book();
    void add();
    void show();
};
book *array = new book[N];
#endif // BOOK_H
Файлик с методами и майном :
C++ (Qt)
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
#include <iostream>
#include <windows.h>
#include "book.h"
 
using namespace std;
 
 
book :: book() {
 
}
void book::add(){
    cout <<"Count book : ";
    cin >> count_book;
    for (int i = 0;i<count_book;i++)
    {
    cout <<"Name book : ";
    cin >> array[i].name;
 
    cout <<"Count authors : ";
    cin >> array[i].count_auth;
 
    cout << "Authors : " <<endl;
    cin >> array[i].author;
 
    cout << "Count page : ";
    cin >> array[i].count_page;
 
    cout << "Year : ";
    cin >> array[i].year;
    }
 
}
 
 
void book ::show(){
    for (int i = 0;i<count_book;i++)
    {
    cout <<"------------------------------------"<<endl;
    cout <<"Name book : "<< array[i].name << endl;
    cout <<"Count authors : "<< array[i].count_auth <<endl;
    cout <<"Count page : "<<array[i].count_page<<endl;
    cout <<"Year : " << array[i].year << endl;
    cout <<"------------------------------------"<<endl;
 
    }
    }
 
int main(){
    while(1){
book var;
cout <<"1.Add"<<endl;
cout <<"2.Show"<<endl;
cout <<"3.Exit"<<endl;
int menu;
cin >> menu;
if (menu==1)var.add();
if (menu==2) var.show();
else break;
    }
 
return 0;
}
Собственно , проблемы две.
Первая - в функции main , после того как выбираю в меню 1(ввод книги) , не запускается заново while , хотя если выбрать пункт 2 , то все работает нормально.
Вторая - надо сделать возможность задания нескольких авторов , как я ещё не знаю (
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2015, 23:07
Ответы с готовыми решениями:

не работает код из книги класс
сейчас учусь программированию по книге и дошел до классов. суть классов немного разобрался, но...

Описать структуру Bibliotec, содержащую следующие поля: автор книги, инвентарный номер книги, название книги
Описать структуру BIBLIOTEC содержащий следующие поля: автор книги , инвентарный номер книги ,...

Не получается создать класс Account из книги Дейтелов
Задача: Создайте класс с именем Account, которым мог бы воспользоваться банк для представления...

Описать класс «Домашняя библиотека»; реализовать поиск книги по заданному признаку
Помогите решить програму: Описать класс «домашняя библиотека». предусмотреть возможность работы с...

13
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
08.03.2015, 23:34 2
C++
1
else if (menu==2)var.show();
Добавлено через 1 минуту
Цитата Сообщение от romalikons Посмотреть сообщение
Вторая - надо сделать возможность задания нескольких авторов , как я ещё не знаю (
про динамические массивы слышал что-нибудь?
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 78
08.03.2015, 23:38  [ТС] 3
kravam, не помогло (

Добавлено через 14 секунд
с первой

Добавлено через 1 минуту
kravam, пробовал . Но тогда надо делать вложенный цикл , и получается бесконечный ввод и через н-ое кол-во попыток крашиться (
0
Модератор
Эксперт С++
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,155
08.03.2015, 23:38 4
Цитата Сообщение от romalikons Посмотреть сообщение
void add();
void show();
Они не являются членами класса
C++
1
2
friend void show();
friend void add();
и var не нужна:
C++
1
2
if (menu==1)add();
if (menu==2) show();
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
08.03.2015, 23:41 5
Цитата Сообщение от romalikons Посмотреть сообщение
kravam, не помогло (
вводимые данные сюда.

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
Они не являются членами класса
являются
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class book {
    string name;
    int count_auth;
    string author;
    int year;
    int count_page;
 
 
public :
    book();
    void add();
    void show();
};
0
Модератор
Эксперт С++
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,155
08.03.2015, 23:44 6
Я имею ввиду, что их надо оттуда УБРАТЬ, т.к. они не используют данные текущего объекта,
а только данные глобальной переменной array.
Но они должны иметь доступ к данным типа book.
Поэтому эти функции должны быть дружественными!

Возьмите себе на заметку, что если метод класса использует какие-то глобальные данные,
то что-то в нем не так.
В частности, Вы не сможете вынести такие методы в отдельный файл.
0
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 78
08.03.2015, 23:49  [ТС] 7
kravam, первую пофиксил , спасибо )
if (menu==1) var.add();
else var.show();
zss, как так ? в майне есть же доступ к данным класса

Добавлено через 4 минуты
zss, покажите в коде пожалуйста , не знаком с френд функциями (
0
Модератор
Эксперт С++
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,155
08.03.2015, 23:59 8
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
#include <iostream>
#include <string>
using namespace std;
 
int const N = 1024;
int count_book;
class book 
{
private:
    string name;
    int count_auth;
    string author;
    int year;
    int count_page;
public :
    friend void add();
    friend void show();
}array[N];
 
void add()
{
    cout <<"Count book : ";
    cin >> count_book;
    for (int i = 0;i<count_book;i++)
    {
        cout <<"Name book : ";
        cin >> array[i].name;
 
        cout <<"Count authors : ";
        cin >> array[i].count_auth;
 
        cout << "Authors : " <<endl;
        cin >> array[i].author;
 
        cout << "Count page : ";
        cin >> array[i].count_page;
 
        cout << "Year : ";
        cin >> array[i].year;
    }
 
}
 
 
void show(){
    for (int i = 0;i<count_book;i++)
    {
        cout <<"------------------------------------"<<endl;
        cout <<"Name book : "<< array[i].name << endl;
        cout <<"Count authors : "<< array[i].count_auth <<endl;
        cout <<"Count page : "<<array[i].count_page<<endl;
        cout <<"Year : " << array[i].year << endl;
        cout <<"------------------------------------"<<endl;
 
    }
}
 
int main()
{
    int menu;
    do
    {
        cout <<"1.Add"<<endl;
        cout <<"2.Show"<<endl;
        cout <<"3.Exit"<<endl;
        cin >> menu;
        switch(menu)
        {
        case 1:add();break;
        case 2:show();break;
        default:;
        }
    }while(menu<3);
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 03.10.2013
Сообщений: 78
09.03.2015, 00:06  [ТС] 9
zss, Спасибо , а с количеством авторов поможете ? Если в классе , вместо переменной объявить массив , а во вложенном цикли вводить - не выходит (
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
09.03.2015, 00:28 10
Лучший ответ Сообщение было отмечено romalikons как решение

Решение

Цитата Сообщение от zss Посмотреть сообщение
они не используют данные текущего объекта,
а только данные глобальной переменной array.
ещё как используют:

C++
1
2
3
4
    cin >> array[i].name;
 
    cout <<"Count authors : ";
    cin >> array[i].count_auth;
второй вопрос, что это корявенько всё. То есть создаётся класс "книга", а потом массив таких элементов... То есть из класса "книга" идёт рульба двумя сущностями- собственно книгой и списком книг. А зачем? Книга это одна сущность, список книг- другая сущность. romalikons, я бы разбил класс book на

1) собственно "книга"
2) список книг (массив, список, вектор- как тебе удобнее)

++++++++++++++++++++++++++++++++++++++++++++++++++


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
/////////////////////////////////////////////////////// 
//Можно тут при большом желании тоже конструктор 
//простенький определить;    
//например book (string, int, string, year, count_page) 
//я описал книгу ПРОСТО КАК СТРУКТУРУ, ибо достаточно   
struct book 
{
    string name;
    int count_auth;
    string author;
    int year;
    int count_page;
};
 
//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////
 
//А это СПИСОК КНИГ. Тут мы можем добавлять к списку книги, 
//просматривать и прочая.
class list_book
{
 public :
 
 //Деструктор ОБЯЗАТЕЛЕН! Я не стал писать
 list_book (int N)
   book *array = new book[N];
 
 void add();
 void show();
 
 //Указатель на начало массива.
 private:
  book* book_;
}
 
//////////////////////////////////////////////
Работать в таком порядке:
1) Создаём указатель на элемент типа book;
2) Создаём элемент типа list_book;
3) В цикле заполняем book_ с помощью той же add
4) Выводим список с помощью той же show

В общем, возможны варианты. Я лишь хотел показать, что КНИГА и СПИСОК КНИГ две разные сущности и не стоит их реализовывать в одном классе.

Добавлено через 5 минут
Ещё можно, например так: предполагаем, что будем иметь дело со списком книг (одни книга- тоже список.) Тогда создаём класс list_book; в нём реализовываем что надо. Так, а класс book создаём как ВНУТРЕННИЙ. Или даже приватный. Ну в общем, опять идея та, что книга и список книг- отдельные сущности.
1
Модератор
Эксперт С++
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,155
09.03.2015, 09:42 11
kravam,
Цитата Сообщение от kravam Посмотреть сообщение
ещё как используют:
Текущим называется объект, метод которого вызван и он адресуется указателем this.
Поскольку методы add и show ни в каком виде (явно, неявно) не используют this,
то это значит, что они не используют данные текущего объекта.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
09.03.2015, 09:48 12
zss,
Обратимся к коду add:
Цитата Сообщение от kravam Посмотреть сообщение
cin >> array[i].name;
Что тут name? А это поле объекта this, не?
0
Модератор
Эксперт С++
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,155
09.03.2015, 09:59 13
Цитата Сообщение от kravam Посмотреть сообщение
А это поле объекта this, не?
Отнюдь нет.
this в исходном коде - это указатель на переменную var.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
09.03.2015, 12:21 14
Цитата Сообщение от zss Посмотреть сообщение
Поскольку методы add и show ни в каком виде (явно, неявно) не используют this,
то это значит, что они не используют данные текущего объекта.
похоже, что так оно и есть.
0
09.03.2015, 12:21
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2015, 12:21
Помогаю со студенческими работами здесь

Описать класс «домашняя библиотека». Предусмотреть возможность работы с произвольным числом книг, поиска книги
Друзья, не работает функция add. Программа крашится. Я понимаю, что он как бы пытается записать в...

Создать класс Account. Задача из книги Дейтелов "Как програмировать на С++"
Начал изучение С++, прочитал главу &quot;Введение в классы и объекты&quot; в книге Дейтелов &quot;Как...

Реализовать класс "Книжный магазин", используя двусвязный список (ошибка с покупкой книги)
Доброго времени суток,мне нужно реализовать класс BookShop используя двусязный список,все методы...

читаю главу 10 книги стивена праты - "объекты и классы". автор во всех примерах поступает следуйщим образм: объявляет класс в одном фаиле...
...а реализует функции в другом - в том котором создаёт и ползуется объектом. у меня вопросс: а не...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru