Сортировка массива структур по одному из полей по алфавиту - C (СИ)
Формулировка задачи:
Вечер добрый. Нужна помощь в реализации сортировки массива структур(а точнее, одного поля массива) по алфавиту. Что имеем:
поле name как раз и нужно отсортировать. сделал что-то подобное:
но, увы, эта функция делает свое дело только после того, как её запустить несколько раз(она, походу, игнорирует то, что она запущена в цикле for )
прошу указать мне на мои ошибки и буду рад, если их мне объяснят. заранее большое спасибо.
struct book { char name[15]; char surname[15]; char tel[15]; } mybook[10];
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; } } }
Решение задачи: «Сортировка массива структур по одному из полей по алфавиту»
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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д