Файлы и структуры

Тема в разделе "MS Visual C++", создана пользователем -, 17 окт 2010.

  1. Гость

    Здравствуйте, помогите, пожалуйста. Дана структура Библиотека.. она содержит имя автора, имя книги и год издания.. нужно предусмотреть функции поиска книг, добавления книг, удаления книг.. а также результат будет храниться в текстовом файле..
    Поммогите с задачкой плиз :rolleyes:
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    А мысли свои есть хотя бы????
    Может хоть по описанию структуры ?
    Если хотя бы начнешь, я помогу...
     
  3. Гость

    struct Bibl
    {
    char name[20]; //имя автора
    char kniga[20]; //имя книги
    char god[4]; //год издания
    };

    помогите плиз.. у меня при введении первой записи - нормально все, а при введении второй записи, вылетает ошибка =((
    Код на добавление записи:
    Bibl* add(char *name1, char *kniga1, char *god1, Bibl *book1, int &size)
    {
    size++;
    Bibl *book;
    book = new Bibl[size];
    for(int i=0; i<size-1; i++)
    {
    strcpy(book.name, book1.name);
    strcpy(book.kniga, book1.kniga);
    strcpy(book.god, book1.god);
    }
    strcpy(book[size-1].name, name1);
    strcpy(book[size-1].kniga, kniga1);
    strcpy(book[size-1].god, god1);
    delete []book1;
    return book;
    }

    а также при удалении записи - возникает ошибка =( посмотрите пожалуйста, что неверно в коде?:
    Bibl* delet(int del, Bibl *book1, int &size)
    {
    size--;
    Bibl *book;
    book = new Bibl[size];
    for(int i=0; i<del; i++)
    {
    strcpy(book.name, book1.name);
    strcpy(book.kniga, book1.kniga);
    strcpy(book.god, book1.god);
    }
    for(int i=del; i<size; i++)
    {
    strcpy(book.name, book1[i+1].name);
    strcpy(book.kniga, book1[i+1].kniga);
    strcpy(book.god, book1[i+1].god);
    }
    delete []book1;
    return book;
    }
     
  4. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    #include <iostream>

    using namespace std;

    struct Bibl
    {
    char name[20]; //имя автора
    char kniga[20]; //имя книги
    char god[4]; //год издания
    };

    Bibl* add(char *name1, char *kniga1, char *god1, Bibl *book1, int &size)
    {
    size++; // Тут ты увеличил переменную размера массива
    Bibl *book;
    book = new Bibl[size]; //Выделил память под новый массив (с новой размерностью)
    for(int i=0; i<size-1; i++) //Заполняешь старые элементы
    {
    strcpy(book[i].name, book1[i].name);
    strcpy(book[i].kniga, book1[i].kniga);
    strcpy(book[i].god, book1[i].god);
    }

    strcpy(book[size-1].name, name1);
    strcpy(book[size-1].kniga, kniga1);
    strcpy(book[size-1].god, god1);
    delete []book1; // Удаляешь старый массив из памяти...
    return book; //Возвращаешь новый.... Думаю загвоздка в этом... ты возвращаешь массив, см. определение main(void)
    //Лучше ты бы в этом месте делал так book1 = book;
    //И тогда бы твоя функция приобрела вид void add(char *name1, char *kniga1, char *god1, Bibl *book1, int &size)
    //И новый массив автоматом у тебя в старый бы попадал
    }

    Bibl* delet(int del, Bibl *book1, int &size)
    {
    size--;
    Bibl *book;
    book = new Bibl[size];

    //Тут уж сильно намудрил не стоило так делать и одним циклом можно обойтись
    /*
    for(int i=0; i<del; i++)
    {
    strcpy(book[i].name, book1[i].name);
    strcpy(book[i].kniga, book1[i].kniga);
    strcpy(book[i].god, book1[i].god);
    }
    for(int i=del; i<size; i++)
    {
    strcpy(book[i].name, book1[i+1].name);
    strcpy(book[i].kniga, book1[i+1].kniga);
    strcpy(book[i].god, book1[i+1].god);
    }
    */

    for (int i=0,Pos =0; i<size+1; i++)
    {
    if (i != del)
    {
    strcpy(book[Pos].name, book1[i].name);
    strcpy(book[Pos].kniga, book1[i].kniga);
    strcpy(book[Pos].god, book1[i].god);
    Pos++;
    }
    }



    delete []book1;
    return book;
    }

    int main (void)
    {
    int ArrSize = 0;
    Bibl *books = NULL;

    //Вот тут
    //Обязательно твой массив думаю ты вот этого не делал в своей программе,
    //а так все верно
    books                = add("1","2","3",books,ArrSize);

    books = add("4","5","6",books,ArrSize);
    books = delet(1,books,ArrSize);



    }
     
  5. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    А вообще лучше с таким делом работать с помощью Классов... Удобнее практичнее...
    К примеру вот так это будет выглядить
    Код (C++):
    #include <iostream>

    using namespace std;

    struct Book
    {
    char name[20]; //имя автора
    char kniga[20]; //имя книги
    char god[4]; //год издания
    };

    struct Bible
    {
    Book *Books;
    int SizeBooks;

    public:
    Bible();
    bool Add(char* Name, char* Kniga, char* god);
    void Print(void);
    };

    Bible::Bible()
    {
    Books = NULL;
    SizeBooks = 0;

    }
    bool Bible::Add(char* Name, char* Kniga, char* God)
    {
    SizeBooks++;
    Book *NewBooks = new Book[SizeBooks];
    if (!NewBooks) return false; //если не получилось выделить память

    for(int i=0; i<SizeBooks-1; i++) //Заполняешь старые элементы
    {
    strcpy(NewBooks[i].name, this->Books[i].name);
    strcpy(NewBooks[i].kniga, this->Books[i].kniga);
    strcpy(NewBooks[i].god, this->Books[i].god);
    }

    strcpy(NewBooks[SizeBooks-1].name, Name);
    strcpy(NewBooks[SizeBooks-1].kniga, Kniga);
    strcpy(NewBooks[SizeBooks-1].god, God);

    delete [] this->Books; // Удаляешь старый массив из памяти...
    this->Books = NewBooks; //Пишишь новый в память
    return true;
    }

    void Bible::Print(void)
    {
    for (int i =0; i < this->SizeBooks; i++)
    {
    cout<<this->Books[i].name<<"\t"<<this->Books[i].kniga<<"\t"<<this->Books[i].god<<endl;
    }

    }


    int main (void)
    {
    Bible MyBible;
    MyBible.Add("1","2","3");
    MyBible.Add("4","5","6");
    MyBible.Print();
    }
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот поиск элементов:
    Код (C++):
    #include <iostream>

    using namespace std;

    struct Book
    {
    char name[20]; //имя автора
    char kniga[20]; //имя книги
    char god[4]; //год издания

    public:
    void Print(void)
    {
    cout<<name<<"\t"<<kniga<<"\t"<<god<<endl;
    }

    };

    struct Bible
    {
    Book *Books;
    int SizeBooks;

    public:
    Bible();
    bool Add(char* Name, char* Kniga, char* god);
    void Print(void);
    int Search(char *SearchString,int Opt);
    };

    Bible::Bible()
    {
    Books = NULL;
    SizeBooks = 0;

    }
    bool Bible::Add(char* Name, char* Kniga, char* God)
    {
    SizeBooks++;
    Book *NewBooks = new Book[SizeBooks];
    if (!NewBooks) return false; //если не получилось выделить память

    for(int i=0; i<SizeBooks-1; i++) //Заполняешь старые элементы
    {
    strcpy(NewBooks[i].name, this->Books[i].name);
    strcpy(NewBooks[i].kniga, this->Books[i].kniga);
    strcpy(NewBooks[i].god, this->Books[i].god);
    }

    strcpy(NewBooks[SizeBooks-1].name, Name);
    strcpy(NewBooks[SizeBooks-1].kniga, Kniga);
    strcpy(NewBooks[SizeBooks-1].god, God);

    delete [] this->Books; // Удаляешь старый массив из памяти...
    this->Books = NewBooks; //Пишишь новый в память
    return true;
    }

    void Bible::Print(void)
    {
    for (int i =0; i < this->SizeBooks; i++)
    {
    cout<<this->Books[i].name<<"\t"<<this->Books[i].kniga<<"\t"<<this->Books[i].god<<endl;
    }

    }

    //Функция поика книги
    //SearchString - строка поиска;
    //Opt - опции поиска (0(умолчание) - по полю name; 1- по полю kniga)
    //Возвращает -1 - если по поиску ничего не найдено или не верно выбран парамметр Opt
    //        Индекс_книги - если поиск прошел успешно и книга найдена
    int Bible::Search(char *SearchString,int Opt = 0)
    {
    char BufferSearch[20]; //Буфер для поиска
    for (int i = 0; i < this->SizeBooks; i++) //Обойдем весь массив элементов
    {
    switch(Opt) //Проверяем Opt, исходя из чего в буферную переменую копируем требуемое поле
    {
    case 0: //Поиск по названию
    strncpy(BufferSearch,this->Books[i].name,19); //
    break;
    case 1: //Поиск по книги
    strncpy(BufferSearch,this->Books[i].kniga,19);
    break;
    default: return -1; //Если Opt не верен выйдем с кодом -1
    }

    if (strncmp(SearchString,BufferSearch,strlen(SearchString)) == 0) //Сравним строки если совпадают
    {
    return i; //То вернем индекс элемента массива
    }

    }

    return -1;
    }


    int main (void)
    {
    Bible MyBible;
    MyBible.Add("1","2","3");
    MyBible.Add("4441","5","6");
    MyBible.Print();
    MyBible.Books[MyBible.Search("4")].Print();
    }
     
  7. Гость

    Спасибо большое)) :)
     
  8. Гость

Загрузка...
Похожие Темы - Файлы структуры
  1. lmike
    Ответов:
    27
    Просмотров:
    259
  2. garrick
    Ответов:
    25
    Просмотров:
    661
  3. sgfsdg
    Ответов:
    1
    Просмотров:
    428
  4. vovanabali
    Ответов:
    0
    Просмотров:
    536
  5. anatoliygorbunov
    Ответов:
    1
    Просмотров:
    754

Поделиться этой страницей