ДЗ: lab04_bits.task.pdf
Описание
Полностью готова, с исходниками.
Лабораторнаяработа№4
Представление данных в памяти
Цель работы
- Изучить представление различных типов и структур данных в памяти ЭВМ.
- Освоить средства языка и стандартной библиотеки C++ для низкоуровневых манипуляций с битами данных, адресами памяти и строками C.
Задание на лабораторную работу
Общее задание
- Подготовить инструменты для исследований и отладки.
Написать функции для печати отдельных байт и блока данных data размером size
байт в шестнадцатеричном и в двоичном представлении.
void print_in_hex(uint8_t byte);
void print_in_hex(const void* data, size_t size);
void print_in_binary(uint8_t byte);
void print_in_binary(const void* data, size_t size); Указание. Для удобства чтения рекомендуется между байтами добавлять пробелы и делать перевод строки, например, после каждых 16-и байт (в print_in_hex()) или каждых 4-х байт (в print_in_binary()).
- Написать программу-калькулятор для побитовых операций.
|
и двоичном виде. Операнды — двухбайтовые беззнаковые целые числа (uint16_t).
- Изучить представление и размещение данных в памяти.
- Определить структуру Student, описывающую студента атрибутами:
- имя (массив из 17 символов, включая завершающий '');
- год поступления (беззнаковое целое, 2 байта);
- средний балл (с плавающей запятой);
- пол, представленный одним битом (0 — женский, 1 — мужской);
- количество пройденных курсов;
- Определить структуру Student, описывающую студента атрибутами:
- указатель на структуру Student, описывающую старосту группы (для старосты — нулевой указатель).
Указание. Поле размером в несколько бит (не больше, чем бит в определенным целочисленном типе) можно объявить так:
целочисленный-тип имя-поля : число-бит;
- Объявить и заполнить массив из трех структур Student, описывающий двух студентов одной группы и их старосту.
- Напечатать, занести в отчет и письменно пояснить:
- адрес и размер массива;
- адреса и размеры всех элементов массива;
- для всех полей, кроме пола1, одного из элементов массива (не старосты): адрес, смещение от начала структуры, размер, шестнадцатеричное и двоичное представление;
- все элементы массива в шестнадцатеричном виде с указанием соответствия блоков байт полям структур.
Указание. Смещение поля field структуры типа type от начала любого её экземпляра можно определить макросом offsetof(type, field).
- Написать программу для обработки текстового файла, представляя текст только строками C, размещаемыми в динамической памяти или на стеке.
- Запросить у пользователя имя файла, сохранив его в массиве символов, размещенном на стеке (не в динамической памяти).
- Проверить, используя функции стандартной библиотеки C++ для работы со строками C, что введенное имя файла корректно (в Windows):
- не содержит запрещенных символов: *, ", <, >, ? или |;
- если содержит двоеточие, то только вторым символом, которому предшествует буква, и за двоеточием следует обратная косая черта ().
- если файл имеет расширение, то только *.txt (в любом регистре).
Указание. Задачи решаются стандартными функциями isalpha(), strchr(), strrchr(), strncmp(), tolower().
- Если введенное имя файла не имеет расширения, добавить расширение .txt.
- Загрузить содержимое текстового файла в память целиком:
- использовать ifstream или fopen() для доступа к файлу;
1 К битовым полям нельзя применять оператор sizeof (так как он возвращает размер в байтах) и оператор взятия адреса (так как по определению адресуются только байты, но не их части).
- использовать методы seekg() и tellg() либо функции fseek() и ftell() для определения размера файла, переместившись в его конец и получив текущее положение в файле;
- выделить в динамической памяти массив достаточного размера;
- загрузить всё содержимое файла в выделенную область памяти методом read() или функцией fread().
- Запросить у пользователя строку, поместив её в массив на стеке.
- Подсчитать и вывести число вхождений введенной строки в текст файла.
- Освободить все выделенные в процессе решения блоки памяти.
Контрольные вопросы
- Опишите назначение и использование операторов new и delete. Чем отличается синтаксис удаления массива от синтаксиса удаления одиночного значения?
- Как при помощи динамических массивов организовать работу с квадратной матрицей, размер которой становится известен во время выполнения?
- Что такое «рваный» массив (jagged array)? Как выделять и освобождать память под его элементы, как к ним обращаться?
- Каковы особенности арифметики типов с плавающей запятой по сравнению с математически точной и сравнения их значений?
- Как и почему корректно сравнивать значения с плавающей запятой и бороться с ошибками округления при операциях над такими значениями?
- В чем заключается арифметика с фиксированной запятой, какие у нее преимущества и недостатки по сравнению с арифметикой типов с плавающей запятой?
- Опишите действие оператора reinterpret_cast. В каких случаях его удобно применять, и какие проблемы при этом могут возникнуть?
- Что такое выравнивание данных (alignment)? Почему оно существует, зачем и как контролировать его наличие?
- Как определить размер переменной в C++, и в каких случаях он отличается от размера полезных данных, связанных с переменной?
- Какие побитовые операторы имеются в C++? Приведите примеры их работы.
- Что такое битовые флаги и битовые маски? Как в C++ записываются числа в системах счисления, отличных от десятичной?
- Каким образом можно: а) объявить целочисленную переменную размером 8, 16, 32 бита (гарантированно); б) объявить битовый массив произвольно большого размера; в) поле структуры размера, не кратного байту (например, 9 бит)?
- Как в C++ объявляются простые массивы (одно- и многомерные), каков синтаксис их инициализации, доступа к отдельным элементам, определения размера?
- Опишите шаблон класса std::array<T, N>, его назначение и преимущества использования по сравнению с простыми массивами.
- Что такое строки в стиле C (C-style string) и какие средства работы с ними имеются в стандартной библиотеке C++?
Файлы условия, демо
Характеристики домашнего задания
Преподаватели
Список файлов
