Тема Основные тенденции развития компьютерных технологий. Параллельные вычисления
Выделяют пять основных тенденций в развитии компьютерных технологий:
Усложнение компьютерных продуктов (услуг). Компьютерный продукт в виде программных средств, баз данных и служб экспертного обеспечения приобретает стратегическое значение.
Способность к взаимодействию. С ростом значимости компьютерного продукта возможность провести идеальный обмен этим продуктом между компьютером и человеком или между компьютерными системами приобретает значение ведущей технологической проблемы. Также эта проблема касается совместимости технических и программных средств. Все проблемы обработки и передачи компьютерного продукта находились в полном соответствии по совместимости и быстродействию.
Ликвидация промежуточных звеньев. Развитие способности к взаимодействию ведет к совершенствованию процесса обмена компьютерным продуктом, а следовательно, при взаимоотношении поставщиков и потребителей в этой области ликвидируются промежуточные звенья.
Не нужны посредники, если есть возможность размещать заказы непосредственно с помощью компьютерных технологий.
Глобализация. Фирмы могут с помощью компьютерных технологий вести дела где угодно, получая исчерпывающую информацию. Глобализация рынка компьютерного продукта нацелена на получение преимуществ за счет распределения постоянных и полупостоянных расходов на более широкий географический регион.
Конвергенция. Исчезают различия между изделиями и услугами, информационным продуктом и средствами, использованием в быту и для деловых целей, информацией и развлечением, а также среди различных режимов работы, таких как передача звуковых, цифровых и видеосигналов.
Применительно к бизнесу эти тенденции приводят к:
1) осуществлению распределенных персональных вычислений, когда на каждом рабочем месте достаточно ресурсов для обработки информации в местах ее возникновения;
2) созданию развитых систем коммуникаций, когда рабочие места соединены для пересылки сообщений;
3) гибким глобальным коммуникациям, когда предприятие включается в мировой информационный поток;
4) созданию и развитию систем электронной торговли;
5) устранению промежуточных звеньев в системе интеграции организация – внешняя среда.
Вводом/выводом называется обмен данными между оперативной памятью и любыми внешними устройствами, в том числе устройствами внешней памяти: магнитными и оптическими дисками, флеш-накопителями.
Информация на внешних носителях хранится в файлах. По форме хранения данных файлы бывают типизированными, нетипизированными и текстовыми. В типизированных и нетипизированных файлах данные различных типов хранятся в том же формате, что и в оперативной памяти. Следовательно, при чтении и записи в такие файлы данные копируются, не изменяя объема и формы своего представления. В текстовых файлах данные хранятся в символьном формате. Поэтому при вводе (чтении) чисел из текстового файла происходит преобразование их представления из символьной формы в форму их внутреннего представления (с фиксированной или плавающей запятой). А при выводе (записи) чисел в текстовый файл они преобразуются из внутренней формы в символьную.
Далее мы будем использовать только текстовые файлы.
Текстовые файлы
Текстовый файл — наиболее часто употребляемая разновидность файлов. Устройства ввода с клавиатуры и вывода на экран работают только с текстовыми файлами. Файлы, содержащие тексты программ на Паскале и других языках программирования, являются текстовыми. Различная документация, информация, передаваемая по каналам электронной связи, — всё это текстовые файлы.
Содержимое текстового файла представляет собой символьную последовательность, разделенную на строки. Каждая строка заканчивается специальным признакомEOLN {end of line — конец строки). Весь файл заканчивается признаком EOF {end of file — конец файла). Схематически это выглядит так:
Здесь S, обозначает i-й символ в строке. Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Признак EOLN состоит из двух однобайтовых управляющих кодов: CR (код ASCII — 13) — возврат к началу строки и LF (код ASCII — 10) — перевод строки. При выводе содержимого текстового файла на экран или на печать признак EOLN обеспечивает визуальное разделение строк: переход к продолжению вывода с новой строки.
Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране монитора или распечатать на принтере.
Ввод из текстового файла
Исходные данные могут быть заранее подготовлены в файле с помощью текстового редактора и сохранены на диске под определенным именем. Ввод исходных данных из файла производится автоматически, и при этом не происходит задержки выполнения программы, как при клавиатурном вводе.
Для организации ввода данных из текстового файла следует:
• объявить в программе переменную с типом Text (она называется файловой переменной);
• связать файловую переменную с файлом внешней памяти, содержащим исходные данные, с помощью оператора Assign;
• открыть файл для чтения с помощью процедуры Reset;
• осуществить чтение из файла с помощью операторов Read или ReadLn;
• закрыть файл с помощью оператора Close.
Пример 1. В текстовом файле с именем abc.txt хранятся пять чисел, разделенных на две строки:
2.5 3.1 4.0
0.7 1.5
В следующей программе организован ввод этих данных в вещественные переменные а, b, с, d, е.
Если файл хранится не в текущем каталоге, то в операторе Assign кроме имени файла надо указывать полный путь к нему. Имя файла можно задавать в строковой константе или переменной.
Для массивов большого размера удобно производить ввод значений из заранее подготовленного текстового файла с исходными данными.
Пример 2. Пусть в текстовом файле с именем matr.txt с помощью текстового редактора записана следующая числовая матрица размером 4x4:
В следующей программе производится ввод этой матрицы в двумерный массив М:
Вывод в текстовый файл
Запись результатов выполнения программы в текстовый файл позволяет сохранить их для того, чтобы в дальнейшем можно было их просмотреть с помощью текстового редактора, распечатать на принтере, а также использовать в качестве исходных данных для другой программы.
Для организации вывода данных в текстовый файл следует:
• объявить в программе файловую переменную с типом Text;
• связать файловую переменную с файлом внешней памяти с помощью оператора Assign;
• открыть файл для записи с помощью процедуры Rewrite;
• осуществить запись в файл с помощью операторов Write или WriteLn;
• закрыть файл с помощью оператора Close.
Пример 3. Требуется записать в текстовый файл таблицу умножения на 2.
Var A: Integer;
ТМ: Text; {Описание файловой переменной}
Begin
Assign (ТМ, 'E:\TabMul.txt'); {Связывание переменной ТМ с файлом}
Rewrite(ТМ); {Открытие файла для записи} {Циклический вывод в файл таблицы умножения}
For А:=2 То 9 Do WriteLn(ТМ, 2, '*', А, '=', 2*А) ;
Close(ТМ) {Закрытие файла}
End.
Процедуры открытия файла для записи и запись в файл имеют следующий формат:
Rewrite(<файловая переменная>)
Write(<файловая переменная>, <список вывода>)
WriteLn(<файловая переменная>, <список вывода>)
Если файла с именем, указанным в операторе Assign, на диске не было, то программа его создаст. Если такой файл уже был, то его прежнее содержание будет утеряно и в него запишутся новые данные. В конце выполнения оператора WriteLn выставляется признак EOLN. Оператор Write этого не делает. Закрытие файла приводит к выставлению признака EOF.
В результате выполнения программы в корневом каталоге диска Е появится файл с именем TabMul.txt. Открыв его в текстовом редакторе, увидим:
2*2 = 4
2*3 = 6
2*4 = 8
2*5 = 10
2*6 = 12
2*7 = 14
2*8 = 16
2*9 = 18
Пусть мы имеем одномерный массив:
-19 15 -48 99 97 55 16 32 22 41
Какой здесь минимальный элемент? (ответ: -48)
Какой максимальный элемент? (ответ: 99)
Давайте попробуем, каким образом мы находим минимальный элемент?
Естественно, путем поэтапного сравнения всех чисел. Мы не задумываемся над тем, что сравниваем всегда пару, «пробегая» глазами все элементы массива. Алгоритм поиска минимального и максимального элемента мы построим таким образом, чтобы сравнивать пару чисел, повторяя действие сравнения нужное количество раз.
Запишем алгоритм нахождения минимума и максимума.
1. Пусть первый элемент массива – минимальный (максимальный).
2. Пока не конец массива:
Сравниваем каждый элемент массива с выбранным минимальным (максимальным):
Если текущий элемент массива меньше минимального (больше максимального), то присваиваем минимальному (максимальном) числу - значение текущего элемента массива.
Рассмотрим схему работы алгоритма при нахождении минимального элемента массива.
А теперь запишем программу на языке Pascal.
program Maximum;
var a :array [1..10] of integer;
i, max : integer;
begin
randomize;
for i:=1 to 10 do begin
a[i]:=random(30);
writeln ('Значение ',i:2, ' элемента массива = ', a[i]:2);
end;
max:= a[1];
for i:=1 to 10 do begin
if a[i] max then max:= a[i];
end;
writeln ('Максимальное значение = ', max);
readln;
end.
Сортировкой или упорядочением массива называется расположение его элементов по возрастанию (или убыванию). Если не все элементы различны, то надо говорить о неубывающем (или невозрастающем) порядке.
- количество шагов алгоритма, необходимых для упорядочения;
- количество сравнений элементов;
- количество перестановок, выполняемых при сортировке.
Мы рассмотрим только три простейшие схемы сортировки.
1. Метод "пузырька"
Самым простым методом сортировки является так называемый метод "пузырька". Чтобы уяснить его идею, представьте , что массив (таблица) расположен вертикально. Элементы с большим значением всплывают вверх наподобие больших пузырьков. При первом проходе вдоль массива, начиная проход "снизу", берется первый элемент и поочередно сравнивается с последующими. При этом:
- если встречается более "легкий" (с меньшим значением) элемент, то они меняются местами;
- при встрече с более "тяжелым" элементом, последний становится "эталоном" для сравнения, и все следующие сравниваются с ним .
В результате наибольший элемент оказывается в самом верху массива.
Во время второго прохода вдоль массива находится второй по величине элемент, который помещается под элементом, найденным при первом проходе, т.е на вторую сверху позицию, и т.д.
2. Сортировка вставками
Второй метод называется метод вставок., т.к. на j-ом этапе мы "вставляем" j-ый элемент M[j] в нужную позицию среди элементов M[1], M[2],. . ., M[j-1], которые уже упорядочены. После этой вставки первые j элементов массива M будут упорядочены.
3. Сортировка посредством выбора
Идея сортировки с помощью выбора не сложнее двух предыдущих. На j-ом этапе выбирается элемент наименьший среди M[j], M[j+1],. . ., M[N](см. процедуру FindMin) и меняется местами с элементом M[j]. В результате после j-го этапа все элементы M[j], M[j+1],. . ., M[N]будут упорядочены.
1. «Почему калькулятор нельзя назвать алгоритмической машиной, а компьютер можно?»
1.
Выписать основные понятия из Видео
Тема «Построение логического выражения с данной таблицей истинности»
2. Ознакомиться с материалом
https://yandex.fr/video/preview/6679764730881621241
2. Записать конспект в раб.тетр. (файл прикр.Дневник.ру)
13.05
Запись — структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи.
Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту.
Например, информация о рекордах по бегу у мужчин для открытых стадионов может содержать следующие атрибуты
рекордсмен
страна
статус соревнований (Олимпиада, чемпионат мира)
длина дистанции
год рекорда
время
Структурная диаграмма для записи
Запись может быть объявлена в разделе type:
идентификатор типа = Record
поле1: тип;
поле2: тип;
…
полеN: тип
end;
Например,
type beg = record
fam: string[25];
srtana: string[20];
status: boolean; {Олимпиада - true; чемпионат мира - false}
dlina: longint;
god: 1900..2009;
vr: string[15];
end;
Var a: beg;
К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:
.
Например,
a.fam; a.dlina и т.п.
Если, например, требуется полю "status" присвоить значение «true», то это делается так: status := true;
Поля записи могут иметь любой тип, кроме файла, в частности, сами могут быть записями.
Например,
type beg1 = record
fam: string[25];
srtana: string[20];
status: boolean; {Олимпиада - true; чемпионат мира - false}
dlina: longint;
god: 1900..2009;
vr: record min: integer;
sec: real;
end;
end;
Var a: beg1;
Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например,
a.vr.min
a.vr.sec
В программе могут использоваться массивы записей.
Любая обработка записей, в том числе ввод и вывод, производится поэлементно.
Например,
var b: array[1..200] of beg1;
...
write('Число рекордсменов? '); readln(n);
for i:=1 to n do
with b[i] do
begin
write('Фамилия спортсмена? '); readln(fam);
write('Гражданин какой страны спортсмен? '); readln(strana);
write('Статус соревнования? '); readln(status);
write('Длина дистанции? '); readln(dlina);
write('Год проведения соревнования? '); readln(god);
write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec);
end;
...
В примере был использован оператор присоединения, который имеет следующий вид:
with do ;
Он позволяет, один раз указав имя переменной типа "запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен.
29.04
Текстовые файлы
Текстовый файл — наиболее часто употребляемая разновидность файлов. Устройства ввода с клавиатуры и вывода на экран работают только с текстовыми файлами. Файлы, содержащие тексты программ на Паскале и других языках программирования, являются текстовыми. Различная документация, информация, передаваемая по каналам электронной связи, — всё это текстовые файлы.
Содержимое текстового файла представляет собой символьную последовательность, разделенную на строки. Каждая строка заканчивается специальным признакомEOLN {end of line — конец строки). Весь файл заканчивается признаком EOF {end of file — конец файла). Схематически это выглядит так:
Здесь S, обозначает i-й символ в строке. Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Признак EOLN состоит из двух однобайтовых управляющих кодов: CR (код ASCII — 13) — возврат к началу строки и LF (код ASCII — 10) — перевод строки. При выводе содержимого текстового файла на экран или на печать признак EOLN обеспечивает визуальное разделение строк: переход к продолжению вывода с новой строки.
Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране монитора или распечатать на принтере.
Ввод из текстового файла
Исходные данные могут быть заранее подготовлены в файле с помощью текстового редактора и сохранены на диске под определенным именем. Ввод исходных данных из файла производится автоматически, и при этом не происходит задержки выполнения программы, как при клавиатурном вводе.
Для организации ввода данных из текстового файла следует:
• объявить в программе переменную с типом Text (она называется файловой переменной);
• связать файловую переменную с файлом внешней памяти, содержащим исходные данные, с помощью оператора Assign;
• открыть файл для чтения с помощью процедуры Reset;
• осуществить чтение из файла с помощью операторов Read или ReadLn;
• закрыть файл с помощью оператора Close.
Пример 1. В текстовом файле с именем abc.txt хранятся пять чисел, разделенных на две строки:
2.5 3.1 4.0
0.7 1.5
В следующей программе организован ввод этих данных в вещественные переменные а, b, с, d, е.
Если файл хранится не в текущем каталоге, то в операторе Assign кроме имени файла надо указывать полный путь к нему. Имя файла можно задавать в строковой константе или переменной.
Для массивов большого размера удобно производить ввод значений из заранее подготовленного текстового файла с исходными данными.
Пример 2. Пусть в текстовом файле с именем matr.txt с помощью текстового редактора записана следующая числовая матрица размером 4x4:
В следующей программе производится ввод этой матрицы в двумерный массив М:
Вывод в текстовый файл
Запись результатов выполнения программы в текстовый файл позволяет сохранить их для того, чтобы в дальнейшем можно было их просмотреть с помощью текстового редактора, распечатать на принтере, а также использовать в качестве исходных данных для другой программы.
Для организации вывода данных в текстовый файл следует:
• объявить в программе файловую переменную с типом Text;
• связать файловую переменную с файлом внешней памяти с помощью оператора Assign;
• открыть файл для записи с помощью процедуры Rewrite;
• осуществить запись в файл с помощью операторов Write или WriteLn;
• закрыть файл с помощью оператора Close.
Пример 3. Требуется записать в текстовый файл таблицу умножения на 2.
Var A: Integer;
ТМ: Text; {Описание файловой переменной}
Begin
Assign (ТМ, 'E:\TabMul.txt'); {Связывание переменной ТМ с файлом}
Rewrite(ТМ); {Открытие файла для записи} {Циклический вывод в файл таблицы умножения}
For А:=2 То 9 Do WriteLn(ТМ, 2, '*', А, '=', 2*А) ;
Close(ТМ) {Закрытие файла}
End.
Процедуры открытия файла для записи и запись в файл имеют следующий формат:
Rewrite(<файловая переменная>)
Write(<файловая переменная>, <список вывода>)
WriteLn(<файловая переменная>, <список вывода>)
Если файла с именем, указанным в операторе Assign, на диске не было, то программа его создаст. Если такой файл уже был, то его прежнее содержание будет утеряно и в него запишутся новые данные. В конце выполнения оператора WriteLn выставляется признак EOLN. Оператор Write этого не делает. Закрытие файла приводит к выставлению признака EOF.
В результате выполнения программы в корневом каталоге диска Е появится файл с именем TabMul.txt. Открыв его в текстовом редакторе, увидим:
2*2 = 4
2*3 = 6
2*4 = 8
2*5 = 10
2*6 = 12
2*7 = 14
2*8 = 16
2*9 = 18
07.02/08.02
Оператор выбора Case
Оператор Case
- это оператор множественного ветвления. То есть в зависимости от некоторого условия может быть выполнено одно из многочисленных продолжений программы. Рассмотрим структуру оператора Case
, а затем я поясню на бытовом примере, как это работает.
Case <селектор> of
<константа 1> : <оператор 1>;
<константа 2> : <оператор 2>;
.............................
<константа N> : <оператор N>;
else <оператор>
end;
где Case
- зарезервированное слово (от англ. "выбор", "вариант");<селектор>
- выражение, исходя из значения которого будет выбран оператор из списка для дальнейшего выполнения;of
- зарезервированное слово (от англ. "из");<константа>
- константа выбора;<оператор>
- любые операторы языка Pascal, в том числе может быть составной или пустой операторы;else
- зарезервированное слово (от англ. "иначе"). Если ни одна из констант не подошла к селектору, то будут выполнены операторы, следующие за else. Блок else не обязателен, поэтому если его нет, оператор case завершит свою работу, так и не выполнив ни одного оператора из списка;end
- зарезервированное слово (от англ. "конец"), завершение оператора варианта.
Разберем работу оператора Case на примере. Каждый из вас, прежде чем выйти на улицу одевает одежду. Выбор этой одежды во многом зависит от температуры на улице. Если на термометре -15, то вы наденете куртку, брюки и сапоги. А если на улице +20, ваш выбор будет состоять из майки, шорт и сандалий. Представьте, что термометр с его показаниями температуры - это своего рода <селектор>
в программе. В роли <констант>
выступают градусы цельсия, а в роли <операторов>
ваш гардероб. Тогда программу, которая выбирает гардероб в зависимости от температуры, можно записать следующим образом:
program garderob;
var
temperatura:integer;
begin
write('Температура = ');
read(temperatura);
case temperatura of
-24..-15 : writeln('Шапка-ушанка, фуфайка, ватные штаны, валенки');
-14..0 : writeln('Шапка, теплая куртка, штаны, ботинки');
1..10 : writeln('Куртка, штаны, ботинки');
11..17 : writeln('Ветровка, джинсы, кроссовки');
18..25 : writeln('Кепка, майка, сандалии');
26..35 : writeln('Плавки, маска, ласты');
else writeln('Лучше остаться дома')
end;
end.
Пользователь вводит значение температуры, если это значение расположено в интервале от -24 до +35 градусов цельсия, то программа находит среди констант ту, которая равна введенному значению, и выводит на экран список гардероба, соответствующий этой температуре. Если введенное значение температуры лежит за пределом от -24 до +35, то на экран выводится сообщение из блока else
- 'Лучше остаться дома'.
Несколько важных замечаний
- Тип селектора должен быть ординальным. То есть он может быть любого типа, кроме вещественного
Real
(более подробно о типах данных читай здесь); - Тип константы должен совпадать с типом селектора. То есть, если у вас селектор имеет тип integer, то и константы выбора должны быть типа integer;
- Каждое из постоянных значений должно быть сопоставлено самое большее с одним оператором. То есть, говоря простым языком, константы не должны повторяться;
- Константы выбора НЕ являются метками. То есть на них нельзя ссылаться в операторе перехода
goto
(об этом операторе будет отдельный урок).
Примеры ошибочного написания оператора Case:
Пример №1 - селектор не может иметь тип real
program one;
var
x:real;
begin
read(x);
case x of
1 : writeln('one');
2 : writeln('two');
3 : writeln('three');
4 : writeln('four');
end;
end.
Пример №2 - тип констант не совпадает с типом селектора:
program two;
var
x:integer;
begin
read(x);
case x of
'A' : writeln('one');
'B' : writeln('two');
'C' : writeln('three');
'D' : writeln('four');
end;
end.
Пример №3 - повторение константы (константа 2 встречается два раза в списке):
program three;
var
x:integer;
begin
read(x);
case x of
1,2 : writeln('one');
2,3 : writeln('two');
4 : writeln('three');
5..7 : writeln('four');
end;
end.
Кстати, в этом примере наглядно показано, что <константа>
может быть не только простым числом, но и представлять собой некий диапазон. Запись диапазона происходит следующим образом: <начало>..<конец>
Также <константа>
может быть задана перечисляемым списком. Такой список записывается через запятую, например (при x:integer):
case x of
0, 1, 2 : <операторы 1>;
3, 4, 5 : <операторы 2>;
6, 9, 15 : <операторы 3>;
end;
через запятую и в одинарных кавычках (при x:char):
case x of
'A', 'B', 'C' : <операторы 1>;
'D', 'E', 'F' : <операторы 2>;
'Monday', 'Tuesday', 'Wednesday' : <операторы 3>;
end;
31.01/01.02
Тема
«Логический тип данных. Логические величины. Логические операции. Правила
записи и вычислений логических выражений».
1.Изучить пар.18
2. Просмотреть видеоурок
3. Записать правила записи и вычисления логических выражений (на языке Паскаль)
15.11.21/16.11.21
Тема «Представление текстовой информации на компьютере. Практическая работа "Представление текста. Сжатие текста"
3. Выполнить практическую работу
Задание 1
Закодировать текст с помощью кодировочной таблицы ASCII.
1) Happy Birthday to you!!
2) Do you speak Russian?
3) How are you today?
4) Password.
Записать двоичное и
шестнадцатеричное представление кода.
Задание 2
Декодировать текст,
записанный в международной кодировочной таблице ASCII (дано десятичное представление).
1)72 101 108 108 111 44 32 109 121 32 102 114 105 101 110 100 33
2)84 97 107 101 32 99
97 114 101 33
3)71 111 111 100
32 108 117 99 107 33
4) 87 105 110 100 111 119 115
Задание 3
Пользуясь таблицей
кодировки ASCII, расшифровать текст, представленный в виде двоичных кодов
символов.
1) 01010000 01100101 01110010 01101101 00100000 01010101
01101110 01101001 01110110 01100101 01110010 01110011
01101001 01110100 01111001
2) 01000100 01000001 01010100 01000001
00100000 01000011 01001111 01001101 01010000 01010010 01000101 01010011
01010011 01001001 01001111 01001110
3) 01000010 01001001 01001110 01000001
01010010 01011001 00100000 01000011 01001111 01000100 01000101 00100001
4) 01010101 01110000 00100000
00100110 00100000 01000100 1101111 01110111 01101110
Задание 4
Пользуясь кодовой
страницей Windows-1251 таблицы кодировки ASCII, получить шестнадцатеричный код
слова:
ИНФОРМАТИЗАЦИЯ;
ДЕКОДИРОВАНИЕ;
РАСШИФРОВКА.
СИМВОЛ
«Решение задач с использованием комбинированного типа данных»
Информация для повторения
08.05.20
05.05.20
24.04.20
Повторить пар. 25 (стр. 169-175)
21.04.20
17.04.20
Тема «Решение задач с использованием символьных величин и строк символов» Набрать программу в паскале и сохранить результат при тестировании
14. 04.20
1. ОБЯЗАТЕЛЬНО пар.27, 28 - повторить
2. Выполнить практическую работу №15
https://docs.google.com/forms/d/e/1FAIpQLSfhKAnUAX5VF3tZvkEoZcIX2TdvxTnxAjn8zwxIIxCh5PREtA/viewform?usp=sf_link
10.04.2020 выполнить до 14.04.2020
1 группа - Елене Владимировне
2 группа - Татьяне Владимировне
Обратите внимание: вам нужно отправить фото набранной программы и фото ее тестирования с вашей фамилией.
20.03.2020
Повторить §24 (стр. 163–169).
Повторить §24 (стр. 163–169).