- •Алгоритмизация и программирование Практические работы
- •Простые вычисления
- •Ветвления
- •Сложные условия
- •Множественный выбор
- •Задачи на ветвления
- •Напишите условие, которое определяет заштрихованную область. Проверьте свой ответ, используя программу c1.Exe.
- •Напишите условие, которое определяет заштрихованную область. Проверьте свой ответ, используя программу c1.Exe.
- •Циклы с условием
- •Циклы с условием – 2
- •Циклы с переменной
- •Вложенные циклы
- •Процедуры
- •Процедуры с изменяемыми параметрами
- •Функции
- •Логические функции
- •Рекурсия
- •Вызов подпрограмм
- •Сохранение регистров
- •Передача параметров в подпрограмму
- •0000 Mov 12,r0 ; это число нужно возвести в квадрат
- •0004 Push r0 ; запишем его в стек
- •0006 Call sqr ; вызов подпрограммы
- •Рекурсия
- •Напишите и отладьте программу с подпрограммой, которая вычисляет куб числа, записанного в регистр r0.
- •Перебор элементов массива
- •Линейный поиск
- •Поиск максимального элемента массива
- •Алгоритмы обработки массивов
- •Отбор элементов массива по условию
- •Сортировка. Метод пузырька
- •Сортировка. Метод выбора
- •Быстрая сортировка
- •Двоичный поиск
- •Посимвольная обработка строк
- •Функции для работы со строками
- •Преобразования «строка-число»
- •Строки в процедурах и функциях
- •Рекурсивный перебор
- •Сравнение и сортировка строк
- •Обработка символьных строк: сложные задачи
- •Матрицы
- •Обработка блоков матрицы
- •Файловый ввод и вывод
- •Обработка массивов из файла
- •Обработка смешанных данных из файла
Процедуры с изменяемыми параметрами
Напишите процедуру, которая переставляет три переданные ей числа в порядке возрастания.
Пример:
Введите три натуральных числа:
10 15 5
5 10 15
Напишите процедуру, которая сокращает дробь вида M/N. Числитель и знаменатель дроби передаются как изменяемые параметры.
Пример:
Введите числитель и знаменатель дроби:
25 15
После сокращения: 5/3
Напишите процедуру, которая вычисляет наибольший общий делитель и наименьшее общее кратное двух натуральных чисел и возвращает их через изменяемые параметры.
Пример:
Введите два натуральных числа:
10 15
НОД(10,15)=5
НОК(10,15)=30
Функции
Напишите функцию, которая определяет сумму цифр переданного ей числа.
Пример:
Введите натуральное число:
123
Сумма цифр числа 123 равна 6.
Напишите функцию, которая находит наибольший общий делитель двух натуральных чисел.
Пример:
Введите два натуральных числа:
7006652 112307574
НОД(7006652,112307574) = 1234.
Напишите функцию, которая «переворачивает» число, то есть возвращает число, в котором цифры стоят в обратном порядке.
Пример:
Введите натуральное число:
1234
После переворота: 4321.
Логические функции
Напишите логическую функцию, которая определяет, является ли переданное ей число совершенным, то есть, равно ли оно сумме своих делителей, меньших его самого.
Пример:
Введите натуральное число:
28
Число 28 совершенное.
Пример:
Введите натуральное число:
29
Число 29 не совершенное.
Напишите логическую функцию, которая определяет, являются ли два переданные ей числа взаимно простыми, то есть, не имеющими общих делителей, кроме 1.
Пример:
Введите два натуральных числа:
28 15
Числа 28 и 15 взаимно простые.
Пример:
Введите два натуральных числа:
28 16
Числа 28 и 16 не взаимно простые.
Простое число называется гиперпростым, если любое число, получающееся из него откидыванием нескольких цифр, тоже является простым. Например, число 733 – гиперпростое, так как и оно само, и числа 73 и 7 – простые. Напишите логическую функцию, которая определяет, верно ли, что переданное ей число – гиперпростое. Используйте уже готовую функцию isPrime, которая приведена в учебнике.
Пример:
Введите натуральное число:
733
Число 733 гиперпростое.
Пример:
Введите натуральное число:
19
Число 19 не гиперпростое.
Рекурсия
Напишите рекурсивную функцию, которая вычисляет НОД двух натуральных чисел, используя модифицированный алгоритм Евклида.
Пример:
Введите два натуральных числа:
7006652 112307574
НОД(7006652,112307574) = 1234.
Напишите рекурсивную функцию, которая раскладывает число на простые сомножители.
Пример:
Введите натуральное число:
378
378 = 2*3*3*3*7
Дано натуральное число N. Требуется получить и вывести на экран все возможные различные способы представления этого числа в виде суммы натуральных чисел (то есть, 1 + 2 и 2 + 1 – это один и тот же способ разложения числа 3). Решите задачу с помощью рекурсивной процедуры.
Пример:
Введите натуральное число:
4
1 + 1 + 1 + 1
1 + 1 + 2
1 + 3
2 + 2
Стек
Из учебника (§ 61) вы уже знаете, что при вызове процедур важнейшую роль играет стек – область оперативной памяти, в которой хранятся адрес возврата из процедуры и локальные переменные. В этой практической работе мы познакомимся с работой стека на примере учебного компьютера «ЛамПанель», с которым вы уже встречались при изучении глав 4 и 5.
Возможности программы «ЛамПанель»
Программа «ЛамПанель» – это модель процессора, который управляет ламповой панелью, то есть, может с помощью специальных команд зажигать и гасить определенные лампочки.
Стек в программе «ЛамПанель» размещается в оперативной памяти, вместе с программой и данными. Оперативная память имеет размер 256 байт, адреса ячеек (байтов) изменяются от 0 до 255 = FF16. Программа начинается с адреса 0 (в начале области памяти), данные обычно расположены сразу за ней. Стек находится в самом конце оперативной памяти и «растет вверх». Это значит, что первое записанное в стек 16-битное слово имеет адрес FE16 (последние два байта памяти), следующее записанное слово – адрес FC16 и т.д. Как же компьютер разбирается, где начинается стек и сколько чисел туда записано?
В процессоре есть специальный регистр SP (от англ. Stack Pointer – указатель стека), в котором хранится адрес вершины стека, то есть последнего записанного в стек 16-битного значения. При запуске программы в регистр SP записывается значение 10016 (область 1 на рисунке). Этот адрес находится за границами оперативной памяти и говорит о том, что стек пуст.
Для того, чтобы записать значение из регистра общего назначения в стек, используется команда PUSH (от англ. push – втолкнуть). Например, при выполнении этих команд в стек будет записано значение регистра R0:
MOV 1234,R0
PUSH R0
Обратите внимание на значение регистра SP – оно стало равно FE16 и теперь указывает на последнее слово памяти (область 2 на рисунке), в котором записано число 123416 – значение регистра R0 (сначала младший байт, потом старший).
Добавим к программе еще одну команду, которая «снимает» 16-битное значение с вершины стека и записывает его в регистр R2:
POP R2
После этого наблюдаем следующее (см. рисунок ниже):
в регистре R2 находится то же значение 123416, которое было в R0 (область 1)
регистр SP содержит значение 10016, которое говорит о том, что стек пуст (область 2)
в последних двух байтах памяти осталось значение 123416, которое было записано в стек (область 3), но теперь оно уже не является часть стека, поскольку регистр SP изменен.
