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

  • Автор темы Guest
  • Дата начала
G

Guest

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

DarkKnight

А мысли свои есть хотя бы????
Может хоть по описанию структуры ?
Если хотя бы начнешь, я помогу...
 
G

Guest

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;
}
 
D

DarkKnight

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);



}
 
D

DarkKnight

А вообще лучше с таким делом работать с помощью Классов... Удобнее практичнее...
К примеру вот так это будет выглядить
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();
}
 
D

DarkKnight

Вот поиск элементов:
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();
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!