Конструирование программ и языки программирования

Министерство образования республики Беларусь

Минский государственный высший

Радиотехнический колледж















Пояснительная записка

К курсовому проекту по предмету "Информатика"

"Конструирование программ и языки программирования"




Содержание



Введение

1. Постановка задачи

1.1 Входная информация

1.2 Выходная информация

2. Вычислительная система

2.1 Основные характеристики выбранного ПК и внешних устройств

2.2 Характеристика программных средств

2.3 Операционная система

3. Объектно-ориентированный анализ задачи

3.1 Описание задачи в ключевых абстракциях предметной области

3.2 Описание интерфейса классов

4. Описание программы

5. Программа и методика испытаний

6. Описание применения

Заключение

Литература	

Приложение А. Листинг программы

	Приложение В. Блок-схема




Введение



Сегодня в начале 21 века, компьютеры можно встретить почти во всех сферах деятельности. Они достаточно прочно укрепились в нашей жизни и сознании. В настоящее время происходит стремительное развитие вычислительной техники и программного обеспечения ЭВМ. Все большему числу специалистов в самых различных областях требуется доступ к вычислительной технике для решения стоящих перед ними задач. Хотя компьютеры создавались для численных расчетов, скоро оказалось, что они могут обрабатывать и другие виды информации – ведь практически все они могут быть представлены в числовой форме. Сейчас компьютеры превратились в универсальные средства для обработки всех видов информации, используемых человеком. С помощью компьютеров не только проводятся числовые расчеты, но и подготавливаются к печати книги, создаются рисунки, кинофильмы, музыка, осуществляется управление заводами и космическими кораблями, проводятся всевозможные тестирования, проверяющие знания людей в той или иной области и так далее.

Одной из значительных ниш, которую заняли ЭВМ, является автоматизация документооборота и хранение больших объемов данных. Информационные технологии и развитие возможностей самих компьютеров позволяет хранить огромное количество данных, обеспечивая при этом высокую (в некоторых случаях почти мгновенную) скорость доступа к информации, возможность корректировки и модификации, переносимости и множимости данных, а если требуется, то их защиту. Также работа с базой данных на ЭВМ обычно более проста и удобна, чем работами с бумажными и другими носителями информации. Все вышеперечисленные возможности реализуются с помощью систем управления базами данных. Сфера применения СУБД практически безгранична. трудно представить себе область интересов человека, которая не требовала бы хранения информации для дальнейшего использования.

Из этого вытекает вывод, что СУБД, в том или ином виде будут существовать всегда. Поэтому можно смело говорить об их актуальности.




1. Постановка задачи



Разработать и написать СУБД склада, при помощи которой можно будет работать с информацией о поступающей продукции и корректировать данные.

Носитель для хранения данных: НЖМД или ГМД компьютера (данные хранятся в файле).



1.1 Входные данные



Строки символов и числа (вводятся с помощью клавиатуры).



1.2 Выходные данные



Считываются из файла и отображаются на экране монитора.




2. Вычислительная система



2.1 Основные характеристики выбранного ПК и внешних устройств



Для комфортной работы программы наличие высоких характеристик ПК не обязательно. СУБД успешно работала на Р-166 с 8 Мв ОЗУ, и должна работать на ПК с ещё более низкими характеристиками.



2.2 Основные характеристики программных средств



При решении задачи я использовал интегрированную среду разработки Borland C++ 3.0. Она позволяет легко писать программы под ОС МS DOS и

