Выборка по нескольким полям в структуре - C (СИ)
Формулировка задачи:
Доброго времени суток.
Помогите понять принцип выборки в структуре, если условие выборки не одно поле, а несколько.
Нужно написать функцию, которая в структуре (инструмент, год выпуска, месяц, день) выводит самый "древний" инструмент. Вот что написано в данную минуту. Выдает бред. Строго прошу не судить-начинающий
void find(FILE *tf)
{char c; int i,max,max_y,max_m,max_d;
clrscr();
tf=fopen("file1.dat","rb+"); // Открытие бинарного файла для чтения\записи
fread (&t1,sizeof(t1),1,tf);
max=-1;
while (!feof(tf))
{
if (max<t1.y, max<t1.m, max<t1.d)
{ max_y=t1.y;
max_m=t1.m;
max_d=t1.d;
}
printf(" Инструмент %10s Год %d Месяц %d День %d",t1.name,&max_y,&max_m,&max_d);
}
printf("\n Изменить? y/n ");
c=getch();
if (c=='y')
{ printf("\n Инструмент: "); scanf("%s",&t1.name);
printf("\n Год: "); scanf("%d",&t1.y);
printf("\n Месяц: "); scanf("%d",&t1.m);
printf("\n День: "); scanf("%d",&t1.d);
i=sizeof(t1);
fseek(tf, -i, 1); // Возврат на sizeof(t1) байт назад
fwrite(&t1,sizeof(t1),1,tf);//запись измененной структуры
}
fread(&t1,sizeof(t1),1,tf);
fclose(tf);
}
Ну хоть пните в нужном направлении.
Решение задачи: «Выборка по нескольким полям в структуре»
textual
Листинг программы
//Сортировка по датам рождения
for(i = 0; i < N; i++)
for(j = i + 1; j < N; j++)
{
if(BOOK[i].BDAY[0] < BOOK[j].BDAY[0])
swpZNAK(BOOK[i], BOOK[j]);
else
if(BOOK[i].BDAY[0] == BOOK[j].BDAY[0])
{
if(BOOK[i].BDAY[1] < BOOK[j].BDAY[1])
swpZNAK(BOOK[i], BOOK[j]);
else
if(BOOK[i].BDAY[1] == BOOK[j].BDAY[1])
if(BOOK[i].BDAY[2] < BOOK[j].BDAY[2])
swpZNAK(BOOK[i], BOOK[j]);
}
}
Объяснение кода листинга программы
Код выполняет сортировку массива структур по датам рождения. Структура BOOK содержит поля BDAY[0], BDAY[1] и BDAY[2], которые представляют собой три компонента даты рождения. Список элементов кода:
- Сортировка по датам рождения
- Цикл для прохода по всем элементам массива
- Сравнение и обмен элементов массива внутри цикла
- Если первое поле дат рождения меньше, то обмен элементов
- Если первое поле дат рождения равно, то проход по второму полю
- Если второе поле дат рождения меньше, то обмен элементов
- Если второе поле дат рождения равно, то проход по третьему полю
- Если третье поле дат рождения меньше, то обмен элементов
- Если третье поле дат рождения равно, то элементы считаются равными
- Цикл завершается после прохода по всем элементам массива