1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

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

  1. Гость

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

    DarkKnight Well-Known Member

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

    Репутация:
    0
    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

    Репутация:
    0
    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код:
    #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

    Репутация:
    0
    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    А вообще лучше с таким делом работать с помощью Классов... Удобнее практичнее...
    К примеру вот так это будет выглядить
    Код:
    #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

    Репутация:
    0
    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот поиск элементов:
    Код:
    #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. Гость

    Репутация:
    0
    Спасибо большое)) :)
     
  8. Гость

    Репутация:
    0
Загрузка...

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