Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 3
з курсу „ Об'єктно-орієнтоване програмування ”
Тема:
Моделювання цифрових пристроїв.
Львів – 2004
Мета роботи: Закріпити теоретичні знання та оволодіти практичними навиками об’єкно-орієнтованого аналізу та створення базових абстракцій для моделювання предметної області.
Варіант завдання на лабораторну роботу
Розробити об’єктно-орієнтовану модель цифрового пристрою:
Варіант 9. Пристрою пошуку максимуму сигналу. Пристрій повинен видати значення максимуму та відлік у якому він досягається.
Опис програми
Клас CSignal :
Базовий клас, що описує цифровий сигнал. Містить регістри для збереження одиничного відліку сигналу (time) та його значення (size), а також методи для їх збереження та завантаження.
Клас CComp, public CSignal:
Описує програмну модель елементарного компаратора двох значень цифрового сигналу. Для обробки сигналу містить метод порівняння двох значень сигналу ( iCompare() ). Успадковує клас CSignal, що дозволяє збереження максимального знайденого значення сигналу та його відліку.
Клас CIO, public CSignal:
Описує програмну модель пристрою вводу/виводу цифрового сигналу. Містить метод отримання наступного значення сигналу і метод збереження кінцевого результату. Успадковує клас CSignal, що дозволяє збереження поточного значення сигналу та його відліку.
Клас CDev, public CIO:
Абстракція, що моделює цифровий пристрій, який приймає на вхід цифровий сигнал, а на вихід видає знайдене його максимальне значення та відлік, в якому його досягнуто.
У програмі створюються об’єкти:
CComp ElemComparator - елементарного компаратора;
CDev MaxFndDevice - пристрій пошуку максимуму сигналу.
Вміст файлів
// main.cpp
#include "Comp.h"
#include "Dev.h"
#include "IO.h"
#include "Signal.h"
int main (int argc, char *argv[])
{
char *InName, *OutName; // Змінні для збереження імен файлів
double x=0;
int t=0;
if (argc!=3)
{
cout << "Wrong argument count!\n";
cout << "SYNTAX: " << argv[0] << " <input file> <output file>\n";
exit(0);
}
InName=(char *)calloc(50,sizeof(char));
strcpy(InName,argv[1]);
InName=(char *)realloc(InName,strlen(InName)+1);
OutName=(char *)calloc(50,sizeof(char));
strcpy(OutName,argv[2]);
OutName=(char *)realloc(OutName,strlen(OutName)+1);
CComp ElemComparator; // Створення об’єкту елементарного компаратора
CDev MaxFndDevice; // Створення об’єкту пристрою
MaxFndDevice.vSetFiles(InName,OutName); // Підключення файлів до пристрою
cout << "Parsing Signal...";
// Цикл порівняння
while ( MaxFndDevice.iEndOfFile()==0 )
{
MaxFndDevice.iGetNextSignal(); // Зчитуємо з файлу наст. відлік сигналу
t=MaxFndDevice.iLoadSignalTime(); //та завантажуємо його часовий відлік
x=MaxFndDevice.dLoadSignalSize(); // і значення до наших змінних
if ( ElemComparator.iCompare(x)==1 )
{ // Якщо значення більше, ніж збережене у компараторі,
ElemComparator.vStoreSignal(t,x); // то зберігаємо його
}
}
// Завантаження максимального значення сигналу та його відліку з компаратора
t=ElemComparator.iLoadSignalTime();
x=ElemComparator.dLoadSignalSize();
// Збереження максимального значення сигналу до файлу
MaxFndDevice.vSaveMax(t,x);
cout << "Signal length " << MaxFndDevice.iLoadSignalTime()
<< ".\nResult saved to " << OutName << ".\n";
free (InName);
free (OutName);
return 0;
}
// Signal.h: interface for the CSignal class.
#if !defined(AFX_SIGNAL_H__216BB1C5_581B_449E_8EC9_582D038796A0__INCLUDED_)
#define AFX_SIGNAL_H__216BB1C5_581B_449E_8EC9_582D038796A0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "iostream.h"
class CSignal
{
public:
int iLoadSignalTime(void);
double dLoadSignalSize(void);
void vStoreSignal(int t, double x);
CSignal();
virtual ~CSignal();
protected:
double size; // Параметр сигналу - значення
int time; // Параметр сигналу – часовий відлік
};
#endif // !defined(AFX_SIGNAL_H__216BB1C5_581B_449E_8EC9_582D038796A0__INCLUDED_)
// Signal.cpp: implementation of the CSignal class.
#include "Signal.h"
CSignal::CSignal()
{ size=0;
time=0;
}
CSignal::~CSignal() {}
void CSignal::vStoreSignal(int t, double x) // Метод збереження сигналу
{ size=x;
time=t;
}
int CSignal::iLoadSignalTime(void) // Метод завантаження відліку сигналу
{ return time; }
double CSignal::dLoadSignalSize(void) // Метод завантаження значення сигналу
{ return size; }
// Comp.h: interface for the CComp class.
#if !defined(AFX_COMP_H__66BE5331_2AA4_401F_984A_D80668E5A1ED__INCLUDED_)
#define AFX_COMP_H__66BE5331_2AA4_401F_984A_D80668E5A1ED__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Signal.h"
class CComp : public CSignal
{
public:
int iCompare (double x);
CComp();
virtual ~CComp();
};
#endif // !defined(AFX_COMP_H__66BE5331_2AA4_401F_984A_D80668E5A1ED__INCLUDED_)
// Comp.cpp: implementation of the CComp class.
#include "Comp.h"
CComp::CComp() {}
CComp::~CComp() {}
int CComp::iCompare(double x) // Метод порівняння нового значення сигналу зі
{ // збереженим
if ( x>size ) return 1; // Нове число більше за збережене, треба замінити
return 0;
}
// IO.h: interface for the CIO class.
#if !defined(AFX_IO_H__BC57362A_ED2C_4BF1_908D_53CE8020A3CB__INCLUDED_)
#define AFX_IO_H__BC57362A_ED2C_4BF1_908D_53CE8020A3CB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Signal.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "fstream.h"
class CIO : public CSignal
{
public:
void vSaveMax(int t, double x);
int iEndOfFile(void);
void vSetFiles(char *i,char *o);
int iGetNextSignal();
virtual ~CIO();
CIO::CIO();
protected:
ifstream InputFile; // Файл із вхідним сигналом
ofstream OutputFile; // Файл для збереження результату
};
#endif // !defined(AFX_IO_H__BC57362A_ED2C_4BF1_908D_53CE8020A3CB__INCLUDED_)
// IO.cpp: implementation of the CIO class.
#include "IO.h"
CIO::CIO() {}
CIO::~CIO()
{ InputFile.close();
OutputFile.close();
}
void CIO::vSetFiles(char *i,char *o) // Метод відкриття файлів
{ InputFile.open(i);
OutputFile.open(o);
}
int CIO::iGetNextSignal(void) // Метод зчитування наступного відліку сигналу
{
InputFile >> time >> size;
return 0;
}
int CIO::iEndOfFile(void) // Метод перевірки чи відкритий вхідний файл та чи
{ // досягнуто його кінець
if ( InputFile.is_open() )
{
if ( InputFile.eof() ) return 1;
else return 0;
}
return 1;
}
void CIO::vSaveMax(int t, double x)
{ OutputFile << "Signal maximum:\n count = " << t << "\n value = " << x << "\n";
cout << "\nSignal maximum:\n count = " << t << "\n value = " << x << "\n";
}
// Dev.h: interface for the CDev class.
#if !defined(AFX_DEV_H__E931764E_92B0_4915_985C_83A937FE5C22__INCLUDED_)
#define AFX_DEV_H__E931764E_92B0_4915_985C_83A937FE5C22__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "IO.h"
class CDev : public CIO
{
public:
CDev();
virtual ~CDev();
};
#endif // !defined(AFX_DEV_H__E931764E_92B0_4915_985C_83A937FE5C22__INCLUDED_)
// Dev.cpp: implementation of the CDev class.
#include "Dev.h"
CDev::CDev() {}
CDev::~CDev() {}
Опис результатів тестування
Виконання програми з поданим на вхід файлом, що містить цифровий сигнал приводить до отримання на виході файлу з максимальним значенням сигналу та відліку, в якому його досягнуто.
Вхідний файл:
1 53475
2 -9.83657e+008
3 1.02619e-009
…………
1023 2.02
1024 5.47889e+008
Вихідний файл:
Signal maximum:
count = 556
value = 2.14435e+009
Висновок: Виконуючи дану лабораторну роботу, я закріпив теоретичні знання та оволодів практичними навиками об’єкно-орієнтованого аналізу та створення базових абстракцій для моделювання предметної області на прикладі пристрою пошуку максимуму сигналу.