
2392_Смирнова_ЛР1_ЭВМ
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ВТ
отчет
по лабораторной работе №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)
Контроллер
Контроллер
СИСТЕМНАЯ ШИНА