Основи програмування на мові С++"

Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 14.03.2013
Размер файла 510,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

"Основи програмування на мові С++"

програмування мова графічний

Анотація

Дана програма вирішує задачу побудови геометричних фігур за допомогою графічного редактора, з використанням об'єктно-орієнтованого програмування (мови С++): багатокутника та описаних навколо його вершин кіл. Програма побудована на основі методів об'єктно-орієнтованого програмування. У програмі створено власні класи із застосуванням інкапсуляції даних. Програма складається з трьох частин. В першій частині створюється масив координат вершин багатокутника, які зчитуються з файла. В другій - будується багатокутник, по заданих вершинах, і, нарешті, в третій частині навколо вершин багатокутника описуються кола.

Завдання

У файлі задані координати вершин багатокутника. Вивести на екран цей багатокутник. Навколо кожної вершини, відстань від якої до хоча б однієї з суміжних не перевищує величини, заданої в іншому файлі, провести коло, радіусом, який дорівнює половині відстані від найближчої сусідньої вершини.

Вступ

Для того, щоб приступити до розв'язку поставленої задачі, необхідно нагадати теоретичні відомості про об'єктно-орієнтоване програмування, як таке, а також його особливості.

Відмінною особливістю мови С++ є поняття класу. Його призначення полягає в тому, щоб надати програмісту інструмент для створення нових типів, настільки ж зручних у звертанні як і вбудовані типи. В ідеалі тип, обумовлений користувачем, способом використання не повинний відрізнятися від вбудованих типів, тільки способом створення.

Тип є конкретне представлення деякої концепції (поняття). Наприклад, наявний у C++ тип float з його операціями +, -, * і т.д. забезпечує обмежену, але конкретну версію математичного поняття дійсного числа. Новий тип створюється для того, щоб дати спеціальне і конкретне визначення поняття, якому ніщо прямо й очевидно серед убудованих типів не відповідає. Як правило, програму, у якій створюються типи, що добре відповідають поняттям додатка, зрозуміти легше, ніж програму, у якій це не робиться. Добре обрані типи, обумовлені користувачем, роблять програму більш чіткою та короткою. Це також дозволяє компілятору виявляти неприпустимі використання об'єктів, що у протилежному випадку залишаться невиявленими до тестування програми.

