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

2392_Смирнова_ЛР1_ЭВМ

.docx
Скачиваний:
0
Добавлен:
05.12.2024
Размер:
463.18 Кб
Скачать

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

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

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

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

Кафедра ВТ

отчет

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

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

Тема: Исследование внутреннего представления различных

форматов данных

Студент гр. 2392

Смирнова М. В.

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

Ельчанинов М. Н.

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

2023

Цель работы.

Знакомство с внутренним представлением различных типов данных, используемых компьютером при их обработке.

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

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

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

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

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

Блок-схема алгоритма

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

#include <iostream>

#include <windows.h>

#include <conio.h>

#include <string>

#include <fstream>

#include <vector>

#include <fstream>

#include <algorithm>

#define UP 72

#define DOWN 80

#define ESC 27

#define ENTER 13

using namespace std;

// Функция перемещения курсора на консоли в указанную позицию

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

void GoToXY(short x, short y) {

SetConsoleCursorPosition(hStdOut, { x,y });

}

// Функция управления видимостью и размером курсора на консоли

void ConsoleCursorVisible(bool show, short size) {

CONSOLE_CURSOR_INFO structCursorInfo;

GetConsoleCursorInfo(hStdOut, &structCursorInfo);

structCursorInfo.bVisible = show;

structCursorInfo.dwSize = size;

SetConsoleCursorInfo(hStdOut, &structCursorInfo);

}

// Объединение для работы с различными типами данных через одно и то же пространство памяти

union REGS

{

double cifra;

unsigned int chislo;

unsigned char bits[8];

} number;

// Главная функция

int main()

{

// Установка заголовка и размеров консоли

SetConsoleTitle(L"ЭВМ: Лаб.работа №1 студентки группы №2392, Смирновой Марии ");

system("mode con cols=80 lines=35");

system("CLS");

setlocale(0, "Rus");

ConsoleCursorVisible(false, 100);

// Опции меню

string Menu[] = { "Ввод: unsigned int", "Ввод: double", "Выход" };

int active_menu = 0;

char ch;

while (true) {

menu_main:

system("CLS");

int x = 25, y = 15;

GoToXY(x, y);

// Отображение пунктов меню

for (int i = 0; i < size(Menu); i++) {

if (i == active_menu) SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_INTENSITY);

else SetConsoleTextAttribute(hStdOut, FOREGROUND_GREEN);

GoToXY(x, y++);

cout << Menu[i] << endl;

}

ch = _getch();

if (ch == -32) ch = _getch();

switch (ch)

{

case UP:

if (active_menu > 0)

--active_menu;

break;

case DOWN:

if (active_menu < (size(Menu) - 1))

++active_menu;

break;

case ENTER:

switch (active_menu)

{

case 0: // Беззнаковое целое число

system("CLS");

SetConsoleTextAttribute(hStdOut, FOREGROUND_GREEN| FOREGROUND_INTENSITY);

cout << "Выбран тип данных: unsigned int. Введите символ: ";

cin >> number.chislo;

// Отображение двоичного представления введенного беззнакового целого числа

for (int i = 3; i >= 0; i--) {

for (int j = 7; j >= 0; j--) {

int a;

a = number.bits[i] & (1 << j);

if (a) a = 1;

cout << a;

}

cout << " ";

}

int n, i, s, kolvo;

cout << "\nВведите номер младшего бита (1 до 32): ";

cin >> n;

cout << "\nСколько бит вы хотите изменить? ";

cin >> kolvo;

n -= 2;

// Изменение указанных битов в двоичном представлении

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

{

cout << "\nСостояние бита (1 или 0): ";

cin >> s;

n += 1;

int groups = n / 8;

int ost = n % 8;

if (s == 0) number.bits[groups] = number.bits[groups] & (~(1 << ost));

if (s == 1) number.bits[groups] = number.bits[groups] | (1 << ost);}

// Отображение измененного двоичного представления и исходного числа

cout << endl;

for (int i = 3; i >= 0; i--)

{

for (int j = 7;j >= 0;j--)

{

int a;

a = number.bits[i] & (1 << j);

if (a) a = 1;

cout << a;

}

cout << " ";

}

cout << "\nЧисло в исходном формате: " << number.chislo;

// Подсказка для выхода из раздела

SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_INTENSITY);

cout << endl << "[Для выхода из этого раздела нажмите любую клавишу]\n";

_getch();

system("CLS");

break;

case 1://дробное число

system("CLS");

SetConsoleTextAttribute(hStdOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);

cout << "Выбран тип данных: double. Введите символы: ";

cin >> number.cifra;

// Отображение двоичного представления введенного дробного числа

for (int i = 7; i >= 0; i--) {

for (int j = 7; j >= 0; j--) {

int a;

a = number.bits[i] & (1 << j);

if (a) a = 1;

cout << a;

}

cout << " ";

}

int n1, i1, s1, kolvo1;

cout << "\nВведите номер младшего бита (1 до 64): ";

cin >> n1;

cout << "\nСколько бит вы хотите изменить? ";

cin >> kolvo1;

n1 -= 2;

// Изменение указанных битов в двоичном представлении

for (int i1 = 0; i1 < kolvo1;i1++)

{

cout << "\nСостояние бита (1 или 0): ";

cin >> s1;

n1 += 1;

int groups = n1 / 8;

int ost = n1 % 8;

if (s1 == 0) number.bits[groups] = number.bits[groups] & (~(1 << ost));

if (s1 == 1) number.bits[groups] = number.bits[groups] | (1 << ost);

}

cout << endl;

for (int i1 = 7; i1 >= 0; i1--)

{

for (int j = 7;j >= 0;j--)

{

int a;

a = number.bits[i1] & (1 << j);

if (a) a = 1;

cout << a;

}

cout << " ";

}

cout << "\nЧисло в исходном формате: " << number.cifra;

SetConsoleTextAttribute(hStdOut, FOREGROUND_RED | FOREGROUND_INTENSITY);

cout << endl << "[Для выхода из этого раздела нажмите любую клавишу]\n";

_getch();

system("CLS");

break;

case 2://"Выход"

exit(0);

}

break;

default:

continue;

}

}

}

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

Рисунок 3. Меню

На изображениях продемонстрирована работа программы. При запуске пользователю предлагают выбрать три пункта: два ввода, unsigned int и double соответственно, и выход.

Рисунок 4. Unsigned int

Рисунок 5. Double

П осле выбора ввода, от пользователя потребуется ввести символ. На экран выведется его значение в битах. Далее предложат ввести номер младшего бита и изменить количество бит, затем состояние бита (0 или 1). После чего выведется новое число и само значение в исходном формате. Аналогично программа работает и в случае с double и с unsigned int.

Выход подразумевает выход из программы. Стоит отметить, что в программе учтены случаи ошибки, которые могли возникнуть в процессе эксплуатации программы (неверно введенные данные и/или при ограниченном количестве действий).

Структура

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

ПЗУ

(RОM)

ОЗУ

(RAM)

Контроллер

Клавиатура

ИП

ЦП

(CPU)

Контроллер

Контроллер

СИСТЕМНАЯ ШИНА

Соседние файлы в предмете Организация ЭВМ