• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Помогите пожалуйста переписать код с С++ на Си

26.01.2022
2
0
BIT
0
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;
    }
}
 
Мы в соцсетях:

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