Windows. Разработанная программа ориентирована под MS DOS, что делает её нетребовательной к ресурсам компьютера и позволяет вести работу даже при отсутствии современных ОС.

	Язык С++ - это язык программирования общего назначения, очень хорошо известный своей эффективностью, экономичностью, и переносимостью.

	Указанные преимущества С++ обеспечивают хорошее качество разработки почти любого вида программного продукта. Использование С++ в качестве языка программирования позволяет получать быстрые, компактные и легко читаемые программы. При этом они имеют хорошую наглядность и их более просто сопровождать.

	С++ сочетает эффективность и мощность в относительно малом по размеру языке. Хотя С++ не содержит встроенных компонент языка, выполняющих ввод - вывод, распределение памяти, манипуляций с экраном или управление процессами, тем не менее, системное окружение С++ располагает очень большой библиотекой модулей, в которой реализованы все подобные функции. Библиотека поддерживает многие, если не все, функции, которые требуются в работе.

	Это решение позволяет программам, написанным на этом языке, быть независимыми от конфигурации конкретного компьютера, а строгое определение языка делает его независимым от любых деталей операционной системы или машины. В то же время программисты могут добавить в библиотеку специфические системные программы, чтобы более эффективно использовать конкретные особенности машины.

	Перечислим некоторые существенные особенности языка С++:

	С++ обеспечивает полный набор операторов структурного программирования.

	С++ поддерживает указатели на переменные и функции. Указатель на объект программы соответствует машинному адресу этого объекта. Посредством разумного использования указателей можно создавать эффективно выполняемые программы, так как указатели позволяют ссылаться на объекты тем же самым путем, как это делает машина. С++ поддерживает указатели, и тем самым позволяет осуществлять непосредственный доступ и манипуляции с адресами памяти.

	В своем составе С++ содержит препроцессор, который обрабатывает текстовые файлы перед компиляцией. Среди его наиболее полезных приложений при написании программ на С++ являются: определение программных констант, замена вызовов функций аналогичными, но более быстрыми макросами, условная компиляция.

	С++ - гибкий язык, позволяющий принимать в конкретных ситуациях самые разные решения. Тем не менее, С++ налагает незначительные ограничения в таких, например, действиях, как преобразование типов. Во многих случаях это является достоинством, однако, программисты должны хорошо знать язык, чтобы понимать, как будут выполняться их программы.

	С++ - это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.



2.3 Операционная система



Операционная система - это программа, которая загружается при включении компьютера. Она производит диалог с пользователем, осуществляет управление компьютером, его ресурсами (оперативной памятью, местом на дисках и т.д.), запускает другие (прикладные) программы на выполнение. Операционная система обеспечивает пользователю и прикладным программам удобный способ обращения( интерфейс ) с устройствами компьютера.

Основная причина необходимости операционной системы состоит в том, что элементарные операции для работы с внутренними устройствами и управление ресурсами компьютера — это операции очень низкого уровня, поэтому действия, которые необходимы пользователю и прикладным программам, состоят из нескольких сотен или тысяч таких элементарных операций. Операционная система скрывает от пользователя эти сложные и ненужные подробности и предоставляет ему удобный интерфейс для работы. Она выполняет также различные вспомогательные действия, например копирование или печать файлов не детализируя данный процесс.

Большинство современных персональных компьютеров IBM PC, как правило, работают под управлением операционной системы MS DOS фирмы Microsoft Corporation или ее варианты PC DOS, распространяемого фирмой IBM, либо же под управлением появившейся в 1988 году совместимой с MS DOS операционной системы DR DOS фирмы Digital Research/5, с.58/.

В нашей стране наибольшее распространение получила операционная система MS DOS, которая и установлена у большинства компьютеров. Известны ранние версии операционных систем (v1.0; v3.30; v5.0), но на более мощных компьютерах с несколькими мегабайтами оперативной памяти используются версии 6.0 и 6.22 операционной системы MS DOS. Эти версии имеют средства для эффективного использования оперативной памяти сверх 640 Кбайт, позволяет работать с логическими дисками больших объемов ( 1 Гбайт и более), переносить DOS и драйверы устройств в расширенную память, освобождая место для прикладных программ и т.д.




3. Объектно-ориентированный анализ задачи



3.1 Описание задачи в ключевых абстракциях предметной области



При решении задачи я воспользовался многими плюсами структурного программирования и для удобства разработки включил классы. Так как проект разрабатывается под MS DOS, невелик по объёму и не получит дальнейшего развития не имеет смысла делать программу полностью объектной: с помощью подпрограмм структурного программирования можно решить данную задачу быстрее и проще. Проектирование классов производилось с учетом потребностей данной программы в объектах. При анализе задачи в ключевых абстракциях я выделил: пользователь, данные, база для хранения данных. При этом пользователь взаимодействует с базой, обмениваясь с ней данными. Значит нам нужен класс данных. Объекты этого класса будут хранится в ОЗУ компьютера при работе программы (что позволяет организовать к ним быстрый доступ), или на диске при работе других приложений или выключенном ПК. Особенности программы удобнее реализовать с помощью структурного программирования, поэтому иерархии классов в программе нет.



