Отсортировать введенные записи по возрастанию значений ключей и распечатать полученный список

С клавиатуры введите набор записей с полями: <Ключ>, <Сообщения> (ключ – целое число). Отсортировать введенные записи по возрастанию значений ключей и распечатать полученный список. В отсортированный массив ввести две новые записи так, чтобы сохранить общую упорядоченность массива. Распечатать дополненный массив.


Ответы (1 шт):

Автор решения: Мар'ян
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define KST 50
#define _CRT_SECURE_NO_WARNINGS

typedef struct KeyMessage {
    int key;
    char message[50];
}KEYMESSAGE;

KEYMESSAGE starr[KST]; // глобальний масив структур
int kst; // реальна  кількість повідомлень
void GetData(void);
void PrintAllData(void);
void Sort_by_Keys(void);
void GetData2(void);
int main()
{
    system("chcp 1251");
    GetData();
    puts("\n\t\tВведенні дані: \n ");
    PrintAllData();
    Sort_by_Keys();
    puts("\n\t\t Відсортовані записи за зростанням значень ключів :\n");
    PrintAllData();
    GetData2();
    Sort_by_Keys();
    PrintAllData();
    return 0;
}
void GetData(void)

{
    int k = 0;
    printf("\n\t\t%-Ведіть <Ключ> та <Повідомлення> (0 -  кінець введення) \n");
    for (k = 0; k < KST; k++) { // цикл введення даних
        printf("\n%2ld. Ключ : ", k + 1);
        scanf_s("%d", &starr[k].key);
        gets_s((starr + k)->message);
        if ((starr + k)->key == '\0')
            break;
        printf(" Повідомлення : ");
        gets_s((starr + k)->message);

        rewind(stdin);
    }
    kst = k;
}

void PrintAllData(void)
{
    KEYMESSAGE* pst;
    for (pst = starr; pst < starr + kst; pst++) {
        printf("%2d. Ключ: %-ld\t\t\t\t Повідомлення: %-s \n", pst - starr + 1,
            pst->key, pst->message);
    }
}

void Sort_by_Keys(void)
{
    KEYMESSAGE* pst, * pst_min, mess;
    for (int k = 0; k < kst - 1; k++) { // зовнішній цикл
        pst_min = starr + k;
        for (pst = pst_min + 1; pst < starr + kst; pst++) // внутрішній цикл
            if (pst->key < pst_min->key)
                pst_min = pst;
        if (pst_min != starr + k) {
            mess = *pst_min; // ставимо найменший на місце k-го
            *pst_min = *(starr + k);
            *(starr + k) = mess;
        }
    }
}

void GetData2(void)
{
    int k = 0;
    for (k = 0; k < 2; k++) { // цикл введення даних
        printf("\n%2ld. Ключ : ", k + 1);
        scanf_s("%d", &starr[k].key);
        gets_s((starr + k)->message);
        printf(" Повідомлення : ");
        gets_s((starr + k)->message);
    }
}
→ Ссылка