Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОргЭВМ(лабы 1-5) / лаба12Ильичева

.docx
Скачиваний:
88
Добавлен:
28.12.2016
Размер:
793.63 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра

отчет

по лабораторной работе №1 и №2

по дисциплине «Организация ЭВМ и систем»

ИССЛЕДОВАНИЕ ВНУТРЕННЕГО ПРЕДСТАВЛЕНИЯ РАЗЛИЧНЫХ ФОРМАТОВ ДАННЫХ.

ИССЛЕДОВАНИЕ ВИДЕОСИСТЕМЫ (ТЕКСТОВЫЙ РЕЖИМ)

Студентка гр. 4373

Ильичева К.

Преподаватель

Иванов Д.

Санкт-Петербург

2016

Задание на лабораторную работу.

1. Разработать алгоритм ввода с клавиатуры двух типов данных: short int и double. Показать на экране их внутреннее представление в двоичной системе счисления.

2. Написать и отладить программу на языке c++, реализующую разработанный алгоритм.

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

Структурная схема аппаратных средств

постоянное

запоминающее

устройство

центральный

процессор

ШИНА

оперативное устройство

запоминающее ввода вывода

устройство

Источник

питания

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

#include "stdafx.h"

#include <iostream>

#include <windows.h>

#include <stdio.h>

#include <cstdio>

#include <conio.h>

using namespace std;

enum color {

Black = 0,

Blue = 9,

Green = 10,

Yellow = 14,

Cyan = 11,

Magenta = 13,

Red = 12,

White = 7,

Gray = 8

};

void setColor(color text, color background){

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));

}

union type {

unsigned long long ll;

double d;

};

unsigned int printDouble1(double x){

COORD coord;

coord.X = 0;

coord.Y = 4;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

cout << " \n ";

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

type data;

unsigned int bit;

data.d = x;

setColor(Blue, Black);

for (int i = 0; i < 64; i++)

{

if ((i > 0) && (i < 12)) setColor(Yellow, Black);

if (i >= 12) setColor(Green, Black);

bit = ((data.ll >> (64 - i - 1)) & 1);

cout << bit;

}

setColor(White, Black);

cout << endl;

return bit;

}

unsigned int printShort(short input){

COORD coord;

coord.X = 0;

coord.Y = 4;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

cout << " \n ";

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

unsigned int bit;

setColor(Yellow, Black);

for (int i = 0; i < 16; i++)

{

if ((i > 0) && (i < 16)) setColor(Yellow, Black);

bit = ((input >> (16 - i - 1)) & 1);

cout << bit;

}

setColor(White, Black);

cout << endl;

return bit;

}

short shift_right_short(unsigned short int input)

{

int size = sizeof(short int)* 8;

input = ((input >> 1) | (input << (size - 1)));

printShort(input);

setColor(Magenta, Black);

cout << input << endl;

setColor(White, Black);

return input;

}

short shift_left_short(unsigned short int input)

{

int size = sizeof(short int)* 8;

input = ((input << 1) | (input >> (size - 1)));

printShort(input);

setColor(Magenta, Black);

cout << input << endl;

setColor(White, Black);

return input;

}

double shift_right_double(double input)

{

type data;

data.d = input;

int size = sizeof(double)* 8;

data.ll = ((data.ll >> 1) | (data.ll << (size - 1)));

printDouble1(data.d);

setColor(Magenta, Black);

cout << data.d << endl;

setColor(White, Black);

return data.d;

}

double shift_left_double(double input)

{

type data;

data.d = input;

int size = sizeof(double)* 8;

data.ll = ((data.ll << 1) | (data.ll >> (size - 1)));

printDouble1(data.d);

setColor(Magenta, Black);

cout << data.d << endl;

setColor(White, Black);

return data.d;

}

void actionsDouble(double input){

char c;

double data = input;

do {

c = _getch();

switch (c){

case 75:

data = shift_left_double(data);

break;

case 77:

data = shift_right_double(data);

break;

}

} while (c != 27);

}

void actionsShort(short input){

char c;

short data = input;

do {

c = _getch();

switch (c){

case 75:

data = shift_left_short(data);

break;

case 77:

data = shift_right_short(data);

break;

}

} while (c != 27);

}

int main(){

setlocale(LC_ALL, "rus");

short int input;

double x;

int m, t, n, k;

do

{

cout << "Выберите с каким типом вы хотите работать: 1 - double; 2 - short int " << endl;

cin >> m;

if (m == 1)

{

cout << "Введите данные:" << endl;

cin >> x;

if ((x > -9223372036854775808.0) & (x < 9223372036854775807.0))

{

printDouble1(x);

}

else {

setColor(Red, Gray);

cout << endl;

cout << "Ошибка!!!" << endl;

cout << endl;

setColor(White, Black);

}

actionsDouble(x);

}

else {

if (m == 2)

{

cout << "Введите данные:" << endl;

cin >> input;

if ((input > -32768) & (input < 32767))

{

printShort(input);

actionsShort(input);

}

else {

setColor(Red, Gray);

cout << endl;

cout << "Ошибка!!!" << endl;

cout << endl;

setColor(White, Black);

}

}

else {

setColor(Red, Gray);

cout << endl;

cout << "Ошибка!!!" << endl;

cout << endl;

setColor(White, Black);

}

}

cout << "Хотите продолжить? да - 1; нет - 0" << endl;

cin >> t;

system("cls");

} while (t != 0);

}

Примеры запуска программы

  1. Тип с плавающей точкой double

    1. Сдвиг вправо

    1. Сдвиг влево

2. Целочисленный тип short int

a. Сдвиг влево

b. Сдвиг вправо

Блок-схема разработанного алгоритма с пояснениями

Реализация работы курсора.

Сначала устанавливаем курсор в положение 0, 4, соответствующей строке с данными вывода, после функция _getch() возвращает нам символ, считанный с консоли. Далее рассматриваем 3 возможных ввода: 75(клавиша влево), 77(клавиша вправо) и 27(esс), с помощью switch.

Соседние файлы в папке ОргЭВМ(лабы 1-5)