У визначенні нового типу основна ідея - відокремити несуттєві подробиці реалізації (наприклад, формат даних, що використовуються для збереження об'єкта типу) від тих якостей, що істотні для його правильного використання (наприклад, повний список функцій, що мають доступ до даних). Такий поділ можна описати так, що робота зі структурою даних і внутрішніх адміністративних підпрограмах здійснюється через спеціальний інтерфейс. Програмування без приховання даних (із застосуванням структур) вимагає меншої продуманості, чим програмування з прихованням даних (з використанням класів). Структуру можна визначити не занадто задумуючись про те, як її передбачається використовувати. А коли визначається клас, вся увага зосереджується на забезпеченні нового типу повною кількістю операцій, що визначені для об`єкту цього типу. Час, витрачений на розробку нового типу, звичайно багаторазово окупається при розробці і тестуванні програми. Ефективним засобом об'єктно-орієнтованого програмування є використання похідних класів. Похідні класи дають простий, гнучкий і ефективний апарат завдання для класу альтернативного інтерфейсу і визначення класу за допомогою додавання можливостей до вже наявного класу без перепрограмування чи перекомпіляції. За допомогою похідних класів можна також забезпечити загальний інтерфейс для декількох різних класів так, щоб інші частини програми могли працювати з об'єктами цих класів однаковим образом. При цьому звичайно в кожен об'єкт розміщується інформація про тип, для того щоб ці об'єкти могли оброблятися відповідним чином у ситуаціях, коли їхній тип не можна визначити під час компіляції. Для елегантної і надійної обробки таких динамічних залежностей типів мається поняття віртуальної функції. По своїй суті похідні класи існують для того, щоб полегшити програмісту формулювання спільності.

Метод вирішення задачі

При розгляді даної програми для визначення радіуса описаних навколо вершин багатокутника кіл виникає необхідність знаходження довжин сторін цього багатокутника. Як відомо, відстань між двома точками знаходиться за формулою:

Отже, скориставшись цією формулою, я знайшов довжину двох суміжних сторін, що дозволило мені знайти радіуси описаних кіл.

Опис класів

При складенні даної курсової роботи я створив три власних класи - це класи tochka, mnogougolnik, та kola. Слід зауважити використання дружніх зв'язків між класами mnogougolnik та kola, де клас kola є дружнім класу mnogougolnik.

class tochka

{

int x;

int y;

public:

void set (int xx,int yy){x=xx;y=yy};

int getx() return x;

int gety() return y;

};

Даний клас записує координати масиву вершин багатокутника, який створюється функцією void dat(). При цьому вищезазначений масив створюється у пам'яті комп'ютера динамічно. Крім цього, клас tochka містить функції getx(), gety(), які повертають значення координат вершин багатокутника.

class mnogougolnik

{

int kol;

friend class kola;

tochka *tochki;

public:

void dat();

void show();

};

В цьому класі створюється вказівник на масив об'єктів *tochki типу tochka, що являє собою масив координат вершин багатокутника. Кількість цих об'єктів дорівнює kol. Тут також знаходиться функція динамічного створення масиву tochki, а також функція виводу на екран самого багатокутника.

class kola

{

int ymlong;

int *r;

public:

int ymlength();

void setr(mnogougolnik mnog);

void show(mnogougolnik mnog);

};

В класі kola міститься функція ymlength(), яка повертає значення змінній ymlong. Ця функція визначає довжину, яку не повинні перевищувати сторони багатокутника. Крім цього тут створюється вказівник на масив *r, який створюється функцією setr(mnogougolnik mnog), і являє собою Множину радіусів кіл, які потрібно описати навколо вершин багатокутника. Нарешті, в цьому класі задана функція show(mnogougolnik mnog), яка виводить на екран вищезазначені кола.

Опис змінних і функцій

void mnogougolnik::dat()

{

char str[100];

int i,x,y;

FILE *f; f=fopen("A:\\my.txt","r");

fgets(str,100,f);

for(i=0;!feof(f);i++)

fgets(str,100,f);

kol=i;

tochki=new tochka[kol];

rewind(f);

fgets(str,100,f);

for(i=0;i<kol;i++)

{

fscanf(f,"%s%2s%d%s%2s%d%s\n",str,str,&x,str,str,&y,str);

tochki[i].set(x,y);

}

fclose(f);

}

Дана функція динамічно створює у пам'яті масив об'єктів tochki. Вона зчитує координати цих точок з файлу my.txt, а також записує ці координати у клас tochka.

Змінні функції dat():

str[100] - стрічка, розміром до 100 символів;

i - номер об'єкту масиву;

x,y - координати вершин багатокутника;

kol - кількість членів масиву;

tochki[i] - масив об'єктів типу tochka;

void mnogougolnik::show(void)

{

int i;

for(i=0;i<kol-1;i++)

line(tochki[i].getx(),tochki[i].gety(),tochki[i+1].getx(),tochki[i+1].gety());

line(tochki[0].getx(),tochki[0].gety(),tochki[kol-1].getx(),tochki[kol-1].gety());

}

Функція show(void) виводить на екран зображення побудованого багатокутника по координатах, які задані в масиві tochki[i].

Змінні функції show(void):

і - номер об'єкту масиву;

kol - кількість членів масиву;

void kola::ymlength()

{

char str[100];

FILE *f; f=fopen("A:\\my1.txt","r");

fgets(str,100,f);

fscanf(f,"%s%s%s%s%s%s%d",str,str,str,str,str,str,&ymlong);

fclose(f);

}

В функції ymlength() зчитується величина ymlong, яку не повинні перевищувати сторони нашого багатокутника.

Змінні функції ymlength():

str[100] - стрічка, розміром до 100 символів;

ymlong - задана величина у файлі my1.txt;

void kola::setr(mnogougolnik mnog)

{

int N=mnog.kol;

r=new int[N];

float r1,r2;

int i;

for (i=0; i<N;i++)

{

if (i==0)

r2=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[N-1].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[N-1].gety(),2));

else

r2=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[i-1].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[i-1].gety(),2));

