Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИТиУвТС / оаип итутс заочное иит 1курс 1 семестр 5 вар.doc
Скачиваний:
11
Добавлен:
01.04.2014
Размер:
1.14 Mб
Скачать

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: