1

Тема: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Розробити алгоритм та реалізувати його мовою С для роботи зі структурами.

У програмі повинні бути реалізовані наступні функції:
1) Створення нового запису;
2) Виведення масиву структур на екран у вигляді таблиці;
3) Пошук запису за параметром згідно варіанту;
4) Видалення запису із масиву.

Назва структури: avto
Поля структури:
• марка автомобіля
• рік випуску
• кількість кінських сил
Реалізувати такі дії:
• введення даних у масив, що складається з 10 записів типу avto
• виведення на екран інформації про марку автомобіля і рік випуску у вигляді таблиці, що має кількість сил вище за вказану

#include <stdio.h>
#include <stdlib.h>

typedef struct{
char model[10];
int year;
int horsepower;
} avto_template;

avto_template input_record(void);
void output_record(avto_template tmp[],int n);
void find_record(avto_template tmpp[],int n);
void delete_record(avto_template tmp[],int n);

int main()
{
    system("chcp 1251");
    system("cls");

    avto_template avto[10];
    int p;
    int i=0;
    do
    {
        printf("Головне меню\n");
        printf("1. Створення нового запису\n");
        printf("2. Перегляд усіх записів\n");
        printf("3. Пошук записів за полем horsepower\n");
        printf("4. Видалення запису з масиву\n");
        printf("5. Вихід\n");
        printf("\nВаш вибір: ");
        scanf("%d", &p);
        switch(p)
        {
        case 1:
            avto[i]=input_record();
            i++;
            break;
        case 2:
            output_record(avto,i);
            break;
        case 3:
            find_record(avto,i);
            break;
        case 4:
            delete_record(avto,i);
            i--;

        }
    }
    while (p!=5);
    return 0;

}

void find_record(avto_template tmp[],int n)
{
    printf("Введіть число для запиту (кількість кінських сил)\n");
    int request;
    scanf("%d", request);
    int i;
    int ni=0;
    for (i=0; i<n; i++)
    {
        if(tmp[i].horsepower>request)
        {
            if(ni==0)
            {
                printf("----------------------------------------");
                printf("    Марка     \t Рік випуску \n");
                printf("----------------------------------------");
                printf("%10s \t %4d \n", tmp[i].model, tmp[i].year);
                ni++;
            }
            else
            {
                printf("%10s \t %4d \n", tmp[i].model, tmp[i].year);
                ni++;
            }

        }
    }
    if(ni==0)
        printf("Немає таких записів!\n");
    else
    printf("----------------------------------------\n");
    printf("\n");

}

Фрагмент програми:
https://replace.org.ua/extensions/om_images/img/5fa7e23c1fc7f/8335b8e640bc37fccaf0f6ec7005bd47.jpg https://replace.org.ua/extensions/om_images/img/5fa7e23c1fc7f/987f74672b30aadc504657c022cac960.jpg https://replace.org.ua/extensions/om_images/img/5fa7e23c1fc7f/b85586abc49011768731f94573f585a7.jpg

2

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

В чому питання?

3

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Як реалізувати видалення запису?

4

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Тобто

void delete_record(auto_template tmp[], int n);

5

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Я не експерт в С, працюю тільки з С++, але залежить від того як ви їх заштовхуєте що ви з ними робите або плануєте робити. Важко сказати що вам буде доречно з представленої частини коду, - але можна декрементувати вказівник для наступного запису і присвоїти записам що підлягають видаленню нульові значення.

Подякували: SaintMal1

6

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Все дякую!!!

7

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

SaintMal написав:

Як реалізувати видалення запису?
Тобто

void delete_record(auto_template tmp[], int n);

Використовуйте масив вказівників на екзумпляри структури, тоді видаляти елементи можна буде присвоєнням NULL.

int delete_record(auto_template *tmp[], int n);

8 Востаннє редагувалося ch0r_t (08.11.2020 17:32:19)

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

leofun01 - Пробачте мою невіжість у С, але хотілося б дещо прояснити - ви рекомендуєте видалити сам вказівник, єдиний як я розумію, на структуру під яку було виділено пам'ять?
(Тобто моя порада і так згодиться хіба що для вправи або задачі з підручника а не практичного застосування, по очевидним причинам, але те що ви пропонуєте, коли я зрозумів ваш намір правильно, відверто кажучи - погана практика.)
*Відредаговано. - зрозумів що ви хочете сказати, все одно дивно так робити тільки через трохи зручності, моя філософія - коли поводиш себе так наче в зарезервованій пам'яті нічого немає то там і має бути так - пусто і чисто.

9

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Ви не знаєте, як видалити запис з масиву?

10

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

tchort написав:

ви рекомендуєте видалити сам вказівник, єдиний як я розумію, на структуру під яку було виділено пам'ять?

Звичайно, перед присвоєнням NULL треба буде робити free у випадку, коли екземпляр буде не потрібний.

tchort написав:

дивно так робити тільки через трохи зручності

Це для O(1) по часу.

SaintMal написав:

1) Створення ...
3) Пошук ...
4) Видалення ...

Сам масив для таких задач - не оптимальне рішення, особливо коли даних буде багато.

Подякували: ch0r_t1

11

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Просто перезаписуєте на ту структуру, яку треба видалити, останню, і запам'ятовуєте, що їх стало менше.
Якщо треба зберегти послідовність - перезаписуєте i+1-й на i--й, i+2-й на i+1-й і т.д.

Подякували: wander, SaintMal2

12

Re: Розробити алгоритм та реалізувати його мовою С для роботи зі структура

Люди, ну будь ласка, ну видно ж, що автор тільки почав учити мову. Так, є кращі практики, але щоб зрозуміти користь від кращих практик, треба трохи повоювати і з гіршими. А тут йому треба конкретну проблему вирішити. Хіба важко давати поради, як дійсно краще це все переробити, після відповіді на пряме питання?

Подякували: SaintMal1