отчет 1 (1079778)
Текст из файла
Отчет по Лабораторной работе №1
«Разработка и использование класса Планета»
Работу выполнила Чёрненькая И.С. ____________
ИУ-5-21
Преподаватель Козлов А.Д. ____________
7 апреля 2009 г.
Условие задачи
- создание программных объектов пользовательских типов с использованием классов;
- создание многофайловых проектов (заголовочный файл для класса, файл с определением методов класса и файл с main-функцией);
- ввод-вывод объектов пользовательских типов в файл;
- перегрузка операций ввода-вывода << и >> для пользовательских типов;
- перегрузка операций отношения (>,==, …) для пользовательских типов;
- сортировка массивов объектов пользовательских типов, хранящихся в файле, с использованием перегруженных операций.
Описание алгоритма
В class_planets.h создается пользовательский класс Планеты, содержащий в себе 4 характеристики планет, методы-аксессоры к этим private полям класса и методы, позволяющие менять значения полей. Стандартный конструктор перегружен для того, чтобы была возможность присваивать экземпляру класса имя. Для класса планет перегружены операторы вывода «>>» и ввода «<<», логические операторы сравнения «<», «>» и «==».
Информация о планетах хранится в текстовом файле. С помощью метода getline() объекта ifstream данные поштучно считываются из файла и для каждой планеты заполняются все поля. По завершении работы функции fillArray() имеем массив из объектов класса Planet с полностью заполненными характеристиками.
Для записи информации о планетах в файл разработана функция putArray(). Данные записываются построчно во внешний файл.
Следующим шагом работы программы является сортировка массива планет. В функциях при передачи массива планет, используется передача адреса для экономии памяти и повышения производительности.
Для редактирования информации о планетах используется функция editArray(). Для ввода информации используется перегруженная функция ввода.
Последним шагом является вывод информации на экран с помощью функции printArray(). Для вывода используется ранее перегруженная функция вывода.
При запуске, приложения программа автоматически спрашивает пользователя о файле, из которого производить первичное чтение базы данных. Далее пользователь видит перед собой меню из 5 пунктов, в котором может выбрать одну из описанных выше операций.
Описание класса:
Класс Planet содержит 4 поля - характеристики планет в спецификаторе доступа private:
name – поле типа string имя планеты,
diameter – поле типа int диаметр планеты,
live – поле типа bool возможность жизни на планете,
sats – поле типа int количество спутников планеты.
В спецификаторе доступа public описаны методы доступа к полям класса и методы для изменения этих полей:
getName – метод типа srting, аксессор к полю name,
getDiameter – метод типа int, аксессор к полю diameter,
getLive – метод типа bool, аксессор к полю live,
getSats – метод типа int, аксессор к полю sats,
setName – метод типа void, позволяющий изменять поле name,
setDiameter – метод типа void, позволяющий изменять поле diameter,
setLive – метод типа void, позволяющий изменять поле live,
setSats – метод типа void, позволяющий изменять поле sats.
Алгоритм программы:
Текст программы:
111.txt
Merkury
4878
0
0
Venus
12104
0
0
Earth
12774
1
1
Mars
6786
1
2
Jupiter
142796
0
16
Saturn
120000
0
17
Uranus
51108
0
5
Neptune
49600
0
2
Pluto
2280
0
1
Планеты. cpp
#include "stdafx.h"
#include "class_planets.h"
#include "Система.h"
#include "ConsolCyr.h"
int _tmain(int argc, _TCHAR* argv[])
{
int Size = 0;
Planet* planets;
int ind;
string file_name = "111.txt"; // из этого файла считываем
string file_name_o = "222.txt"; // в этот файл пишем
cout << "Введите количество планет" << endl;
cin >> Size;
system("cls");
while (true)
{
switch (menu())
{
case 1:
{
planets = fillArray(file_name,Size);
system ("cls");
break;
}
case 2:
{
putArray(file_name_o,planets,Size);
system ("cls");
break;
}
case 3:
{
printArray(planets,Size);
system("pause");
system ("cls");
break;
}
case 4:
{
cout << "Выберите планету для редактирования" << endl;
for(int i=0;i<Size;i++) cout << i+1 << ". " << planets[i].getName() << endl;
cout<<"Ваш выбор ";
int u;
cin >> u;
cin.clear();
cin.ignore(10,'\n');
system ("cls");
while (true)
{
switch (menued())
{
case 1:
{ string tmp; cout << "Введите имя" << endl;
cin >> tmp;
planets[u-1].setName(tmp);
break;
}
case 2:
{ long tmp; cout << "Введите диаметр" << endl;
cin >> tmp;
if (tmp>0)
planets[u-1].setDiameter(tmp);
break;
}
case 3:
{ int tmp;
cout << "Введите спутники" << endl;
cin >> tmp;
if (tmp>=0)
planets[u-1].setSats(tmp);
break;
}
case 4:
{ bool tmp;
cout << "жизнь есть - нажмите 1, жизни нет - нажмите 0" << endl;
cin >> tmp;
planets[u-1].setLive(tmp);
break;
}
case 5:
{
break;
}
}
break;
}
}
case 5:
{
sortArray(planets,Size);
system ("cls");
break;
}
case 6:
{
return 0;
}
default:
{
cout<<"Неверный ввод"<<endl;
break;
}
}
}
}
Class_planets.h
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include "ConsolCyr.h"
using namespace std;
class Planet{
public:
Planet(string Name = "") // конструктор
{
name = Name;
}
~Planet()// деструктор
{};
string getName();
int getDiameter(); // методы, с помощью которых имеем доступ к полям класса
bool getLive();
int getSats();
void setName(string);
void setDiameter(int);
void setLive(bool);
void setSats(int);
friend istream& operator >> (istream& in, Planet& plan){ // перегрузка операции ввода
cout << "Имя: ";
in >> plan.name;
cout << "Диаметр: ";
in >> plan.diameter;
cout << "Спутники: ";
in >> plan.sats;
cout << "1 - жизнь есть, 0 - жизни нет: ";
in >> plan.live;
return in;
}
private:
string name;
int diameter;
bool live;
int sats;
};
string Planet::getName(){ // метод доступа к полю ИМЯ
return name;
}
int Planet::getDiameter(){
return diameter;
}
bool Planet::getLive(){
return live;
}
int Planet::getSats(){
return sats;
}
void Planet::setName(string Name){ // метод, меняющий поле ИМЯ
name = Name;
}
void Planet::setDiameter(int Diameter){
if (Diameter<=0)
diameter=3000;
else
diameter=Diameter;
}
void Planet::setSats(int Sats){
if (Sats<0)
sats=0;
else
sats=Sats;
}
void Planet::setLive(bool Live){
live=Live;
}
ostream& operator << (ostream& out, Planet &plan){ // перегрузка операции вывода
out << endl<< "Имя: " << plan.getName() << endl;
out << "Диаметр: " << plan.getDiameter() << endl;
out << "Спутники: " << plan.getSats() << "\n";
out << (plan.getLive()?"Жизнь есть":"Жизни нет") << endl;
return out;
}
bool operator > (Planet plan1, Planet plan2){ // перегрузка оператора сравнения ">"
if(plan1.getName() > plan2.getName()){
return true;
}else{
return false;
}
}
bool operator < (Planet plan1, Planet plan2){ // перегрузка оператора сравнения "<"
return bool(plan1.getName()<plan2.getName());
}
bool operator == (Planet plan1, Planet plan2){ // перегрузка оператора сравнения "=="
return bool(plan1.getName()==plan2.getName());
}
Система.h
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <iomanip>
#include "ConsolCyr.h"
using namespace std;
Planet* fillArray(string fname, int k){ // функция чтения из файла
ifstream fp(fname.data());
if (!fp.is_open()) {cout<<"Файл не найден\n";exit(1);}
Planet* planets = new Planet[k];
int i=0;
bool l;
int pnum=0;
string buff;
while(pnum < k){
fp >> buff;
planets[pnum].setName(buff);
fp >> i;
planets[pnum].setDiameter(i);
fp >> l;
planets[pnum].setLive(l);
fp >> i;
planets[pnum].setSats(i);
pnum++;
}
return planets;
}
void sortArray(Planet* &planets, int k){ // функция сортировки по возрастанию
Planet temp;
for (int i=1; i<k; i++)
{
for(int j=0; j<k-i; j++)
{
if(planets[j]>planets[j+1])
{
temp = planets[j];
planets[j] = planets[j+1];
planets[j+1] = temp;
}
}
}
}
void printArray(Planet* &planets, int k) // функция печати
{
for(int i=0;i<k;i++)
{
cout << planets[i] << endl;
if(i!=k-1) ;
}
}
void editArray(Planet* &planets, int k)// функция редактирования
{
}
void putArray(string fname, Planet* &planets, int k){ // функция записи в файл
ofstream f(fname.data());
for (int i=0; i<k; i++)
{
f<<planets[i].getName()<<endl;
f<<planets[i].getDiameter()<<endl;
f<<planets[i].getLive()<<endl;
f<<planets[i].getSats()<<endl;
}
}
int menu()
{
cout << "1. Прочитать файл" << endl;
cout << "2. Записать в файл" << endl;
cout << "3. Вывести список планет" << endl;
cout << "4. Редактировать планету" << endl;
cout << "5. Сортировать" << endl;
cout << "6. Выход" << endl;
int choice;
cin >> choice;
cin.clear();
cin.ignore(10,'\n');
return choice;
}
int menued()
{
cout << "Что вы хотите редактировать?" << endl;
cout << "1. Имя" << endl;
cout << "2. Диаметр" << endl;
cout << "3. Спутники" << endl;
cout << "4. Жизнь" << endl;
cout << "5. Возврат в главное меню" << endl;
int choice;
cin >> choice;
cin.clear();
cin.ignore(10,'\n');
return choice;
}
Проверка и вывод результата:
Главное меню:
Вывидем список планет:
Меню редактирования:
Изменим имя планеты Mars на Mors: Изменим количество спутников у Земли:
Отсортируем и и выведем список планет со сделанными изменениями:
Программа работает исправно.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















