Как сделать сдвиг в паскале
Часто удобно задавать вектор сдвига его длиной и углом поворота , что как не трудно заметить, означает сдвиг на вектор с координатами:
Поскольку речь идет о сдвиге точки на экране, то для ее прорисовки полученные значения надо округлить до целых. Однако если преобразование сдвига выполняется неоднократно или, за сдвигом следует другие преобразования (например, поворот), то округления, если они делаются после каждого преобразования, будут приводить к накоплению ошибки. Поэтому если координаты преобразуются несколько раз лучше хранить их в вещественных переменных, а округления делать только непосредственно перед рисованием.
Преобразование сдвига, записанное для координат одной точки, можно применять для сдвига любой фигуры. Так, если надо сдвинуть линию, достаточно применить это преобразование к координатам обоих ее концов. Для сдвига окружности, преобразование применяется к координатам ее центра и т.д.
Координаты точек при повороте на угол относительно начала координат преобразуются по закону
Или в матричном виде:
Чтобы осуществить поворот относительно произвольной точки необходимо сделать сдвиг, который перенесет эту точку в начало координат . После этого надо сделать поворот на требуемый угол и снова сделать сдвиг, который вернет бывшую точку на место (см. рис.).
Рис. 2. Поворот относительно произвольной точки состоит из сдвига, перемещающего эту точку в начало координат, поворота вокруг начала координат и сдвига, возвращающего центр вращения в исходное место.
var
a: array [1..6] of integer;
i,n,k:integer;
\u00a0 begin
\u00a0\u00a0\u00a0\u00a0 writeln('\u041c\u0430\u0441\u0441\u0438\u0432:');
\u00a0\u00a0\u00a0\u00a0 for i:=1 to 6 do
\u00a0\u00a0\u00a0\u00a0 begin
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a[i]:= random(15)+2;
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write(a[i],' ');
\u00a0\u00a0\u00a0\u00a0 end;
\u00a0\u00a0\u00a0\u00a0 writeln;
\u00a0\u00a0\u00a0\u00a0 n:=6;
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 k:=a[1];
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for i:=1 to n-1 do
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 begin
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a[i]:=a[i+1];
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end;
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a[n]:=k;
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 writeln('\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:');
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for i:=1 to n do
\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write(a[i],' '); \u00a0 end. ">]" data-testid="answer_box_list">
var
a: array [1..6] of integer;
i,n,k:integer;
begin
writeln('Массив:');
for i:=1 to 6 do
begin
a[i]:= random(15)+2;
write(a[i],' ');
end;
writeln;
n:=6;
k:=a[1];
for i:=1 to n-1 do
begin
a[i]:=a[i+1];
end;
a[n]:=k;
writeln('Результат:');
for i:=1 to n do
write(a[i],' '); end.
Новые вопросы в Информатика
Каким свойством не обладает формальный исполнитель? 1. имеет собственную систему команд 2. понимает смысл команд 3. может работать в разных режимах 4. … решает круг определенных задач
Даны ящики, которые вмещают 5 кг, 10 кг и 15 кг яблок. Необходимо выяснить, сколько ящиков разного размера понадобится для того, чтобы распределить 10 … 0 кг яблок. язык пайтон
При Циклическом Сдвиге Влево каждый элемент в массиве становится на место своего соседа слева. Первый же элемент, которому двигаться некуда, займет место в хвосте массива, то есть из массива.
Для реализации этого алгоритма нужно в первую очередь спасти первый элемент массива, записав его во вспомогательную ячейку через r:=a[1], потом переставить элементы
For i:=1 to N-1 Do a[i]:=a[i+1]
For i:=2 to N Do a[i-1]:=a[i]
и, наконец, спасенное значение записать на место последнего элемента a[N]:= r. Тогда текст процедуры:
Имя файла: Sdvig_Lt.pas
Procedure Sdvig_Lt (Var aa:Massive);
Var ii: byte; rr: real;
For ii:=1 to n-1 do a[ii]:=aa[ii+1];
Если нужно несколько раз циклически сдвинуть массив, то эту процедуру ставят в цикл. Так, после выполнения оператора
For i:=1 to 3 do Sdvig_Lt (a);
из исходного массива будет получен массив
При Циклическом Сдвиге Вправо массив
получается из исходного чуть иным путем. Убедитесь самостоятельно, что алгоритм
For i:=2 to N do a[i]:=a[i-1];
Не приводит к цели, а текст процедур должен иметь вид:
Имя файла: Sdvig_Rt.pas
Procedure Sdvig_Rt (Var aa:Massive);
Var ii: byte; rr: real;
For ii:=n downto 2 do a[ii]:=aa[ii-1];
Вычисление среднее арифметическое, среднее геометрическое, среднее квадратичное среднее гармоническое
Иногда в задачах требуется вычислить некоторые характеристики массива. Пусть b[i] – некоторыqмассив данных произвольного (но числового!) типа. Тогда для набораb[1],b[2],…,b[k] определены:
среднее арифметическое:
среднее геометрическое:
среднее квадратичное:
среднее гармоническое:
Замечание 1. Для вычисления среднего гармонического потребуется выполнение условия b[i]<>0.
Замечание 2.Для вычисления среднего геометрического необходимо, чтобы произведение, которое должно возводиться в степень 1/k, было положительно.
Сортировка массива
Сортировкой массива называется его упорядочивание по какому-либо принципу. Существуют разные способы сортировки: по убыванию, по возрастанию, по убыванию модулей, по возрастанию моделей, по уменьшению количества делителей (для целых чисел) и т.д.
При сортировке исходный массив
по возрастанию превратится в
по убыванию превратится в
Сортировка одномерного массива методом пузырька
Рассмотрим алгоритм сортировки методом пузырька (Метод назван "методом пузырька", потому что большие элементы, подобно пузырькам, "всплывают" на соответствующую позицию в противоположность "методу погружения" (т. е. методу простых вставок), в котором элементы погружаются на соответствующий уровень. Метод пузырька известен также под более прозаическими именами, такими, как "обменная сортировка с выбором" или метод "распространения".) на следующем примере:
На занятии по физкультуре присутствовала 1 группа, состоящая из 5 студентов. Преподаватель по физкультуре в начале занятия должен их расставить по росту (т.е. – по его убыванию). Определим следующий алгоритм:
Преподаватель двигается вдоль шеренги слева направо.
Если левый студент в паре, ниже правого, преподаватель меняет их местами и переходит к следующей паре.
Рассмотрим в качестве примера массив
И разработаем алгоритм для обработки такого массива, тем более он подойдет и для массива, где ряд элементов уже стоит на своих местах
Массив перед сортировкой
1-ый проход вдоль шеренги преподавателя (k=1)
Номер левого элемента в паре меняется
от 1-го до 4-го (i=1..4)
Массив после 1-го прохода. Один элемент занял свое место
2-ой проход вдоль шеренги преподавателя физкультуры
Массив после второго прохода. Два элемента заняли свои места
3-ий проход (k=3, i=1..2)
Массив после 3-го прохода.
4-ый проход (k=4, i=1)
Сортировка массива завершена.
Для 5-ти элементов массива понадобилось четыре прохода (т.е. N-1). При этом номер левого элемента в пара от прохода к проходу менялся от 1 доN-K(где К –номер прохода). Исходя, из этого напишем текст процедуры сортировки массива по убыванию элементов:
(Имя файлa: Sort_Dec.pas)
Procedure Sort_Dec(Var aa:Massive);
For kk:=1 to n-1 Do Begin
For ii:=1 to n-kk Do Begin
При этом предполагается, что число элементов массива N описано в программе как глобальная константа. Конечно, можно внутренний цикл завести до N-1, не связывая его с номером прохода, но тогда преподаватель обречен на лишнюю работу.
Сортировка пузырьком
Примечание. Этот вид сортировки отличается от обменной тем, что за каждый проход большого цикла захватывается различное количество элементов массива, на каждом шаге более тяжелые опускаются на одну позицию вниз, а более легкие поднимаются на одну позицию вверх. Собственно тоже самое происходит и в обменной сортировке, но там на каждом шаге большого внешнего цикла обработке подвергается весь массив. Трудоемкость пузырьковой сортировки ограничена числом N*(N-1)/2. Пузырьковая сортировка обладает свойством устойчивости.
Читайте также: