Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Решение задачи предполагает создание двух программ: упаковки (см. 2.12.3.3.1) и распаковки (см. 2.12.3.3.2)



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

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

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

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

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

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

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

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

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

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

Для работы программы нам будут нужны переменные, в которых будут храниться составные части кода. Для сохранения всех составных частей будет достаточно по 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.

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

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

#include < stdio.h>

 

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

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

int main(void) {

и объявления переменных - точно по пп 2.12.3.3.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 в спецификациях формата.

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

· по пп. 2.12.3.3.1.1.2:

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

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

· по пп. 2.12.3.3.1.1.3:

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

по пп. 2.12.3.3.1.1.4:

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

· пл пп. 2.12.3.3.1.1.5:

UnitStateWord|=n& 0xFF;

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

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

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

Программа

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

 

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

/* Лабораторная работа № 3 /

/* Задание 3 (часть 1) */

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

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

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

#include < stdio.h>

# include< conio.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);

getch();

return 0;

}

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

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

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

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

Введите код состояния (0 - 31) > 27Введите признак ошибки (0 / 1) > 1Введите признак занятости (0 / 1) > 1Введите количество переданных байт (0 - 255) > 74 Слово состояния устройства = db4a

 

Программа распаковки

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

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

2.12.3.3.2.1.1. Ввод значения слова состояния устройства.

2.12.3.3.2.1.2. Выделение из слова состояния устройства кода состояния. Код слова состояния устройства нужно сдвинуть на 11 разрядов вправо и выделить 5 младших разрядов - " побитовое логическое И" с константой 1F16. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для кода состояния.

2.12.3.3.2.1.3. Выделение из слова состояния устройства признака ошибки. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд - " побитовое логическое И" с константой 1. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака ошибки.

2.12.3.3.2.1.4. Выделение из слова состояния устройства признака занятости. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака занятости.

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

 

2.12.3.3.2. 2. Определение переменных программы Для работы программы нам будут нужны такие же переменные, что и в пп. 2.12.3.3.1.2.

 

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

Начало программы - заголовок и определение переменных - по пп. 2.12.3.3.1.3. Далее идет формирования упакованного кода, которое точно повторяет шаги алгоритма, описанного в пп. 2.12.3.3.2.1:

· по пп. 2.12.3.3.2.1.2:

c=(UnitStateWord> > 11)& 0x1F;

· по пп. 2.12.3.3.2.1.3:

f=(UnitStateWord> > 9)& 1;

· по пп. 2.12.3.3.2.1.4:

b=(UnitStateWord> > 8)& 1;

· по пп. 2.12.3.3.2.1.5:

n=UnitStateWord& 0xFF;

 

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

printf(" Код состояния = %d\n", c);

Подобными операторами выполняется и вывод остальных результатов

 

Текст программы

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

 

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

/* Лабораторная работа № 3 */

/* Задание 3 (часть 2) */

/* Распаковка кода */

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

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

#include < stdio.h>

# include< conio.h>

int main(void)

{

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

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

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

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

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

/* ввод слова состояния устройства */

printf(" Введите cлово состояния устройства \n" );

printf(" (16-ричное число от 0 до 0xFFFF) > " );

scanf(" %x", & UnitStateWord);

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

c=(UnitStateWord> > 11)& 0x1F;

f=(UnitStateWord> > 9)& 1;

b=(UnitStateWord> > 8)& 1;

n=UnitStateWord& 0xFF;

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

putchar('\n');

printf(" Код состояния = %d\n", c);

printf(" Признак ошибки = %d\n", f);

printf(" Признак занятости = %d\n", b);

printf(" Количество переданных байт = %d\n", n);

getch();

return 0;

}

 

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

Отладка программы ведется по методике, описанной в пп. 2.12.3.3.1.4.

 

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

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

Введите cлово состояния устройства (16-ричное число от 0 до 0xFFFF) > cb42 Код состояния = 25Признак ошибки = 1Признак занятости = 1Количество переданных байт = 66

 

2.12.4. Домашнее задание

Написать программу на языке С++, реализующую вычисления по формуле, приведенной в табл. 3.12. Вариант соответствует номеру в журнале группы.

Таблица 3.12.

Варианты домашнего задания

№ вар. Формула № вар. Формула
 

Примечание к табл. – число p (пи+ принять равным p = 3, 14159.

Пример 3.12. Выполнить вычисление по формуле для варианта 30:

Замечание: поскольку решение аналогичных задач рассмотрено очень подробно при решении предыдущих задач, то ниже приводится только текст программы.

Текст программы

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

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

/* Лабораторная работа № 3 */

/* Домашнее задание *//* Арифметические выражения и функции *//* Пример решения. Вариант № 30 *//**************************************************/#include < stdio.h> #include < math.h> # include< conio.h> int main(void) { /* Параметры, которые вводятся */ double x, y; /* Параметры, которые задаются в программе */ double pi=3/14159; double b; /* результаты */ double z; /* рабочая переменная */ printf(" Введите x, y > " ); scanf(" %lf %lf", & x, & y); z=fabs(x*y-1); b=pow(pi*tan(z), -sin(z)); printf(" b = %lg\n", b); getch(); return 0; }

 

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

Введите x, y > 3.0 2.0

b = 0

 

 

3. ВЫВОДЫ

Выполнение этой лабораторной работы должно познакомить Вас с алгоритмизацией вычислительных процессов и с базовыми типами вычислительных процессов (линейным, разветвляющимся и циклическим). Вы должны научиться: составлять простейшие алгоритмы линейных, разветвля­ющихся и циклических вычислительных процессов; выполнять математические операции в своих программах с использованием арифметических операторов языка C++; используя круглые скобки в арифметических выражениях, управлять порядком, в котором язык C++ выполняет операции; использовать побитовые операции языка C ++; использованию директив препроцессора.

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

 

 

4. ТРЕБОВАНИЕ К ОТЧЕТУ

В отчете должны быть отображены следующие пункты:

1. Название работы.

2. Цель работы.

3. Задание.

4. Таблицы соответствия переменных.

5. Краткое описание арифметических операций и приоритетов операций.

6. Краткое описание операций побитового сдвига.

6. Листинги всех программ задания.

7. Результаты выполнения всех программ (скриншоты) задания.

8. Выводы.

 

 

5. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ

 

1. Что понимают под алгоритмом?

2. Какими свойствами должен обладать алгоритм?

3. Какие существуют способы записи алгоритмов?

4. В чем заключается способ записи алгоритмов в виде блок-схем?

5. Какими достоинствами обладает способ записи алгоритмов в виде блок-схем?

6. Какие условные графические изображения используются для обоз­начения основных символов блох-схем?

7. Какие правила должны соблюдаться при начертании (выполнении) блок-схем алгоритмов?

8. Чем вызвана необходимость введения алгоритмических языков для записи программ для ЭВМ?

9. В чем заключается способ записи алгоритмов с помощью алгорит­мических языков?

10. В чем состоит сущность алгоритмизации вычислительного процес­са?

11. Из каких этапов складывается процесс подготовки и решения за­дачи на ЭВМ и в чем заключается их сущность?

12. Какой вычислительный процесс называется линейным?

13. Какой вычислительный процесс называется разветвляющимся?

14. Какой вычислительный процесс называется циклическим?

15. Что понимается под алгоритмическим языком?

16. Как классифицируются языки программирования?

17. Какие алгоритмические языки программирования вы знаете? Каково назначение этих языков?

18. Какой язык программирования называется машинным?

19. Какой язык программирования называется машинно-ориентирован­ным?

20. Какой язык программирования называется машинно-независимым?

21. Какой язык программирования называется универсальным?

22. Какой язык программирования называется специализированным?

23. Что называется программой?

24. Что такое транслятор и для чего он нужен?

25. Какой должна быть степень детализации алгоритма вычислитель­ного процесса?

26. Откуда произошел термин " алгоритм"?

27. Чем численный алгоритм отличается от логического?

28. Из каких разделов состоит современная теория алгоритмов?

29. Дайте определение алгоритма по Маркову

30. Дайте определение алгоритма по Колмогорову

31. Каким требованиям должен отвечать алгоритм?

32. Что собой представляет машина Поста?

33. Что собой представляет машина Тьюринга?

34. Какие способы записи алгоритмов вам известны?

35. Каковы недостатки словесного способа записи алгоритма?

36. Каковы достоинства и недостатки представления алгоритма в виде блок-схемы?

37. Приведите пример простейшего алгоритма, представленного при помощи диа­граммы Нэсси—Шнейдермана.

38. Что такое " псевдокоды"?

39. На какие группы можно подразделить языки программирования высокого уровня?

40. Какие базовые алгоритмические конструкции вам известны?

41. Что такое " линейный алгоритм"?

42. Что такое " разветвляющийся алгоритм"? Чем обуславливается выбор пути при ветвлении?

43. Что такое " циклический алгоритм"? Чем отличается цикл с предусловием от цикла с постусловием?

44. Как Вы понимаете приоритет операций в языке С++?

45. Приоритеты арифметических операций в языке С++.

46. Использование стандартных математических функций.

47. Использование функций scanf() и printf().

48. Структура программы на языке С++.

49. Какие операции называются унарными? Примеры.

50. Какие операции называются бинарными? Примеры.

51. Перечислите названия и знаки арифметических операций в порядке уменьшения их приоритета.

52. Что обозначают операции ++ и --?

53. Порядок выполнения префиксных и постфиксных операций ++ и --.

54. В каком заголовочном файле хранятся прототипы математических функций?

55. Как подключить к программе библиотеку математических функций?

56. Какой алгоритм называется линейным?

57. Какой линейный алгоритм называется вычислительным?

58. Для чего составляется таблица соответствия переменных?

59. Приведите пример графической схемы линейного алгоритма.

60. Что называется тестом?

61. Как и на каком этапе разработки программы составляется тест для линейного вычислительного алгоритма?

62. Как проводится проверка правильности составленной программы?

63. Что называется алгоритмом?

64. Перечислите типы алгоритмов.

65. Данте определение линейного алгоритма.

66. Перечислите способы описания алгоритмов.

67. Что называется схемой алгоритма?

68. Какие блоки используются для описания линейных алгоритмов?

69. Опишите этапы решения задачи на ЭВМ.

70. Дайте понятие контрольного теста.

71. Дайте понятие алгоритмического языка.

72. Что называется транслятором?

73. Что представляет собой программа на алгоритмическом языке?

74. Опишите структуру программы на С++.

75. Объясните выполнение оператора ввода.

76. Что такое бесформатный вывод данных?

77. Какие форматы вывода данных вам известны?

78. Как обеспечить в программе доступность библиотеки математиче­ских функций?

79. В какой форме следует задавать аргументы тригонометрических функ­ций?

80. Как на языке С++ записываются функции вычисления десятичного и натурального логарифмов?

81. Как выполняется пошаговая трассировка программы?

82. В чем заключается разница в работе " горячих" клавиш [F7] и [F8]?

83. Как обеспечить останов работающей программы перед выполнени­ем определенного оператора?

84. Как определить значение какой-либо переменной или выражения в точке останова?

85. Как в точке останова изменить существующее значение переменной?

86. Каким образом можно продолжить работу программы после оста­нова?

87. Как после останова работы программы и внесения в нее корректив запустить программу сначала?

88. На какие группы делятся бинарные операции?

89. Приведите список побитовых операций (операторов) языка С++.

90. Поясните работу побитового оператора NOT.

91. Поясните работу побитового оператора AND.

92. Поясните работу побитового оператора XOR.

93. Поясните работу побитового оператора OR

94. Поясните работу операторов побитового сдвига.

 

Литература

1. Волков В. Б., Макарова Н. В. Информатика. Учебник для вузов. – СПб: Питер, 2011

2. Гагарина Л.Г., Колдаев В.Д. Алгоритмы и структуры данных: учеб. пособие. – М.: Финансы и статистика; ИНФРА-М, 2009. -304 с: ил.

3. Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования: учеб. пособие. – 3-е изд., испр. и доп. – М: ФОРУМ, 2008. — 432 с. — (Про­фессиональное образование).

4. Страуструп Б. Программирование: принципы и практика использования C++. Пер. с англ. – М.: ООО " И.Д. Вильямс", 2011. – 1248 с.: ил.

5. Савич У. Программирование на C++. – СПб: Питер, 2004.

6. ГОСТ 19.701-90. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.

7. Хенкеманс Д., Ли М. Программирование на С++. – Пер. с англ. – СПб: Символ-Плюс, 2002, 2005. 416 с, ил.

8. Герберт Ш. С++: базовый курс, 3-е издание.: Пер. с англ. – М.: Издательский дом " Вильяме", 2010. – 624 с.: ил.

9. Дейтел Х., Дейтел П. Как программировать на С++ Бином-Пресс, 2010.

 


Оглавление

 

Лабораторная работа № 03. 2

Алгоритмизация вычислительного процесса. 2

Арифметические операции и математические функции языка С.. 2

Битовые операции. 2

1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ.. 2

1.1. Алгоритмизация вычислительного процесса. 2

1.2. Арифметические операции. 23

1.2.1. Знаки операций. 23

1.2.2. Операции. 24

1.2.3. Арифметические операции. 28

1.2.4. Другие операции языка С++. 32

1.2.4.1. Операция присваивания. 32

1.2.4.2. Операции отношения. 32

1.2.4.3 Логические операции. 32

1.2.4.4. Операция запятая. 32

1.2.4.5. Операции инкремента и декремента. 33

1.2.4.6. Операция sizeof. 34

1.3. Порядок (старшинство) выполнения арифметических операций. 34

1.4. Круглые скобки позволяют переопределить приоритет. 36

1.5. Стандартные математические функции языка С++. 37

1.6. Побитовые логические операции и операции сдвига. 40

2. ЗАДАНИЕ.. 44

3. ВЫВОДЫ... 63

4. ТРЕБОВАНИЕ К ОТЧЕТУ.. 64

5. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ.. 64

Литература. 67

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 578; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.115 с.)
Главная | Случайная страница | Обратная связь