Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
РОЗРАХУНКОВО-ГРАФІЧНА РОБОТА
з дисципліни
«Об’єктно-орієнтоване програмування, частина 2»
Керівник лабораторних занять:
ст. викладач Кузьо М.М.
Варіант 11
Завдання 1.Згідно вибраного номеру задачі, вказаного нижче, написати програму реалізації перевантажених функцій, вибравши відповідну їх групу:
a) int func(int* arr, int length1);
double func(double* arr, int length1);
Функція func(....) :
перевіряє чи елементи масиву розташовані по спаданню.
Головна програма повинна містити також тестову перевірку програми виконання поставленої задачі а також ввід значень індексів розмірності двовимірного масиву, режим багаторазового вводу вхідної послідовності, вводу всіх можливих комбінації вхідної послідовності, за якої забезпечується як виконання, так і не виконання відповідної умови задачі.
Результати виконання кожної тестової перевірки програми повинні відображатись на екрані монітора, а також записані в текстовий файл, тобто програма повинна забезпечувати:
- запис даних у текстовий файл ;
- читання даних з текстового файлу.
Запис даних у файл здійснюється у вигляді структурованої таблиці, з використанням засобів форматування. Послідуючі записи додаються у файл.Не менше двох записів у файл повинно бути здійснено.
Слід передбачати незалежний багаторазовий вибір користувачем режиму роботи: запис чи читання даних при роботі з текстовим файлом.
Структура даних, що записується у файл наступна:
перше поле – поле запису прізвища;
друге поле – поле запису імені;
третє поле – поле запису номера групи та номера завдання;
четверте поле – поле запису результату тестової перевірки, що включає задану вхідну послідовність даних та вихідну, за необхідності, або, відповідний до умови задачі, результат обчислення.
Слід також передбачити обробку виключних ситуацій
Порядок виконання:
1.Реалізовано програму main.cpp
#include<iostream>
#include<fstream>
#include<conio.h>
using namespace std;
int func(int**arr,int lenght1,int lenght2)
{
int b;
for(int k=0;k+1<lenght1;k++)
for(int j=0;j+1<lenght2;j++)
{
if(arr[k][j]<=arr[k+1][j+1]){
b=1;
}
else{
b=0;
}
}
return b;
}
double func(double**arr,int lenght1,int lenght2)
{
double t;
for(int k=0;k+1<lenght1;k++)
for(int j=0;j+1<lenght2;j++)
{
if(arr[k][j]<=arr[k+1][j+1]){
t=1;
}
else{
t=0;
}
}
return t;
}
void main()
{
int choice, i, j=0;
int lenght1,lenght2,change;
int** arr_l;
double** arr_f;
char *name;
char *prizvuwche;
char *grupa;
char *res;
char *res1;
name= new char[100];
prizvuwche=new char[100];
grupa=new char[100];
res=new char[100];
res1=new char[100];
while(j==0)
{
cout<<"\nIf you want to add the information to the File\t\tPRESS \"1\"\n\nIf you want to show the information at the screen\tPRESS \"2\"\n\nIf you want to out \t\t\t\t\tPRESS \"0\"\n\n";
change=getch();
if(change=='1'){
ofstream fout("File.txt",ios::app);
cout<<"Enter your name, please!\n\n";
cin>>name;
cout<<"Enter your prizvuwche, please!\n\n";
cin>>prizvuwche;
cout<<"Enter your grupu, please!\n\n";
cin>>grupa;
cout<<"Enter size of array, please!\t";
cin>>lenght1>>lenght2;
arr_l=new int* [lenght1];
for (int i=0;i<lenght1;i++)
arr_l[i]=new int [lenght2];
arr_f=new double* [lenght1];
for (int i=0;i<lenght1;i++)
arr_f[i]=new double [lenght2];
cout<<"\nEnter int array, please!\n";
for(i=0; i<lenght1; i++)
for(int j=0;j<lenght2;j++)
{
cout<<"arr_l["<<i<<"]["<<j<<"] ";
cin>>arr_l[i][j];
}
for(i=0; i<lenght1; i++){
for(int j=0;j<lenght2;j++){
cout<<arr_l[i][j]<<" ";
}
cout<<endl;
}
int q = func(arr_l,lenght1,lenght2);
if(q == 1){
cout<<"Danuy masuv ne spadae";
res=" -----> Masuv Ne Spadae";
}
else{
cout<<"Masuv Spadae";
res=" ----> Masuv spadae";
}
cout<<"\nEnter double array, please!\n";
for(i=0; i<lenght1; i++)
for(int j=0;j<lenght2;j++)
{
cout<<"arr_f["<<i<<"]["<<j<<"] ";
cin>>arr_f[i][j];
}
for(i=0; i<lenght1; i++){
for(int j=0;j<lenght2;j++){
cout<<arr_f[i][j]<<" ";
}
cout<<endl;
}
int z = func(arr_l,lenght1,lenght2);
if(z == 0){
cout<<"Danuy Masuv Ne Spadae";
res1=" -----> Masuv Ne Spadae";
}
else{
cout<<"Danuy masuv spadae";
res1=" ----> Masuv spadae";
}
fstream outfile("File.txt",ios::app);
if( !outfile){
cout << "Файл не відкритий. \n";
}
fout.width(25);
fout <<name<<"\t";
fout.width(25);
fout<<prizvuwche<<"\t";
fout.width(30);
fout<<grupa<<"\t";
fout.width(50);
for(i=0; i<lenght1; i++)
for(int j=0;j<lenght2;j++)
fout<<arr_l[i][j];
fout.width(50);
fout<<res<<"\t";
fout.width(50);
for(i=0; i<lenght1; i++)
for(int j=0;j<lenght2;j++)
fout<<arr_f[i][j];
fout.width(50);
fout<<res1<<"\t\n";
fout.close();
cout<<"\nThe information was added to the File\n\n";
}
if(change=='2')
{
ofstream fout("File.txt",ios::app);
system ("cls");
ifstream fin("File.txt");
cout<<"Content\n\n"<<"File.txt"<<"\t\n\n\n";
char ch;
while(fin.get(ch))
cout<<ch;
fin.close();
}
if(change=='0')
{
j=1;
}
}
}
2.Вихідні дані:
Масив типу double
Дані записалися у файл File.txt
Завдання 2. Створити оголошення класів згідно варіанту. Розробити програму-драйвер, яка продемонструє роботу похідних класів.
5
Базовий клас:
class Resource
{
protected:
int id;
bool isUsed;
char* title;
char* author;
public:
Resource(int number) ;
virtual ~ Resource() ;
virtual bool TakeResource ();
virtual bool GiveBackResource();
virtual void PrintInfo();
virtual bool Status() {return isUsed;}
};
Resource() – конструктор базового класу. Ініціалізує змінну id та isUsed. Виділяє пам’ять під title та author.
~ Resource() – деструктор базового класу.
TakeResource() – встановлює змінну isUsed=1 (виводить на екран повідомлення).
GiveBackResource() – встановлює змінну isUsed=0 (виводить на екран повідомлення).
PrintInfo () – виводить інформацію про ресурс.
Status() – повертає стан ресурсу.
Похідний клас Book.
Атрибути:
int pages;
int year;
Похідний клас CD.
Атрибути:
int cdType;
Визначити конструктор та деструктор (!вивільняти всі ресурси!) класу.
В основній програмі створити декілька ресурсів та продемонструвати процес їхнього використання.
Порядок виконання:
1.Реалізовано програму 6.cpp
#include "Resource.h"
void main() {
int a;
CD NFS(1,"Ukrainian songs","Pikardiska tertsia",4);
NFS.PrintInfo();
NFS.TakeResource();
NFS.Status();
NFS.GiveBackResource();
NFS.Status();
cout << "\n\n";
Book Stys(2,"Vasyl Stus","A-BA-BA-GA-LA-MA-GA",756,2001);
Stys.PrintInfo();
Stys.TakeResource();
Stys.Status();
Stys.GiveBackResource();
NFS.Status();
cin >> a;
}
Resource.h
#include <iostream>
using namespace std;
class Resource
{
protected:
int id;
bool isUsed;
char* title;
char* author;
public:
Resource(int num,char* t, char* a) {
id = num;
isUsed = 0;
title = new char;
author = new char;
title = t;
author = a;
}
virtual bool TakeResource();
virtual bool GiveBackResource();
virtual void PrintInfo();
virtual bool Status() {
if (isUsed) cout << "\nUsed";
else cout << "\nNot Used";
return isUsed; }
};
class Book:public Resource
{
protected:
int pages;
int year;
public:
Book(int num,char* t, char* a, int p, int y):Resource(num, t, a) {
pages = p;
year = y;
}
void PrintInfo();
};
class CD: public Resource
{
protected:
int cdType;
public:
CD(int num,char* t, char* a, int type):Resource(num,t,a) {
cdType = type;
}
void PrintInfo();
};
Resource.cpp
#include "Resource.h"
/*Methods of Resource class */
bool Resource::TakeResource() {
isUsed = 1;
cout << "Take Resource";
return 1;
}
bool Resource::GiveBackResource() {
isUsed = 0;
cout << "\nGive Back Resource";
return 1;
}
void Resource::PrintInfo() {
cout << "\nID: " << id << endl;
cout << "Title: " << title << endl;
cout << "Author: " << author << endl;
}
/*End methods of resource class*/
/*Method of books class */
void Book::PrintInfo() {
cout << "\nID: " << id << endl;
cout << "Title: " << title << endl;
cout << "Author: " << author << endl;
cout << "Pages: " << pages << endl;
cout << "Year: " << year << endl;
}
/*End methods of books class*/
/*Method of CD class*/
void CD::PrintInfo() {
cout << "\nID: " << id << endl;
cout << "Title: " << title << endl;
cout << "Author: " << author << endl;
cout << "cdType: " << cdType << endl;
}
/*End method of CD class*/
2.Вихідні дані:
Завдання 3. Побудувати програму розв’язання задачі, що вказане нижче, з використанням власного класу контейнера масиву та дружнього класу ітератора.
Контейнерний клас повинен містити дані масиву та необхідні методи контейнерних класів.
Слід використати основні методи контейнерних класів:
begin()- повернення ітератора до початкового елементу масиву контейнера,
end()- повернення ітератора на позицію останнього елементу контейнера,
size()-повернення кількості елементів масиву контейнера
Клас ітераторів повинен містити основні методи(функції) роботи ітераторів, такі як:
pd++, ++pd - інкременти, переміщення ітератора по всім елементам контейнера,
*pd- розіменування ітератора,тобто повернення або присвоєння значення елемента контейнера,а також інші функії, такі як присвоєння одного ітератора іншому (pd1= pd2) або порівняння двох ітераторів(pd1== pd2).
Перевірити чи елементи двовимірного масиву розташовані по спаданню.
Порядок виконання:
1.Реалізовано програму main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;
void main()
{
int n,m,N,t;
cout<<"Vvedit' rozmir matruci:\n";
cin>>n>>m;
N=m*n;
vector<char> v(N); //створення обєкту типу vector
vector<char>::iterator vv;//оголошення ітератора
for(int i = 0; i < v.size(); i++) {
cout<<"Vvedit' v["<<i+1<<"]= ";
cin>>v[i];
}
for(int i=0; i<N; i++)
{
cout<<v[i]<<"\t";
if((i+1)%n==0)
{
cout<<endl;
}
}
for(int k=0;k<N-1;k++)
if(v[k]<=v[k+1])
t=1;
else
t=0;
if(t == 1)
cout<<"Elementu matruci roztawovani Ne po-spadann`u\n\a\n\n\n";
else
cout<<"Elementu matruci roztawovani po-spadann`u\n\a\n\n\n";
}
2.Вихідні дані:
Реалізовано програму main2.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
class Stack{
char items[40];
int sp;
public:
friend class StackIter;
Stack()
{
sp = 0;
}
void push()
{
int n,m,N;
cout<<"Vvedit' rozmir matruci:\n";
cin>>n>>m;
N=m*n;
for(; sp < N; sp++) {
cout<<"Vvedit' v["<<sp+1<<"]= ";
cin>>items[sp];
}
for(int i=0; i<N; i++)
{
cout<<items[i]<<"\t";
if((i+1)%n==0)
{
cout<<endl;
}
}
}
int pop()
{
return items[sp--];
}
bool isEmpty()
{
return (sp == - 1);
}
};
class StackIter{
const Stack &stk;
int index;
public:
StackIter(const Stack &s): stk(s)
{
index = 0;
}
void operator++()
{
index++;
}
bool operator()()
{
return index != stk.sp + 1;
}
int operator *()
{
return stk.items[index];
}
};
bool operator == (const Stack &l, const Stack &r)
{
StackIter itl(l), itr(r);
for (; itl(); ++itl, ++itr)
if (*itl != *itr) break;
return !itl() && !itr();
}
void main()
{
Stack s;
s.push();
int z=0;
int r=-1;
StackIter sp(s);
z=*sp;
//for(;sp();++sp)
while(sp())
{
++sp;
if(z<*sp){
z=*sp;
r=1;
}
else
r=-1;
break;
}
if(r==1)
cout<<"\n Elementu masuvu Ne po-spadannu\n\n\n\a";
else
cout<<"\n Elementu masuvu po-spadannu\n\n\n\n\a";
}
Вихідні дані: