Сортировка массива структур по одному из полей по алфавиту - 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д