Загрузка данных


/* Сортировка массива структур студент. Шаг 2 */
/* Задание. Сделать lt_name() и применить одну из,
в зависимости от введенного числа (1 - lt_age или 2 - lt_name()), остальное - ошибка */
#include <stdio.h>
#include <locale.h>
#include <string.h>  // для strcmp

typedef struct {
	int id;
	int age;
	char name[40];
} t_student;

int lt_age(t_student, t_student);
int lt_name(t_student, t_student);
void sort(t_student[], int, int(*)(t_student, t_student));

#define MAXN 100

int main(void) {
	setlocale(LC_ALL, "");
	char *fname = "data.txt";
	t_student ar[MAXN];
	FILE *fh = fopen(fname, "r");
	if (fh == NULL) {
		perror("WOW");
		getchar();
		return 1;
	}
	
	int choice;
	scanf("%d", &choice);  // исправлено: добавлен &
	
	// Чтение данных из файла ДО сортировки
	int count = 0;
	t_student st;
	while (count < MAXN && 
		3 == fscanf(fh, "%d%s%d", &st.id, st.name, &st.age)
		) {
		ar[count] = st;
		++count;
	}
	fclose(fh);  // закрываем файл после чтения
	
	// Выбор функции сравнения в зависимости от выбора пользователя
	if (choice == 1) {
		sort(ar, count, lt_age);
	}
	else if (choice == 2) {
		sort(ar, count, lt_name);
	}
	else {
		printf("ERROR");
		return 1;  // выход при ошибке
	}
	
	printf("count=%d\n", count);
	for (int i = 0; i < count; ++i) {
		printf("%d.%s: %d\n", ar[i].id, ar[i].name, ar[i].age);
	}
	return 0;
}

int lt_age(t_student a, t_student b) {
	return a.age < b.age;
}

int lt_name(t_student a, t_student b) {
	return strcmp(a.name, b.name) < 0;  // лексикографическое сравнение
}

void sort(t_student ar[], int n, int(*lt)(t_student, t_student)) 
{
	for (int i = 0; i < n-1; ++i) {
		int imin = i;
		for (int j = i+1; j < n; ++j) {
			if (lt(ar[j], ar[imin])) { imin = j; }
		}
		if (i != imin) {
			t_student temp = ar[imin];
			ar[imin] = ar[i];
			ar[i] = temp;
		}
	}
}