К выполнению лабораторной работы №2.
Тема: «Создание ООП обработки массивов данных сложной структуры».
Задание на ЛР2 совпадает с заданием на ЛР1, но дополнительно
1) должна быть написана отдельная функция сохранения исходных данных в файлах на диске (текстовом и двоичном);
2) спроектировать выполнение пунктов а) и б) индивидуального задания так,чтобы исходные данные могли считываться как из двоичного файла, так и вводиться с клавиатуры (для этого следует создать отдельные функции);
3) результат обработки необходимо сохранить в текстовом и двоичном файлах, причем в текстовых файлах данные должны быть представлены в виде таблицы.
Пример индивидуального задания:
Имеются сведения о результатах сдачи сессии студентами группы:
Фамилия студента и оценки за 3 экзамена.
Требуется: а) для каждого студента найти средний балл за сессию;
б) по каждому предмету найти средний балл группы, а также процент отличников и процент не сдавших экзамен студентов с указанием названий предметов.
Пример оформления программного кода:
// Подключение стандартных библиотек:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<iostream.h>
#include<io.h>
struct Zap { char Fam[10]; //Фамилия студента
int Bal[3]; //Оценки за сессию
float SRED; }; //Средний балл
struct Rec { char Naz[15]; //Название предмета
float PR[3];}; //Средний балл и искомые %-ты
//****************************
Class PRED{//Описание класса для работы с предметами
friend class STUD;
Rec* P;
int N;
public:
void Input(); //Ввод названий предметов
void Print(); //Вывод результата
PRED(int k){N=k; P=new Rec[k];}
~PRED(){delete []P;}
};
//Описание функций класса PRED:
void PRED::Input(){//Ввод названий предметов:
for(int i=0;i<N;i++){
cout<<"\n Input nazv. predmeta: "<<i+1<<"). ";cin>>P[i].Naz;
for(int j=0;j<3;j++)P[i].PR[j]=0;
}}
/ //Вывод результата:
void PRED::Print() { FILE *f=stdout; int k;
do{ fprintf(f,"\n---------------------------------------------------");
fprintf(f,"\n N Nazvanie SR_Bal Proc_5 Proc_2 ");
fprintf(f,"\n---------------------------------------------------");
for(int i=0;i<N;i++){
fprintf(f,"\n%4d). %15.14s",i+1,P[i].Naz);
for(int j=0;j<3;j++)fprintf(f," %8.2f",P[i].PR[j]);
}
fprintf(f,"\n---------------------------------------------------");
k=0;
if(f==stdout){cout<<"\n Save in file Predmet.txt? (1-Yes, 0-No): ";
cin>>k;if(k)f=fopen("Predmet.txt","wt");}
else fclose(f);
}while(k); }
//************************************
Class STUD{//Описание класса для работы со студентами
Zap* Mas;
int kol; //количество студентов в группе
public:
void Input(); //Ввод исходных данных
void Input_con(int n); //Ввод данных с клавиатуры
void Input_RND(int n); //Ввод данных случайным образом
void Input_FL(); //Ввод данных из файла
void Input_bin(FILE*); //Чтение данных из двоичного файла
void Action(); //Выполнение пункта а) задания
void Print_SR(); //Вычисления ср.баллов по предметам
void Print_table(FILE*); //Вывод таблицы результата
void Write_bin(FILE*); //Запись данных в двоичный файл
void Print_Sort(); //Вывод результата сортировки
int Save(); //Сохранение результата работы
void Sort_Pole(int); //Сортировка данных
void Punkt_B(PRED&); //Выполнение пункта б) задания
STUD(){kol=0;} //Конструктор класса
~STUD(){delete []Mas;} //Деструктор класса
};
//Описание функций класса STUD:
Ввод исходных данных
void STUD::Input(){ int i,N;
cout<<"\n Input data from:";
cout<<"\n 1- Consol, 2- RND, 3- File (0- Exit): -> "; cin>>i;
if(!i)exit(0);
if(i<3){cout<<"\n Input kol-vo zapisei: "; cin>>N;}
switch(i){
case 1:Input_con(N);break;
case 2:Input_RND(N);break;
case 3:Input_FL();
} }
Ввод данных из файла
void STUD::Input_FL(){ FILE* ft; int L; char NF[15];
//------------------------------------------
do{cout<<"\n Input File Name bin-file: ";cin>>NF;
ft=fopen(NF,"rb");
if(!ft){cout<<"\n File -> no exist!";break;}
Input_bin(ft); fclose(ft);L=0;
}while(L); }
Чтение данных из двоичного файла
void STUD::Input_bin(FILE* f) { Zap z;
if(kol)delete []Mas;
int i=fileno(f);
long L=filelength(i);
kol=L/sizeof(Zap);
cout<<"\n Kol-vo zapisei="<<kol;
Mas=new Zap[kol];
for(i=0;i<kol;i++)fread(Mas+i,sizeof(Zap),1,f);
cout<<"\n Press any key...";getch(); }
Ввод данных с клавиатуры
void STUD::Input_con(int n){ Zap z;
if(n>kol){ if(kol) delete []Mas; kol=n; Mas=new Zap[n]; }
for(int i=0;i<n;i++){
printf("\n %d). Input FAM: ",i+1); cin>>z.Fam;
for(int j=0;j<3;j++){
printf(" Input BAL %d: ",j+1); cin>>z.Bal[j];
}
z.SRED=0; Mas[i]=z; } }
Ввод данных случайным образом
void STUD::Input_RND(int n){ Zap z; int i,j;
char st[]="QWERTYUIOPASDFGHJKLZXCVBNM";
int k,L=strlen(st);
if(n>kol){ if(kol) delete []Mas; kol=n; Mas=new Zap[n]; }
randomize();
for(i=0;i<n;i++){ k=random(7);
for(j=0;j<2+k;j++) z.Fam[j]=st[random(L)];
z.Fam[j]='\0';
for(j=0;j<3;j++)z.Bal[j]=1+random(5);
z.SRED=0; Mas[i]=z; } }