Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
/
Звіт
про виконання лабораторної роботи №2
з дисципліни:
“Програмування, частина 2 (Об’єктно-орієнтоване програмування)”
на тему:“ Потоковий ввід-вивід ”
2017
Мета: познайомитися із потоковим вводом-виводом.
Теоретичні відомості
Простори імен
У мові програмування С++ так само як і у багатьох об’єктно-орієнтованих мовах програмування існує поняття просторів імен, що розділяються, на відміну від мови С в якій існує один глобальний простір імен. Простори імен служать для об’єднання класів, що написані різними програмістами або мають схоже призначення в групи. Завдяки цьому з’являється можливість усувати неоднозначності, що пов’язані з використанням класів, що мають однакові імена, але різне призначення. Також простори імен дозволяють безпечно підключати бібліотеки класів не боячись співпадінь у назвах існуючих і підключених класів. Все, що оголошене в межах простору імен є видимим лише в його межах.
Для оголошення простору імен слід вжити ключове слово namespace після якого слід вказати назву простору імен. Після цього в фігурних дужках визначається його тіло. Тіло простору імен може містити як класи і структури, так і функції зі змінними та константами, а також вкладені простори імен. Приклад просторів імен:
namespace Student
{
char* pszName;
int* pMarks;
double averageMark(int* Marks, int size);
}
namespace Teacher
{
char* pszName;
double averageMark;
}
Простори імен є відкритими. Це означає, що можна в будь-якому місці програми оголосити простір імен з існуючою назвою, додати в нього нові елементи і при компіляції ці простори імен об’єднаються в один, що міститиме існуючі і нововведені елементи.
Простір імен може бути безіменним, якщо його ім’я при оголошенні не вказується. Безіменні простори імен можна використовувати для оголошення глобальних статичних змінних з внутрішнім зв’язуванням, оскільки згідно стандарту ключове слово static є застарілим.
Для того, щоб звернутися до елементу з простору імен слід вказати назву простору імен, оператор розширення області видимості (::) та здійснити відповідне звернення до елементу простору імен:
Student :: averageMark(arr, size);
Teacher :: averageMark = 5.2;
Щоб постійно не вказувати простори імен при зверненні до їх елементів, їх можна підключити до програми за допомогою ключового слова using частково або повністю. Для підключення окремих елементів простору імен використовується using оголошення. Для підключення всього простору імен з використовується using директива.
Синтаксис підключення окремих елементів простору імен з використанням using оголошення:
using назваПросторуІмен :: назваЕлементу;
using Student :: averageMark;
using Teacher :: pszName;
Тепер до функції averageMark з простору імен Student і змінної pszName з простору імен Teacher можна звертатися звичним чином:
averageMark(arr, size);
pszName = “Микола Григорович”;
Синтаксис підключення всього простору імен з використанням using директиви:
using namespace назваПросторуІмен;
using namespace Student;
При підключені всього простору імен ми можемо звичним чином звертатися до всіх його елементів. Проте, при підключенні кількох просторів імен, що мають елементи з однаковою назвою до яких відбувається звертання, відбудеться конфлікт імен. Для його усунення слід явно вказувати до якого простору імен належить елемент до якого іде звертання.
Простори імен можуть бути вкладеними. Оголошення вкладених просторів імен відбувається шляхом визначення простору імен в просторі імен:
namespace NSpace1
{
…
namespace NSpace2
{
…
int value;
}
}
Якщо простори імен є вкладеними, то слід вказати повний шлях до елемента розмежовуючи простори імен оператором ::, наприклад:
NSpace1 :: NSpace2 :: value = 5;
Аналогічно відбувається підключення просторів імен та їх елементів за допомогою ключового слова using.
Потоки вводу-виводу в С++
Система вводу-виводу в стандартній бібліотеці С++ реалізована у вигляді потоків. Потік вводу-виводу – це логічний пристрій, який приймає та видає інформацію користувача. Кожен потік зв’язаний з фізичним пристроєм (клавіатура, монітор) або з файлом. Бібліотека потоків iostream реалізована як ієрархія класів та забезпечує широкі можливості для виконання операцій вводу-виводу. Далі наведено призначення деяких класів потокового вводу-виводу:
istream – підтримує операції по вводу;
ostream – підтримує операції по виводу;
iostream – підтримує операції по вводу-виводу;
іfstream – підтримує операції по вводу з файлу;
ofstream – підтримує операції по виводу у файл;
fstream – підтримує операції з файлами по вводу-виводу.
Завдання:
Написати програму, яка буде додавати у текстовий файл введену з клавіатури інформацію(згідно курсового проекту). Слід передбачити можливість вибору користувачем режиму роботи: додавання чи відображення даних (меню). Забезпечити зберігання даних у файлі у вигляді структурованої таблиці за допомогою засобів форматування. При виводі на екран має відображатися шапка з інформацією в якій колонці які дані відображаються. У файлі має зберігатися лише структурована інформація без шапки.
У моїй програмі є дві функції lookSchedule та editSchedule. Перша використовується для перегляду розкладу поїздів, а друга для його редагування.
В файлі Сashier.h прописуємо інтерфейс з 2 методами: void LookSchedule(string) і void LookSchedule(int);
В файлі Сashier.cpp прописуємо реалізації цих двох методів.
В файлі Sourse.cpp в якому є виконавчий метод main створюємо об’єкт який буде викликати наші методи.
Код Sourse.cpp:
#include "Cashier.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
while (true)
{
setlocale(LC_CTYPE, "ukr");
int numeric, numberTrain = 1, platform = 1;
string nameTrain, arrivalTime, departureTime;
cout << "Виберiть що ви хочете зробити:\n якщо переглянути розклад нажмiть 1,\n якщо редагувати розклад нажмiть 2,\n щоб вийти нажмiть 3.\n";
cin >> numeric;
Cashier vasuluna; //Створюємо в класі об'єкт
if (numeric == 1)
{
vasuluna.lookSchedule(numberTrain, nameTrain, arrivalTime, departureTime, platform); //Об'єкт визиває метод, щоб переглянути розклад
}
if (numeric == 2)
{
cout << "Введiть змiни до розкладу\n";
vasuluna.editSchedule(numberTrain, nameTrain, arrivalTime, departureTime, platform); //Об'єкт визиває метод, щоб редагувати розклад
}
if (numeric == 3)
{
break;
}
}
}
Код Сashier.cpp:
#include "Cashier.h"
#include <iostream>
#include<fstream>
#include<iomanip>
using namespace std;
int Cashier::lookSchedule(int numberTrain, string nameTrain, string arrivalTime, string departureTime, int platform) //Клас визиває метод для перегляду розкладу
{
ifstream infile;
infile.open("Schedule.txt");
if (!infile)
{
cout << "Cannot open file" << endl;
return -1;
}
cout << setw(20) << "Номер поїзда" << setw(20) << "Назва поїзда" << setw(20) << "Час прибуття" << setw(20) << "Час вiдправлення" << setw(20) << "Номер платформи" << setw(20) << endl;
while (!infile.eof())
{
infile >> numberTrain;
infile >> nameTrain;
infile >> arrivalTime;
infile >> departureTime;
infile >> platform;
if (!infile.eof())
{
cout.width(20);
cout << numberTrain;
cout.width(20);
cout << nameTrain;
cout.width(20);
cout << arrivalTime;
cout.width(20);
cout << departureTime;
cout.width(20);
cout << platform;
cout << endl;
}
}
infile.close();
}
int Cashier::editSchedule(int numberTrain, string nameTrain, string arrivalTime, string departureTime, int platform) //Клас визиває метод для редагування розкладу
{
cout << "Номер поїзда:";
cin >> numberTrain;
cout << "Назва поїзда:";
cin >> nameTrain;
cout << "Час прибуття:";
cin >> arrivalTime;
cout << "Час вiдправлення:";
cin >> departureTime;
cout << "Номер платформи:";
cin >> platform;
fstream outfile("Schedule.txt", ios::app);
if (!outfile)
{
cout << "Cannot open file" << endl;
return -1;
}
outfile.setf(ios::left);
outfile.width(20);
outfile << numberTrain << ' ';
outfile.width(20);
outfile << nameTrain << ' ';
outfile.width(20);
outfile << arrivalTime << ' ';
outfile.width(20);
outfile << departureTime << ' ';
outfile.width(20);
outfile << platform << endl;
outfile.close();
}
Код Сashier.h:
#pragma once
#include <string>
using namespace std;
class Cashier
{
public:
int lookSchedule(int, string, string, string, int); //Створюємо метод для відкривання розкладу
int editSchedule(int, string, string, string, int); //Створюємо метод для редагування розкладу
};
Результат виконання програми:
/
Рис.1 - Ескіз екрана виконаної програми(Коли відбувається вивід розкладу на екран)
/
Рис.2 - Ескіз екрана виконаної програми(Коли пошук відбувається його редагування)
Висновок: виконуючи другу лабораторну роботу я отримав знання та навички у використанні потокового файлового вводу та виводу, що стане мені корисним для курсової роботи. В подальшому планую навчитися виконувати сортування цього списку та його редагування.