Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум по ВМСиС.doc
Скачиваний:
25
Добавлен:
05.06.2015
Размер:
2.31 Mб
Скачать

Содержание отчета

Для защиты лабораторной работы каждым студентом должен быть написан отчет о лабораторной работе, оформленный в отдельной тетради для лабораторных работ по курсу «Вычислительные машины, системы и сети», включающий тему, цель работы и содержащий следующие пункты:

  1. Общие сведения о вводе и выводе символьных данных.

  2. Задание на занятие.

  3. Алгоритм работы программы (блок-схема или словесное описание).

  4. Листинг программы (смысловая часть) с комментариями.

  5. Ответ на контрольный вопрос.

Контрольные вопросы

  1. Каким образом кодируются символы в компьютере?

  2. Что такое ASCII-код? Чем отличается кодировкаUNICODEотASCII?

  3. Что такое управляющие символы?

  4. Что такое управляющие клавиши?

  5. Какие функции языка Си используются для ввода кодов клавиш?

  6. Чем отличаются функциональные клавиши от обычных клавиш?

Задание на занятие

  1. Написать программу на языке Си, которая выводит на экран 256 ASCII символов (жёлтым цветом на синем фоне) и их кодов в шестнадцатеричном виде (серым цветом на синем фоне).

  2. Написать программу, которая отображает состояние клавиатуры и нажатие управляющих клавиш.

  3. Написать программу на языке Си, которая вводит пароль с клавиатуры. Требования к программе:

    1. Вывести строку приглашения ввода пароля: "Enter password:" и начать вводить символы на текущей строке после символа двоеточие.

    2. Осуществить чтение значений только обычных клавиш без отображения их на экране, с маскировкой введенных символов (вместо нажатого символа выводить символ "*"). Функциональные клавиши не должны отображаться на экране.

    3. Анализировать при вводе строки клавишу BackSpace (ASCII-код = 8) и обрабатывать ее как возврат на один символ назад со стиранием предыдущего введенного символа.

    4. Ограничить количество вводимых символов двадцатью (при вводе остальных символов программа не должна на них реагировать, но должна иметь возможность обрабатывать клавишу BackSpace).

    5. Реализовать сбор введенных символов в строку или массив.

    6. Окончание ввода строки пароля по клавише Enter (ASCII-код = 0xD).

    7. Сравнить введенный пароль со строкой (или массивом символов) "123" и вывести результат сравнения на экран, показывая верен ли введённый пароль или нет.

Лабораторная работа №5

Отрицательные числа и числаBCD

Продолжительность: 4 часа.

Цель: Изучение компьютерного представления отрицательных чисел и чисел в двоично-десятичном формате.

Основные сведения

Отрицательные числа.Внутри компьютера все числа, хранятся в двоичном виде. Как представлять отрицательные числа, если двоичный разряд может быть только в двух состояниях?

Способ представления, в котором один из битов обозначает знак числа, означает то, что "знаковый" бит должен обрабатываться особым способом, в отличие от "числовых" бит. Например, если 000000002– соответствует нулю, а 000000012– плюс единице, то число 100000012должно обозначать минус единицу [1]. Каким образом компьютер будет вычитать от нуля единицу, чтобы получить такое представление?

К тому же в такой системе записи есть два нуля: 00000000 (+0) и 10000000 (-0), отсюда следует, что в восьми битах можно записать 255 чисел от –127 до +127.

Исходя из вышеперечисленных недостатков, в компьютере отрицательные числа хранятся другим способом. Число –1 представлено в двоичном виде так: 111111112, и вычисление разницы между нулём и единицей не вызывает таких сложностей. Достаточно занять единицу из старшего разряда:

Таким образом, восьмибитовой последовательностью разрядов можно закодировать 256 чисел от –128 до +127 (см. Табл. 5.1.). Такая система записи отрицательных чисел называется дополнением до двухи является наиболее распространённой системой.

Таблица 5.1. Представление отрицательных чисел в одном байте.

Код числа

Значение

01111111

+127

00000001

+1

00000000

0

11111111

-1

11111110

-2

10000000

-128

Для того чтобы узнать, как будет выглядеть отрицательное число в двоичном виде, нужно воспользоваться следующей последовательностью действий:

  1. модуль числа преобразовать в двоичный вид;

  2. инвертировать полученное двоичное число;

  3. к результату прибавить 1, соблюдая правила заёма и переноса битов.

Например, число –12 будет выглядеть так:

  1. 00001100(+12)

  2. 11110011(после инверсии всех бит)

(–12 в системе "дополнение до двух")

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

–получился результат, отличный от нуля, но, в связи с тем, что мы получали двоичное отрицательное число, длиной в один байт, то и результат должен быть длиной в один байт. Единица старшего разряда отбрасывается и получается искомый нуль.

Какое отрицательное число соответствует последовательности битовможно определить, совершая действия в обратном порядке:

  1. от последовательности бит отнять единицу, соблюдая правила заёма и переноса битов;

  2. инвертировать последовательность битов;

  3. преобразовать в десятичное число.

Например, число 111001102означает следующее:

(отнимаем единицу)

  1. 0001 1010(инвертируем все биты)

  2. 0x1A = 26(модуль отрицательного числа)

Результат: 111001102 = –26.

Шестнадцатибитовое представление отрицательных чисел аналогично восьмибитовому, минус единица представлена цепочкой шестнадцати единичных разрядов: 11111111111111112. Соответственно самое большое число, которое можно записать в слово (два байта) равно 01111111111111112(), а самое маленькое – 10000000000000002()

Мы узнали, как будет выглядеть отрицательное число в компьютере. Убедиться в справедливости этих слов можно с помощью короткой программы.

Пример 5.1.Вывод отрицательных чисел в шестнадцатеричном виде.

#include <conio.h>

#include <stdio.h>

void main()

{ int a;

clrscr();

printf("Введите отрицательное число :");

scanf("%d",&a);

printf("В компьютере число хранится так:%X",a);

getch(); }

Десятичные числа.Хотя десятичная система счисления является более удобной для восприятия человеком, в компьютере числа хранятся в двоичном виде. Это связано с двумя состояниями транзистора – элементарной единицы любого электронного вычислителя. Но некоторые контроллеры используют десятичные числа для обмена данными с устройствами. Этот факт никак не означает, что в контроллерах данные хранятся в десятичном виде. На самом деле применяется двоично-десятичный код (BCD – Binary-Coded Decimal) [1], который удобен при отладке для человека, контролирующего процесс передачи данных.

Для хранения одного десятичного разряда в двоично-десятичном коде требуется 4 бита. Эти четыре бита дают 16 комбинаций () для размещения 10 различных значений (от 0 до 9). При этом 6 оставшихся комбинаций не используются.

Микропроцессор Intel хранит BCD-числа в двух форматах (см. Рис. 5.1.):

  • Упакованный двоично-десятичный тип (Packed BCD) – каждый байт содержит две десятичные цифры. Десятичная цифра представляет собой двоичное значение в диапазоне от 0 до 9. При этом двоичное представление старшей цифры занимает старшие 4 бита. Следовательно, диапазон представления десятичного упакованного числа в одном байте составляет от 0 до 99;

  • Неупакованный двоично-десятичный тип (Unpacked BCD) – каждый байт содержит одну десятичную цифру в четырёх младших битах. Старшие четыре бита имеют нулевое значение. Диапазон представления десятичного неупакованного числа в одном байте составляет от 0 до 9.

Рис. 5.1. Представление BCD-чисел

Рис. 5.2. Пример представления числа 3917

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

Для арифметических вычислений BCD-чисел в микропроцессореIntelпредусмотрены определённые команды, которые работают в основном с неупакованнымиBCD-числами, т.к. этот формат являетсябайт-ориентирован­ным(каждый разряд десятичного числа кодируется байтом). УпакованныеBCD-числа представляют собойбит-ориентированныйформат (каждый разряд десятичного числа кодируется четырьмя битами, т.е. не целым байтом).

Стандартные двоично-десятичные арифметические команды работают только с одним байтом или словом BCD-числа, поэтому программисту, если он хочет делать операции с числами, большими 9999, необходимо самостоятельно осуществлять арифметические операции с байтами цепочек двоично-десятичного кода чисел, исправляя переносы и заёмы десятичных разрядов.

Пример 5.2.Преобразование введённого числа в неупакованный двоично-десятичный формат.

#include <stdio.h>

#include <conio.h>

void main ()

{ unsigned char x [20], xx[20];

int c,ext,i,jj,max;

clrscr();

printf("Введите X -->");

jj=0;

do

{ char c=getch(); if (!c) ext = getch();

if (c==13) break;

if (c==27) { textcolor(15);

cprintf(" Esc!!!");

break; };

if ((c==8)&&(jj>0))

{ cprintf("\b \b");

jj--;

continue; }

cprintf("%c",c);

x[jj]=c;

jj++;

if (jj>9) break;

} while (1);

max=jj;

for (i=0;i<max;i++) xx[i]=x[i]-0x30;

xx[max]=0;

printf("\n\r BCD число=");

for (i=0;i<max;i++) printf("%c",xx[i]+0x30);

getch(); }