Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке

Курсовая работа на тему «Разработка приложения, начисляющего стипендию студентам»

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

СОДЕРЖАНИЕ

Задание

Введение

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

. Описание организации структур хранимых данных

. Создание пользовательских функций приложения

. Схемы алгоритмов работы приложения

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

Заключение

Список использованных источников

ЗАДАНИЕ ПО КУРСОВОЙ РАБОТЕ

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

.        Создать программу (консольный режим), выполнив функциональное разбиение, реализующую следующие функции работы с бинарным/текстовым файлом. Предусмотреть создание меню 1-го уровня со следующими пунктами:.     Вход под администратором

Нужна помощь в написании курсовой?

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

Заказать курсовую

b.      Вход под пользователем

c.       Выход

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

.        Меню 2-го уровня:

—        Для администратора:) Создание/открытие файла с данными)   Добавление записи)         Редактирование записи)       Удаление записи)         Просмотр всех данных в табличной форме)       Различные процедуры поиска и фильтрации данных)         Управление пользователями)        Выход в меню 1-го уровня

Для обычного пользователя:)        Открытие файла с данными)          Просмотр всех данных в табличной форме) Выполнение задачи)    Различные процедуры поиска и фильтрации данных)   Выход в меню 1-го уровня

.        Данные должны быть организованы в структуре (struct), не менее 7-ми полей, обязательно предусмотреть использование вложенных структур.

.        Предусмотреть обработку исключительных ситуаций

.        Построение программного кода должно соответствовать правилам, определенным в документе «CodeConventions» для соответствующего языка (технологии).

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

ВВЕДЕНИЕ

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

Данная программа была написана на языке программирования Си с использованием компилятора MicrosoftVisualStudio 2008.

Основные достоинства языка Си:

.Лаконичность записи алгоритмов

.Экономичность в расходовании памяти

.Возможность низкоуровневого программирования

.Логическая стройность написанных на нем программ

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

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

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

С помощью компьютера данная работа была автоматизирована. Основные принципы автоматизации это надёжность, гибкость и безопасность. Надёжность обеспечивается за счёт решения задач в короткий срок. Это достигается при помощи надёжных технических средств, современных технологий разработки программного обеспечения.

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

Безопасность работы подразумевает защиту данных от несанкционированного доступа, а также от различных потерь данных и т.п.

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

. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ ОБ ИСПОЛЬЗУЕМЫХ АЛГОРИТМАХ

Алгоритм — набор инструкций <#»897689.files/image001.gif»>

Рисунок 1 — Структуры хранимых данных

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

Так же курсовая работа написана через односвязные списки.

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

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

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

. СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ ПРИЛОЖЕНИЯ

Функциядобавления информации в файл

Функция, реализованная для администратора, которая запрашивает ввод с клавиатуры данных, после чего записывает их в файл. Но для начала функция выполняет проверку на открытие файла, и если файл не открыт, то функция возвращает нас в меню второго уровня.

void add()

{(«cls»);((fptr=fopen(file_FIO,»r»))==0)(«откройте файл!n»);

{(«введите название факультетаn»);(stdin);(ship.faculty);(«cls»);(«введите название специальностиn»);(stdin);(ship.specialty);(«cls»);(«введите номер группыn»);(«%d», &ship.group);(«cls»);(«введите номер курсаn»);(«%d», &ship.course);(«cls»);(«введите Фиоn»);(stdin);(ship.FIO);(«cls»);(«введите средний баллn»);(«%d», &ship.rating);(«cls»);(«введите суммуn»);(«%d», &ship.price);(begin)

{= new list;>str = ship;>next = begin;= ptr;

}{= new list;>str = ship;>next = NULL;

}(«cls»);(«Запись успешно добавленаn»);

}();;

}

Функция редактирования информации. Функция, которая редактирует информацию, путем линейного поиска. С помощью поиска находим нужную нам информацию, перед этим программа проверяет ее на существование, после чего программа вызывает меню, в котором при помощи оператора switch-case реализовано меню редактирования. Функция запрашивает ввод переменной select. Если select равен:

.        Мы редактируем название факультета.

2.      Редактируем название специальности.

3.      Редактируем номер группы.

.        Редактируем ФИО.

.        Редактируем средний балл.

.        Редактируем сумму стипендии.

После редактированиямы возвращаемся в функцию admin_menu ().

void edit()

{(«cls»);((fptr=fopen(file_FIO,»r+»))==0)(«откройте файл!n»);

{number;(!begin)(«Файл пуст.n»);

{(«Введите номер, который вы хотите изменить:n»);(stdin);(«%d»,&number);i = 0;= begin;(ptr) {++;(i == number);= ptr->next;(i == number)(«cls»);(«№ %-15s%-20s%-20s%-15s%-15s%-15s%-15sn»,»Факультет»,»Специальность»,»Группа»,»Курс»,»Фамилия»,»Средний балл»,»сумма bur»);(«%-5d%-17s%-15s%-20d%-15d%-20s%-13d%-13dn», number, ptr->str.faculty, ptr->str.specialty, ptr->str.group, ptr->str.course, ptr->str.FIO, ptr->str.rating, ptr->str.price);(«Что вы хотите изменить?n»);(«1 — название факультета.n»);(«2 — название спаециальности.n»);(«3 — номер группы.n»);(«4 — номер курса.n»);(«5 — Фамилия.n»);(«6 — средний балл.n»);(«7 — сумму.n»);(«Esc — выход.n»);select;

{=getch();

} while((select<‘1′ || select>’7’) && select!=27);(«cls»);(select)

{‘1′:printf(«Введите новое название факультета:n»);(stdin);(ptr->str.faculty);;’2′:printf(«Введите новое название специальности:n»);(stdin);(ptr->str.specialty);;’3′:printf(«Введите новый номер группы:n»);(«%d»,&ptr->str.group);;’4′:printf(«Введите новый номер курса:n»);(«%d»,&ptr->str.course);;’5′:printf(«Введите новую Фамилия:n»);(stdin);(ptr->str.FIO);;’6′:printf(«Введите новый средний балл:n»);(«%d»,&ptr->str.rating);;’7’:printf(«Введите новую сумму:n»);(«%d»,&ptr->str.price);;27:return;

}(«Запись успешно изменена.n»);();;

}(«В файле нет записи с таким номером.n»);

}

}();;

}

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

void remove()

{(«cls»);((fptr=fopen(file_FIO,»r»))==0)(«Откройте файл!n»);

{(1)

{number=0, i=0;end, cur;(«Введите номер записи, которую вы хотите удалить:n»);(stdin);(«%d»,&number);= begin;(ptr) {++;(i == number);= ptr->next;

}(i == number)

{(«№ %-15s%-20s%-20s%-15s%-15s%-15s%-15sn»,»Факультет»,»Специальность»,»Группа»,»Курс»,»Фамилия»,»Средний балл»,»сумма bur»);(«%-5d%-17s%-15s%-20d%-15d%-20s%-13d%-13dn», number, ptr->str.faculty, ptr->str.specialty, ptr->str.group, ptr->str.course, ptr->str.FIO, ptr->str.rating, ptr->str.price);(«Вы уверены что хотите удалить запись №%d?n»,number);(«Enter — да.nEsc — нет.n»);select=0;

{=getch();

} while(select!=13 && select!=27);(select==27);(select==13)

{* ptr2;= begin;(ptr == begin) {= begin->next;ptr;

}{(ptr2->next != ptr) {= ptr2->next;

}->next = ptr->next;ptr;

}(«nЗапись успешно удалена.n(Нажмите любую клавишу)n»);();;

}

}

{(«nВ файле нет записи с таким номером.n»);();;

}

}

}();

}

Функция поиска по двум полям,в данном случаи это поле «Специальность» и «Средний балл».

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

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

программный код пользователь студент

void search_spesialty_and_rating()

{i = 0,k=0;(«cls»);((fptr=fopen(file_FIO,»r»))==0)(«Откройте файлn»);

{(«cls»);(«Введите название специальности:n»);(stdin);(check.check_specialty);(!begin)(«В файле нет ни одной записи.n(Для выхода нажмите любую клавишу)n»);

{(«cls»);(«Введите средний балл:n»);(«%d»,&check.check_rating);= begin;(«cls»);(«№ %-15s%-20s%-20s%-15s%-15s%-15s%-15sn»,»Факультет»,»Специальность»,»Группа»,»Курс»,»Фамилия»,»Средний балл»,»сумма bur»);(ptr)

{++;(!strcmp(ptr->str.specialty,check.check_specialty))

{(ptr->str.rating==check.check_rating)

{(«%-5d%-17s%-15s%-20d%-15d%-20s%-13d%-13dn», i, ptr->str.faculty, ptr->str.specialty, ptr->str.group, ptr->str.course, ptr->str.FIO, ptr->str.rating, ptr->str.price);++;

}

}= ptr->next;

}(k==0)

{(«Введенных данных нетn»);

}(«(Для выхода нажмите любую клавишу)n»);

}

}();

}

Функция поиска по одному полю,в данном случаи это поле «Факультет».

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

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

search_faculty()

{i = 0,k=0;(«cls»);((fptr=fopen(file_FIO,»r»))==0)(«Откройте файлn»);(«cls»);(«Введите название факультета:n»);(stdin);(check.check_faculty);(!begin)(«В файле нет ни одной записи.n(Для выхода нажмите любую клавишу)n»);

{= begin;(«№ %-15s%-20s%-20s%-15s%-15s%-15s%-15sn»,»Факультет»,»Специальность»,»Группа»,»Курс»,»Фамилия»,»Средний балл»,»сумма bur»);(ptr) {++;(!strcmp(ptr->str.faculty,check.check_faculty))

{(«%-5d%-17s%-15s%-20d%-15d%-20s%-13d%-13dn», i, ptr->str.faculty, ptr->str.specialty, ptr->str.group, ptr->str.course, ptr->str.FIO, ptr->str.rating, ptr->str.price);++;

}= ptr->next;

}(k==0)

{(«Такого название факультетаа нетn»);

}(«(Для продолжения нажмите любую клавишу)n»);

}

}();

Оставшиеся функции поиска,схожи с выше описанными.

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

 

Функция main

Листинг программного кода:

main()

{(1251);(1251);choice1, k;

{= 0;(«cls»);(«Выберите из перечисленного:n»);(«1.Администраторn»);(«2.Пользовательn»);(«Esc — выход.n»);=getch();

} while((choice1<‘1′ || choice1>’2′) && choice1!=27);(choice1)’1′:administrator();;’2’:user_menu1();;27:return 0;

}

} while (1);

Блок-схема

Функция поиск по факультету

Листинг программного кода:

void search_faculty()

{i = 0,k=0;(«cls»);((fptr=fopen(file_FIO,»r»))==0)(«Откройте файлn»);(«cls»);(«Введите название факультета:n»);(stdin);(check.check_faculty);(!begin)(«В файле нет ни одной записи.n(Для выхода нажмите любую клавишу)n»);= begin;(«№ %-15s%-20s%-20s%-15s%-15s%-15s%-15sn»,»Факультет»,»Специальность»,»Группа»,»Курс»,»Фамилия»,»Средний балл»,»сумма bur»);(ptr) {++;(!strcmp(ptr->str.faculty,check.check_faculty))(«%-5d%-17s%-15s%-20d%-15d%-20s%-13d%-13dn», i, ptr->str.faculty, ptr->str.specialty, ptr->str.group, ptr->str.course, ptr->str.FIO, ptr->str.rating, ptr->str.price);++;= ptr->next;(k==0)

{(«Такого название факультетаа нетn»);(«(Для продолжения нажмите любую клавишу)n»);

}

}();

}

Блок-схема

Функция поиска по специальности и среднему баллу

Листинг программного кода:

search_spesialty_and_rating()

{i = 0,k=0;(«cls»);((fptr=fopen(file_FIO,»r»))==0)(«Откройте файлn»);

{(«cls»);(«Введите название специальности:n»);(stdin);(check.check_specialty);(!begin)(«В файле нет ни одной записи.n(Для выхода нажмите любую клавишу)n»);

{(«cls»);(«Введите средний балл:n»);(«%d»,&check.check_rating);= begin;(«cls»);(«№ %-15s%-20s%-20s%-15s%-15s%-15s%-15sn»,»Факультет»,»Специальность»,»Группа»,»Курс»,»Фамилия»,»Средний балл»,»сумма bur»);(ptr) ++;(!strcmp(ptr->str.specialty,check.check_specialty))

{(ptr->str.rating==check.check_rating)

{(«%-5d%-17s%-15s%-20d%-15d%-20s%-13d%-13dn», i, ptr->str.faculty, ptr->str.specialty, ptr->str.group, ptr->str.course, ptr->str.FIO, ptr->str.rating, ptr->str.price);++;= ptr->next;(k==0)(«Введенных данных нетn»);

}(«(Для выхода нажмите любую клавишу)n»);();

}

. ОПИСАНИЕ ПРОГРАММЫ

Данная программа начинается с главного меню или меню первого уровня.

 

Рисунок 2 — Главное меню

Рассмотрим подробнее возможности администратора.

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

 

Рисунок 3 — Меню администратора

Теперь рассмотрим работу каждой из функций отдельно.

.        Создание/открытие файла с данными.

Если мы нажмем ‘1’, то перед нами появится меню, где нам предложат создать или открыть файл. Если мы попробуем открыть файл, который еще не создан, то увидим:

 

Рисунок 4 — Ошибка открытия файла.

При создании файла мы вводим его название, после чего мы увидим сообщение «Файл создан», при успешном открытии файла мы увидим: «Файл открыт» (Рисунок 13).

Если файл не открыть, то все далее описанные функции работать не будут, а будут выдавать ошибку.

После нажатия клавиши ‘Esc’ мы опять окажемся в меню второго уровня для администратора.

.        Добавление записи.

 

 

Рисунок 5 — Добавление записи

.        Редактирование записи.

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

После того, как вы выбрали запись, возвращаетесь в меню второго уровня, нажимаете ‘3’, после чего перед вами появляется окно, где вас просят ввести название игрушки, записи о которой вы хотите изменить. После чего вы увидете окно, представленное на Рисунке 6.

 

После введенного номера вбранной записи,перед нами разворачивается меню:

Рисунок 6 — Вывод еще не измененной записи

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

.        Удаление записи

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

Рисунок 7 — Удаление записи

Далее работ программы зависит от того, какой пункт меню мы выберем.

 

Рисунок 8 — Данные в табличной форме

После нажатия ‘Esc’ мы возвращаемся в меню 2-го уровня для администратор.

.        Различные процедуры поиска и фильтрации данных.

Рисунок 9 — Меню поиска и фильтраций

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

 

Рисунок 10

Дальше все аналогично.

После нажатия ‘esc’ мы возвращаемся в меню (Рисунок 9)

А сейчас мы рассмотрим все возможности пользователя.

Вход под пользователем начинается с меню.

Рисунок 11 — Меню для входа пользователя.

Регистрация пользователя может происходить неоднократно, однако программа проверяет логин при регистрации на его существование ранее, а именно, зарегистрирован ли уже такой логин.

Если логин и пароль введены правильно, то мы попадаем в меню пользователя.

Рисунок 12 — Меню пользователя

Рассмотрим каждую функцию отдельно.

.        Открытие файла с данными.

Данная функция отличается от функции администратора лишь тем, что не имеет возможности создавать файл.

Если файла, который мы хотим отрыть. Не существует, то мы увидим окно, представленное на Рисунке 4.

В обратном случае, мы увидим:

 

Рисунок 13 — Открытие файла.

.        Просмотр всех данных в табличной форме.

Функция аналогичная функции администратора. Поэтому ее работу можно посмотреть на Рисунке 8.

.        Выполнение задачи.

Функция, которая выполняет основную задачу курсовой работы.

Функция осуществляет поиск и вывод данных на экран(по ФИО).

Рисунок 14 -Выполнения задачи.

4.      Различные процедуры поиска и фильтрации данных.

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

Их работу можно посмотреть на рисунке 9-10.

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

ЗАКЛЮЧЕНИЕ

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

Задача курсовой работы:

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

.        Создать программу (консольный режим), выполнив функциональное разбиение, реализующую следующие функции работы с бинарным/текстовым файлом. Предусмотреть создание меню 1-го уровня со следующими пунктами:.     Вход под администратором

b.      Вход под пользователем

c.       Выход

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

.        Меню 2-го уровня:

—        Для администратора:) Создание/открытие файла с данными)   Добавление записи)       Редактирование записи)       Удаление записи)         Просмотр всех данных в табличной форме)       Различные процедуры поиска и фильтрации данных)         Управление пользователями)        Выход в меню 1-го уровня

Для обычного пользователя:)        Открытие файла с данными)          Просмотр всех данных в табличной форме)  Выполнение задачи)    Различные процедуры поиска и фильтрации данных)   Выход в меню 1-го уровня

.        Данные должны быть организованы в структуре (struct), не менее 7-ми полей, обязательно предусмотреть использование вложенных структур.

.        Предусмотреть обработку исключительных ситуаций

.        Построение программного кода должно соответствовать правилам, определенным в документе «CodeConventions» для соответствующего языка (технологии).

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

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

При написании курсовой работы была изучена специальная литература, включающая книги по программированию, такие как «Язык программирования С» и «Как программировать на С++». Так же были использованы интернет — ресурсы: поисковик гугл и база гостов.

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

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

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

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

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

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

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

Дейтел Х. Как программировать на С++. / Х. Дейтел, П. Дейтел. — 1005 с.

Доманов А. Т. Стандарт предприятия. / А. Т. Доманов, Н. И. Сорока. — Минск БГУИР, 2011. — 169 с.

МакконнеллС. Совершенный код, 2-е издание. <http://vk.com/doc-66398064_271119421?dl=8c67d82fbaa299c571> / С. Макконнелл. — Русская редакция, 2010. — 867 с.

Мелещенко А. А. Основы программирования на языке С. / А. А. Мелещенко. — Минск, 2004. — 232 с.

Поисковик Google. Web: https://www.google.ru/

Единая база гостов. Web: <http://gostexpert.ru/>

Средняя оценка 0 / 5. Количество оценок: 0

Поставьте оценку первым.

Сожалеем, что вы поставили низкую оценку!

Позвольте нам стать лучше!

Расскажите, как нам стать лучше?

672

Закажите такую же работу

Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке