Добавил:
Kaz
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include"Person.h"
Person::Person()
{
this->age = 0;
}
Person::Person(char *_fname,char *_lname,int _age)
{
this->fname = _fname;
this->lname = _lname;
this->age = _age;
}
Person::Person(const Person & tmp)
{
this->fname = tmp.fname;
this->lname = tmp.lname;
this->age = tmp.age;
}
Person::~Person()
{
}
void operator << (std::ostream & os,Person & tmp)
{
//реализовано автоформатирование таблицы в зависимости от длины строк в данных или размере числа
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// для первой вертикальной линии и выравнивания
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int num_of_symbols = 24 - tmp.fname.GetLength(); // замеряем расстояние от второй полоски бордюра до последнего символа поля /имя/
String string_with_spaces1(25); //объявляем строку для хранения кол-ва пробелов
for(int i = 0;i < num_of_symbols;i++) // в цикле заполняем временную переменную String пробелами
{
if(i == num_of_symbols - 1)
{
string_with_spaces1 += "|"; // в последний символ этой строки записываем |
break;
}
string_with_spaces1 += " "; // записываем пробелы
}
os << "|"; // горизонтальная полоса слева от поля /имя/
os << " "; // небольшой отступ от самой крайней левой вертикальной полосы до поля /имя/
os << tmp.fname; // печатаем имя
os << string_with_spaces1; // вслед печатаем строку с пробелами
os << " "; // отступ от второй полосы центрльной до поля /фамилия/
os << tmp.lname; // печатаем фамилию
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// для второй вертикальной линии и выравнивания
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int num_of_symbols2 = 52 - 25 - tmp.lname.GetLength();
String string_with_spaces2(59);
for(int i = 0;i < num_of_symbols2;i++) // в цикле заполняем временную переменную String пробелами
{
if(i == num_of_symbols2 - 1)
{
string_with_spaces2 += "|"; // в последний символ этой строки записываем |
break;
}
string_with_spaces2 += " "; // записываем пробелы
}
os << string_with_spaces2;
os << " ";
int num_of_chisel = 0; // переменная для того чтобы при печати в таблице корректно прорисовывалось при
if(tmp.age != 0) // проверка для того чтобы когда число равняется нулю оно не печаталось
{
os << tmp.age;
}
else // а граница самой крайней правой рамки корректно смещалась
num_of_chisel += 1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// для третьей вертикальной линии и выравнивания
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// однозначных и двузначных числах
if(tmp.age >= 0 && tmp.age < 10)
num_of_chisel += 1;
int num_of_symbols3 = 68 - num_of_symbols - num_of_symbols2 - tmp.fname.GetLength() - tmp.lname.GetLength() + num_of_chisel;
String string_with_spaces3(80);
for(int i = 0;i < num_of_symbols3;i++) // в цикле заполняем временную переменную String пробелами
{
if(i == num_of_symbols3 - 1)
{
string_with_spaces3 += "|"; // в последний символ этой строки записываем |
break;
}
string_with_spaces3 += " "; // записываем пробелы
}
cout << string_with_spaces3;
os << endl;
}
void operator >> (std::istream & is,Person & tmp)
{
bool flag1,flag2,flag3,flag10; // для выходов из циклов ввода
do
{
try
{
cout << "Введите имя:";
is >> tmp.fname;
flag1 = true;
if(tmp.fname.GetLength() == 0)
throw InpException(1);
}
catch(InpException &exc)
{
cout << exc;
flag1 = false;
}
}
while(!flag1);
do
{
try
{
cout << "Введите фамилию:";
is >> tmp.lname;
flag2 = true;
if(tmp.lname.GetLength() == 0)
throw InpException(2);
}
catch(InpException &exc)
{
cout << exc;
flag2 = false;
}
}
while(!flag2);
do
{
try
{
do
{
try
{
cout << "Введите возраст:";
is >> tmp.age;
flag10 = true;
if (!is || is.peek() != '\n')
throw InpException(10);
}
catch(InpException & exc)
{
cout << exc;
flag10 = false;
is.clear();
is.sync();
}
}while(!flag10);
flag3 = true;
if(tmp.age < 0 || tmp.age > 100)
throw InpException(3);
}
catch(InpException & exc)
{
cout << exc;
flag3 = false;
}
}while(!flag3);
}
void Person::operator = (const Person & tmp)
{
this->fname = tmp.fname;
this->lname = tmp.lname;
this->age = tmp.age;
}
Соседние файлы в папке Files