3.2 Описание интерфейса классов



Класс DataF несёт ответственность за получение и хранение в своих полях данных, введённых пользователем. Этот класс имеет следующий интерфейс:



class DataF

{

public:


Далее следует описание полей структуры хранящей данные.

Потом объявление функции char GetPole(char *str,int nb,int rzc), которая выполняет работу по занесению данных введённых пользователем в соответствующие члены-данные класса.

В качестве параметров функция принимает указатель на заполняемое поле структуры, количество символов отведённых под это поле и режим работы: новая запись (rzc==0), либо корректировка (rzc==1).

Следующая функция-член класса: void NewZap(int rzc) организует диалог с пользователем и вызывает функцию GetPole(char*,int,int) передавая ей нужные параметры.

В качестве параметров функция NewZap(int) принимает два целых, указывающих на режим работы (как и предыдущая функция).




4. Описание программы



Программа не очень велика, поэтому для удобства чтения и отладки она выполнена в одном модуле. Ряд переменных имеет глобальный характер: это связано с тем, что они используются несколькими подпрограммами и передача их другим способом вызвала бы дополнительны трудности при реализации и привела бы к более запутанному коду.

Программа, после загрузки в память, запрашивает имя пользователя (оно используется для занесения в поля записи). Потом происходит считывание данных из файла в массив объектов (LoadZap()).

Функция DrawMain(int regim) прорисовывает элементы управления выделяя текущий (для этого используется параметр regim).







Перемещаясь по элементам управления с помощью клавиатуры или мыши, пользователь может выбрать один режимов работы. В этом случае вызывается функция EnterHandle(int regim), которая определяет какой из режимов выбран и вызывает соответствующие подпрограммы.

При реализации просмотра, корректировки и удаления используется одна и таже функция View() которая возвращает номер выбранной записи, это заметно облегчило разработку и сделало код более ясным и читабельным.







Перед завершением программа вновь связывается с файлом данных и вносит в него произведенные пользователем изменения и дополнения.

Программа включает в себя инициализацию мыши, сделанную на Assembler. Для работы с мышью используются функции:

MouseStatus(int *x, int *y, int *button); -- проверяет нажатие клавиши мыши.

ShowMouse(); -- показывает курсор мыши.

HideMouse(); -- прячет курсор мыши.




5. Программа и методика испытаний



Над завершённым программным продуктом был проведён ряд испытаний:

А)

запущена программа

введены новые данные

совершен выход из программы

программа была вновь открыта : добавленные данные присутствовали.

Вывод : данные были успешно сохранены в файле(при просмотре директории файл присутствовал).

испытание было повторено

В)

После запуска программы были открыты данные для корректировки и изменены некоторые из них.

Потом некоторые записи были удалены.

Во время просмотра удалённые записи отсутствовали, а корректировавшиеся были изменены.

Был совершен выход из программы и повторный запуск.

Все ранее внесённые изменения присутствовали.

Вывод : программа успешно корректирует и удаляет данные, а потом сохраняет изменения в файле.

С)

Программа была загружена.

В структуру данных внесены изменения.

Совершён нестандартный выход.

Программа вновь загружена.

При просмотре сделан вывод: нестандартный выход имеющийся файл данных не повредил, однако новые изменения внесены небыли.

Вывод по всем испытаниям:

С возложенной задачей программа успешно справляется, не требуя при этом большого количества ресурсов системы.




6. Описание применения



Написанная мною программа является СУБД и предназначена для хранения данных об поступивших на склад объектах. Она может найти применение на различного рода хранилищах и складах или в процессах использующих те же принципы хранения и обработки информации.

Программа сконфигурирована под MS DOS и установка Windows ей не требуется.

Минимальные требования: CPU—Pentium 100 m, и ОЗУ—8Мв, наличие стандартных устройств ввода-вывода.

Данный программный продукт обладает дружелюбным интерфейсом, и легкость управления работой.

