Программирование на С++, индивидуальная работа

Цель: Разработка простейших классов на примере разработки моделей элементарных объектов. Введение

Индивидуальное задание по курсу «Программирование» – это обязательный вид работы, который необходимо выполнить студенту для получения высокой оценки по результатам семестра. Структура и цели индивидуального задания

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

Индивидуальное задание состоит из двух частей. Задача первой части задания – овладение дополнительным теоретическим материалом и систематизация знаний студента о методах разработки алгоритмов решения практических задач, углубленное изучение отдельных вопросов использования языка программирования, его операторов и стандартных библиотек. Результатом первой части задания является обзор и описание состояния вопроса по выбранной тематике (реферативная часть). Вторая часть задания посвящена получению практических навыков решения прикладных задач с использованием выбранной среды программирования. В качестве конкретной задачи (или задач) обычно выбирается задача, согласованная по смыслу с первой частью индивидуального задания.

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

Задачей данной части индивидуального задания является самостоятельный поиск и систематическое изложение материала по выбранной тематике. Студент должен самостоятельно скомпоновать и связно изложить материал, который не входит в базовый лекционный материал курса «Программирование». Для выполнения этой исследовательской работы следует использовать как печатные, так и электронные источники.

Перечень примерных тем рефератов

Практическая часть

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

Разработать алгоритм и записать его средствами блок-схем.

Реализовать алгоритм на выбранном языке программирования.

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

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

Варианты заданий

НомерЗадание
1Объект «комплексные числа». Операции определяются по общепринятым формулам. Предусмотреть возможность операции присваивания, сложения, деления и перевода в текстовую строку текущих значений. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
2Объект «комплексные числа». Операции определяются по общепринятым формулам. Предусмотреть возможность операции присваивания, сложения, умножения и перевода в показательную () форму с возможностью распечатки на консоль. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
3Объект «вектор на плоскости» заданный в системе декартовых координат. Начало вектора расположено в начале координат. Операции определяются согласно общепринятых формул линейной (векторной) алгебры. Предусмотреть возможность операции присваивания, сложения, скалярного умножения и распечатки координат текущих значений. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
4Объект «вектор на плоскости» заданный в системе декартовых координат. Начало вектора расположено в начале координат. Операции определяются согласно общепринятых формул линейной (векторной) алгебры. Предусмотреть возможность операции присваивания, вычитания, скалярного умножения и распечатки координат текущих значений. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
5Объект «вектор на плоскости» заданный в системе декартовых координат. Начало вектора расположено в начале координат. Операции определяются согласно общепринятых формул линейной (векторной) алгебры. Предусмотреть возможность операции присваивания, сравнения модулей, скалярного умножения и распечатки координат текущих значений. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
6Объект «вектор на плоскости» заданный в системе декартовых координат. Начало вектора расположено в начале координат. Операции определяются согласно общепринятых формул линейной (векторной) алгебры. Предусмотреть возможность операции присваивания, нахождения угла между векторами, скалярного умножения и распечатки координат текущих значений. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
7Объект «равнобедренный треугольник, заданный длинами сторон». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, определяющий существует или такой треугольник. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
8Объект «равносторонний треугольник, заданный длинами сторон». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, определяющий существует или такой треугольник. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
9Объект «прямоугольный треугольник, заданный длинами сторон». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, определяющий существует или такой треугольник. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
10Объект «равнобедренный треугольник, заданный длиной равнобедренной стороной и углом между ними». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, отвечающий на вопрос – остро или тупо угольным является заданный треугольник. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
11Объект «треугольник, заданный длиной двух стороной и углом между ними». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, отвечающий на вопрос – остро или тупо угольным является заданный треугольник. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
12Объект «прямоугольник, заданный длинами двух сторон». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, отвечающий на вопрос – является ли прямоугольник квадратом. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
13Объект «множество целых чисел заданной мощности». Предусмотреть возможность операции присваивания, объединения двух множеств, вывода на печать элементов множества, а так же метод, отвечающий на вопрос – принадлежит ли указанное значение множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией. Мощность множества задается при создании объекта.
14Объект «множество вещественных чисел заданной мощности». Предусмотреть возможность операции присваивания, объединения двух множеств, вывода на печать элементов множества, а так же метод, отвечающий на вопрос – принадлежит ли указанное значение множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией. Мощность множества задается при создании объекта.
15Объект «множество символов заданной мощности». Предусмотреть возможность операции присваивания, объединения двух множеств, вывода на печать элементов множества, а так же метод, отвечающий на вопрос – принадлежит ли указанное значение множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией. Мощность множества задается при создании объекта.
16Объект «множество целых чисел удвоенной длины заданной мощности». Предусмотреть возможность операции присваивания, объединения двух множеств, вывода на печать элементов множества, а так же метод, отвечающий на вопрос – принадлежит ли указанное значение множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией. Мощность множества задается при создании объекта.
17Объект «множество вещественных чисел удвоенной точности заданной мощности». Предусмотреть возможность операции присваивания, объединения двух множеств, вывода на печать элементов множества, а так же метод, отвечающий на вопрос – принадлежит ли указанное значение множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией. Мощность множества задается при создании объекта.
18Объект «множество байт заданной мощности». Предусмотреть возможность операции присваивания, объединения двух множеств, вывода на печать элементов множества, а так же метод отвечающий на вопрос – принадлежит ли указанное значение множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией. Мощность множества задается при создании объекта.
19Объект «множество целых чисел не заданной (переменной) мощности». Предусмотреть возможность операции добавить элемент к множеству, определение количество элементов в множестве, вывода на печать всех элементов множества, а так же метод удаляющий указанный элемент из множества, если этот элемент принадлежит множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
20Объект «множество вещественных чисел не заданной (переменной) мощности». Предусмотреть возможность операции добавить элемент к множеству, определение количество элементов в множестве, вывода на печать всех элементов множества, а так же метод удаляющий указанный элемент из множества, если этот элемент принадлежит множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
21Объект «множество символов не заданной (переменной) мощности». Предусмотреть возможность операции добавить элемент к множеству, определение количество элементов в множестве, вывода на печать всех элементов множества, а так же метод удаляющий указанный элемент из множества, если этот элемент принадлежит множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
22Объект «множество целых чисел удвоенной длины не заданной (переменной) мощности». Предусмотреть возможность операции добавить элемент к множеству, определение количество элементов в множестве, вывода на печать всех элементов множества, а так же метод удаляющий указанный элемент из множества, если этот элемент принадлежит множеству. Конструктор должен позволить создавать объекты без и с начальной инициализацией.
23Объект «прямоугольник, заданный длинами двух сторон». Предусмотреть возможность операции присваивания, определения площади и периметра, а так же логический метод, отвечающий на вопрос – содержится ли, указанный параметрами метода прямоугольник, внутри прямоугольника. Конструктор должен позволить создавать объекты без и с начальной инициализацией

Примеры подобных учебных реализаций: СТЕК символьных строк

class stack {
  private:
     char st[55];   // массив для хранения элементов стека
     int  ptr;      // указатель номера СЕДУЮЩЕГО свободного места в массиве
     int  max_ptr;  // максимальный размер стека
     char buf[110];  // для организации печати информации о состоянии стека
  public:
     stack();            // конструктор
     ~stack();           // деструктор
     void push(char c);  // метод - поместить в стек
     char pop();         // метод - взять из стека ('\0' - если стек пуст)
     char look();        // метод - посмотреть что в вершин стека ('\0' - если стек пуст)
     char * pr();        // метод - вернуть символьную строку - элементов в стеке
     void prln();        // метод -  распечатать стек
};
stack::stack()            // конструктор
     {
      max_ptr=55;
      ptr=0;
      for(int i=0; i< max_ptr; i++) st[i]='\0';
     };
stack::~stack()          // деструктор
     {
      ptr=0;
      for(int i=0; i< max_ptr; i++) st[i]='\0';
     };
void stack::push(char c)   // метод - поместить в стек
     {
      if ( (ptr+1) > max_ptr) 
      { printf("*** переполнение стека ***\n");
        exit(666);
      };
      st[ptr++]=c;
      return;
     };
char stack::pop()    // метод - взять из стека ('\0' - если стек пуст)
    {
      char cc;
      if (ptr < 0 ) return '\0';
      ptr--;
      cc=st[ptr];
      st[ptr]='\0';
      return cc;
    };
 
char stack::look()      // метод - посмотреть что в вершин стека ('\0' - если стек пуст)
    {
     char cc;
     int t_ptr;
     t_ptr=ptr-1;
     if ( t_ptr < 0 ) return '\0';
     cc = st[t_ptr];
     return cc;
    };
 
char *stack::pr()  // метод - вернуть символьную строку - элементов в стеке
    { int i;
      int j=0;
      buf[j++]=':'; buf[j++]=' ';
      for (i= (strlen(st)-1); i >= 0;  i-- ) 
       {      
         buf[j++]=st[i];
         buf[j++]=' ';
       };
      buf[--j]='\0';
      //sprintf(buf,": %s ",st);
      return buf;
    };
 
void stack::prln()    // метод -  распечатать стек
    { printf("%s\n", pr() );
      return;
    };
=====================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "stack.h"
int main(int argc, char * argv[]) {
  stack st; 
  st.prln();
 
  st.push('1'); st.prln();
  st.push('2'); st.prln();
  st.push('3'); st.prln();
  st.push('4'); st.prln();
  char
  z=st.pop();
  printf("===>pop ===> %c \n",z);
  st.prln();
  z=st.pop();
  printf("===>pop ===> %c \n",z);
  st.prln();
  z=st.look();
  printf("===>look===> %c \n",z);
  st.prln();
  printf("*********** %s\n",st.pr());
 return;
};

Результаты:

:
: 1
: 2 1
: 3 2 1
: 4 3 2 1
===>pop ===> 4
: 3 2 1
===>pop ===> 3
: 2 1
===>look===> 2
: 2 1
*********** : 2 1

Класс - "моя строка" st

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
class st {
   private:
   int l;           // длина
   char * s;        // адрес строки
  public:
   st();            // конструктор без параметра
   st(char *);    // конструктор с инициализирующим параметром
   ~st();
const char * put(const char *); // взять указатель на строку
const char * get();               // записать строку
 st(const st & x);                // конструктор копирования
 st & operator=(const st & x);    // оператор присваивания
 st & operator+=(const st & x);  //унарный оператор +=
 
 friend st operator+(const st & x, const st & y); 
 // дружественная функция +
 
 friend st operator-(const st & x, const st & y);
                            // дружественная функция -
 
 void ch(char); // для теста - изменить 0-й символ
 void pr( char *); // для теста - распечатать....
 
};
 
void st::ch(char x)
{ if (s[0] != '\0') this->s[0]=x;
   return;
};
 
 void st::pr(char tit[]="")
{printf("%s[%d]<%s>\n",tit,l,s);return; };
 
st::st()
{ l=1; s=new char[1]; s[0]='\0';};  
 
st::st(char * d)
{ l=strlen(d)+1; s=new char[l]; 
  strcpy(s, d);
  };
 
st::~st()
{
   delete [] s;
   l=0;
};
 
 st & st::operator=(const st & x)
 {
   if( this == &x ) return *this;
   delete [] this->s;
   this->l=x.l;
   this->s=new char[l]; 
   strcpy(s, x.s); 
   return *this;
 };
 
 // copy constructor
 //   попробуйте убрать.....
 st::st(const st & x)
 {
   this->l=x.l;
   this->s=new char[l]; 
   strcpy(s, x.s); 
 };
 
 // унарный +=
 st & st::operator+=(const st & x)
 {
   char *p;    int lp=this->l+x.l-1;
   p=new char[lp];
   sprintf(p,"%s%s",this->s, x.s);
   // в р - конактенитрованная строка
   delete [] this->s;
   this->l=lp;
   this->s=new char[lp]; 
   strcpy(this->s, p); 
   return *this;
 };
 // бинарный +
 st operator+(const st & x, const st & y )
 {
   char *p; 
   st temp;//! вызывается конструктор копирования
   int lp=x.l + y.l -1;
 
   p=new char[lp];
 
   sprintf(p,"%s%s", x.s, y.s);
   // в р - конактенитрованная строка
   temp.l=lp;
   temp.s=new char[lp]; 
   strcpy(temp.s, p); 
   return temp;
 };
 
 // бинарный -
 st operator-(const st & x, const st & y )
 {
   printf("x=%s  y=%s \n", x.s, y.s); 
   char *p; 
   st temp;  // !!!!!!!!!!!!!!!!!!!!!
   int i,j;    
   int k;
   char tchar;
   int flag;
   int n=x.l+1;
   p=new char[n];
   k=0;
   for(i=0; i< x.l; i++)
    {   tchar=x.s[i];
        // есть ли tchar в y.s ?
        flag=0;
        for(j=0;j<y.l;j++)  
          if(tchar==y.s[j]) {flag=1; break;};
        if(flag==0) p[k++]=tchar;
    };
    p[k]='\0';
   // в р - новая строка
   temp.l=k;
   temp.s=new char[k]; 
   strcpy(temp.s, p); 
   return temp;
 };
 
const char * st::put(const char * d)
{ 
  delete [] s;
  l=strlen(d)+1; s=new char[l]; 
  strcpy(s, d); 
  return s;
};
 
const char * st::get()
{
  return s;
}
 
int main(int argc, char *argv[] )
{ st a1, a2, a3, a4="куку";
  const char * p;
 
  p=a1.put("привет");  
  printf("***p===<%s>\n",p);
  a1.pr("a1= ....  ==> ");
  a2=a1;
  a2.pr("a2=a1 => ");
  a3.put("Всем "); a3.pr("a3.put(...) ==> ");
  a3+=a2;        a3.pr("a3+=a2 ==> ");
  printf("*************************\n");
  a1.ch('$');      a1.pr("a1($) ==> ");
  a2=a1;
  a2.ch('@');    a2.pr("a1(@) ==> ");
  a4.pr("a4 ==> ");
  printf("*************************\n");
  a2=a1 + " +++ " + a4;    a2.pr("a1 +++ a4 ==> ");
  a1 = "победа!";   a1.pr("a1=.... ==> ");
  a2 = a1 - "по";   a2.pr("a2=a1 - по ==> ");
  a3 = a1 - "ап";   a3.pr("a3=a1 - ап ==> ");
  return 0;
}

Результаты:

***p===<привет>
a1= ....  ==> [7]<привет>
a2=a1 => [7]<привет>
a3.put(...) ==> [6]<Всем >
a3+=a2 ==> [12]<Всем привет>
*************************
a1($) ==> [7]<$ривет>
a1(@) ==> [7]<@ривет>
a4 ==> [5]<куку>
*************************
a1 +++ a4 ==> [16]<$ривет +++ куку>
a1=.... ==> [8]<победа!>
x=победа!  y=по
a2=a1 - по ==> [5]<беда!>
x=победа!  y=ап
a3=a1 - ап ==> [5]<обед!>

множества

#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <stdlib.h>

class set {
private:
int size;
int *elems;
public:
set(void);
friend set operator+(set,set);
friend set operator-(set,set);
friend set operator*(set,set);
friend int operator<=(set,set);
friend int operator>=(set,set);
friend int operator==(set,set);
friend int operator!=(set,set);
friend void operator>>(set,char*); //Вывод множества в файл
friend void operator << (set&,char*); //Ввод множества из файла
void Print();
};

class ErrorInOpenFile {
public:
ErrorInOpenFile() { strcpy(mess,"Ошибка при работе с файлом");}
void ErrMessage() const {cout << mess;}
private:
char mess[50];
};

set::set() // конструктор
{
size=0;
};

int operator != (set a, set b) // не равно
{
int i,j,flg,res;
res=1;
for(i=0; i<a.size; i++)
{
flg=0;
for(j=0; j<b.size; j++)
if(b.elems[j] == a.elems[i]) flg=1;
if(!flg) res=0;
}
return !res;
};

int operator == (set a, set b) // равно
{
int i,j,flg,res;
res=1;
for(i=0;i<a.size;i++)
{
flg=0;
for(j=0; j<b.size; j++)
if(b.elems[j] == a.elems[i]) flg=1;
if(!flg) res=0;
}
return res;
};

int operator>=(set a, set b) {
int i,j;
int res,flg;
res=1;
for(i=0; i < a.size; i++) {
flg=0;
for(j=0; j<b.size; j++)
if(b.elems[j] == a.elems[i]) flg=1;
if(!flg) res=0;
}
return res;
};

int operator <= (set a, set b)
{
int i,j;
int res,flg;
res=1;
for(i=0; i<b.size; i++)
{
flg=0;
for(j=0;j<a.size;j++)
if(a.elems[j] == b.elems[i]) flg=1;
if(!flg)res=0;
}
return res;
};

set operator + (set a,set b)
{
int i,j,k;
int count;
count=0;
int flag;
for(i=0;i<b.size;i++)
{
flag=1;
for(j=0;j<a.size;j++)
if(a.elems[j] == b.elems[i]) flag=0;
if(flag) count++;
}
count+=a.size;
set res;
res.size=count;
res.elems=new int[count];
for(i=0;i<a.size;i++)res.elems[i]=a.elems[i];
for(j=0;j<b.size;j++)
{
flag=1;
for(k=0;k<a.size;k++)
if(a.elems[k]==b.elems[j])flag=0;
if(flag) res.elems[i++]=b.elems[j];
}
return res;
};

set operator-(set a,set b)
{
int i,j,k;
int count;
count=0;
int flag;
for(i=0;i<a.size;i++)
{
flag=1;
for(j=0;j<b.size;j++)
if(a.elems[i]==b.elems[j])flag=0;
if(flag)count++;
}
set res;
res.size=count;
res.elems=new int[count];
i=0;
for(j=0;j<a.size;j++)
{
flag=1;
for(k=0;k<b.size;k++)
if(a.elems[j]==b.elems[k])flag=0;
if(flag) res.elems[i++]=a.elems[j];
}

return res;
};

set operator*(set a,set b)
{
int i,j,k;
int count;
count=0;
int flag;
for(i=0;i<b.size;i++)
{
flag=1;
for(j=0;j<a.size;j++)
if(a.elems[j]==b.elems[i])flag=0;
if(!flag)count++;
}
set res;
res.size=count;
res.elems=new int[count];
i=0;
for(j=0;j<b.size;j++)
{
flag=1;
for(k=0;k<a.size;k++)
if(a.elems[k]==b.elems[j])flag=0;
if(!flag) res.elems[i++]=b.elems[j];
}
return res;
};

void operator << (set& nw,char* FileName)
{
const MAX_STR=255;
FILE *in;
char buff[MAX_STR+1];
try
{
in=fopen(FileName,"r");
if(in==NULL) throw ErrorInOpenFile();
}
catch(ErrorInOpenFile ERR)
{
ERR.ErrMessage();
exit(1);
}
unsigned i,count;
fgets(buff,MAX_STR,in);
sscanf(buff,"%d",&count);
nw.size=count;
nw.elems=new int[count];
for(i=0;i<count;i++)
{
fgets(buff,MAX_STR,in);
sscanf(buff,"%d",&nw.elems[i]);
}
fclose(in);
};

void operator>>(set nw,char* FileName)
{
int i;
const MAX_STR=255;
char buff[MAX_STR];
FILE* out;
try
{
out=fopen(FileName,"w+");
if(out==NULL)throw ErrorInOpenFile();
}
catch(ErrorInOpenFile ERR)
{
ERR.ErrMessage();
exit(1);
}
sprintf(buff,"%d\n",nw.size);
fputs(buff,out);
for(i=0; i<nw.size; i++)
{
sprintf(buff,"%d\n",nw.elems[i]);
fputs(buff,out);
}
fclose(out);
};

void set::Print()
{
int i;
cout << "\n";
for(i=0;i<size;i++)
cout << elems[i] << "\n";
};
void main()
{
set A;
set B;
set C;
A << "SetA.txt";
cout << "\nSet A";
A.Print();
B << "SetB.txt";

cout << "\nSet B";
B.Print();

C=A+B;
cout << "\nSet C";
C.Print();
// set D;
// D << "SetD.txt";
// set E;
// E=A-D;
// cout << "\nSet E";
// E.Print();
// set F;
// F=A*D;
// cout << "\nSet F";
// F.Print();
};

Атрибуты строки

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
class string {
 private:
     char *str;
     unsigned char attr;
     int  row, col;
 public:
     string();
     string(char *, unsigned char, int , int );
     void write();
};
string::string()
  {
   str = new char [ sizeof "Привет!" ];
   strcpy(str, "Привет!");
   attr=(BLUE  <<  4) + YELLOW;  // BROWN << 4+GREEN;
   row=15;
   col=36;
  };
string::string(char * line, unsigned char a, int y=0, int x=0)
 {
  str=new char [ strlen(line)+1 ]; 
  strcpy(str, line);
   attr=a;
   row=y;
   col=x;
  };
void string::write()
{
   textattr( attr);
   gotoxy(col, row);
   cputs( str );
}

void main(int argc, char * argv[])
{
   clrscr();
 
   string string1;
   string string2("Строка вторая!", (BLACK << 4)+WHITE);
   string string3("Третья строка!", (BROWN << 4)+GREEN, 17, 19);
   string string4("Четвертая строка!", (BROWN << 4)+GREEN, 1, 1);
    string1.write();
    string2.write();
    string3.write();
    string4.write();
  return;
}

Отчет о выполнении

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

Требования к оформлению отчёта:

Отчёт состоит из таких основных частей:

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

Введение: область использования.

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

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