Вадим Гилюк
New member
C++:
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
struct Contact
{
char fname[30];
char sname[30];
char surname[30];
char address[150];
char age[5];
char phone[20];
char wplace[50];
char school[50];
char familiar[50];
char tnota[30];
};
const unsigned int EXT = 5; //константа ступенчатого расширения массива
/*
добавление нового контакта: передаем ссылку на динамический массив
указателей на указатели структр, ссылку на размер массива, ссылку на
счетчик заполненных структур, ссылку на добавляемую структуру.
*/
void AddContact(Contact**&, int&, int&, Contact*);
void ShowContact(Contact* [], int);
int SaveNoteBook(Contact**, int);
int LoadNoteBook(Contact**&, int&, int&);
void DeleteContact(Contact**&, int, int&, int);
void EditContact(Contact**&, int, Contact*);
void Find(Contact**, int, char[], bool);
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int size = 0;
int count = 0;
int ContactNumber;
Contact** MainPtr = new Contact * [size];
char MenuChoise, Exit, del;
//bool sorting;
do
{
do
{
system("cls");
cout << "-------- Записна книга --------" << endl << endl;
cout << "1. Додайте новий контакт" << endl << "2. Видаліть контакт" << endl
<< "3. Показати всі контакти" << endl << "4. Показати один контакт" << endl << "5. Знайти контакт" <<
endl << "6. Зберегти файл" << endl << "7. Завантажити файл" << endl << "8. Вихід" << endl;
MenuChoise = _getch();
} while (MenuChoise != '1' && MenuChoise != '2' && MenuChoise != '3' && MenuChoise != '4'
&& MenuChoise != '5' && MenuChoise != '6' && MenuChoise != '7' && MenuChoise != '8');
switch (MenuChoise)
{
case '1':
{Contact* n_contact = new Contact;
cout << "Додайте новий контакт" << endl;
cout << "Введіть ім'я: " << endl;
gets_s(n_contact->fname);
cout << "Введіть прізвище: " << endl;
gets_s(n_contact->sname);
cout << "Введіть По-Батькові: " << endl;
gets_s(n_contact->surname);
cout << "Введіть адрес: " << endl;
gets_s(n_contact->address);
cout << "Введіть вік: " << endl;
gets_s(n_contact->age);
cout << "Введіть номер телефону (10 цифр): " << endl;
gets_s(n_contact->phone);
cout << "Введіть місце роботи: " << endl;
gets_s(n_contact->wplace);
cout << "Навчальний заклад: " << endl;
gets_s(n_contact->school);
cout << "Введіть знайомих: " << endl;
gets_s(n_contact->familiar);
cout << "Введіть характер знайомства: " << endl;
gets_s(n_contact->tnota);
AddContact(MainPtr, size, count, n_contact);
delete n_contact;
n_contact = nullptr; }
break;
case '2':
cout << "Виберіть контакт, який потрібно видалити: " << endl;
fflush(stdin);
cin >> ContactNumber;
if (ContactNumber > count || ContactNumber < 1)
{
cout << "Не знайдено контакт." << endl;
break;
}
do
{
ShowContact(MainPtr, ContactNumber - 1);
cout << endl << "Ви справді хочете видалити цей контакт? (1 - Так, 0 - Ні)" << endl;
fflush(stdin);
del = _getch();
} while (del != '1' && del != '0');
if (del == '0')
{
break;
}
DeleteContact(MainPtr, size, count, ContactNumber - 1);
break;
case '3':
if (!count)
{
cout << "Не знайдено контактів." << endl;
break;
}
for (int i = 0; i < count; i++)
{
ShowContact(MainPtr, i);
}
break;
case '4':
cout << "Виберіть номер контакту: " << endl;
fflush(stdin);
cin >> ContactNumber;
if (ContactNumber > count || ContactNumber < 1)
{
cout << "Не знайдено контакт." << endl;
break;
}
ShowContact(MainPtr, ContactNumber - 1);
break;
case '5':
do
{
system("cls");
cout << "-------- Пошук --------" << endl << endl;
cout << "1. Пошук за ім'ям" << endl;
MenuChoise = _getch();
} while (MenuChoise != '1' && MenuChoise != '2');
switch (MenuChoise)
{
case '1':
char Name[50];
cout << "Введіть ім'я: ";
fflush(stdin);
gets_s(Name);
Find(MainPtr, count, Name, true);
break;
}
case '6':
SaveNoteBook(MainPtr, count);
break;
case '7':
LoadNoteBook(MainPtr, count, size);
break;
case '8':
return;
}
cout << endl << "Зробити ще одну операцію? (1 - Так, 0 - Ні)" << endl;
fflush(stdin);
Exit = _getch();
} while (Exit != '0');
for (int i = 0; i < count; i++)
{
delete MainPtr;
}
delete[]MainPtr;
MainPtr = nullptr;
}
void AddContact(Contact**& notebook, int& size, int& count, Contact* NewContact)
{
if (count == size) //расширяем массив, если нет свободного места
{
size += EXT;
Contact** temp = new Contact * [size];
for (int i = 0; i < count; i++)
{
temp = notebook;
}
delete[]notebook;
notebook = temp;
}
notebook[count] = new Contact; //создание новой структуры
//копирование новой структуры в первую свободный элемент массива
*notebook[count]->fname = *NewContact->fname;
strcpy_s(notebook[count]->fname, 30, NewContact->fname);
*notebook[count]->sname = *NewContact->sname;
strcpy_s(notebook[count]->sname, 30, NewContact->sname);
*notebook[count]->address = *NewContact->address;
strcpy_s(notebook[count]->address, 150, NewContact->address);
*notebook[count]->age = *NewContact->age;
strcpy_s(notebook[count]->age, 5, NewContact->age);
*notebook[count]->phone = *NewContact->phone;
strcpy_s(notebook[count]->phone, 20, NewContact->phone);
*notebook[count]->surname = *NewContact->surname;
strcpy_s(notebook[count]->surname, 30, NewContact->surname);
*notebook[count]->wplace = *NewContact->wplace;
strcpy_s(notebook[count]->wplace, 50, NewContact->wplace);
*notebook[count]->school = *NewContact->school;
strcpy_s(notebook[count]->school, 50, NewContact->school);
*notebook[count]->familiar = *NewContact->familiar;
strcpy_s(notebook[count]->familiar, 50, NewContact->familiar);
*notebook[count]->tnota = *NewContact->tnota;
strcpy_s(notebook[count]->tnota, 20, NewContact->tnota);
cout << endl << "Новий контакт було додано:" << endl;
ShowContact(notebook, count);
count++;
}
void ShowContact(Contact* ptr[], int index)
{
cout << endl << "Порядковий номер: " << index + 1 << endl;
cout << "Ім'я: " << (*ptr[index]).fname << endl;
cout << "Прізвище: " << (*ptr[index]).sname << endl;
cout << "По-батькові: " << (*ptr[index]).surname << endl;
cout << "Адреса: " << (*ptr[index]).address << endl;
cout << "Вік: " << (*ptr[index]).age << endl;
cout << "Номер телефону: " << (*ptr[index]).phone << endl;
cout << "Місце роботи: " << (*ptr[index]).wplace << endl;
cout << "Навчальний заклад: " << (*ptr[index]).school << endl;
cout << "Знайомі: " << (*ptr[index]).familiar << endl;
cout << "Характер знайомства: " << (*ptr[index]).tnota << endl;
}
int SaveNoteBook(Contact** NoteBook, int count)
{
int c = 0;
FILE* file;
// открываем файл
fopen_s(&file, "Записна книга.bin", "wb");
// записываем размер массива
fwrite(&count, sizeof(int), 1, file);
// в цикле получаем из массива очередную структуру
// и записываем в файл
for (int i = 0; i < count; i++)
{
// записываем структуру
fwrite(NoteBook, sizeof(Contact), 1, file);
// освобождаем память где хранилась уже
// записанная структура
delete NoteBook;
c++;
}
// закрываем файл
fclose(file);
// удаляем массив указателей
delete[]NoteBook;
cout << "Файл збережено." << endl;
// возвращаем кол-во записанных структур
return c;
}
int LoadNoteBook(Contact**& NoteBook, int& count, int& size_book)
{
int c = 0;
FILE* file = nullptr;
// открыть файл
errno_t er = fopen_s(&file, "Записна книга.bin", "rb");
// проверка на ошибку открытия
if (er != 0)
return 0;
// считываем размер массива
fread_s(&c, sizeof(int), sizeof(int), 1, file);
// проверяем считанный размер
if (c <= 0)
return 0;
// временная переменная
Contact item;
// в цикле считываем по одной структуре из файла и
// передаём в функцию AddContact для копирования в массив
for (int i = 0; i < c; i++)
{
// считываем структуру
fread_s(&item, sizeof(Contact), sizeof(Contact), 1, file);
// добавляем элемент в массив
AddContact(NoteBook, size_book, count, &item);
}
// закрываем файл
fclose(file);
file = nullptr;
cout << "Файл загружено." << endl;
// возвращаем кол-во считанных структур
return c;
}
void DeleteContact(Contact**& notebook, int size, int& count, int index)
{
Contact** temp = new Contact * [size];
for (int i = 0; i < index; i++)
{
temp = notebook;
}
for (int i = index; i < count; i++)
{
temp = notebook[i + 1];
}
delete[]notebook;
notebook = temp;
count--;
cout << endl << "Контакт було видалено." << endl;
}
void EditContact(Contact**& notebook, int index, Contact* NewContact)
{
*notebook[index]->fname = *NewContact->fname;
strcpy_s(notebook[index]->fname, 30, NewContact->fname);
*notebook[index]->sname = *NewContact->sname;
strcpy_s(notebook[index]->sname, 30, NewContact->sname);
*notebook[index]->address = *NewContact->address;
strcpy_s(notebook[index]->address, 150, NewContact->address);
*notebook[index]->age = *NewContact->age;
strcpy_s(notebook[index]->age, 5, NewContact->age);
*notebook[index]->phone = *NewContact->phone;
strcpy_s(notebook[index]->phone, 20, NewContact->phone);
cout << endl << "Контакт було змінено:" << endl;
ShowContact(notebook, index);
}
void Find(Contact** notebook, int count, char string[], bool what)
{
int num = 0;
for (int i = 0; i < count; i++)
{
if (what)
{
if ((strstr((*notebook).fname, string)) != nullptr || (strstr((*notebook).sname, string)) != nullptr)
{
ShowContact(notebook, i);
num++;
}
}
else
{
if ((strstr((*notebook).phone, string)) != nullptr)
{
ShowContact(notebook, i);
num++;
}
}
}
if (!num)
{
cout << endl << "Не знайдено контактів." << endl << endl;
}
}