Относительно:
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 ) );