Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2017, 19:49   #1
Svetlana2104
Новичок
Джуниор
 
Регистрация: 08.05.2017
Сообщений: 2
Вопрос С++ запись о книге содержит поля: автор, название, год издания, издательство, цена. реализовать класс Subscriber

запись о книге содержит поля: автор, название, год издания, издательство, цена. реализовать класс Subscriber, содержащий фамилию абонента, номер и список взятых книг. Один элемент содержит запись о книге, дату выдачи, требуемую дату возврата и признак возврата.
Реализовать методы добавления в список и удаления книг; поиска книг, подлежащих возврату; поиска по автору, издательству и году издания; вычисления стоимости подлежащих возврату книг; сформировать список должников.
Я смогла написать программу для работы с одним объектом Subscriber. По заданию нужно сделать очередь из объектов на основе queue. или хотя бы массив объектов.

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <Windows.h>
using namespace std;
class Subscriber;
struct Book
{
    string UDK;     // Издательство
    string autor;
    string name;
    int year;
    int amount;     // Цена
    Book* next;
};
class Debt
{
    Book *beg;
    Book *end;
public:
    void init(Subscriber ob);
    void show();
};
class Subscriber
{
    string surname;
    string number;
    Book *beg;
    Book *end;
public:
	Subscriber()
    {
    	cout<<"vvedite inf ob abonente" << endl;
        cin>>surname;
        cin>>number;
        cout<<"Запись о студенте добавлена";
    }
    void add();
    void add(char* str);
    void show();
    void search(Book **a, const int n);
    void clear();
    template <class MIS> void mis(MIS some);
    int cost();
    void change();
    Subscriber operator +(Subscriber op);
    Subscriber operator -(Subscriber op);
    Subscriber operator *(Subscriber op);
    friend void Debt::init(Subscriber ob);
};
void Subscriber::add(char* str)
{
    Book* pv = new Book;
    int i = 0, predel = 500;
    char buf[10] = { '\0' };
    //1)
    while (str[i] != ' ')
    {
        pv->UDK += str[i];
        i++;
        if (i>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    while (str[i] == ' ')
    {
        i++;
        if (i>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    //2)
    int j = 0;
    while (str[i] != ' ')
    {
        buf[j] = str[i];
        i++;
        j++;
        if (i>predel || j>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    buf[j] = '\0';
    pv->year = atoi(buf);
    while (str[i] == ' ')
    {
        if (i>predel || j>predel)
        {
            mis((*pv).UDK);
            return;
        }
        i++;
    }
    //3)
    while (str[i] != '\"')
    {
        pv->autor += str[i];
        i++;
        if (i>predel || j>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    //4)
    i++;
    while (!(str[i] == '\"'))
    {
        pv->name += str[i];
        i++;
        if (i>predel || j>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    i++;
    while (str[i] == ' ')\
    {
        i++;
        if (i>predel || j>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    //5)
    buf[0]='\0';        
    j = 0;
    while (str[i] != '\0')
    {
        buf[j] = str[i];
        i++;
        j++;
        if (i>predel || j>predel)
        {
            mis((*pv).UDK);
            return;
        }
    }
    buf[j] = '\0';
    pv->amount = atoi(buf);
    //6)
    if (end) end->next = pv;
    pv->next = 0;
    if (!beg) beg = pv;
    end = pv;
}
template <class MIS> void Subscriber::mis(MIS some)
{
    cout << "Ошибка!" << endl << some << endl;
    system("pause");
    return;
}
void Subscriber::add()
{
    system("cls");
    Book* pv = new Book;
    cout << "Укажите издательство:.."; cin >> pv->UDK;
    cout << "Год издания:..........."; cin >> pv->year;
    cin.sync();
    cout << "Автора:................"; getline(cin, pv->autor);
    cout << "Название книги:........"; getline(cin, pv->name);
    cout << "Цену:.................."; cin >> pv->amount;
    if (end) end->next = pv;
    pv->next = 0;
    if (!beg) beg = pv;
    end = pv;
    cout << "Готово!" << endl;
    Sleep(400);
}
void Subscriber::show()
{
    cout << "Информация о клиенте:" << endl;
    cout << "Номер:............" << number << endl;
    cout << "Фамилия:.........." << surname << endl;
 
    return;
}
Svetlana2104 вне форума Ответить с цитированием
Старый 08.05.2017, 19:53   #2
Svetlana2104
Новичок
Джуниор
 
Регистрация: 08.05.2017
Сообщений: 2
По умолчанию Продолжение кода

Код:
void Subscriber::search(Book **a, const int n)
{

    int i = 0, j = 0;
    string UDK;
    string autor;
    string name;
    int year;
    int amount;
 
 
    Book *f = beg;
 
    cout << "Укажите ключи:" << endl;
    cout << "Издательство:...."; cin >> UDK;
    cout << "Год издания:....."; cin >> year;
    cin.sync();
    cout << "Автор:..........."; getline(cin, autor);
 
 
    a[0] = 0;
    for (i = 0, j = 0; i<n; i++)
    {
        if (UDK == f->UDK ||
            year == f->year ||
            autor == f->autor)
        {
            a[j] = f;
            j++;
            a[j] = 0;
        }
        f = f->next;
    }
 
    if (!a[0])
    {
        cout << "Ничего не найдено! ";
        Sleep(300);
        return;
    }
 
 
    Book *buf;
    year = a[0]->year;
    for (i = 0; (a[i] && i<n); i++)
    {
        for (j = i; (a[i] && j<n); j++)
        if (a[i]->year < year)
        {
            buf = a[i];
            a[i] = a[j];
            a[j] = buf;
            year = a[i]->year;
        }
    }
    cout << "РЕЗУЛЬТАТЫ ПОИСКА:" << endl;
    for (i = 0; a[i]; i++)
    {
        cout << i + 1 << "..................";
        cout << endl << "Издательство:...." << a[i]->UDK;
        cout << endl << "Год издания:....." << a[i]->year;
        cout << endl << "Автор:..........." << a[i]->autor;
        cout << endl << "Название книги:.." << a[i]->name;
        cout << endl << "Цена:............" << a[i]->amount;
        cout << endl << endl;
    }
 
    system("pause");
}
void Subscriber::clear()
{
    //system("cls");
 
    // Определение числа книг и вызов функции поиска:
    int n = 0, T;
    Book *f = beg;
    while (f)
    {
        n++;
        f = f->next;
    }
    f = beg;
    Book **a = new Book*[n - 1];
    search(a, n);
 
 
    //Удаление:
    if (n>1)
    {
        cout << "Введите номер книги для удаления:" << endl;
        cin >> T;
        --T;
    }
    else
        T = 0;
    if (a[T] == beg)    //если 1 элемент
    {
        cout << "1 el!" << endl;
        beg = beg + 1;
        delete a[T];
    }
    else
    if (a[T]->next == 0)    //если последний элемент
    {
        cout << "last el!" << endl;
        delete a[T];
        a[T - 1]->next = 0;
    }
    else    //иначе
    {
        cout << "else!" << endl;
 
        f = beg;
        while (f->next != a[T])
            f = f->next;
 
        f->next = a[T]->next;
        delete a[T];
    }
    cout << "Удаление завершено" << endl;
    Sleep(400);
    return;
}
int Subscriber::cost()
{
    Book* pv = beg;
    int count;
    while (pv)
    {
        count += pv->amount;
        pv = pv->next;
    }
    return count;
}
void Subscriber::change()
{
    string name;
    name = surname;
    cout << "\tВведите новый номер" << endl << "\t";
    cin >> number;
    cout << "\tИ новое имя:" << endl << "\t";
    cin >> surname;
    cout << "\tЗа сим," << name << ", даю тебе новое имя: " << surname << endl;
    Sleep(500);
}
Subscriber Subscriber::operator + (Subscriber op)
{
    Subscriber temp;
    temp.surname = this->surname + " или " + op.surname;
    temp.number = this->number + " или " + op.number;
    temp.beg = this->beg;
    temp.end = op.end;
    temp.end->next = op.beg;
    return temp;
}
Subscriber Subscriber::operator -(Subscriber op)
{
    Subscriber temp;
    temp.beg = 0;
    temp.surname = "Только " + this->surname;
    temp.number = this->number;
    Book *p1 = this->beg;
    Book *p2 = op.beg;
    Book *p = 0;
    bool flag;
    for (; p1 != 0; p1 = p1->next)
    {
        p2 = op.beg;
        flag = true;
        for (; p2 != 0; p2 = p2->next)
        {
            if (p1 == p2)
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            if (temp.beg == 0)
            {
                Book *pv = new Book;
                *pv = *p1;
                temp.beg = pv;
                p = temp.beg;
            }
            else
            {
                Book *pv = new Book;
                *pv = *p1;
                p->next = pv;
                p = pv;
            }
        }
    }
    return temp;
}
Subscriber Subscriber::operator *(Subscriber op)
{
    Subscriber temp;
    temp.beg = 0;
    temp.surname = this->surname + " и " + op.surname;
    temp.number = this->number + " и " + op.number;
    Book *p1 = this->beg;
    Book *p2 = op.beg;
    Book *p = 0;
    bool flag;
    for (; p1 != 0; p1 = p1->next)
    {
        p2 = op.beg;
        flag = false;
        for (; p2 != 0; p2 = p2->next)
        {
            if (p1 == p2)
            {
                flag = true;
                break;
            }
        }
        if (flag)
        {
            if (temp.beg == 0)
            {
                Book *pv = new Book;
                *pv = *p1;
                temp.beg = pv;
                p = temp.beg;
            }
            else
            {
                Book *pv = new Book;
                *pv = *p1;
                p->next = pv;
                p = pv;
            }
        }
    }
    return temp;
}
void Debt::init(Subscriber ob)
{
    beg = ob.beg;
    end = ob.end;
}
void Debt::show()
{
    Book *p = beg;
    for (; p; p = p->next)
    {
        cout << p->autor << ", ";
        cout << "\"" << p->name << "\", ";
        cout << "изд. \"" << p->UDK << "\", ";
        cout << p->year << ", ";
        cout << "стоим. " << p->amount << " руб.";
        cout << endl;
    }
 
}
int main()
{
    setlocale(0, "rus");
 	system("chcp 1251");
    int otv1, otv2;
    Subscriber client;
    cout << "Меню" << endl;
    cout << "1 - Добавить абонента в базу" << endl;
    cout << "2 - Редактировать абонента" << endl;
    cout << "3 - Выдать абоненту книгу" << endl;
    cout << "4 - Просмотреть список книг абонента" << endl;
    cout << "5 - Списать книгу с абонента" << endl;
    cout << "6 - Выйти" << endl;
    cin >> otv1;
    switch (otv1)
    {
        case 1: 
		{ 
        	break;
        }
        case 2: 
		{
        	client.show();
        	client.change();
        	break;
        }
        case 3: { client.add(); break; }
        case 4: 
	    {
	        Debt d;
	        d.init(client);
	        d.show();
	        break; 
	    }
        case 5: 
		{ 
			client.clear(); break; 
		}
	    /*case 5: 
	    { 
            const int n = 20; 
            Book *a[n];  
            client[0].search(a, n); 
            break; 
	    }*/
	    case 6: 
		{
	    	break;
	    }
        default: { cout << "Неправильный ввод" << endl; }
	}
    cout << "Пока!" << endl;
    Sleep(500);
    return 0;
}
Svetlana2104 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] В частной библиотеке хранится информация о литературе: название книги, автор, цена, вид переплета. Найти:... destra1j Помощь студентам 7 05.05.2016 12:30
реализовать класс Time который содержит три поля типа int shilovec5377 Общие вопросы C/C++ 4 08.06.2015 11:04
С++. Структуры и массивы структур. Дан массив записей, содержащий сведения о книгах: фамилия автора, название книги, год издания Beauty44 Помощь студентам 3 21.09.2013 13:14
Массив. Класс с именем NOTE содержит следующие поля: MrRuslanBB Помощь студентам 0 12.03.2013 02:12
Даны сведения о книгах в библиотеке: фамилия автора, название книги и год издания. Напечатать автора и название книг, го greshnik92 Общие вопросы C/C++ 3 21.06.2011 10:45