Скачиваний:
58
Добавлен:
01.04.2014
Размер:
42.76 Кб
Скачать

УО «Белорусский Государственный университет информатики и радиоэлектроники»

Отчёт

По контрольной работе №6 по теме:

«Обработка структур с использованием файлов»

Вариант 1

Выполнил:

Студент гр. ____

______________

Проверил:

______________

Минск 2010

Задание.

Написать программу обработки файла типа запись, содержащую следующие пункты меню: «Создание», «Просмотр», «Коррекция» (добавление новых данных или редактирование старых), «Решение индивидуального задания».

Каждая запись должна содержать следующую информацию о студентах:

- фамилия и инициалы;

- год рождения;

- номер группы;

- оценки за семестр: по физике, математике, информатике, химии;

- средний балл.

Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.

Содержимое всего файла и результаты решения индивидуального задания записать в текстовый файл.

Распечатать анкетные данные студентов, сдавших сессию на 8, 9 и 10.

Листинг 6.1

#include <io.h>

#include <stdio.h>

#include <conio.h>

struct Students{

char FIO[30];

int year_birthday;

int num_group;

int balls[4];

double s_ball;

};

Students student;

FILE *Fs, *Ft; // файл структуры и текстовый соответственно

char fs_name[] = "students.dat";

char ft_name[] = "result.txt";

int size = sizeof(Students);

// прототипы функций

void create();

void add();

bool view();

void out(Students, int);

void edit(int);

void save(Students *, int);

void zadanie();

void main(){

int kod, kod_edit, edit_number;

Ft = fopen(ft_name, "w");

while(1){

puts("\n1 - Create\t2 - View\t3 - Edit\t4 - Zadanie\t0 - Exit\n");

puts("Input the code here: ");

scanf("%d", &kod);

switch(kod){

case 0:

fclose(Ft);

return;

case 1: // Create File

create();

if(!Fs){

puts("\nCreate Error!");

return;

}

break;

case 2: // View

if (!view()){

puts("\n\nError View!\n");

return;

}

break;

case 3: // Edit

puts("\n1 - Add\t2 - Edit\n");

scanf("%d", &kod_edit);

switch(kod_edit){

case 1: // Add new record

add();

puts("Add a new line");

break;

case 2:

// Edit record

view();

printf("\n\nVvedite nomer izmenyaemoj zapisi:\t");

scanf("%d", &edit_number);

edit(edit_number);

///////

break;

}

break;

case 4:

zadanie();

break;

}

}

getch();

}

/*

* Функция для создания нового пустого файла структуры

*/

void create(){

Fs = fopen(fs_name, "wb");

puts("\nFile Created!\n");

}

/*

* Функция для добавления новой записи в структуру

*/

void add(){

double fiz, mat, inf, khi, sball;

Fs = fopen(fs_name, "ab");

printf("\nFIO - ");

fflush(stdin);

gets(student.FIO);

printf("\nBirthday Year, Number Group - ");

scanf("%d %d", &student.year_birthday, &student.num_group);

printf("\nInput Balls: fizik, matem, informatic, khimya - ");

scanf("%d %d %d %d", &student.balls[0], &student.balls[1],

&student.balls[2], &student.balls[3]);

fiz = student.balls[0];

mat = student.balls[1];

inf = student.balls[2];

khi = student.balls[3];

sball = (fiz + mat + inf + khi) / 4;

printf("%6.2lf", sball);

student.s_ball = sball;

fwrite(&student, size, 1, Fs);

fclose(Fs);

}

/*

* Отобржажение файла структуры на дисплее

*/

bool view(){

int i = 1;

Fs = fopen(fs_name, "rb");

if (!Fs)

return false;

printf("\n\t--------------- Informations ---------------\n");

fprintf(Ft, "\n\n\n\t--------------- Informations ---------------\n");

while(1){

if(!fread(&student, size, 1, Fs)) break;

out(student, i);

i++;

}

puts("\n\n\n");

fclose(Fs);

return true;

}

/*

* Отображение одной записи на дисплее

* Вх. параметры:

* - s типа структуры Students

* - i - для отображения порядкового номера (счётчик) ->

* ->исп. для вывода номера записи, в файл не записывается

*/

void out(Students s, int i=0){

printf("\n%d. %s - %d, group: %d; Fizik: %d, Matem: %d, Informatic: %d, Khimiya: %d, Sredni ball: %1.2lf", i, s.FIO, s.year_birthday, s.num_group, s.balls[0], s.balls[1], s.balls[2], s.balls[3], s.s_ball);

fprintf(Ft, "\n%s - %d, group: %d; Fizik: %d, Matem: %d, Informatic: %d, Khimiya: %d, Sredni ball: %1.2lf", s.FIO, s.year_birthday, s.num_group, s.balls[0], s.balls[1], s.balls[2], s.balls[3], s.s_ball);

}

void edit(int edit_number){

Students *st, newStudent;

int descriptor, i, kol;

long len;

printf("\nEdit student:\nFIO - ");

fflush(stdin);

gets(newStudent.FIO);

printf("\nBirthday Year, Number Group - ");

scanf("%d %d", &newStudent.year_birthday, &newStudent.num_group);

printf("\nInput Balls: fizik, matem, informatic, khimya - ");

scanf("%d %d %d %d", &newStudent.balls[0], &newStudent.balls[1], &newStudent.balls[2], &newStudent.balls[3]);

newStudent.s_ball = (newStudent.balls[0]+newStudent.balls[1] + newStudent.balls[2] + newStudent.balls[3]) / 4;

Fs = fopen(fs_name, "rb");

descriptor = fileno(Fs);

len = filelength(descriptor);

kol = len/size;

st = new Students[kol]; // 138

for (i=0; i<kol; i++){

fread((st+i), size, 1, Fs);

}

fclose(Fs);

st[edit_number-1] = newStudent;

for (i=0; i<kol; i++)

out(st[i], i+1);

save(st, kol);

delete []st;

}

void save(Students *st, int num){

int i;

Fs = fopen(fs_name, "wb");

for (i=0; i<num; i++)

fwrite(&st[i], size, 1, Fs);

fclose(Fs);

}

/**

* Выполнение индивидуального задания

* 1 Вариант:

* - Распечатать анкетные данные студентов, сдавших ->

* ->сессию на 8, 9 и 10.

*/

void zadanie(){

Students *st;

int descriptor, i, j=0, kol;

long len;

printf("\n ------- Studenti sdavwie sesiyu na 8, 9, 10 ------- ");

fprintf(Ft, "\n ------- Studenti sdavwie sesiyu na 8, 9, 10 ------- ");

Fs = fopen(fs_name, "rb");

descriptor = fileno(Fs);

len = filelength(descriptor);

kol = len/size;

st = new Students[kol];

for (i=0; i<kol; i++){

fread((st+i), size, 1, Fs);

}

fclose(Fs);

for (i=0; i<kol; i++){

if (st[i].balls[0]>=8 && st[i].balls[1]>=8 && st[i].balls[2]>=8 && st[i].balls[3]>=8)

out(st[i],0);

}

delete []st;

}

Результат выполнения программы.

Используемая литература.

Б. Страуструп. Язык программирования С++

Соседние файлы в папке отчёты