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

Алгоритмизация и

программирование
АЛГОРИТМИЗАЦИЯ
Алгоритмизация

Постановка задачи связана с конкретизацией основных параметров ее


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

Алгоритмизация – это процесс создания алгоритма решения задачи.


Алгоритм – заранее заданное понятное и точное пpедписание возможному
исполнителю совеpшить определенную последовательность действий для получения
решения задачи за конечное число шагов.

Название «алгоритм» произошло от латинской формы имени величайшего


среднеазиатского математика Мухаммеда ибн Муса ал-Хорезми (Alhorithmi), жившего
в 783—850 гг.
В своей книге «Об индийском счете» он изложил правила записи натуральных
чисел с помощью арабских цифр и правила действий над ними «столбиком», знакомые
теперь каждому школьнику.
В XII веке эта книга была переведена на латынь и получила широкое Абу Абдуллах (или Абу Джафар)
распространение в Европе. Мухаммад ибн Муса аль Хорезми
Алгоритмизация

При составлении алгоритма для автоматического


устройства нужно принимать во внимание следующее:
• Первое – это кто исполнитель, тот, кто будет работать по Исполнитель алгоритма — это некоторая
абстрактная или реальная (техническая,
нашему алгоритму. биологическая или биотехническая)
система, способная выполнить действия,
• Второе – это как скомбинировать команды, чтобы предписываемые алгоритмом.
исполнитель сделал то, что от него требуется.
• Третье – это форма записи алгоритма.
Алгоритмизация
Постановка задачи

Построение математической модели

Постановка задачи – предполагает подробное описание самой


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

результатов
Алгоритмизация

Алгоритмическое мышление
помогает формировать навыки:

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


при помощи фиксированного набора средств;
➢ строить информационные структуры для описания объектов и средств;
➢ организовывать поиск информации, необходимой для решения поставленной задачи;
➢ правильно, четко и однозначно формулировать мысль в понятной собеседнику форме и
правильно принимать текстовое сообщение;
➢ своевременно обращаться к ЭВМ при решении задач из любой области;
➢ формировать навыки анализа информации, умение структурировать ее.
Общая методика
алгоритмизации
Для записи алгоритма существует общая методика:
•Каждый алгоритм должен иметь имя, которое раскрывает его смысл.
•Необходимо обозначить начало и конец алгоритма.
•Описать входные и выходные данные.
•Указать команды, которые позволяют выполнять определенные действия над выделенными
данными

Общий вид алгоритма:


1. Алгоритм: Название алгоритма
2. Описание данных
3. Начало
4. Команды
5. Конец
Общая методика
алгоритмизации

1.Принцип поэтапной детализации алгоритма (другое название — "проектирование сверху-


вниз"). Этот принцип предполагает первоначальную разработку алгоритма в виде укрупненных
блоков (разбиение задачи на подзадачи) и их постепенную детализацию.

2.Принцип "от главного к второстепенному", предполагающий составление алгоритма, начиная с


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

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


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

1. Универсальность (массовость) - применимость алгоритма к различным наборам исходных данных.


2. Дискретность - процесс решения задачи по алгоритму разбит на отдельные действия.
3. Однозначность - правила и порядок выполнения действий алгоритма имеют единственное толкование.
4. Конечность - каждое из действий и весь алгоритм в целом обязательно завершаются.
5. Результативность - по завершении выполнения алгоритма обязательно получается конечный результат.
6. Выполнимость - результата алгоритма достигается за конечное число шагов.

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

• рисунок, когда последовательность действия представлена картинками;


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

Последовательность
включения проектора
Способы записи алгоритма
На естественном языке – построчно, каждая команда – с новой строки
Способы записи алгоритма
Графическое представление – блок-схема

Основные элементы блок-схем


Способы записи алгоритма
Графическое представление – блок-схема

https://creately.com/
Способы записи алгоритма
Символьный способ

Запись программы компьютера на языке Паскаль


Способы записи алгоритма
Табличный способ

Алгоритм вычисления примера R=2a+3b

№ действия Действие Величина Результат


1 2
1 * 2 a k
2 * 3 b u
3 + k u R
Структура алгоритма

•Следование (линейная) . Предполагает последовательное выполнение команд сверху вниз. Если алгоритм
состоит только из структур следования, то он является линейным.
•Ветвление. Выполнение программы идет по одной из двух, нескольких или множества ветвей. Выбор ветви
зависит от условия на входе ветвления и поступивших сюда данных.
•Цикл. Предполагает возможность многократного повторения определенных действий. Количество повторений
зависит от условия цикла.

Следование (линейная) Ветвление Цикл


Структура алгоритма

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

Пример
Ветвление if
Составить блок-
Это самый простой тип схему алгоритма решения
задачи: с датчика температуры
ветвления. Если результат
последовательно снимаются
вычисления выражения-условия два показания, осуществить
возвращает true (правда), то вывод только положительных
выполнение алгоритма идет по значений температур
ветке «Да», в которую включены
дополнительные выражения-
действия. Если условие
возвращает false (ложь), то
выполнение алгоритма идет по
ветке «нет», т.е продолжает
выполняться основная ветка
программы.
Структура алгоритма

Ветвление if-else

Если выражение-условие возвращает true


(правда), то выполнение алгоритма идет по
ветке «Да», если условие не выполняется
(false), то выполнение идет по ветке «Нет».
При любом результате выражения-условия
нельзя вернуться в основную ветку
программы, минуя дополнительные
действия.
Структура алгоритма

Ветвление if-elif-else

Количество условий может быть различно. Если


выполняется первое, то после выполнения действий,
программа переходит к основной ветке, не проверяя
дальнейшие условия. Если первое условие возвращает
ложь, то проверяется второе условие. Если второе
условие возвращает правду, то выполняются действия,
включенные в вторую ветку конструкции. Последнее
условие проверяется лишь в том случае, если ни одно
до него не дало в результате true. Данную
алгоритмическую конструкцию (if – elif – else) не
следует путать с алгоритмической конструкцией
«Выбор».
Структура алгоритма

Цикл while

Пока условие выполняется (результат логического


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

Пример
Цикл do Составить блок-
схему алгоритма решения
В этом цикле первый раз
задачи: вычислить площадь
условие проверяется пожара в виде круга при 10
лишь после выполнения значениях радиуса
действий тела цикла.
Если условие возвращает
true, то выражения-
действия повторяются
снова. Каким бы ни было
условие, тело данного
цикла хотя бы раз, но
выполнится.
Структура алгоритма

Цикл for

Данный цикл также называют циклом «Для» (for). В его


заголовке указывается три параметра: начальное
значение переменной (от), конечно значение (до) и ее
изменение с помощью арифметической операции на
каждом «обороте» цикла (шаг).
Логический алгоритм

Логическими принято называть алгоритмы, которые содержат предписания (операции)


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

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

Задача “Ханойские башни”

В таблице приведен результат решения задачи для случая четырех дисков.


Здесь А - занятый в начальный момент (нулевой шаг) стержень, В -
свободный, а С - вспомогательный стержень. Цифрами обозначен “номер”
диска, причём большему номеру соответствует больший диаметр.
Вычислительный алгоритм

Вычисление факториала натурального числа


n! = 1× 2× 3× ... × n
Алгоритмы, в соответствии с которыми решение
поставленных задач сводится к математическим
действиям, называются вычислительными
алгоритмами.

Вычислительный алгоритм - точное


предписание действий над входными данными,
задающее вычислительный процесс,
направленный на преобразование
произвольных входных данных в полностью
определенный этими данными результат.
ПРОГРАММИРОВАНИЕ
Программирование

Правильный подход к разработке эффективного алгоритма для данной задачи - изучить её


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

Алгоритмы + структуры данных = программы


Программирование

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

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

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

По этому критерию можно выделить следующие уровни языков программирования:


• машинные;
• машинно-оpиентиpованные (ассемблеpы);
• машинно-независимые (языки высокого уровня).
Языки программирования

Машинные языки и машинно-ориентированные языки — это языки низкого уровня, требующие


указания мелких деталей процесса обработки данных.
Языки же высокого уровня имитируют естественные языки, используя некоторые слова разговорного
языка и общепринятые математические символы. Эти языки более удобны для человека.
Языки высокого уровня делятся на:
•процедурные (алгоритмические) (Basic, Pascal, C и др.), которые предназначены для однозначного
описания алгоритмов; для решения задачи процедурные языки требуют в той или иной форме явно
записать процедуру ее решения;
•логические (Prolog, Lisp и др.), которые ориентированы не на разработку алгоритма решения задачи, а
на систематическое и формализованное описание задачи с тем, чтобы решение следовало из
составленного описания;
•объектно-ориентированные (Object Pascal, C++, Java и др.), в основе которых лежит понятие объекта,
сочетающего в себе данные и действия над нами. Программа на объектно-ориентированном языке,
решая некоторую задачу, по сути описывает часть мира, относящуюся к этой задаче. Описание
действительности в форме системы взаимодействующих объектов естественнее, чем в форме
взаимодействующих процедур.
Языки программирования
Машинные языки

Каждый компьютер имеет свой машинный язык, то плюсы минусы


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

плюсы минусы
Язык ассемблера — это позволяет программисту: чтобы
машинно-зависимый язык
• пользоваться текстовыми мнемоническими (то есть написать
низкого уровня, в котором
короткие мнемонические имена
легко запоминаемыми человеком) кодами; программу на
соответствуют отдельным • по своему усмотрению присваивать символические языке
машинным командам. имена регистрам компьютера и памяти; ассемблера
Используется для представления • задавать удобные для себя способы адресации; для
в удобочитаемой форме • использовать различные системы счисления конкретного
программ, записанных в (например, десятичную или шестнадцатеричную) для компьютера,
машинном коде. представления числовых констант; важно знать
• использовать в программе комментарии и др. его
архитектуру
Языки программирования
Языки высокого уровня

плюсы минусы
Языки высокого уровня были
• алфавит алгоритмического языка значительно шире алфавита Несмотря на то, что
разработаны для того, чтобы большинство
машинного языка, что существенно повышает наглядность текста
освободить программиста от программы; специалистов в
учета технических особенностей области программного
• набор операций, допустимых для использования, не зависит от обеспечения
конкретных компьютеров, их набора машинных операций, а выбирается из соображений удобства разрабатывают
архитектуры. формулирования алгоритмов решения задач определенного класса; программы на языках
Таким образом, алгоритмические • формат предложений достаточно гибок и удобен для использования, высокого уровня,
что позволяет с помощью одного предложения задать достаточно таких, как Object Pascal
языки в значительной мере или C, наиболее
содержательный этап обработки данных;
являются машинно- мощное и
• требуемые операции задаются с помощью общепринятых эффективное
независимыми. Они облегчают математических обозначений; программное
работу программиста и • данным в алгоритмических языках присваиваются индивидуальные обеспечение
повышают надежность имена, выбираемые программистом; полностью или
создаваемых программ. • в языке может быть предусмотрен значительно более широкий набор частично написано на
языке ассемблера.
типов данных по сравнению с набором машинных типов данных.
Программирование

• Программирование (кодирование) - составление программы по заданному алгоритму.


• Программирование - процесс и искусство создания компьютерных программ и/или
программного обеспечения с помощью языков программирования.
• Программирование сочетает в себе элементы искусства, фундаментальных наук (прежде
всего информатика и математика), инженерии, спорта и ремесла.
• В узком смысле слова, программирование рассматривается как Кодирование алгоритмов
на заданном языке программирования.
• Под программированием также может пониматься разработка логической схемы для
ПЛИС, а также процесс записи информации в ПЗУ.
• В более широком смысле программирование - процесс создания программ, то есть
разработка программного обеспечения.
Программирование

Язык программирования — набор ключевых слов


(словарь) и система правил (грамматических и
синтаксических) для конструирования операторов, состоящих
из групп или строк чисел, букв, знаков препинания и других
символов, с помощью которых программисты могут сообщать
компьютеру набор команд.
С изобретением программно-управляемых
вычислительных машин появилась новая профессия -
программист.
Первым в истории программистом была Ада
Лавлейс, работавшая вместе с Чарльзом Беббиджем. Она
разрабатывала программы управления его Аналитической
машиной. Массовой профессия программиста стала только с
изобретением ЭВМ. Ада Лавлейс.
Первый в истории
программист
Эволюция языков программирования

Электронная коммерция. Оленева В.И.


Первые языки
программирования

1950 г. - Ассемблер
Первые языки
программирования
Середина 50-х под руководством Джона Бэкуса для фирмы IBM был
разработан алгоритмический язык программирования FORTRAN.
Первые языки
программирования

Конец 50-х - как альтернатива языку FORTRAN, первоначально


ориентированному на архитектуру IBM, под руководством Питера Наура
был разработан язык ALGOL (ALGOrithmic Language).
Первые языки
программирования
Начало 60-х - PL/1, СOBOL.
Язык для обработки деловой информации
Первые языки
программирования

В конце 60-х годов под руководством Найарда и Дала был разработан язык Simula-67
Первые языки
программирования

В середине 70-х годов Вирт предложил язык Pascal.


Первые языки
программирования

Универсальный язык программирования С был разработан в середине 70-х годов Денисом Ритчи и
Кеном Томпсоном.
Первые языки
программирования
Инструмент для создания кроссплатформенных
приложений

• Настольные приложения

• Веб-приложения

• Мобильные приложения
Языки WEB-
программирования

В 90-х годах появляются языки, ориентированные на создание серверных


приложений, такие как Java, Perl и PHP, языки описания документов – HTML и XML.
Применение языков
программирования

Fortran Python

Pascal Java

C PHP

C++ JavaScript

Objective-C
Применение языков
программирования

▪ научные вычисления (языки C++, FORTRAN, Java);


▪ системное программирование (языки C++, Java);
▪ обработка информации (языки C++, COBOL, Java);
▪ искусственный интеллект (LISP, Prolog);
▪ издательская деятельность (Postscript, TeX);
▪ удаленная обработка информации (Perl, PHP, Java, C++);
▪ описание документов (HTML, XML).
Языки программирования
для задач искусственного интеллекта
LISP PROLOG PYTHON R

По данным TechRepublic:
• К 2025 г. инвестиции в отрасль машинного
обучения превысят 235 миллиардов долларов.
• К концу 2018 года количество специалистов,
работающих в данной сфере, удвоилось, по
сравнению с предыдущим периодом.
Языки программирования в России
Самые известные программисты мира

математик из Великобритании Ада Джон фон Нейман, венгеро-американский математик Компьютерный специалист Деннис Ритчи известен по
Лавлейс (1815-1852), дочь Байрона, сделал важный вклад во многие отрасли науки, участию в создании языков программирования BCPL, B,
считающаяся создательницей первой такие как: квантовая физика, функциональный C, расширения ALTRAN для языка программирования
в мире программы и описания анализ и информатика. С именем фон Неймана FORTRAN. Языки C и FORTRAN получили широкую
вычислительной машины. Сам связывают архитектуру большинства современных популярность в прикладных задачах, также на базе
проект в конечном итоге был компьютеров, подразумевающую совместное языка C были разработаны многие более поздние языки
разработан британским математиком хранение программ и данных для них в памяти программирования. Также, Ритчи участвовал в
Чарльзом Бэббиджем. вычислительной машины. разработке операционных систем Multics и UNIX.
Самые известные программисты мира

Бьёрн Страуструп — автор языка программирования C++ — Основателем движения свободного Алексей Пажитнов — советский программист
одного из самых широко используемых языков ПО, проекта GNU (General Public и изобретатель всемирно известной и
программирования, разработанного на базе C. Страуструп любимой всеми игры "Тетрис". С 1996 по
License), основанного в 1983-м году, а
стал первопроходцем в области использования объектно-
также фонда свободных программ и 2005 год Пажитнов работал в компании
ориентированного программирования, которое позволяет
создавать масштабные проекты за короткое время, Лиги за свободу программирования Microsoft, где занимался разработкой
распределяя задачи между участниками и используя ранее стал американец Ричард Столлман. головоломок Pandora's Box. В 2007 и в 2009
разработанные решения. На базе C++ разработано В числе его изобретений числится годах был удостоен награды Game
несколько современных языков программирования. также концепция "копилефта". Developers Choice Awards First Penguin Award.
Самые известные программисты мира

В ряду с известными программистами и хакерами — Соучредитель компании Apple, разработчик Один из богатейших людей планеты,
Линус Торвальдс. Линус создал Linux — ядро компьютеров американец Стив Возняк по праву изобретатель, программист и бизнесмен Билл
операционной системы GNU/Linux, являющейся на считается одним из отцов революции Гейтс навсегда вошел в историю компьютерных
данный момент самой распространённой из свободных персональных компьютеров в 1970-х гг. Возняк технологий как основатель и крупнейший
операционных систем. основал Apple Computer вместе со Стивом акционер компании Microsoft. В тринадцать лет
На ядре Linux построена операционная система Джобсом в 1976 году и разрабатывал для Билл написал свою первую программу – игру
Android, являющаяся самой распространенной ОС для первых компьютеров как программную, так и «Крестики-нолики» на языке программирования
смартфонов в мире. аппаратную часть. BASIC.
Самые известные программисты мира

Евгений Касперский — российский программист, В 2013 году не стало одного из Человек 2010 года по версии журнала Time, самый молодой
специалист по информационной безопасности, сооснователей поисковой компании миллиардер Марк Цукерберг — создатель всемирно известной
один из основателей, ведущий разработчик и "Яндекс" Ильи Сегаловича. Российский и крайне популярной социальной сети Facebook. В школьные
крупнейший акционер ЗАО "Лаборатория программист, директор по технологиям и годы Марк разработал сетевую версию игры "Риск". Отвергнув
Касперского". Также является лауреатом разработкам, а также активный участник и предложения о трудоустройстве со стороны AOL и Microsoft,
государственной премии в области науки и организатор помощи сиротам и больным совместно с Крисом Хьюзом и Дастином Московицем начал
технологий за 2008 год. детям скончался 23 июля 2013 года. работу над крупнейшей социальной сетью в мире.
Самые известные программисты мира

Сооснователь социальной сети "Вконтакте" Игорь Данилов — российский В 1992 г. Борис Нуралиев вместе с братом —
Павел Дуров еще в период учёбы в СПбГУ программист, автор популярного Сергеем Нуралиевым, создали бухгалтерскую
занимался разработкой некоммерческих программу "1С". В 1996 году возглавляемая им
антивируса Dr.Web, технический
Интернет-проектов, предназначенных для компания выпустила систему "1С:Предприятие",
повышения качества общественной и научной директор и основатель компании начала заниматься разработкой компьютерных
жизни университета. Проект "Вконтакте" — "Доктор Веб". игр. В 2005 году компания "1С" вошла в тройку
также его собственная работа. лидеров российского рынка интегрированных
систем управления предприятиями.
Праздники

13 сентября во всем мире


отмечается профессиональный
праздник программистов.
Это 256-й день года, выбранный
как символ восьмиразрядного байта,
позволяющего выразить идентичное
количество значений. В России
день программиста стал официальным
• день сисадмина (последняя пятница июля)
праздником в 2009 году.
• день компьютерщика (14 февраля),
• день веб-программиста (4 апреля)
• день тестировщика (9 сентября).

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