if(i==N-1)

r1=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[0].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[0].gety(),2));

else

r1=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[i+1].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[i+1].gety(),2));

if((r1<=ymlong)&&(r2<=ymlong))

{

if(r1<r2)

r[i]=r1/2;

else

r[i]=r2/2;

}

else r[i]=0;

}

}

У вищенаведеній функції setr (mnogougolnik mnog) створюється масив радіусів кіл, які необхідно описати навколо вершин багатокутника. Ця задача вирішується наступним чином: створюються змінні r1,r2, які є довжинами двох прилеглих до вершин сторін багатокутника. Обчислюється значення r1 та r2. За умовою, довжини цих сторін не повинні перевищувати певної величини ymlong, яку ми зчитуємо з файлу. Якщо довжини обох зі сторін не перевищують цієї величини, то ми знаходимо радіуси описаних кіл діленням навпіл довжини меншої з двох прилеглих сторін: r[i]=r1/2 або r[i]=r2/2. Якщо ж ця умова не виконується, в масив радіусів записується значення 0.

Змінні функції setr(mnogougolnik mnog):

N - величина, яку ми прирівнюємо до mnog.kol;

mnog.kol - об'єкт типу mnogougolnik, в якому задана кількість членів масиву tochki - kol;

i - номер об'єкту масиву;

ymlong - величина, яку не повинні перевищувати довжини сторін багатокутника;

r[i] - масив радіусів описаних кіл;

void kola::show(mnogougolnik mnog)

{

int i;

for(i=0;i<mnog.kol;i++)

if(!r[i]==0)

circle(mnog.tochki[i].getx(),mnog.tochki[i].gety(),r[i]);

}

Функція show (mnogougolnik mnog) виконує вивід на екран описаних навколо вершин багатокутника кіл, радіусом r[i], але лише в тому випадку, коли цей радіус не дорівнює 0.

Змінні функції (mnogougolnik mnog):

i - номер об'єкту масиву;

r[i] - радіуси описаних кіл;

mnog.kol - об'єкт типу mnogougolnik, в якому задана кількість членів масиву tochki - kol;

mnog.tochki[i] - координати вершин багатокутника;

Лістинг основної задачі

#include <stdio.h>

#include<iostream.h>

#include <stdlib.h>

#include <math.h>

#include<conio.h>

#include<string.h>

#include<graphics.h>

class tochka

{

int x;

int y;

public:

void set (int xx,int yy)x=xx;y=yy;

int getx() return x;

int gety() return y;

};

/////////////////////////////////////////////

class kola;

////////////////////////////////////////////

class mnogougolnik

{

int kol;

friend class kola;

tochka *tochki;

public:

void dat();

void show();

};

///////////////////////////////////////////////

class kola

{

int ymlong;

int *r;

public:

void ymlength();

void setr(mnogougolnik mnog);

void show(mnogougolnik mnog);

};

///---------------------------

void main(void)

{

mnogougolnik mnog;

kola ko;

mnog.dat();

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode,"C:\\Bc\\bin\\");

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1);

}

setbkcolor(1);

setcolor(6);

mnog.show();

getch();

ko.ymlength();

ko.setr(mnog);

ko.show(mnog);

getch();

clrscr();

closegraph();

}

///----------------------------

void mnogougolnik::dat()

{

char str[100];

int i,x,y;

FILE *f; f=fopen("A:\\my.txt","r");

fgets(str,100,f);

for(i=0;!feof(f);i++)

fgets(str,100,f);

kol=i;

tochki=new tochka[kol];

rewind(f);

fgets(str,100,f);

for(i=0;i<kol;i++)

{

fscanf(f,"%s%2s%d%s%2s%d%s\n",str,str,&x,str,str,&y,str);

tochki[i].set(x,y);

}

fclose(f);

}

///////////////////////////////

void kola::ymlength()

{

char str[100];

FILE *f;

f=fopen("A:\\my1.txt","r");

fgets(str,100,f);

fscanf(f,"%s%s%s%s%s%s%d",str,str,str,str,str,str,&ymlong);

fclose(f);

}

/////////////////////////////////

void kola::setr(mnogougolnik mnog)

{

int N=mnog.kol;

r=new int[N];

float r1,r2;

int i;

for (i=0; i<N;i++)

{

if (i==0)

r2=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[N-1].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[N-1].gety(),2));

else

r2=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[i-1].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[i-1].gety(),2));

if(i==N-1)

r1=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[0].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[0].gety(),2));

else

r1=sqrt(pow(mnog.tochki[i].getx()-mnog.tochki[i+1].getx(),2)+

+pow(mnog.tochki[i].gety()-mnog.tochki[i+1].gety(),2));

if((r1<=ymlong)&&(r2<=ymlong))

{

if(r1<r2)

r[i]=r1/2;

else

r[i]=r2/2;

}

else r[i]=0;

}

}

/////////////////////////////////////

void mnogougolnik::show(void)

{

int i;

for(i=0;i<kol-1;i++)

line(tochki[i].getx(),tochki[i].gety(),tochki[i+1].getx(),tochki[i+1].gety());

line(tochki[0].getx(),tochki[0].gety(),tochki[kol-1].getx(),tochki[kol-1].gety());

}

///////////////////////////////////

void kola::show(mnogougolnik mnog)

{

int i;

for(i=0;i<mnog.kol;i++)

if(!r[i]==0)

circle(mnog.tochki[i].getx(),mnog.tochki[i].gety(),r[i]);

}

Файли з вхідними даними

Рис. Файл my.txt

Рис.Файл my1.txt

Роздруківка графічного вирішення

Рис.

Програма Menu

#include<stdio.h>

#include <conio.h>

#include <process.h>

#include <string.h>

#define LEFT 75

#define RIGHT 77

#define DOWN 13

class Knopka

{

int x1;

int y1;

int x2;

int y2;

char str[80];

public:

void setparam (int xx1 , int yy1, int xx2,int yy2,char *sstr) ;

void show(int Lcolor, int bcolor);

virtual void run(void)=0;

};

class knopka1:public Knopka

{

public:

void run(void);

};

class knopka2:public Knopka

{

public:

void run(void) ;

};

class knopka3 : public Knopka

{

public:

void run (void) ;

};

class knopka4: public Knopka

{

public:

void run(void);

};

class knopka5: public Knopka

{

public:

void run(void) ;

};

class Menu

{

knopka1 kn1;

knopka2 kn2;

knopka3 kn3;

knopka4 kn4;

knopka5 kn5;

Knopka *maskn[5];

int x;

int y;

int nomAct;

int actTextCol;

int actBgCol;

int pasTextCol;

int pasBgCol;

void show(void);

void onLeft(void) ;

void onRight(void) ;

void onDown(void) ;

public:

Menu(int xx,int yy);

void getmessage(int msg);

};

void main()

{

textbackground(0);

clrscr();

Menu mnu(15,1);

while(1) mnu.getmessage(getch());

}

void Knopka::setparam(int xx1,int yy1,int xx2,int yy2,char *sstr)

{

x1=xx1;

y1=yy1;

x2=xx2;

y2=yy2;

strcpy(str,sstr);

};

void Knopka::show(int tcolor,int bcolor)

{

textcolor(tcolor);

textbackground(bcolor);

window(x1,y1,x2,y2);

clrscr();

gotoxy (1,1);

printf("%s",str);

}

void knopka1::run(void)

{

char str[80] ;

FILE* fin=fopen("a:\\button.txt","r") ;

textcolor(15);

textbackground(1) ;

window(2,4,78,25) ;

clrscr() ;

for(int i=0;i<14;i++)

{

fgets(str,80,fin) ;

gotoxy(1,1+i) ;

cputs(str);

}

textbackground(0) ;

getch() ;

clrscr() ;

}

void knopka2::run(void)

{

spawnl (P_WAIT,"C:\\WINDOWS\\notepad.exe","notepad.exe",

"A:\\my.txt",NULL) ;

}

void knopka3::run(void)

{

spawnl(P_WAIT,"c:\\bc3.1\\bin\\bc.exe","bc.exe","a:\\Cursovaya.cpp",NULL) ;

//spawnl (P_WAIT,"d:\\Bc31\\bin\\bc.exe","bc.exe",a:\\Cursovaya.cpp", NULL) ;

}

void knopka4::run(void)

{

spawnl(P_WAIT,"A:\\Cursovaya.exe",NULL);

}

void knopka5::run (void)

{

exit(0);

}

void Menu::onLeft(void)

{

nomAct=(nomAct==0)?4:(nomAct-=1);

}

void Menu::onRight(void)

{

nomAct=(nomAct==4) ?0 : (nomAct+=1);

}

void Menu::onDown(void)

{

maskn[nomAct]->run() ;

}

void Menu::show(void)

{

_setcursortype(_NOCURSOR) ;

for(int i=0;i<5;i++)

if (i==nomAct)

maskn[i]->show (actTextCol, actBgCol) ;

else

maskn [i]->show (pasTextCol, pasBgCol) ;

}

void Menu :: getmessage ( int msg)

{

switch(msg)

{

case LEFT:

onLeft() ;

show() ;

break;

case RIGHT:

onRight() ;

show() ;

break;

case DOWN:

onDown() ;

show();

}

}

Menu::Menu(int xx,int yy)

