
Int main(int argc, char* argv[])
{
int kod1, kod2, D_f, i, kol;
double S;
long len;
// открываем для записи текстовый файл результатов
Ft = fopen(File_Rez, "w");
while(true) {
// выводим меню
puts("\n Create - 1\n View - 2\n Edit - 3\n Individual - 4\n EXIT - 0");
scanf("%d", &kod1);
// выбираем действие в зависимости от введенного пункта меню
switch (kod1) {
case 1: // создание нового файла базы данных
if ((Fz = fopen(File_Zap,"wb")) == NULL) {
puts("\n Create ERROR!\n");
break;
}
fclose(Fz);
printf("\n New file %s is created.\n",File_Zap);
break;
case 2: // просмотр всех записей студентов
case 3: // редактирование записей
// открываем файл для чтения (в бинарном режиме)
if ((Fz = fopen(File_Zap,"rb")) == NULL) {
puts("\n Open ERROR!\n");
break;
}
D_f = fileno(Fz); // получение
len = filelength(D_f); // количества записей
kol = len/size; // в файле
if (kol == 0) {
printf("\n\t The file is empty.\n");
fprintf(Ft,"\n\t The file is empty.\n");
} else {
// вывод на экран
printf("\n\t--------- Informations ---------\n");
// запись этой же информации в текстовый файл Ft
fprintf(Ft,"\n\t--------- Informations ---------\n");
i = 1;
while(1) {
// считываем текущую запись из файла
if (!fread(&Zap,size,1,Fz)) break;
// выводим запись с нумерацией строк,
// если это пункт "редактирование",
// и без нумерации - если "просмотр"
Out(Zap, (kod1 == 2 ? 0 : i++));
}
printf("\t------------- End --------------\n");
fprintf(Ft,"\t------------- End --------------\n");
}
fclose(Fz);
// если был выбран пункт "редактирование"
if (kod1 == 3) {
kod2 = 0;
if (kol > 0) { // если в файле есть записи
puts("\n Input record number for edition (0 - for new record creation)");
// ввод номера записи, которую нужно редактировать
scanf("%d", &kod2);
// проверка корректности ввода
if ((kod2 < 0) || (kod2 > kol)) {
puts("\nWrong record number!\n");
break;
}
if (kod2 > 0) { // выбрана существующая запись
// открываем файл для чтения и записи
Fz = fopen(File_Zap,"rb+");
// указатель в файловом потоке - на нужное место
fseek(Fz,size*(kod2-1), SEEK_SET);
// считываем запись
fread(&Zap,size,1,Fz);
printf("\n Old F.I.O. - %s; new value - ",Zap.FIO);
fflush(stdin);
gets(Zap.FIO);
printf(" Old birth year - %d; new value - ",Zap.god);
scanf("%d",&Zap.god);
printf(" Old group number - %d; new value - ",Zap.group);
scanf("%d",&Zap.group);
printf(" Old marks - %d, %d, %d, %d; new values - ",Zap.marks[0],Zap.marks[1],Zap.marks[2],Zap.marks[3]);
// ввод новых оценок с одновременным
// подсчетом средней
S = 0;
for (i = 0; i < 4; i++) {
scanf("%d",&Zap.marks[i]);
S = S + Zap.marks[i];
}
printf(" Old avg.mark - %6.3lf; new value - %6.3lf\n",Zap.avg,S/4);
Zap.avg = S/4;
// возвращаем указатель на запись на одну назад
// (он подвинулся на следующую при считывании)
fseek(Fz,-size, SEEK_CUR);
// записываем новую запись на место старой
fwrite(&Zap, size, 1, Fz);
}
} else { // если файл еще пустой
printf("\n\t You can only add info.");
}
if (kod2 == 0) { // если выбрано добавление новой записи
// открываем файл для дозаписи в конец
Fz = fopen(File_Zap,"ab");
// заполняем запись
printf("\n F.I.O. - ");
fflush(stdin);
gets(Zap.FIO);
printf(" Birth year - ");
scanf("%d",&Zap.god);
printf(" Group number - ");
scanf("%d",&Zap.group);
printf(" Marks - ");
S = 0;
for (i = 0; i < 4; i++) {
scanf("%d",&Zap.marks[i]);
S = S + Zap.marks[i];
}
Zap.avg = S/4;
printf(" Average mark - %6.3lf\n",Zap.avg);
// дописываем запись в файл
fwrite(&Zap, size, 1, Fz);
}
fclose(Fz);
}
break;
case 4: // выполнение индивидуального задания
if ((Fz = fopen(File_Zap,"rb")) == NULL) {
puts("\n Open ERROR!\n");
break;
}
D_f = fileno(Fz); // подсчет
len = filelength(D_f); // количества записей
kol = len/size; // в файле
if (kol == 0) {
printf("\n\t The file is empty.\n");
break;
}
S = 0; // счетчик выводимых записей
printf("\n\t--------- Individual ---------\n Students with 4 or 5 in phys and greater than 8 in others:\n");
fprintf(Ft,"\n\t--------- Individual ---------\n Students with 4 or 5 in phys and greater than 8 in others:\n");
// cчитываем записи из файла
for (i = 0; i < kol; i++) {
fread(&Zap,size,1,Fz);
// если студент имеет 4 или 5 по физике
// и больше 8 по остальным предметам - выводим
if (((Zap.marks[0] == 4) ||
(Zap.marks[0] == 5)) &&
((Zap.marks[1] > 8) &&
(Zap.marks[2] > 8) &&
(Zap.marks[3] > 8))) {
Out(Zap,0);
S++;}
}
fclose(Fz);
if (S == 0) { // если ни одного студента не найдено
printf("\n\tThere are no such students.\n");
fprintf(Ft,"\n\tThere are no such students.\n");
}
printf("\t------------- End -------------\n");
fprintf(Ft,"\t------------- End -------------\n");
break;
case 0:
// перед выходом закрываем результирующий файл
fclose(Ft);
return 0;
}
}
}
// функция вывода одной записи на экран и в файл
// если x не ноль - это номер записи - выводим его в начале
void Out(TZap z, int x)
{
if (x > 0) {
printf(" Record %d: ",x);
fprintf(Ft," Record %d: ",x);
}
printf(" %s; %d g.r.; group# %d; avg.mark: %6.3lf;",z.FIO,z.god,z.group,z.avg);
printf("\n Marks: phys - %d, math - %d, inf - %d, chem - %d.\n",z.marks[0],z.marks[1],z.marks[2],z.marks[3]);
fprintf(Ft, " %s; %d g.r.; group# %d; avg.mark: %6.3lf;",z.FIO,z.god,z.group,z.avg);
fprintf(Ft, "\n Marks: phys - %d, math - %d, inf - %d, chem - %d.\n",z.marks[0],z.marks[1],z.marks[2],z.marks[3]);
}
Описание работы программы:
Первоначально выбрав пункт «1», создаем файл с именем zapisi.dat, который будет располагаться в текущем каталоге (созданной папке).
Затем, выбираем пункт «3»: т.к. в файле еще нет записей, сразу же предлагается добавить запись:
Последовательно вводим данные, среднее рассчитывается по введенным оценкам автоматически.
Далее снова выбираем пункт «3»: выводятся пронумерованными все записи файла на случай, если пользователь пожелает исправить какую-либо, и предлагается ввести номер записи для редактирования:
Ввод номера существующей записи ведет к режиму ее редактирования, при этом на экран выводится имеющаяся информация и предлагается ввести новую:
Выбирая затем пункт «2», можно убедиться, что информация поменялась.
Для добавления новых записей выбираем пункт «3», затем вводим «0» и нужные значения:
После ввода таким образом 10ти записей приступаем к выполнению индивидуального задания.
Для контроля сначала выбираем пункт «2» – просматриваем имеющуюся информацию, затем выбираем пункт «4», при этом выводится на экран (пишется в файл) информация о студентах, которые имеют по физике оценки 4 или 5 и по остальным предметам больше 8 баллов – т.е. 9 или 10: