Similar presentations:
Сложные условия. Сортировка (часть 5)
1.
Сложные условияЧасть 5
2.
ВНИМАНИЕ!В СЛЕДУЮЩЕЙ ЗАДАЧЕ БУДУТ
ТРЕУГОЛЬНИКИ.
НО, СУТЬ ЗАДАЧИ НЕ В НИХ
РЕШАЯ ЗАДАЧУ, МЫ ПОДНИМЕМ
ОДИН ИЗ БАЗОВЫХ ПРИЕМОВ
ПРОГРАММИРОВАНИЯ –
ИСПОЛЬЗОВАНИЕ ПРОМЕЖУТОЧНОЙ
ПЕРЕМЕННОЙ
и узнаем про
СОРТИРОВКУ «ПУЗЫРЬКОМ»
3.
Задача 7.Сгенерировать три случайных числа так, чтобы все они были в диапазоне от
5 до 135 оканчивались на 5.
Далее надо:
• вывести на экран эти числа;
• расположить их в порядке убывания; вывести на экран числа в порядке
убывания
• нарисовать и закрасить три равносторонних треугольника со стороной
100. Основания треугольников расположены на линии, параллельной оси
Х. Расстояние между треугольниками = 100. Для рисования и
закрашивания треугольников берем последовательно номера цветов из
отсортированного ряда чисел.
4.
Это то, что должно получиться5.
На какие подзадачи можно разделить задачу?• Подзадача 7.1. Сгенерировать три случайных числа по
определенному правилу
• Подзадача 7.2. Вывести на экран эти исходные числа
• Подзадача 7.3. Расположить их в порядке убывания
• Подзадача 7.4. Вывести отсортированные числа на экран
• Подзадача 7.5. Нарисовать треугольники с отсортированными
цветами
6.
Будем разбираться с условием.Подзадача 7.1. Сгенерировать три случайных числа так, чтобы все они
были в диапазоне от 5 до 135 оканчивались на 5.
СТРОГО: сначала пишем НА ЛИСТОЧКЕ команду для формирования числа,
которое отвечает трём условиям:
- случайное
- диапазон 5 - 135
- оканчивается на 5
Вариантов решения может быть несколько.
7.
Будем разбираться с условием.Далее надо:
• вывести на экран эти числа;
• расположить их в порядке убывания; вывести на экран числа в порядке убывания
==============================================================================
Подзадача 7.2. Вывести на экран эти числа.
Выводим исходные числа, чтобы было видно «что было» - «что стало»
Не видя изначальную последовательность чисел, мы не сможем оценить корректность
работы нашей программы
Подзадача 7.3. Расположить их в порядке убывания
Вот это - основное смысловое действие, которое требуется сделать в задаче
ВАМ НУЖНО БУДЕТ ПРИДУМАТЬ АЛГОРИТМ ДЛЯ ЕГО РЕАЛИЗАЦИИ
8.
Подзадача 7.3Далее разбираемся с помощью промежуточных упражнений и
задач с этой подзадачей.
9.
Будем разбираться с условием.Подзадача 7.3.
даны 3 произвольных числа, требуется расположить их в порядке убывания
===================================================================
Вопрос: что значит «порядок убывания»? Рассуждайте.
Ответ: числа расположены в ряду по порядку, по некоторому правилу
Какое здесь утверждается правило упорядочивания чисел в ряду?
Правило – убывание чисел в ряду;
то есть, числа идут по порядку от большего к меньшему
10.
Упражнения:1) даны три числа 23, 40, 7. Расположите их в порядке убывания.
40, 23, 7
2) Даны 4 числа: 45, 32, 110, 12 . Расположите их в порядке убывания
110, 45, 32, 12
3) Даны 5 чисел: 15, 30, 10, 20, 45 . Расположите их в порядке возрастания
Порядок возрастания – от меньшего к большему:
10, 15, 20, 30, 45
11.
Задание I: придумайте алгоритм и нарисуйте блок-схему.Даны 3 произвольных числа, требуется вывести их на экран в порядке
возрастания
ВНИМАНИЕ! Порядок действий далее:
НЕ пишем, программу, решающую задачу 7.
1) рисуем блок-схему для этого задания
2) получаем «зачет» за блок-схему
3) разбираем совместно алгоритмы решения задания I
12.
Давайте разбираться с алгоритмомДля простоты допустим, что набор чисел,
которые мы можем сгенерировать, состоит из 3х чисел:
1 , 2, 3
В этом случае для их генерации нам подойдет команда random 4
А это имена переменных, в которые мы в программе записываем числа:
а в
с
Тогда команда для генерации значения каждой из переменных:
Make “a random 4
Make “b random 4
Make “c random 4
13.
Это все возможные варианты сгенерированных последовательностей чисел.Их всего 6 – это количество возможных перестановок 3 чисел = 3!(факториал)
Обратите внимание:
Это имена переменных
Каждый запуск на исполнение процедуры,
генерирующей 3 числа
(или всей программы целиком) даст
новую последовательность из трех чисел.
И, эта последовательность
обязательно будет какой-то
из этих шести
Каждый запуск
программы дает один из рядов
а
1
1
2
2
3
3
b
2
3
1
3
1
2
c
3
2
3
1
2
1
Это значения
переменных
14.
С каждым рядом чисел мы будем разбираться отдельно.Наша задача:
1) проанализировать, в каком
порядке стоят числа в
сгенерированной
последовательности
2) переставить числа
в последовательности так,
чтобы они шли друг за другом
в порядке возрастания
a
b
с
1
1
2
2
3
3
2
3
1
3
1
2
3
2
3
1
2
1
3) вывести на экран упорядоченный ряд
Порядок вывода
ПЕРЕМЕННЫХ на экран
а b с
а с b
b а с
с а b
b c a
c b а
Ответ: в данной задаче он всегда
Вопрос: каким будет итоговый ряд(значений)? будет такой: 1 2 3
15.
Мы поняли: на входе в процедуру, которая будет сортировать* рядиз трех чисел возможно 6 разных вариантов числового ряда.
На выходе должен один, упорядоченный по возрастанию ряд.
Нам нужно придумать алгоритм, который будет анализировать входной ряд,
переставлять нужным образом числа и выводить упорядоченный ряд.
а
b
с
условие
Порядок вывода на экран
1
1
2
2
3
1
3
2
3
а<b
a<b
a>b
И
И
И
b<c
b>c
b<c
(а < с избыточно)
И a<c
И a<c
а b с
а с b
b а с
2
3
3
3
1
2
1
2
1
a>b
a>b
a>b
И
И
И
b>c
b<c
b>c
И
И
с а в
b с а
c b а
a>c
a>c
(a > c избыточно)
*Сортировка - термин, от англ.глагола to sort – приводить в порядок, упорядочивать
16.
аb
с
условие
Порядок вывода на экран
1
1
2
2
3
1
3
2
3
а<b
a<b
a>b
И
И
И
b<c
b>c
b<c
(а < с избыточно)
И a<c
И a<c
а b с
а с b
b а с
2
3
3
3
1
2
1
2
1
a>b
a>b
a>b
И
И
И
b>c
b<c
b>c
И
И
с а в
b с а
c b а
a>c
a>c
(a > c избыточно)
Из этой таблицы можно вывести 2 варианта алгоритма:
1) Со сложными условиями
2) С простыми условиями
Нарисуйте блок-схемы к обоим вариантам
17.
Задание II: после того, как нарисуете обе блок-схемы, запишите одну из нихв виде программы. Писать будем последовательно 3 раза, немного меняя
условие.
1) На входе три случайных числа в произвольном диапазоне
2) Посмотрите на то выражение, которое написали ранее для подзадачи 7.1
(большой задачи 7), используйте его для генерации входного ряда чисел.
Теперь на входе будут случайные числа, оканчивающиеся на 5
и в диапазоне 5-135.
3) Измените свой алгоритм и программу так, чтобы вместо порядка
возрастания числа сортировались и выводились в порядке убывания
18.
Сейчас мы впервые решали задачу на сортировку чисел.Сортировка – это один из базовых приемов программирования.
Далее вы будете решать много разных учебных задач на эту тему.
В реальной практике программиста сортировка используется
внутри множества задач.
Подумайте вот о чем: если ряд будет состоять не из 3х, а из 4х чисел,
как изменится алгоритм?
Вопрос: Сколько возможных входных рядов будет?
Ответ: количество перестановок в ряду из 4х чисел = 4! = 4* 3* 2* 1 = 24
Вопрос: Сколько потребуется сравнений?
Много… даже страшно начать считать. И, запутаться в таких
«нагромождениях» условных операторов очень легко.
19.
То, что вам надо будет сделать сейчас – этопостараться изобрести другой алгоритм сортировки 3х чисел.
Такой, который без принципиальных
изменений можно было бы применить и не только к входной
последовательности из 3х чисел, но и из 4х, из 5ти и так далее.
Подсказка: надо использовать «промежуточную переменную»
ДАЕМ СЕБЕ ВРЕМЯ, ДУМАЕМ…..
20.
ПРО ПЕРЕМЕННУЮС точки зрения того, «как все устроено» в памяти компьютера, переменная – это ячейка
памяти. Разбираться с этим подробно мы будем в рамках учебной программы
3го года обучения.
Сейчас нам нужно представить переменную как такое 2 в 1:
1. Ёмкость – место для хранения, коробка, например.
Емкость подписана именем. Это модель ячейки памяти.
2. Мысленно положим в коробку что-то, что имеет
измеримую величину или что-то, что можно посчитать.
Это будет модель значения,
которое содержится в ячейке памяти.
21.
2в1• место для хранения с
именем
• число, которое
сохраняем
у него есть имя
22.
Смотрим на верхнюю грань кубика, видим числоЭто – значение переменной (то, что записано в ячейке памяти)
Кубик + блюдце = переменная
возможные в задаче варианты значений: 1, 2, 3
Это ячейка с именем
23.
ab
Для каждой переменной a, b, c представляем себе такую
конструкцию, являющуюся моделью переменной
c
24.
Задача: вводятся 3 случайных числа (опять рассматриваем набор 1, 2, 3).Расположить их в порядке возрастания в тех же ячейках памяти.
Вопрос: чем эта формулировка задачи по сортировке 3х чисел
отличается от предыдущей?
Ответ: в предыдущей задаче нужно было вывести на экран упорядоченный
ряд чисел.
НЕ БЫЛО указаний, в каких переменных должны быть записаны числа
итогового ряда.
25.
В предыдущей задаче нужно было вывести на экран упорядоченный рядчисел.
Наша цель была проанализировать, какое
значение у каждой из переменных a, b, c .
Понять:
ab c
1) у какой переменной значение
наименьшее – вывести на экран ее
значение первым
2) у какой переменной значение среднее вывести на экран ее значение вторым
3) у какой переменной значение
наибольшее – вывести на экран ее
значение третьим
analyze
& show
вывод на экран
значений
переменных
получались разные
последовательности:
a b c ; b c a; a c b …..
26.
Задачу можно было сформулировать и так:1) проанализируйте значения переменных a b c
2) сформируйте из переменных a b c такую последовательность, чтобы
при выводе ее на экране мы увидели ряд из трех чисел, расположенных
от большего к меньшему
3) выведите на экран итоговую последовательность значений переменных
вывод на экран
значений переменных
ab c
analyze &
show
получались разные
последовательности: a b c ; b c a;
a c b …..
27.
Новая формулировка еще раз:Задание III: вводятся 3 случайных числа (опять рассматриваем набор 1, 2, 3).
Расположить их в порядке возрастания в тех же ячейках памяти.
ab c
a b c
SORT
a b c
SHOW
На входе в процедуру сортировки - переменные a b c
На выходе должны быть те же переменные в том же порядке a b c
Показ на экран здесь уже вторичная задача. Главное – отсортировать.
На входе в процедуру сортировки каждая из переменных a b c содержит
произвольное значение; на выходе должно быть так:
- в а записано минимальное число
- в b записано среднее по величине число
- в с записано максимальное число
28.
БЫЛОa b с Порядок вывода
на экран
ДОЛЖНО СТАТЬ
a b с Порядок вывода
на экран
1 2 3
а b с
1 2 3
а b с
1 3 2
а с b
1 3 2
а b с
2 1 3
b а с
2 1 3
а b с
2 3 1
с а b
2 3 1
а b с
3 1 2
b c a
3 1 2
а b с
3 2 1
c b а
3 2 1
а b с
ПРИ ЭТОМ: числовой ряд на выходе в обоих случаях такой: 1 2 3
Постарайтесь в связи с этим осознать, что a, b, c - это
имена ячеек , а 1, 2, 3 – это значения, которые в них записаны
29.
Сортировка методом «Пузырька»Задание III: вводятся 3 случайных числа.
Расположить их в порядке возрастания в тех же ячейках памяти.
Это входные ряды чисел.
а
1
1
2
2
3
3
b
2
3
1
3
1
2
c
3
2
3
1
2
1
АЛГОРИТМ
Чтобы получить ряд 1 2 3 в переменных a b c
мы будем последовательно ПЕРЕСТАВЛЯТЬ ЗНАЧЕНИЯ
в переменных a b c
Чтобы представить, что будет происходить, не
запутаться и не потерять ни одно нужное значение,
будем далее иллюстрировать переменные моделью
«блюдце + кубик»
30.
Сортировка методом «Пузырька»Задача: вводятся 3 случайных числа.
Расположить их в порядке возрастания в тех же ячейках памяти.
Это входные ряды чисел
а
1
1
2
2
3
3
b
2
3
1
3
1
2
c
3
2
3
1
2
1
Так же как в предыдущем варианте задачи мы
должны сначала проанализировать входной ряд.
АЛГОРИТМ:
1) будем сравнивать парами значения переменных
входного ряда: значение a со значением b,
значение b со значением c,
значение с со значением a
2) менять местами значения переменных в паре
таким образом: если значение переменной слева
больше, чем значение переменной справа, меняем
значения местами
31.
АЛГОРИТМ1) будем сравнивать попарно значения переменных входного ряда.
Вопрос: какие пары для сравнения у нас есть?
а b c
Ответ: a b; b c; a c
1 2 3
2) менять местами значения переменных таким образом: 1 3 2
если в паре значение переменной слева больше, чем
2 1 3
значение переменной справа, меняем их местами
2 3 1
Если a > b make “a :b
3 1 2
3 2 1
Задание:
примените идею если a > b make “a :b ко всем трем парам
переменных, напишите в тетради последовательность команд
Задача: обнаружить проблему такой перестановки. В чем она состоит?
32.
Ответ: проблема состоит в потере значения переменной,которое мы терять не собирались
Рассмотрим проблему на примере вот такого входного ряда:
а
1
b
3
c
2
Сравниваем:
a > b? нет не переставляем, идем дальше. Ряд не изменился 1 3 2
b > c? да make “b :c ряд изменился: 1 2 2
a > c? нет ряд не изменился 1 2 2
Пока дальше не идем, анализируем.
Какой «нежелательные побочный эффект» произошел на предыдущем шаге?
Ответ: мы потеряли значение переменной b, которое было равно 3
Его больше нет нигде….
33.
а bc
1 3
2
a > b? нет не переставляем, идем дальше. Ряд не изменился 1 3 2
b > c? да make “b :c ряд изменился: 1 2 2
a > c? нет ряд не изменился 1 2 2
ПРОБЛЕМА: мы потеряли значение переменной b, которое было равно 3
Вопрос:
что нужно сделать, чтобы в этом алгоритме не происходило такой потери?
Еще раз, рассуждаем далее:
Сравниваем :
Ответ: завести «промежуточную переменную». Ее единственный смысл в
алгоритме - временное хранение значения одной из основных переменных.
Значение промежуточной переменной мы будем изменять внутри
программы: в каком-то месте она будет сохранять значение переменной a, в
других местах значение b или значение c.
34.
Заведем новую переменную temp (temporary – временный). а bc
Тогда так:
1 3
2
- сначала make "temp 0
- сравниваем :
a > b? нет, не переставляем, идем дальше. Ряд не изменился 1 3 2
b > c? да make "temp :b значение :temp = 3
make "b :c
ряд изменился: 1 2 2
make "c :temp ряд изменился: 1 2 3
a > c? нет
ряд не изменился: 1 2 3
Ура! Мы получили именно то, что хотели – упорядоченный по возрастанию
числовой ряд! Теперь можно выводить на экран последовательность значений
переменных a b c
Вывод на экран значения переменной temp не запрашивается условием
задачи. НО! Во многих случаях полезно его вывести в целях поиска ошибок
35.
Еще раз смотрим, анализируем:а b
c
- сначала make "temp 0
1 3
2
- сравниваем :
a > b? нет, не переставляем, идем дальше. Ряд не изменился 1 3 2
b > c? да
a > c? нет
make "temp :b
make "b :c
make "c :temp
значение :temp = 3
ряд изменился: 1 2 2
ряд изменился: 1 2 3
ряд не изменился 1 2 3
Вопрос: что происходило здесь с переменными?
Ответ: менялись их значения. И благодаря использованию
«коробки для временного хранения» мы не потеряли ни одно значение
36.
Этот ряд мы отсортировали за «один проход» алгоритма.То есть, в анализе исходного ряда нам потребовалось
только 1 раз пройти через 3 попарных сравнения
а
1
1
2
2
3
3
b
2
3
1
3
1
2
c
3
2
3
1
2
1
а
1
b
3
Вопрос: сколько таких троек попарных
сравнений необходимо, чтобы отсортировать
ЛЮБОЙ из входных рядов.
Посмотрите на таблицу с вариантами рядов
и посчитайте.
Ответ: таких «шагов алгоритма» с процедурой сортировки, которая
анализирует входной ряд, необходимо провести 3
c
2
37.
ab ca b c
SORT
SORT
a b c
SORT
a b c
a b c
SHOW
таких «шагов алгоритма» с процедурой сортировки, которая анализирует
входной ряд, необходимо сделать 3. Это значит - цикл.
Задание IV:
нарисуйте полную блок-схему алгоритма сортировки ряда из 3х чисел.
38.
Этот метод сортировки: последовательное шаг за шагом сравнение элементовряда парами и последующая перестановка значений в паре,
называется «сортировка методом пузырька»
Есть идеи, откуда такое название?
Можно порассуждать так:
минимальное число ряда последовательно, через перестановки и цикл,
продвигается к «своему законному месту», так же, как пузырек воздуха
«всплывает» на поверхность воды.
Эта ассоциация и название метода, конечно, авторские (автор неизвестен),
однако за данным алгоритмом закреплено это название.
Встретитесь еще не раз.
39.
Использование промежуточной переменнойСейчас мы вернемся к «блюдцам и кубикам» для того, чтобы понять и
запомнить фундаментальные постулаты программирования.
Мы поймем их механизмы в процессе изучения программы 3го года
обучения. Сейчас поймем «в первом приближении.
temp
a
b
c
40.
Использование промежуточной переменнойВ переменной ВСЕГДА хранится значение.
Пустое блюдце не существует. В нем всегда лежит кубик.
А на верхней грани кубика всегда есть число.
temp
a
b
c
41.
Использование промежуточной переменнойСмотрим на кубики сверху
а
1
b
3
c
2
модель этого ряда
это ситуация :temp=0
это :b = 3
это :а = 1
это :c = 2
temp
a
b
c
42.
Использование промежуточной переменнойb > c? да make "temp :b значение :temp = 3
ряд не изменился 1 3 2
Это значит - выставить
на кубике temp
Значение равное тому,
что сейчас на кубике b
а
1
b
3
c
2
Значение переменной b теперь существует в дубле
это :b = 3
это :а = 1
это :c = 2
temp
Вопрос: где теперь 0?
раз нет переменной со значением 0
значит - нигде, потерян
a
b
c
43.
Использование промежуточной переменной-
а
1
b > c? да make "temp :b значение :temp = 3
make "b :c
Ряд изменился: 1 2 2
make "c :temp Ряд изменился: 1 2 3
b
3
c
2
На кубике b выставляем значение кубика с
теперь значение с существует в дубле
это make" b :c
это :а = 1
это :c = 2
temp
Значение b было 3, а стало 2.
Если бы мы до этого
не установили 3 на кубике temp,
значение b = 3 было бы потеряно
a
b
c
44.
Использование промежуточной переменной-
b > c? да make "temp :b
make "b :c
значение :temp = 3
Ряд изменился: 1 2 2
make "c :temp Ряд изменился: 1 2 3
а
1
b
3
c
2
На кубике c выставляем значение кубика temp
теперь значение temp существует в дубле
make "b :c
:а = 1
make "c :temp
temp
Здесь мы используем
сохраненное на время значение
b = 3. Мы восстанавливаем
исходное значение b и можем
его использовать как и задумывали
a
b
c
45.
Еще раз: использование промежуточной переменной-
b > c? да
make "temp :b
make "b :c
make "c :temp
3
make "b :c
:а = 1
make "c :temp
temp
1
a
b
2
c
46.
ПРО ПЕРЕМЕННУЮЗачем мы сейчас так подробно рассматривали, что происходит при
присвоении значения переменной. Смыслов два.
ПЕРВЫЙ:
Надо усвоить фундаментальные постулаты ПРО ПЕРЕМЕННУЮ
(1) На каждом шаге работы программы любая переменная имеет конкретное
значение. Не бывает переменных без значений!
Если рассуждать «в кубиках и блюдцах» - невозможно завести переменную и
мыслить ее себе как «пустое блюдце», или как «пустое», без значения имя
или как емкость без содержания.
(2) Если переменной присваивается новое значение, ее предыдущее значение
ТЕРЯЕТСЯ. Чтобы не потерять исходное значение, надо его продублировать
до изменения – выставить на другом кубике, возможно на вспомогательном,
типа промежуточной переменной
47.
ПРО ПЕРЕМЕННУЮКонкретнее:
в случае выполнения команды присвоения переменной нового значения
make "a :b, то значение, которое было в переменной а до выполнения
команды make "a :b ПОТЕРЯЕТСЯ, если мы его никуда не запишем
Команда присвоения может быть такой make "a 5
В другом языке будет другой синтаксис, НО СМЫСЛ ОДИН, вне зависимости
от языка.
В связи с этим становится понятно, почему при анализе текста программы
компилятором учебной среды Лого выдается ОШИБКА, когда имя
переменной используется в программе, а значение ей до этого НЕ
ПРИСВОЕНО.
48.
ПРО ПЕРЕМЕННУЮОШИБКА: имя переменной используется в программе, а значение ей до
этого НЕ ПРИСВОЕНО.
Суть в том, что в переменной всегда есть значение, однако, если автор
программы не указал, чему будет равна переменная,
её значение оно будет каким-то случайным, оставшиеся
в памяти компьютера от предыдущей работы….
Если бы компилятор не останавливал процесс компиляции и дальнейшего
запуска программы на исполнение в этом месте и
программа бы исполнялась, результаты выполнения программы
могли бы быть какие угодно, и почему они именно такие
– никто бы никогда не понял.
49.
ПРО ПЕРЕМЕННУЮВТОРОЙ СМЫСЛ предыдущего подробного разбора:
Надо понять и запомнить метод использования промежуточной
переменной. Этом приемом вы будете пользоваться всегда, если будете
программистами
В чем суть: если нам нужно поменять значение переменной а,
типа так make "a :b и одновременно не потерять значение переменной а,
которое было в ней до этой команды, надо это предыдущее значение
переменной :а куда-то записать до команды make "a :b
То есть, вот такая последовательность команд
make "temp :a
make "a :b
сохранит предыдущее значение переменной :а в переменной temp и его
далее можно будет использовать в программе.
50.
Теперь мы знаем как можно решить подзадачу 7.3Для решения подзадачи 7.3 "Расположить числа в порядке убывания"
предпочтительно использовать алгоритм с промежуточной переменной
=================================================================
Возвращаемся к исходной постановке задачи 7
51.
Вот теперь мы готовы решить ЗАДАЧУ 7.Сгенерировать три случайных числа так, чтобы все они были в диапазоне от 5 до 135
оканчивались на 5.
Далее надо:
• вывести на экран эти числа;
• расположить их в порядке убывания; вывести на экран числа в порядке убывания
• нарисовать и закрасить три равносторонних треугольника со стороной 100. Основания
треугольников расположены на линии, параллельной оси Х. Расстояние между
треугольниками = 100. Для рисования и закрашивания треугольников берем
последовательно номера цветов из отсортированного ряда чисел.
Перечислим все, что требуется сделать в задаче:
1. Сгенерировать три случайных числа
2. Вывести на экран эти числа.
3. Расположить числа в порядке убывания
4: Вывести на экран числа, расположенные в порядке убывания
5: Нарисовать треугольники.
52.
Задача 8. Вводится 4порядке возрастания.
числа. Расположить их в этих же переменных в
Сначала подумайте: какие изменения нужно будет внести в алгоритм такой
же задачи с тремя числами?
Сколько сравнений будет в процедуре сортировки ряда?
Сколько будет шагов в цикле?
Нарисуйте блок-схему алгоритма решения Задачи 8.