ООП / Бизнес ооп / s1
.pdfС-1 «Доступ к данным в памяти и их обработка»
Задание.
1.В начале семинара обсудите с преподавателем вопросы программирования, рассмотренные в лекционном курсе:
структуры,
битовые поля,
массивы,
сортировка,
операции сдвига (<<, >>),
логические (&&, ||) и поразрядные (&, |, ^) операции.
Ввод/вывод текста с помощью cin, cout, getch();
позиционирование текстового курсора;
задержка вывода на экран.
2.Разработайте программу в соответствии с полученным вариантом:
В1 «Планировщик». Обеспечьте ввод времени (ЧЧ:ММ) начала и окончания, а также наименование (от 1 до 30 символов) задачи. Выведите на экран отметки времени от 07:00 до 23:00 с шагом 15 минут и отметьте символом «*» промежутки времени, которые заняты хотя бы одним заданием.
В2 «Конвертер». Разработайте программу преобразования чисел между системами счисления (2), (10) и (16), не используя операции умножения и деления. Добавьте функциональность калькулятора на 4 арифметических действия (без дробных частей).
В3 «Записи». Разработайте программу, сохраняющую записи (порядковый номер ввода, число с плавающей точкой и строку длиной до 30 символов). Управление данными осуществляется с клавиатуры: ввод новой записи, удаление записи по заданному номеру/числу/строке, сортировка по номеру/числу/строкам.
В4 «Регистр». Устройство имеет в своем составе регистр состояния, отображающий состояние 8 режимов работы с помощью светодиодов, состояние хранится в 8-битной переменной. Разработайте программу, чтобы при нажатии клавиш 0..7 изменялось состояние разрядов регистра, отображаемых «звездочкой» или «пробел». При запуске программы выполните анимацию плавного появления звездочек (10% яркости – 1 из 10 циклов звездочка отображается на своем знакоместе, остальные 9 циклов – нет; далее –
2 из 10, 3 из 10, …, 10 из 10).
В5 «Лабиринт». В памяти хранятся символы, означающие стенки и проходы прямоугольного лабиринта, а также предметы. Требуется анимировать движение объекта в лабиринте с учетом стенок и проходов, причем предметы можно брать, переносить и выкладывать. Количество одновременно носимых предметов – 3.
В6 «Представление». Исследуйте представление чисел signed и unsigned для типов данных char, int, long, float, double для 32-разрядной операционной системы: приведите максимально и минимально допустимые значения, соответствие характерных (2) комбинаций (00..00, 10…00, 11…11 и др.) целым и дробным (float, double) числам. Продемонстрируйте на примерах представление характерных дробных чисел.
В7 «Процессор». Используется упрощенная модель микропроцессора с регистром A для вычислений и регистром PC (program counter) для хранения адреса следующей выполняемой команды. При вызове функции (команда CALL) значения регистров A и PC сохраняются в стек, при возврате из функции (команда RETURN) значения регистров A и PC восстанавливаются из стека. Команды представляются числовыми кодами так, чтобы код умещался в одну ячейку памяти.
Команда |
Параметр |
Код команды |
Назначение |
CLEAR |
нет |
0 |
Очистка регистра А |
ADD |
1 … 100 |
1 … 100 |
Добавление числа в регистр А |
CALL |
1 … 99 |
–1 … –99 |
Вызов функции по адресу |
RETURN |
нет |
–110 |
Возврат из функции |
STOP |
нет |
–120 |
Завершение программы |
Ниже приведен пример основной программы (адреса 0…5) и двух функций (адреса 50…52 и 60…61). Запишите ее в одномерный массив размером 100, элементами которого будут числа из столбца «код команды»; неуказанные элементы не заполняйте. При этом индекс массива будет совпадать с адресом команды в программе. Запрограммируйте работу имитатора процессора для выполнения аналогичных программ, используя регистры и стек. Стек реализуйте на основе массива.
Адрес |
Команда |
Код |
|
команды |
|||
|
|
||
0 |
CLEAR |
0 |
|
1 |
ADD 5 |
5 |
|
2 |
ADD 14 |
14 |
|
3 |
CALL 50 |
-50 |
|
4 |
CALL 60 |
-60 |
|
5 |
STOP |
-120 |
|
… |
|
|
|
50 |
CLEAR |
0 |
|
51 |
ADD 10 |
10 |
|
52 |
RETURN |
-110 |
|
… |
|
|
|
60 |
CALL 50 |
-50 |
|
61 |
RETURN |
-110 |
В8 «Указатели». Разработайте имитатор работы с переменными в автоматической и динамической областях памяти. Поддерживаются переменные целого типа int (диапазон значений 100…200), указатели на переменные целого типа (диапазон адресов 0…19). В этой задаче одна переменная или указатель занимают один адрес. Диапазон адресов автоматической памяти – 0…9, динамической – 10…19. Запишите прототипы нижеуказанных функций и запрограммируйте их. Отобразите в левой части экрана карту памяти, в правой – выполняемые команды.
variable(“a”); |
// int |
a; |
|
set(“a”,150); |
// a = |
150; |
|
set(variable(“b”),160); |
// int |
b = |
160; |
setAddr(variablePtr(“pa”),”a”); |
// int* pa |
= &a; |
|
setValue(“pa”,170); |
// *pa = 170; |
||
setAddr(variablePtr(“p1”),new_()); |
// int |
*p1 |
= new int; |
setValue(“p1”,180); |
// *p1 |
= 180; |
del_(“p1”); |
// |
delete p1; |
set(“p1”,0); |
// |
p1 = 0; |
//комментарии
//variable(“a”) – находит свободное место
//в адресах 0…9 и размещает там переменную типа int. //set(“a”,150) – находит переменную по имени и уст.
// значение.
//variablePtr(“pa”) – находит свободное место
//в автоматической памяти и размещает там указатель //на переменную типа int.
//setAddr((“pa”),”a”) – находит адрес переменной a
//и заносит его
//в значение указателя.
//setValue(“pa”,170) – разыменовывает указатель pa
// и заносит по полученному адресу значение.
//new_() – находит свободный адрес в диапазоне 10…19,
//занимает его (устанавливает флаг)
//и возвращает найденный адрес.
//del_(“p1”) – освобождает адрес в памяти, на который
//ссылается p1.
Экран (адрес – 2 цифры, пробел, имя переменной – 2 символа (только для адресов 00…09, по умолчанию «--», примеры – «a», «pa»), пробел, флаг «ячейка динамической памяти занята» – «+» или «-» (только для адресов 10…19), пробел, значение – 0…19, 100…200, по умолчанию 999), в списке ниже символ «●» означает пробел:
00●--●●●999
…
09●●●●●●999
10●●●●-●999
…
19●●●●-●999
3.По окончании семинара сдайте свою работу на скрепленных листах в письменном виде для проверки и получения баллов за начальный вариант решения; на ближайшей лабораторной работе сдайте работающую задачу на ПК и защитите ее.