{

x=xx;

y=yy;

nomAct=0;

maskn[0]=&kn1;

maskn [1]=&kn2;

maskn[2]=&kn3;

maskn [3]=&kn4;

maskn[4]=&kn5;

actTextCol=15;

actBgCol=1;

pasTextCol=0;

pasBgCol=2;

FILE* fin=fopen("a:\\menus.txt","r") ;

char str[80];

for (int i=0;i<5;i++)

{

fgets(str,80,fin) ;

maskn[i]->setparam(x,y,x+strlen(str)-2,y,str);

x=x+strlen(str);

}

fclose(fin) ;

show() ;

Файли даних для Menu

Рис. Лістинги вхідних файлів Button.txt та Menus.txt

Рис.

Рис.Роздруківка графічних результатів роботи

Висновки

Для вирішення задачі, поставленої в курсовій роботі, я вивчив основи об`єктно-орієнтованого програмування (мову С++) та успішно застосовував їх. При цьому я створив три власних класи: tochka, mnogougolnik, та kola. Кожен клас має власні приватні елементи та інтерфейсні функції, що забезпечують доступ до його приватних елементів. При описі класів я ознайомився з використанням та застосуванням дружніх зв`язків між класами та функціями. Розробив власний метод вирішення поставленої задачі: вивів формулу для створення масиву об'єктів типу tochki.

Навчився користуватися інформацією, що задана у текстових файлах, а також при розробленні програми використовував графічний редактор для побудови геометричних фігур. Слід зауважити, що існує одне обмеження, що накладається на початкові умови - довжина сторін багатокутника не повинна перевищувати певної довжини. Після отримання графічних результатів, можна освідчитись у правильності побудови алгоритмів та методів розв'язання даної задачі: при цьому ті вершини багатокутника, сусідні сторони (або сторона) яких перевищує вказану величину залишаються без описання колами, інші описані колами, радіус яких становить половині довжини меншої сусідньої сторони. Для більш зручного користуванням програмою є також програма Menu, з якої можна відкрити текстовий файл даних my.txt та my1.txt із подальшим записом та збереженням необхідної інформації, запустити саму програму Cursovaya.exe , відкрити для коригування файл Cursovaya.cpp, прочитати довідку про саму програму.

Список використаної літератури

1.Б.Страуструп «Язык программирования Си++». Москва «Бином» 2001.

2.«Си++ Язык программирования». Москва «И.В.К-СОФТ» 1991.

3.„Языки программирования Си и С++». Москва. «Познавательная книга плюс» 2001.

4.«С++ специальный справочник». Санкт-Петербург. «Питер» 2001.

Размещено на Allbest.ru


Подобные документы

  • Аналіз сучасного стану технологій програмування. Засоби реалізації об'єктів в мові C++, структура даних і функцій. Розробка програмного продукту - гри "трикутники", з використовуванням моделей, класів і функцій об’єктно-орієнтованого програмування.

    курсовая работа [117,8 K], добавлен 14.03.2013

  • Ключові поняття мови об’єктно-орієнтованого програмування C++: інкапсуляція, наслідування, абстракція, поліморфізм. Об’ява класів у мові С++. Графічні засоби. Пошук відстані між точками. Опис класів і об’єктів. Програма графічної задачі. Лістинги файлів.

    курсовая работа [144,3 K], добавлен 14.03.2013

  • Об’єктно-орієнтоване програмування мовою С++. Основні принципи об’єктно-орієнтованого програмування. Розробка класів з використанням технології візуального програмування. Розробка класу classProgressBar. Базовий клас font. Методи тестування програми.

    курсовая работа [211,3 K], добавлен 19.08.2010

  • Особливості редагування за допомогою текстового редактора NotePad вхідного файлу. C++ як універсальна мова програмування, знайомство с функціями. Характеристика графічних засобів мови С. Аналіз основних понять об’єктно-орієнтованого програмування.

    курсовая работа [123,3 K], добавлен 14.03.2013

  • Редагування за допомогою текстового редактора NotePad вхідного файлу даних. Програмна реалізація основного алгоритму з використанням засобів об'єктно-орієнтованого програмування. Об’ява та опис класів і об'єктів. Розробка допоміжних програмних засобів.

    курсовая работа [69,4 K], добавлен 14.03.2013

  • Принципи об'єктно-орієнтованого підходу. Розробка програмного комплексу з використанням цього алгоритму і користувальницьких класів на мові програмування С++. Реалізація простого відкритого успадкування. Тестування працездатності системи класів.

    курсовая работа [98,0 K], добавлен 06.05.2014

  • Розробка програми на мові програмування С++ з використанням об’єктно-орієнтованого програмування, яка включає в себе роботу з файлами, класами, обробку числової інформації і роботу з графікою. Структура класів і об’єктів. Лістинг та алгоритм програми.

    курсовая работа [104,4 K], добавлен 14.03.2013

  • Розробка програми на мові програмування С++ з використанням об'єктно-орієнтованого програмування. Робота з файлами, графікою, класами, обробка числової інформації. Графічні засоби мови програмування. Алгоритм задачі та допоміжні програмні засоби.

    курсовая работа [102,5 K], добавлен 14.03.2013

  • Прототип об'єктно-орієнтованого програмування. Управління процесом реалізації програми. Розвиток апаратних засобів. Об'єктно-орієнтовані мови програмування. Надійність і експлуатаційні якості програм. Візуальне об’єктна-орієнтовне проектування Delphi.

    контрольная работа [28,9 K], добавлен 18.05.2009

  • Фундаментальні поняття об'єктно-орієнтованого програмування. Система лінійних нерівностей та опуклі багатогранники. Системи лінійних рівнянь лінійної алгебри як частковий випадок систем лінійних обмежень. Використання середовища програмування Delphi7.

    курсовая работа [222,7 K], добавлен 20.05.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.