Вы находитесь на странице: 1из 17

Лабораторная работа №1.

Тема: Классы, объекты. Функции-члены класса в языке С++. Инкапсуляция


3 - вариант
Задание:
Создайте класс Rectangle (прямоугольник). Класс имеет атрибуты
length (длина) и width (ширина), каждый из которых по умолчанию
равен единице. Он имеет функции-элементы, которые вычисляют
периметр (perimeter) и площадь (area) прямоугольника, а также
функции записи и чтения как для length, так и для width.
Текст программы:
#include <iostream>
namespace cf {

class Rect {
private:
double height;
double width;
char fillRect;
char perimRect;
public:
Rect(double h = 1, double w = 1) {
height = h;
width = w;
}
void setFillRect(char c) {
fillRect = c;
}
void setPerimRect(char c) {
perimRect = c;
}
void setWidth(double w) {
width = w;
}
void setHeight(double h) {
height = h;
}
double getWidth() const {
return width;
}
double getHeight() const {
return height;
}
double perim() {
return 2 * (width + height);
}
double area() {
return width * height;
}
void draw() {
for (size_t i = 0; i < width; ++i) {
for (size_t j = 0; j < height; ++j) {
if (i == 0 || i == width - 1)
std::cout << perimRect;
else if (j == 0 || j == height - 1)
std::cout << perimRect;
else
std::cout << fillRect;
}
std::cout << std::endl;
}
}
};
}

int main() {
cf::Rect rect(5, 5);
rect.setFillRect('*');
rect.setPerimRect('=');
rect.draw();
return 0;
}
Результаты:
Лабораторная работа №2.
Тема: КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ
3 - вариант
Задание:
Создайте класс box, конструктору которого передаются три
величины типа double, представляющие длины сторон параллелепипеда.
Класс box должен подсчитывать его объем и хранить результат типа
double. Включите функцию-член vol(), которая выводит на экран объем
каждого объекта класса box.

Текст программы:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
class Box {
private:
double v;
public:
Box(double a, double b,
double c) {
v = a * b * c;
}
void vol() {
printf("V = %lf", v);
}};

int main() {
double a, b, c;
do {
printf("Enter a:");
scanf("%lf", &a);
printf("Enter b:");
scanf("%lf", &b);
printf("Enter c:");
scanf("%lf", &c);
Box b(a, b, c);
b.vol();
getchar();
printf("\n");
} while (1);
return 0;
}
Результаты:
Лабораторная работа №3.
Тема: НАСЛЕДОВАНИЕ
3 - вариант
Задание:
Создать класс-родитель точка, его наследника - класс отрезок,
наследников отрезка «квадрат», «параллелограмм».

Текст программы:
#include <stdio.h>
/*
Создать класс-родитель точка, его наследника - класс отрезок,
наследников отрезка «квадрат», «параллелограмм»
*/
#include <iostream>
#include <conio.h>
#include <Windows.h>
void gotoxy(int xpos, int ypos) {
COORD scrn;
HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
scrn.X = xpos; scrn.Y = ypos;
SetConsoleCursorPosition(hOuput, scrn);
}
class Dot {
protected:
int x;
int y;
public:
Dot() {

}
Dot(int x, int y) {
setXY(x, y);
}
void setXY(int x, int y) {
this->x = x;
this->y = y;
}
void Draw() {
gotoxy(x, y);
printf(".");
}
void Erars() {
gotoxy(x, y);
printf(" ");
}
};

class Line :public Dot {


protected:
int x2, y2;
public:
Line() {

}
Line(int x, int y, int x2, int y2) {
setXY(x, y, x2, y2);
}
void setXY(int x, int y, int x2, int y2) {
this->x = x;
this->y = y;
this->x2 = x2;
this->y2 = y2;
}
void Draw() {
if (y != y2 && x != x2) {
int k = (y2 - y) / (x2 - x);
int b = (x2 * y - x * y2) / (x2 - x);
}

if (y == y2 && x < x2) {


for (int i = x; i != x2; i++) {
gotoxy(i, y2);
printf(".");
}
}
if (y == y2 && x > x2) {
for (int i = x; i != x2; i--) {
gotoxy(i, y2);
printf(".");
}
}
if (y > y2 && x == x2) {
for (int i = y; i != y2; i--) {
gotoxy(x, i);
printf(".");
}
}
if (y < y2 && x == x2) {
for (int i = y; i != y2; i++) {
gotoxy(x, i);
printf(".");
}
}
}
void Erars() {
if (y == y2 && x < x2) {
for (int i = x; i != x2; i++) {
gotoxy(i, y2);
printf(" ");
}
}
if (y == y2 && x > x2) {
for (int i = x; i != x2; i--) {
gotoxy(i, y2);
printf(" ");
}
}
if (y > y2 && x == x2) {
for (int i = y; i != y2; i--) {
gotoxy(x, i);
printf(" ");
}
}
if (y < y2 && x == x2) {
for (int i = y; i != y2; i++) {
gotoxy(x, i);
printf(" ");
}
}
}
};
class Squad :public Line {
protected:
int x3;
int y3;
int x4;
int y4;
public:
Squad() {

}
Squad(int x, int y, int x2, int y2, int x3, int y3, int x4, int y4) {
setDots(x, y, x2, y2, x3, y3, x4, y4);
}

void setDots(int x, int y, int x2, int y2, int x3, int y3, int x4, int y4) {
this->x = x;
this->y = y;
this->x2 = x2;
this->y2 = y2;
this->x3 = x3;
this->y3 = y3;
this->x4 = x4;
this->y4 = y4;
}

void Draw() {
printf("Draw Squad");
}

void Erarse() {
printf("Erarse Squad");
}

void Rotate() {
printf("Rotate Squad");
}

void Fill() {
printf("Fill Squad");
}

};

class Parallel :public Line {


protected:
int x3;
int y3;
int x4;
int y4;
public:
Parallel() {

}
Parallel(int x, int y, int x2, int y2, int x3, int y3, int x4, int y4) {
setDots(x, y, x2, y2, x3, y3, x4, y4);
}

void setDots(int x, int y, int x2, int y2, int x3, int y3, int x4, int y4) {
this->x = x;
this->y = y;
this->x2 = x2;
this->y2 = y2;
this->x3 = x3;
this->y3 = y3;
this->x4 = x4;
this->y4 = y4;
}

void Draw() {
printf("Draw Parallel");
}

void Erarse() {
printf("Erarse Parallel");
}

void Rotate() {
printf("Rotate Parallel");
}

void Fill() {
printf("Fill Parallel");
}

};

void SetWindow(int Width, int Height)


{
COORD coord;
coord.X = Width;
coord.Y = Height;

SMALL_RECT Rect;
Rect.Top = 0;
Rect.Left = 0;
Rect.Bottom = Height - 1;
Rect.Right = Width - 1;

HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);


SetConsoleScreenBufferSize(Handle, coord);
SetConsoleWindowInfo(Handle, TRUE, &Rect);
}

int main() {
SetWindow(110, 41);
Dot dot(1, 1);
dot.Draw();
dot.setXY(1, 2);
dot.Draw();
dot.Erars();

Line line(1, 3, 7, 3);


line.Draw();

line.setXY(40, 15, 15, 15);


line.Draw();

line.setXY(25, 10, 25, 15);


line.Draw();

line.setXY(30, 15, 30, 10);


line.Draw();
line.Erars();

line.setXY(10, 10, 25, 25);


line.Draw();
line.setXY(1, 4, 7, 4);
line.Draw();
line.Erars();

Squad sq(1, 1, 2, 2, 3, 3, 4, 4);


sq.Draw();
sq.Rotate();
sq.Erars();
sq.Fill();

Parallel paral(1, 1, 2, 2, 3, 3, 4, 4);


paral.Draw();
paral.Rotate();
paral.Erars();
paral.Fill();

_getch();
}
Результаты:
Лабораторная работа №4.
Тема: ПОЛИМОРФИЗМ. ПЕРЕГРУЗКА ОПЕРАЦИЙ И ФУНКЦИЙ
3 - вариант
Задание:
В британском формате дата задается как число/месяц/год. Реализовать с
учетом високосных годов:
а) сложение даты с заданным количеством дней (операция +);
б) вычитание из даты заданного количества дней (операция -).

Текст программы:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <locale.h>
#include <iostream>

using namespace std;


int LongMonth[] = { 1,3,5,7,8,10,12 };
const char* sMonth[] =
{
"января",
"февраля",
"марта",
"апреля",
"мая",
"июня",
"июля",
"августа",
"сентября",
"октября",
"ноября",
"декабря"
};

