Методические указания к лабораторным работам
2-й семестр
Порядок выполнения лабораторных работ
Познакомиться с темой и целью лабораторной работы.
Изучить необходимые к выполнению лабораторной работы теоретические сведения и примеры программ.
Познакомиться с общим заданием к лабораторной работе и индивидуальным вариантом задания.
Написать и отладить программу решения задачи индивидуального варианта.
Протестировать работу программы на различных наборах исходных данных.
Продемонстрировать преподавателю работу программы.
Оформить отчет.
Защитить лабораторную работу.
Оборудование, технические средства, инструмент
Лабораторные работы выполняются в компьютерном классе, оснащенном персональными компьютерами. На компьютерах должна быть установлена система программирования, поддерживающая создание программ на С++ (например, Qt Creator, MS Visual C++ Express), система программирования на Java (например, NetBeans) и система программирования на С# (например, MS Visual C# Express).
Требования к оформлению отчета
Отчет по лабораторной работ должен содержать:
титульный лист;
цель работы;
задание к лабораторной работе (общее задание и индивидуальный вариант задания);
состав проекта и листинг программы;
тестовые примеры, иллюстрирующие все варианты работы программы.
Требования к защите лабораторных работ
После оформления отчета, лабораторную работу защищают, т. е. поясняют алгоритм работы программы и отвечают на контрольные вопросы.
Лабораторная работа №6. Работа с файлами в С++, Java и C#.
Цель работы: получить практические навыки работы с дисковыми файлами в С++, Java и C#.
Задание 1
Изменить программу, созданную на С++ на основе задания 1 лабораторной работы № 5. В класс индивидуального варианта добавить метод diskIn(), который записывает поля объекта в файл и метод diskOut(), который читает поля объекта из файла. В функцию main() добавить запись массива объектов класса индивидуального варианта в файл и чтения их из файла с использованием методов diskIn() и diskOut() .
Пример 1
В листинге 1 представлена программа, в которой формируется исходный список студентов, список студентов с минимальным рейтингом, а также осуществляется поиск информации о рейтинге студента по его фамилии. Исходный список студента сортируется по фамилии в алфавитном порядке. В программе имеется возможность записи списка студентов в текстовый файл и чтение списка студентов из текстового файла.
Для создания программы использовалась среда разработки Qt Creator 3.0 (основан на Qt 5.2.0). На рисунке 1 показан состав проекта программы.
Рисунок 1 – Состав проекта программы
Создание проекта в Qt Creator: Файл -> Новый файл или проект … -> Проект без использования Qt -> Простой проект на С++.
Добавление класса в проект: Файл -> Новый файл или проект … -> С++ -> Класс С++.
Компиляция, сборка и выполнение проекта: Сборка -> Запустить.
На рисунке 2 показан результат выполнения программы.
Листинг 1
// student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <string>
#include <fstream>
using namespace std;
class Student
{ private:
string fam;
string name;
int grade; //рейтинг
public:
Student();
~Student();
string getfam();
string getname();
int getgrade();
void setfam(string fam1);
void setname(string name1);
void setgrade(int grade1);
void input();
void output();
void diskOut(ofstream& fout); // запись в файл
void diskIn(ifstream& fin); // чтение из файла
};
#endif // STUDENT_H
// student.cpp
#include "student.h"
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
Student::Student()
{ fam = "";
name = "";
grade = 0;
}
Student::~Student(){}
void Student::output()
{ cout << left << setw(10)<< fam;
cout << setw(13) << name;
cout << setw(3) << grade << endl;
}
void Student::input()
{ cin.get();
cout << "\nФамилия: "; getline(cin, fam);
cout << "Имя: "; cin >> name;
cout << "Рейтинг: "; cin >> grade; cin.ignore();
if (grade < 0 || grade > 100)
throw "\nОшибка: Рейтинг должен быть от 0 до 100!";
if (cin == NULL) { throw "\nОшибка формата!";}
}
void Student::diskOut(ofstream& fout)
{ fout << fam << endl;
fout << name << endl;
fout << grade << endl;
}
void Student::diskIn(ifstream& fin)
{ getline(fin, fam);
getline(fin, name);
fin >> grade; fin.get();
}
string Student::getfam() { return fam;}
string Student::getname(){ return name;}
int Student::getgrade(){ return grade;}
void Student::setfam(string fam){this->fam = fam;}
void Student::setname(string name){this->name = name;}
void Student::setgrade(int grade){this->grade = grade;}
// main.cpp
#include "student.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
using namespace std;
int compare(const void* s1, const void* s2)
{ if (((Student*)s1)->getfam() < ((Student*)s2)->getfam()) return -1;
else if (((Student*)s1)->getfam() > ((Student*)s2)->getfam()) return 1;
else return 0;
}
int main()
{ int n; int p; bool fl = true;
Student* st = NULL;
try{
do { cout << "Введите 1 или 2: ";
cout << "\n1 - Ввод списка студентов и запись в файл";
cout << "\n2 - Чтение списка студентов из файла";
cout << "\n>"; cin >> p; cin.ignore();
if (p == 1)
{ fl = false;
cout << "Введите кол-во студентов: ";
cin >> n;
st = new Student[n];
cout << "Введите информацию о студентах: ";
for(int i = 0; i<n; i++)
st[i].input();
ofstream fout("E:\\Student.txt");
fout << n <<endl;
for(int i = 0; i<n; i++)
st[i].diskOut(fout);
fout.close();
}
if (p == 2)
{ fl = false;
ifstream fin("E:\\Student.txt");
if (!fin) throw "\nОшибка: Файл не найден!";
else
{ fin >> n; fin.get();
st = new Student[n];
for (int i = 0; i < n; i++)
st[i].diskIn(fin);
fin.close();
}
}
if (cin == NULL) { throw "\nОшибка формата!";}
}while(fl);
qsort(st,n,sizeof(Student), compare);
cout << "\nСписок студентов: \n";
cout << setw(10) << "Фамилия" << setw(11)<< "Имя" << setw(9)<< "Рейтинг" << endl;
for(int i = 0; i<n; i++)
st[i].output();
string fam;
cout << "\nУкажите фамилию студента: "; cin >> fam;
int f = 0;
for(int i = 0; i<n; i++)
if (st[i].getfam() == fam)
{ cout << "\nРейтинг студента "<< fam <<" - " << st[i].getgrade();
f = 1;
}
if (f == 0) cout << "\nНет в списке студента " << fam;
int min = st[0].getgrade();
for(int i = 0; i<n; i++)
if (st[i].getgrade() < min)
min = st[i].getgrade();
cout << "\nСписок студентов с минимальным рейтингом: \n";
cout << setw(10) << "Фамилия" << setw(11)<< "Имя" << setw(9)<< "Рейтинг" << endl;
for(int i = 0; i<n; i++)
if (st[i].getgrade() == min)
st[i].output();
delete [] st;
}
catch (const char *str)
{ cout << str << endl; }
}
Рисунок 2 – Результат выполнения программы