Для упрощения доступа к данным реализован поиск, сходный по применению с поиском в справочной системе компилятора BorlandC++3.0.

Программа проста в использовании и не требует никаких дополнительных программных и технических средств от ЭВМ, и специальной квалификации от пользователя.

Её системные требования довольно низкие, поэтому программу можно использовать даже на старых моделях компьютеров.




Заключение



Поставленная задача выполнена на уровне моих представлений о потребностях склада, поэтому возможен некоторый отрыв от реальности (но, так как программа может быть модифицирована, это легко исправить).

В связи с тем, что программа не получит коммерческого распространения и новые её версии разрабатываться не будут, я не использовал многие возможности предлагаемые объектно-ориентированным подходом в программировании, чтобы не увеличивать время разработки программы и не ухудшать её читабельность.




Литература



Гилберт Шилдт "Borland C++"

2. Гради Буч "Объектно-ориентированный анализ и проектирование".




Приложение А



Листинг программы



#include <conio.h>

#include <stdio.h>

#include <graphics.h>

#include <iostream.h>

#include <dir.h>

#include <PROCESS.H>

#include <IO.h>

#include <dos.h>

#include <time.h>

#include <FSTREAM.H>

void append();

void Mousebut(int *cbb,int *xx,int *yy);

void HideMouse();

void ShowMouse();

char Conv(int);

void Correct(void);

int Find();

void DrawMain(int);

void Timeout();

int nzap=0,regim;

int exitp;

char userprg[15]=" ";

time_t lt;

char *mch;

class DataF {

public:

char datep[10];

char name[20];

char col_vo[10];

char ed_ism[5];

char inform[200];

char user[15];

char GetPole(char *str,int nb,int rzc)

{

int i;

if(rzc==0)

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

{

str[i]=' ';

};

int ic;

char chr;

int nb1=nb,nb2=nb;

if(rzc!=0){if(nb>100)nb2=30; for(i=0;i<nb2-2;i++)cout<<str[i];nb1=nb1-2; cout<<"_"; };

for(i=((rzc!=0)?nb1:0);i<nb-1;i++)

{

ic=getch();

if(ic==13)break;

if(ic==27){nzap--;i=nb;};

if(ic==8){str[i-1]=' ';i=i-2;gotoxy(wherex()-2, wherey()); cout<<"_"; cout<<" "; gotoxy(wherex()-1,wherey());}

else{

chr=Conv(ic);

str[i]=chr;

gotoxy(wherex()-1,wherey());

cout<<chr;

cout<<"_"; };

};

gotoxy(wherex()-1,wherey());

cout<<" ";

str[nb-1]='\0';

};

void NewZap(int rzc) //rzc: 0-new 1-correct

{

HideMouse();

cleardevice();

if(rzc!=0){gotoxy(20,9); cout<<"корректировка :";};

gotoxy(20,10);

cout<<"наименование : ";

GetPole(&name[0],20,rzc);

gotoxy(20,11);

cout<<"единицы измерений : ";

GetPole(&ed_ism[0],5,rzc);

gotoxy(20,12);

cout<<"количество : ";

GetPole(&col_vo[0],10,rzc);

gotoxy(20,13);

cout<<"дата поступления : ";

GetPole(&datep[0],10,rzc);

gotoxy(20,14);

cout<<"дополнительные данные: ";

GetPole(&inform[0],200,rzc);

for(int i=0; i<15; i++) user[i]=userprg[i];

};

};

DataF Zap[125];

void LoadZap()

{

clrscr();

gotoxy(10,10);

cout<<" введите своё имя: ";

cin>>userprg;

FILE *f;

f=fopen("ttt.cfg","r");

nzap=1;

while (!feof(f))

{

fread(&Zap[nzap],sizeof(DataF),1,f);

nzap++;

};

nzap--;

fclose(f);

};

void SaveZap()

{

FILE *f;

f=fopen("ttt.cfg","w");

for (int i=1;i<nzap;i++) fwrite(&Zap[i],sizeof(DataF),1,f);

fclose(f);

};

void append()

