Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическое занятие №1234 по си++.docx
Скачиваний:
9
Добавлен:
08.11.2018
Размер:
787.62 Кб
Скачать

5. Пример решения задачи (вариант 30)

5.1. Программа упаковки

5.1.1. Разработка алгоритма решения.

Алгоритм программы линейный и состоит из следующих шагов.

5.1.1.1. Ввод значений составных частей слова состояния устройства. Для каждой составной части нужно вывести приглашение на ввод и ввести данные.

5.1.1.2. Занесение в слово состояния устройства кода состояния. У переменной, которая хранит значение кода состояния, нужно выделить 5 младших разрядов - это можно сделать, выполнив операцию "побитовое логическое И" между значением переменной и двоичной константой 00011111 (16-ричной константой 1F). Потом полученное значения следует сдвинуть на 11 разрядов влево.

5.1.1.3. Занесение в слово состояния устройства признака ошибки. В переменной - признаке ошибки выделить один младший разряд - операция "побитовое логическое И" с константой 1. Полученное значение сдвинуть на 9 разрядов влево. Чтобы добавит полученный код к тому коду, который уже получен на предыдущем шаге, нужно выполнить операцию "побитовое логическое ИЛИ" между предыдущим значением слова состояния устройства и полученным кодом.

5.1.1.4. Занесение в слово состояния устройства признака занятости. В переменной - признаке занятости выделить один младший разряд. Полученное значение сдвинуть на 8 разрядов влево и добавить к тому коду, который получен на предыдущем шаге (так же как в пп.5.1.1.3.).

5.1.1.5. Занесение в слово состояния устройства количества байт. В переменной - количестве байт выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение добавить (см. пп.5.1.1.3.) к тому коду, который уже есть.

Отметим, что если значения составных частей кода, введенные оператором, не выходят за диапазон допустимых для них значений, то операция выделения младших байтов излишня. Но мы предусматриваем ее на случай ошибок оператора.

5.1.2. Определение переменных программы

Для работы программы нам будут нужны переменные, в которых будут храниться составные части кода. Для сохранения всех составных частей будет достаточно по 1 байту, следовательно, тип этих переменных может быть char или unsigned char. Диапазоны возможных значений этих переменных: c - код состояния - 0 ...31; f - признак ошибки - 0, 1; b - признак занятости - 0, 1; n - количество байт - 0 ... 255. Отметим, что в переменных c, f, b старший разряд байта не используется, так что не имеет значения, будут они типа char или unsigned char. В переменной n используется старший разряд, следовательно, она обязательно должна быть типа unsigned char.

Нужна также переменная для сохранения результирующего кода слова состояния устройства. Это 2-байтная переменная, у которой старший разряд используется как кодовый, а не как знаковый. Так что, эта переменная должна быть типа unsigned int.

5.1.3. Разработка текста программы

Текст программы начинается с включения в программу файла:

#include <stdio.h>

В этом файле содержатся описания стандартных функций ввода-вывода, которые непременно будут использоваться в программе.

Далее идет заголовок функции main():

int main(void) {

и объявления переменных - точно по пп 5.1.2:

char c;

char f;

char b;

unsigned char n;

unsigned int UnitStateWord;

Ввод кода состояния складывается из вывода на экран приглашения:

printf("Введите код состояния (0 - 31) >");

и собственно ввода значения в переменную c:

scanf("%d",&c);

Такие же пары операторов повторяются для ввода значений f, b, n. Все значения вводятся как десятичные числа, используется тип %d в спецификациях формата.

Далее идет формирование упакованного кода, которое точно повторяет шаги алгоритма описанного в пп. 5.1.1:

  • по пп.5.1.1.2:

  • UnitStateWord=((unsigned char)c&0x1F)<<11;

Преобразование типа переменной c в unsigned char необходимо, потому что иначе сдвиг 8-разрядного кода на 11 разрядов приведет к потере нужных нам кодов.

  • по пп.5.1.1.3:

  • UnitStateWord|=((unsigned char)f&1)<<9;

  • по пп.5.1.1.4:

  • UnitStateWord|=((unsigned char)b&1)<<8;

  • пл пп.5.1.1.5:

  • UnitStateWord|=n&0xFF;

Вывод результата выполняется оператором:

printf("\nСлово состояния устройства = %04x\n",UnitStateWord);

Результат выводится как 16-ричное число из 4 цифр (что соответствует 2 байтам), обязательно выводятся ведущие нули.

Полный текст программы приведен ниже.

/******************************************************/

/* Практическое занятие №4 (часть 1) */

/* Упаковка кода */

/* Пример выполнения. Вариант №30. */

/******************************************************/

#include <stdio.h>

int main(void) {

char c; /* код состояния */

char f; /* признак ошибки */

char b; /* признак занятости */

unsigned char n; /* количество байт */

unsigned int UnitStateWord; /* слово состояния */

/* ввод составных частей */

printf("Введите код состояния (0 - 31) >");

scanf("%d",&c);

printf("Введите признак ошибки (0 / 1) >");

scanf("%d",&f);

printf("Введите признак занятости (0 / 1) >");

scanf("%d",&b);

printf("Введите количество переданных байт (0 - 255) >");

scanf("%d",&n);

/* формирование упакованного кода */

UnitStateWord=((unsigned int)c&0x1F)<<11;

UnitStateWord|=((unsigned int)f&1)<<9;

UnitStateWord|=((unsigned int)b&1)<<8;

UnitStateWord|=n&0xFF;

/* вывод результата */

printf("\nСлово состояния устройства = %04x\n",

UnitStateWord);

return 0;

}

5.1.4. Отладка программы

Отладку программы можно вести в пошаговом режиме с отслеживанием значений переменных - составных частей при их вводе и кода-результата на шагах его формирования. Для последнего может возникнуть неудобство, т.к. в режиме отладки значение переменной UnitStateWord будет представляться как десятичное число, а нам удобнее видеть его как 16-ричное или как 2-ичное. Поэтому для такого отслеживания удобнее будет вставить в соответствующие места текста программы вызовы функции printf, которые будут выводить промежуточные значения кода в 16-ричном формате.

5.1.5. Результаты работы программы

При работе программы на экран были выведены такие результаты:

Введите код состояния (0 - 31) >27

Введите признак ошибки (0 / 1) >1

Введите признак занятости (0 / 1) >1

Введите количество переданных байт (0 - 255) >74

Слово состояния устройства = db4a