Сортировка по одному из полей в структуре - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задана структуру с именем info, содержащую номер, имя и фамилию, а также дату рождения человека. Надо отсортировать по возрастанию номера телефона. Вопрос такой, со строками мало работал. Не могу присвоить значение одной строки другой внизу кода, где хочу сделать сортировку пузырьком. Вот код:
#include <stdio.h>
#include <locale.h>
 
int main(void)
{
    setlocale(LC_ALL,".1251");
    int s, i, j;
    char *time;
    int const n=3,n1=15;
    printf("Введите кол-во необходимых списков:");
    scanf("%d",&s);
 
    struct
    {
    char name[n1], surname[n1];
    long  int telephone;
    int date_of_birth[n];
    } info[s];
 
    for(i=0;i<s;i++)
        {
        printf("Имя и Фамилия %d-ого человека:\n",i);
        gets(info[i].name);
        gets(info[i].surname);
        printf("Номер %d-ого человека:\n",i);
        scanf("%ld",&info[i].telephone);
 
    printf("Дата рождения %d-ого человека:\n",i);
        for(j=0;j<n;j++){
                switch(j)
                {
                case 0: time="День";  break;
                case 1: time="Месяц"; break;
                case 2: time="Год"; break;
                }
            printf("%s:",time);
            scanf("%d",&info[i].date_of_birth[j]);
        }
        }
        // сортировка по возрастанию телефона человека
        int   temp4;
        long int temp3;
        char temp1,temp2;
        for(i=0;i<s-1;i++){
        for(j=i+1;j<s;j++){
            if(info[i].telephone>info[j].telephone){
 
            temp1=info[i].name;
            temp2=info[i].surname;
            temp3=info[i].telephone;

            info[i].name=info[j].name;
            info[i].surname=info[j].surname;
            info[i].telephone=info[j].telephone;

            info[j].name=temp1;
            info[j].surname=temp2;
            info[j].telephone=temp3;
 
        }
        }
        }
        }

Решение задачи: «Сортировка по одному из полей в структуре»

textual
Листинг программы
    struct
    {
    char name[n1], surname[n1];
    long  int telephone;
    int date_of_birth[n];
    } info[s], tmp;
// и будет так
tmp = info[i];
info[i] = info[j];
info[j] = tmp;

Объяснение кода листинга программы

В представленном коде реализуется сортировка по одному из полей в структуре.

  1. Создается структура с полями: имя, фамилия, номер телефона и дата рождения (в формате ГГГГММДД).
  2. Создается массив из s структур.
  3. Переменная i инициализируется значением 0.
  4. Цикл по всем элементам массива структур (кроме последнего), в котором:
    • Переменная j инициализируется значением i + 1.
    • Если поле telephone текущей структуры больше, чем у следующей, то:
    • Перемещается значение поля telephone из следующей структуры в текущую.
    • Перемещается значение поля surname из следующей структуры в текущую.
    • Перемещается значение поля name из текущей структуры в следующую.
    • Перемещается значение поля telephone из текущей структуры в следующую.
    • Перемещается значение поля date_of_birth из текущей структуры в следующую.
    • Переменная i инициализируется значением j.
    • Переменная j инициализируется значением i.
  5. Цикл завершается.
  6. Результат сортировки выводится на экран.

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы