Распечатать введенные данные в виде таблицы, отсортировав их по фамилиям читателей в алфавитном порядке - C (СИ)

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

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

С клавиатуры ввести набор данных в форме структур, содержащих информацию о читателях библиотеки: <Фамилия, инициалы>, <Год рождения>, <Пол>, <Адрес>. Распечатать введенные данные в виде таблицы, отсортировав их по фамилиям читателей в алфавитном порядке.

Сортировка по алфавиту(кусок программы):

typedef struct LIBRARY 
{
    char name[30];
    int birth; 
    char gender;
    char address[30];
} mytype;
mytype reader[N];
 
//k - количество введенных структур
 
int Sort (void) 
{
    int i, j, code;
    mytype *p1, *p2, temp;
for (i=0; i<k-1; i++) 
{
    p1=reader; p2=reader+1;
    for (j=1; j<k-i; j++) 
    {
        code=strcmp(p1->name, p2->name);
        if (code>0) 
        {
            temp=*p1;
            *p1=*p2;
            *p2=temp;
        }
        p1++; p2++;
    }
}
return 0;
}

Полный текст программы:

#include <stdio.h>
#include <iostream>
#define N 30
 
int InputAmount (void);
int InputStruct (void);
int OutputStruct (void);
int Sort (void);
 
int k;
typedef struct LIBRARY 
{
    char name[30];
    int birth; 
    char gender;
    char address[30];
} mytype;
mytype reader[N];
 
int main(int)
{
setlocale(0,"");
InputAmount();
InputStruct();
puts("============================================================================");
puts("||                           List of readers:                             ||");
OutputStruct();
Sort();
puts("============================================================================");
puts("||                        Sort list of readers:                           ||");
OutputStruct();
puts("||                                                                        ||");
puts("============================================================================");
system("pause");
return 0;
}
 
int InputAmount (void) 
{
    for ( ; ; ) 
    {
        printf("Enter the amount of readers: ");
        if (scanf_s("%d", &k)==0) 
        { 
            printf ("\nIncorrect input! Enter the number, not a letter (symbol)! \n \n"); 
            fflush(stdin); continue;
        }
        if (k<0) 
        {
            printf("\nNumber of readers must be  greater than 0! \n \n"); 
            fflush(stdin); 
        }
        else break;
    }
    puts("");
    fflush(stdin);
    return k;
}
 
int InputStruct (void) 
{
    int i;
    for(i=0; i<k; i++) 
    {
        printf("\nName and Surname of reader: ");
        gets_s(reader[i].name); 
        fflush(stdin);
 
        printf("Year of birth: ");
        scanf_s("%d",&reader[i].birth);
        fflush(stdin);
 
        printf("Gender (m/f): ");
        scanf("%c", &reader[i].gender);
        fflush(stdin);
 
        printf("Address: ");
        gets_s(reader[i].address);
        fflush(stdin);
 
        puts("");
    }
    fflush(stdin);
    system("cls");
    return 0;
}
 
int OutputStruct (void) 
{
    int i;
    puts("||                                                                        ||");
    printf("||   The reader's name:         Birth:    Gender:           Address:      ||\n");
    for(i=0; i<k; i++) printf("||   %-22s     %-5d     %-10c   %18s ||\n", reader[i].name, reader[i].birth, reader[i].gender, reader[i].address);
    puts("||                                                                        ||");
    puts("============================================================================");
    return 0;
}
 
int Sort (void) 
{
    int i, j, code;
    mytype *p1, *p2, temp;
for (i=0; i<k-1; i++) 
{
    p1=reader; p2=reader+1;
    for (j=1; j<k-i; j++) 
    {
        code=strcmp(p1->name, p2->name);
        if (code>0) 
        {
            temp=*p1;
            *p1=*p2;
            *p2=temp;
        }
        p1++; p2++;
    }
}
return 0;
}

Пробовала переделать на такую функцию (сравнивала буквы, очень подозрительно, выдает ошибку):

int NewSort (void)
{
    int i, j, k, r;
    mytype temp, *str1, *str2;
    str1=reader; str2=reader+1;
    for (i=0; *reader[i].name!='0'; i++)
    {
        k=strlen(str1->name);
        r=strlen(str2->name);
        for (j=0; j<k || j<r; j++)
        {
            if ((str1->name[j])>(str2->name[j]))
            {
                temp=*str1;
                *str1=*str2;
                *str2=temp;
                break;
            } 
            if ((str1->name[j])<(str2->name[j])) break;
        }
        str1++; str2=str1+1;
    }
    return 0;
}
Ничего больше в голову не лезет, помогите пожалуйста

Решение задачи: «Распечатать введенные данные в виде таблицы, отсортировав их по фамилиям читателей в алфавитном порядке»

textual
Листинг программы
#include <stdlib.h>
int cmp(const mytype *r1, const mytype *r2);
 
int main(void) {
...
    qsort(reader, k*sizeof(reader[0]), sizeof(reader[0]), cmp);
...
}
 
int cmp(const mytype *r1, const mytype *r2) {
    return strcmp(r1->name, r2->name);
}

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

  1. Включаем необходимые заголовочные файлы
  2. Объявляем функцию сортировки, которая будет использоваться для сортировки данных
  3. В функции main() создаем массив reader типа mytype и инициализируем его данными о читателях
  4. Используем функцию qsort() для сортировки массива reader по функции сравнения cmp()
  5. В функции cmp() сравниваем поля name массива mytype
  6. Возвращаем результат сравнения
  7. В функции main() продолжаем работу с отсортированным массивом reader

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


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

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

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