Нужна помощь в печати отсортированного файла по дням - PullRequest
0 голосов
/ 11 апреля 2019

Я пишу программу для печати дней в файл для студентов.Внизу они выбирают из списка, и он попадает в мой переключатель состояния ниже, где он вызывает мой оператор печати.В операторе печати у него будет функция сортировки для структуры данных.Но я немного запутался в том, как написать функцию для сортировки.Я хотел бы отсортировать по MWF и TR

. Здесь происходит оператор запроса, а под оператором запроса - сортировка по дням.

#include<stdio.h>
#include<string.h>
    #include "student.h"
    class_t classes[20];


    void queryUser(class_t classes[], int n){
    // This will prompt the user what they would like to do within the program
    // the idea here is to decide how each function needs to run
    char year;
    char user = 'a';
    char *time = " ";
    char *day = " ";
    char nl;
    // FILE* iptr = fopen("/public/csci112sp19/pgm1/classes.txt", "r");
    FILE* fptr = fopen("out.txt", "w");
    while(user != 'Q'){
        printf("What would you like to do?\n");
        printf("Print all classes: A\n");
        printf("Print all classes by day: B\n");
        printf("Print Classes by time: C\n");
        printf("Print all classes for student year: D \n");
        printf("Quit : Q\n");
        scanf("%c%c", &user, &nl);


        // there will be an switch case statement in this function
        // similar to if statements, if a case is called
        // the function will dictate what will print the information
        // stored in the selected array
        // put lower case in also
        printf("user is %c and n is %d\n", user, n);
        switch(user){
            case 'A':
                printAllClasses(classes, n,fptr);
                break;

            case 'B':
                printf("What days would you like to sort by MWF or TR?");
                scanf("%s", day);
                scanf("%c", &nl);
                printClassDay(classes, day , n, fptr);
                break;
            case 'C':
                printf("what time and what day");
                scanf("%s %s", time, day);
                scanf("%c", &nl);
                printClassTime(classes, day, time, n, fptr);
                //search array for day and time matching
                break;
            case 'D':
                printf("Please enter what year in school, Fresh: 1, Soph: 2, JR: 3, SR, 4\n");

                scanf("%c", &year);
                scanf("%c", &nl);
                yearMethod(classes, year, n, fptr);
                break;
            case 'Q':
                break;
            default:
                printf("Please use capital letters\n");
        }
    }
}
$


void sortbyclassdays(class_t classes[], int n, FILE* fptr){

    int i, j, doswap = 0;

    class_t temp;

    for (i = 0; i < n; ++i) {
        for (j = i; j < n; ++j) {
            doswap = strcmp(classes[i].classDays, classes[j].classDays);
        }

        if (doswap > 0) {
            temp = classes[i];
            classes[i]= classes[j];
            classes[j] = temp;
        }
    }

    return;
}


void printClassDay(class_t classDays[], char* day, int n, FILE* fptr){
    //this method will print classes by days selected by user
    sortbyclassdays(classes, n, fptr);
    for(int i = 0; i < n; ++i){
        if(strcmp(day,"MWF")){
            printOneClass(classes[i], fptr);
        }
        else if(strcmp(day, "TR")){
            printOneClass(classes[i], fptr);
        }
    }
    return;

1 Ответ

0 голосов
/ 11 апреля 2019

Относительно:

printf("What would you like to do?\n");
printf("Print all classes: A\n");
printf("Print all classes by day: B\n");
printf("Print Classes by time: C\n");
printf("Print all classes for student year: D \n");
printf("Quit : Q\n");

функция: printf() является дорогим потребителем циклов ЦП.

«Меню» будет трудно читать и понимать.

Предложить:

printf("%s", 
       "\nWhat would you like to do?\n"
       "A: Print all classes:\n"
       "B: Print all classes by day:\n"
       "C: Print Classes by time:\n"
       "D: Print all classes for student year:\n"
       "Q: Quit\n");

или даже лучше:

puts(  "\nWhat would you like to do?\n"
       "A: Print all classes:\n"
       "B: Print all classes by day:\n"
       "C: Print Classes by time:\n"
       "D: Print all classes for student year:\n"
       "Q: Quit\n");

OT: относительно:

scanf("%c%c", &user, &nl); 

При вызове любого из scanf () семейство функций, всегда проверяйте возвращаемое значение, чтобы убедиться, что операция прошла успешно.Примечание: возвращаемое значение - либо EOF, либо число успешных преобразований спецификатора входного формата.В текущем сценарии предложите:

if( scanf("%c%c", &user, &nl) != 2) 
{ 
    // handle error 
}

относительно этого вида заявления:

scanf("%c", &nl); 

настоятельно рекомендуем использовать:

int nl; 
while( (nl = getchar() ) != '\n' && nl != EOF );

относительно:

for (j = i; j < n; ++j) 
{ 
    doswap = strcmp(classes[i].classDays, classes[j].classDays); 
} 

Это будет циклически проходить через все «classDays», а затем выходить из цикла. Поэтому следующий блок кода:, начиная с:

if (doswap > 0)

будет смотреть только на последнюю запись в массиве.Таким образом, никакие другие данные не будут отсортированы.

Ваш компилятор «может» позволить вам избежать неприятностей с этим:

 default:
     printf("Please use capital letters\n");

однако после вызова printf() должно быть:

     break;

относительно:

switch(user)

Это не будет работать, если пользователь вводит строчную букву.

Рекомендуется:

switch( toupper(user) )

относительно:

char user = 'a';

имя user не является репрезентативным для его содержания.

Предложите что-то более значимое, например:

selection

относительно:

void sortbyclassdays(class_t classes[], int n, FILE* fptr){

Параметр функции: FILE *fptr не используется.Предложите удалить этот параметр функции и все ссылки на него в оставшейся части кода

относительно:

if(strcmp(day,"MWF")){
        printOneClass(classes[i], fptr);
    }

почему пропускаются записи, которые имеют: "MWF" в поле "день"?

относительно:

else if(strcmp(day, "TR")){
        printOneClass(classes[i], fptr);
    }

Зачем пропускать записи, имеющие "TR" в поле day?

в опубликованном коде отсутствует функция main() иотсутствует последний } в функции: printClassDay()

Настоятельно рекомендуем заменить тело функции: sortbyclassdays() алгоритмом сортировки, который действительно работает.Предложить: пузырьковая сортировка

функция: printOneClass() отсутствует в опубликованном коде.

OT: функции, которые объявлены как возвращающие void, имеют 'декларация возвратаЭто утверждение не нужно

в отношении таких утверждений, как:

temp = classes[i];
classes[i]= classes[j];
classes[j] = temp;

Маловероятно, что эти утверждения действительно переместят целое struct class_t

Предложить:

memcpy( &temp, &classes[i], sizeof( class_t ) );
memcpy( &classes[i], &classes[j], sizeof( class_t ) );
memcpy( &classes[j], &temp, sizeof( class_t ) );
...