{

FILE *f;

f=fopen("ttt.cfg","a");

fwrite(&Zap[nzap],sizeof(DataF),1,f);

fclose(f);

};

void MouseStatus(int *x,int *y,int *button)

{

int bb,xx,yy;

asm {

mov ax,03;

int 33h;

mov bb,bx;

mov xx,cx;

mov yy,dx;

};

*button=bb;

*x=xx;

*y=yy;

};

void Information()

{

HideMouse();

char ch;

int exitInf=0;

cleardevice();

gotoxy(18,9);

cout<<"разработано Можайко А.С.";

ch=getch();

DrawMain(regim);

ShowMouse();

};

void DrawMain(int regim)

{

cleardevice();

const char MenuItem[6][16]={" ",

" „добавить ",

" просмотр ",

" корректировка ",

" удалить ",

" выход "};

setcolor(1);

setbkcolor(1);

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

{

setfillstyle(1,i==regim?9:10);

fillellipse(300,55+i*60,90,20);

outtextxy(238,50+i*60,MenuItem[i]);

}; 	Timeout(); ShowMouse();

};

void ShowMouse(void)

{

asm {	 mov ax,01h

int 33h

}

};

void HideMouse(void)

{

asm{

mov ax,02

int 33h

}

};

void Nadpis(int n1,int coln)

{

setbkcolor(3);

struct viewporttype SaveWin;

getviewsettings(&SaveWin);

setviewport(9,9,631,260,SaveWin.clip);

clearviewport();

setviewport(9,279,598,434,SaveWin.clip);

clearviewport();

setviewport(SaveWin.left,SaveWin.top,SaveWin.right,SaveWin.bottom,SaveWin.clip);

char *st,*st1,*st2,*st3,*st4,*st5,stm[100],stm2[100];

int i;

if((n1)<125)

for (i=1;i<9;i++)

{

if(i==coln) setcolor(1);

else setcolor(4);

gotoxy(3,2*i);

cout<<n1+i-1;

st=Zap[n1+i-1].datep;

outtextxy(40,i*32-12,st);

st1=Zap[n1+i-1].name;

outtextxy(150,i*32-12,st1);

st2=Zap[n1+i-1].col_vo;

outtextxy(380,i*32-12,st2);

st3=Zap[n1+i-1].ed_ism;

outtextxy(500,i*32-12,st3);

setcolor(4);

if(i!=8)line(8,i*32+5,632,i*32+5);

};

st4=Zap[n1+coln-1].inform;

outtextxy(50,320,st4);

st5=Zap[n1+coln-1].user;

outtextxy(550,420,st5);

};

int Find()

{

char ch,rf,*zapm,word[20];

int mflag[125];

for(int f=1;f<nzap;f++)

mflag[f]=1;

setbkcolor(5);

bar(100,100,500,250);

rf=getch();

int k=-1,ret,fpk;

ch=getch();

while(3)

{

k++;

fpk=0;

for(int i=1;i<nzap-1;i++)

{

if(mflag[i]!=0){

if(rf==50){

if(ch==Zap[i].name[k]){ mflag[i]=1;fpk=1;};

if(ch!=Zap[i].name[k]) mflag[i]=0;

};

if(rf==49){

if(ch!=Zap[i].datep[k]) mflag[i]=0;

if(ch==Zap[i].datep[k]){ mflag[i]=1;fpk=1;};

};

};

};

if(fpk==0){ ch=getch(); fpk=7; };

do {

for(i=1;i<nzap-1;i++)

if(mflag[i]==1)

{

Nadpis(i,1);

ret=i;

ch=getch();

if((ch!=9)) i=nzap;

};

if(ch==9)ch=getch();}

while(ch==9);

if(ch==13)break;

};

return ret;

};//*/

int View(int corr)

{

HideMouse();

setfillstyle(1,1);

bar(0,0,getmaxx(),getmaxy());

setcolor(4);

line(0,270,640,270);

line(0,0,7,7);

line(633,7,640,0);

line(0,270,7,263);

line(633,263,640,270);

line(0,270,7,277);

line(633,277,640,270);

line(0,480,7,473);

line(633,473,640,480);

rectangle(7,7,633,263);

rectangle(7,277,633,473);

setfillstyle(1,2);

bar(601,279,631,471);

settextstyle(0,0,3);

outtextxy(608,290,"F");

outtextxy(608,335,"I");

outtextxy(608,380,"N");

outtextxy(608,425,"D");

settextstyle(0,0,0);

rectangle(600,278,632,472);

rectangle(601,277,633,473);

setfillstyle(1,3);

bar(8,8,632,261);

bar(8,278,599,472);

bar(8,435,599,472);

setcolor(4);

int exitPrg=0,ret=0;

char cr;

int i=1,newi=1,botton, x, y;

Nadpis(1,1);

ShowMouse();

line(8,450,599,450);

while(exitPrg==0){

while(!kbhit()){Mousebut(&botton, &x, &y);

if(botton>0)

if((x>601)&&(x<631))

if((y>279)&&(y<471)){

i=Find();newi=i;i=1;};

};

cr=getch(); HideMouse();

switch(cr){

case 72:{i--;

if(i<1) {

i=1;

if(newi>1){newi--;};

};

Nadpis(newi,i);

break;};

case 80:{i++;if(i>8){i=8;newi++;};

Nadpis(newi,i);

break; };

case 62:i=Find();newi=i;i=1;break;

case 27:exitPrg=1;ret=-1;break;

case 13:{delay(300);ret=(newi+i-1);exitPrg=1;

break;};

};

textbackground(2); setfillstyle(1,10); ShowMouse();

};

HideMouse();

settextstyle(0,0,0);

return ret;

};

void deleteZap(void)

{

int exitdel=0;

char ch;

while (exitdel==0)

{

int t=View(2);

if(t==-1)break;

setbkcolor(1);

bar(100,100,500,200);

ch=getch();

if(ch==13){

for(int i=t; i<=nzap; i++){ Zap[i]=Zap[i+1];exitdel=1;};

};

};

}; //*/

void Correct(void)

{

int t=View(1);

setbkcolor(1);

if((t!=0)&&(t!=-1))

Zap[t].NewZap(1,t);

};

void EnterHandle(int regim)

{

cleardevice();

switch (regim)

{

case 1: Zap[nzap].NewZap(0,nzap);nzap++; break;

case 2: View(0); break;

case 3: Correct();break;

case 4: deleteZap();nzap--; break;

case 5: exitp=1; break;

};

cleardevice();

DrawMain(regim);

};

void Timeout()

{

setcolor(1);

lt=time(NULL);

outtextxy(445,460,mch);

mch=ctime(&lt);

setcolor(11);

outtextxy(445,460,mch);

setcolor(1);

};

int main()

{

int driver,mode,r;

int regim=1;

driver=DETECT;

mode=0;

LoadZap();

initgraph(&driver,&mode,"c:\\borlandc\\bgi");

setbkcolor(8);

DrawMain(regim);

ShowMouse();

exitp=0;

int x,y,button,timeR=0;

Mousebut(&button,&x,&y);

while (exitp==0)

{

timeR++;

if(timeR==-10) { Timeout();timeR=0; };

if (kbhit()) switch (getch())

{

case 27: exitp=1;

break;

case 80:regim=regim % 5 +1; DrawMain(regim);

break;

case 72:regim=regim==1?5:regim-1; DrawMain(regim);

break;

case 13:EnterHandle(regim);

};

Mousebut(&button,&x,&y);

if (button>0)

if ((x>555)&&(x<630))

if ((y>0)&&(y<80)) Information();

if (button>0)

{

if((x>255)&&(x<340))

{

if((y>100)&&(y<125))regim=1;

if((y>165)&&(y<185))regim=2;

if((y>225)&&(y<245))regim=3;

if((y>285)&&(y<305))regim=4;

if((y>345)&&(y<365))regim=5;

EnterHandle(regim);

};

};

};

SaveZap();

HideMouse();

restorecrtmode();

return 0;

};

void Mousebut(int *cbb,int *xx,int *yy)

{

int cb,x,y;

asm{

mov ax,05h

mov bx,0

int 33h

mov cb,bx

mov x,cx

mov y,dx

};

*xx=x;*yy=y;*cbb=cb;

};




Приложение В



Блок-схема