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

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

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

Вечер добрый. Нужна помощь в реализации сортировки массива структур(а точнее, одного поля массива) по алфавиту. Что имеем:
struct book 
{ 
    char name[15]; 
    char surname[15]; 
    char tel[15]; 
} mybook[10];
поле name как раз и нужно отсортировать. сделал что-то подобное:
void Sortname(struct book *mybook, int N) // N - текущее кол-во записей в массиве
{
    int i,j;
    char temp[15];
    for (i=1; i<N; i++) 
            { tolower(mybook[i].name[j]);
              if (strncmp(mybook[i].name,mybook[i+1].name,1)>0)
               { strcpy(temp,mybook[i].name);
                 strcpy(mybook[i].name,mybook[i+1].name);
                 strcpy(mybook[i+1].name,temp); 
                 strcpy(temp,mybook[i].surname);
                 strcpy(mybook[i].surname,mybook[i+1].surname);
                 strcpy(mybook[i+1].surname,temp); 
                 strcpy(temp,mybook[i].tel);
                 strcpy(mybook[i].tel,mybook[i+1].tel);
                 strcpy(mybook[i+1].tel,temp); break; } 
               else if ((strncmp(mybook[i].name,mybook[i+1].name,1)==0) && (strncmp(mybook[i].name,mybook[i+1].name,2)>0))
               { strcpy(temp,mybook[i].name);
                 strcpy(mybook[i].name,mybook[i+1].name);
                 strcpy(mybook[i+1].name,temp); 
                 strcpy(temp,mybook[i].surname);
                 strcpy(mybook[i].surname,mybook[i+1].surname);
                 strcpy(mybook[i+1].surname,temp); 
                 strcpy(temp,mybook[i].tel);
                 strcpy(mybook[i].tel,mybook[i+1].tel);
                 strcpy(mybook[i+1].tel,temp); break; }
              }
}
но, увы, эта функция делает свое дело только после того, как её запустить несколько раз(она, походу, игнорирует то, что она запущена в цикле for ) прошу указать мне на мои ошибки и буду рад, если их мне объяснят. заранее большое спасибо.

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

textual
Листинг программы
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
#define MAX_STRING_LENGTH   32
#define MAX_BOOKS       5
 
typedef struct {
    char name[MAX_STRING_LENGTH];
    char surname[MAX_STRING_LENGTH];
    char tel[MAX_STRING_LENGTH];
} book_t;
 
int sorter (const void * a, const void * b) {
    return strcmp (((book_t *)a)->name, ((book_t *)b)->name) > 0;
}
 
void book_print (book_t * b) {
    printf ("name   : %s\n"
             "surname: %s\n"
             "tel    : %s\n",
              b->name, b->surname, b->tel);
}
 
void book_printn (book_t * b, size_t num) {
    for ( ; num; --num) {
        book_print (b++);
        printf ("\n-----------------\n");
    }
}
 
int main()
{
    /*  поля заполнены от балды, потому что я не в курсе
     *  что именно они должны значить
     *  и вообще это больше похоже на структуру,
     *  описывающую `человека'
    */
    book_t books[MAX_BOOKS] = {
        { "The Jungle Book",    "Rudyard Kipling",  "1" },
        { "Frankenstein",   "Mary Wollstonecraft",  "2" },
        { "The Secret Garden",  "Frances Hodgson B",    "3" },
        { "Heidi",      "Johanna Spyri",    "4" },
        { "Enchiridion",    "Epictetus",        "5" }
    };
 
    printf ("---------------- BEFORE SORT ----------------\n");
    book_printn (books, MAX_BOOKS);
 
    // сортировка
    qsort (books, MAX_BOOKS, sizeof (book_t), sorter);
 
    printf ("---------------- AFTER SORT -----------------\n");
    book_printn (books, MAX_BOOKS);
 
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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