Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2022, 14:10   #1
Polita
Новичок
Джуниор
 
Регистрация: 13.03.2022
Сообщений: 1
По умолчанию Сортировка структуры на си

Описать структуру с именем WORKER, содержащую следующие
поля:
 фамилия и инициалы работника;
 название занимаемой должности;
 год поступления на работу.
Написать программу, выполняющую следующие действия:
 ввод с клавиатуры данных в массив, состоящий из десяти
структур типа WORKER (записи должны быть упорядочены по
алфавиту);
 вывод на экран фамилий работников, стаж работы которых
превышает значение, введенное с клавиатуры (если таких
работников нет, вывести соответствующее сообщение).

не могу разобраться с сортировкой по алфавиту и ее выводом.
вот что я написала, вывод сортировки удалила, так как не работал вовсе.

Код:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define n 5

typedef struct worker   //Структура
{
    char fio [40];
    unsigned int year;
    char post [60];
} worker;

int sorter (const char * A, const char * B) {
    return strcmp (((worker *)A)->fio, ((worker *)B)->fio) > 0;
}
 
int main(void)
{
worker a[n];
int i;

    for (i=0; i<n; i++)   //Ввод данных
    {
        printf ("FIO: ");
		scanf("%s", &a[i].fio);
		fflush( stdin ); 
        printf ("Year: ");
        scanf("%s", &a[i].post);
        fflush( stdin );
        printf ("POST: ");
        scanf("%d", &a[i].year);
        fflush( stdin );
        getchar();
    } 
    
qsort (a, n, sizeof (worker), sorter);


    return 0;
}

Последний раз редактировалось Polita; 13.03.2022 в 14:27.
Polita вне форума Ответить с цитированием
Старый 13.03.2022, 17:42   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Нарушен порядок ввода - приглашение "Year", а scanf(post) и наоборот.

Сколько помню, весовая функция для qsort должна возвращать один из трёх вариантов - число из диапазона <0, 0, >0, т.е. сравнение с 0 в return лишнее, т.к. strcmp и так возвращает нужный тип результата.

И описание весовой функции должно содержать в заголовке нетипизированные указатели (void *)
Код:
int sorter (const void *A, const void *B)
{
    //printf("'%s'   '%s'\n", ((worker *)A)->fio, ((worker *)B)->fio);
    return strcmp(((worker *)A)->fio, ((worker *)B)->fio);
}
Также, при вводе строки нужно в scanf давать адрес переменной. Название массива без индекса - это и есть адрес. Т.е. для всех вводимых строк нужно
Код:
scanf("%s", a[i].fio); <----- без амперсанда &
Исправляйте.
Заодно и функцию вывода добавьте - сравнивать до и после сортировки.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка структуры wertyBSD C++ Builder 8 13.10.2014 01:19
[C]. Сортировка структуры M_Asja Помощь студентам 0 20.01.2013 21:02
Сортировка структуры Proger_1 Win Api 2 04.12.2012 20:45
сортировка структуры Си jana89 Общие вопросы C/C++ 5 27.11.2011 20:48
сортировка структуры vo_sa Общие вопросы C/C++ 1 25.06.2009 14:16