class date
{
private:
int day, month, year;
bool bChangeDay, bChangeMonth, bChangeYear;//Флаги указывающие на корректировку
char sDate[256];//Дата в строковом формате
public:
date(); //конструктор без параметров
date(int iDay, int iMonth, int iYear);//конструктор с параметрами
date(const date& val); //конструктор копирования
~date(); //деструктор

int getDay() { return day; }


int getMonth() { return month; }
int getYear() { return year; }

void setDay(int iDay);


void setMonth(int iMonth);
void setYear(int iYear);
//Сигнализируют пользователя о некрректности ввода даты
bool IsChangeDay() { return bChangeDay; }
bool IsChangeMonth() { return bChangeMonth; }
bool IsChangeYear() { return bChangeYear; }
friend int operator%(date a, date b);
friend date operator+(date a, int b);
friend date operator-(date a, int b);

int operator! () const {


int A[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int x = 0;
if (year % 4 == 0)
A[1]++;
for (int i = 0; i < month - 1; i++)
x += A[i];
x += day;
return x;
}

char* printf(int ifmt);


};

int found(int m1, int dm, int d1, int g)


{
switch (m1)
{
case 1:
dm = 0 + d1;
break;
case 2:
dm = 31 + d1;
break;
case 3:
if (g - (g / 4) * 4 == 0)dm = d1 + 60;
else dm = 59 + d1;
break;
case 4:
if (g - (g / 4) * 4 == 0)dm = 91 + d1;
else dm = 90 + d1;
break;
case 5:
if (g - (g / 4) * 4 == 0) dm = 121 + d1;
else dm = 120 + d1;
break;
case 6:
if (g - (g / 4) * 4 == 0) dm = 152 + d1;
else dm = 151 + d1;
break;
case 7:
if (g - (g / 4) * 4 == 0) dm = 182 + d1;
else dm = 181 + d1;
break;
case 8:
if (g - (g / 4) * 4 == 0) dm = 213 + d1;
else dm = 212 + d1;
break;
case 9:
if (g - (g / 4) * 4 == 0) dm = 244 + d1;
else dm = 243 + d1;
break;
case 10:
if (g - (g / 4) * 4 == 0) dm = 274 + d1;
else dm = 273 + d1;
break;
case 11:
if (g - (g / 4) * 4 == 0) dm = 305 + d1;
else dm = 304 + d1;
break;
case 12:
if (g - (g / 4) * 4 == 0) dm = 335 + d1;
else dm = 334 + d1;
break;
}
return dm;
}

date operator+(date a, int b) {


a.day += b;

return a;
}

date operator-(date a, int b) {


a.day -= b;
return a;
}

int operator%(date a, date b) {


int g1, g2, m1, m2, d2, i, d, d1, d0, g, dm = 0;
if (a.getDay() < b.getYear()) {
g = b.getYear() - a.getYear();
d0 = (g / 4) + 1;
d = g * 365;
d += d0;
dm = found(a.getMonth(), dm, a.getDay(), a.getYear());
d -= dm;
dm = 0;
dm = found(b.getMonth(), dm, b.getDay(), b.getYear());
d += dm;
}
else {
g = a.getYear() - b.getYear();
d0 = (g / 4) + 1;
d = g * 365;
d += d0;
dm = found(a.getMonth(), dm, a.getDay(), a.getYear());
d -= dm;
dm = 0;
dm = found(b.getMonth(), dm, b.getDay(), b.getYear());
d -= dm;
}
return abs(d - 1);
}

date::date()
{
day = 1;
month = 1;
year = 1900;

bChangeDay = false;
bChangeMonth = false;
bChangeYear = false;

sDate[0] = '\0';
}

date::date(int iDay, int iMonth, int iYear)


{
bChangeDay = false;
bChangeMonth = false;
bChangeYear = false;
setDay(iDay);
setMonth(iMonth);
setYear(iYear);

sDate[0] = '\0';
}

date::date(const date& val)


{
day = val.day;
month = val.month;
year = val.year;

sDate[0] = '\0';
}

date::~date()
{
//Память не выделяли так что думаю,
//кроме установки дефалтных значений
//ничего сделать и не можем
day = 1;
month = 1;
year = 1900;

sDate[0] = '\0';
}

void date::setDay(int iDay)


{
if (iDay < 1 || 31 < iDay)
bChangeDay = true;
if (bChangeDay)
day = 1;
day = iDay;
}

void date::setMonth(int iMonth)


{
int i, nMonth = sizeof(LongMonth) / sizeof(int);
if (iMonth < 1 || 12 < iMonth)
bChangeMonth = true;
if (bChangeMonth)
month = 1;
//Если месяц не 31-дневный,
//а day == 31,
//то устанавливаем day == 1
if (day == 31)
{
for (i = 0; i < nMonth; i++)
{
if (iMonth == LongMonth[i])
break;
}
if (nMonth <= i)
bChangeDay = true;
}
if (bChangeDay)
day = 1;
month = iMonth;
}

void date::setYear(int iYear)


{
if (iYear < 1)
bChangeYear = true;
if (bChangeYear)
iYear = 1;
if (28 < day && month == 2)
if (iYear % 4 != 0)
bChangeDay = true;
if (bChangeDay)
day = 1;
year = iYear;
}

char* date::printf(int ifmt)


{
switch (ifmt)
{
case 1:
sprintf(sDate, "%02d %s %04d\r\n", day, sMonth[month - 1], year);
break;
default:
sprintf(sDate, "%02d.%02d.%04d\r\n", day, month, year);
break;
}
return &sDate[0];
}

int main() {
setlocale(LC_ALL, "");
date a(20, 12, 1899);
printf("%s", a.printf(0));
printf("%s - оператор - \n", (a-5).printf(0));
printf("%s - оператор + ", (a+5).printf(0));
return 0;
}
Результаты: