
ОргЭВМ_лаб1
.docx
Санкт-Петербургский государственный электротехнический университет имени В. И. Ленина
Кафедра Вычислительной техники
ОТЧЕТ
По лабораторной работе № 1 в дисциплине ОргЭВМ
Работу выполнил: Иванов Серафим Кириллович, 0392
Работу проверил: Ельчанинов М. Н
2021 год
Задание на работу:
Разработать алгоритм ввода с клавиатуры числе, формата double и unsigned int и показать на экране их внутреннее представление в двоичной системе счисления.
Написать и отладить программу на языке С++, реализующую разработанный алгоритм.
Установить в заданное пользователем состояние определённое количество
рядом стоящих бит, номер младшего из которых, как и всё остальное, вводится с
клавиатуры типа данных и последующего вывода преобразованного кода в двоичной системе счисления и в формате исходного данного
*блок схему предоставить не представляется возможным, поскольку из-за ее громоздкости она будет малоинформативной*
Ниже предоставлен код. Обращаю внимание на то, что он разбит на файлы, поэтому понять может быть сложно. Во избежание этого код продублирован на GitHub, при желании вы можете с ним ознакомиться.
//main file
#include "My_double.h"
#include "My_uint.h"
int main()
{
std::cout << "Enter your double value: \x1b[32m";
double value;
std::cin >> value;
std::cout << "\x1b[0m";
My_double my(value);
std::cout << "Your nuber at IEEE: \n";
my.show_bits();
my.change_bits();
std::cout << "\nEnter your unsigned int value: \x1b[32m";
unsigned int value2;
std::cin >> value2;
std::cout << "\x1b[0m";
My_uint my2(value2);
std::cout << "Your nuber at IEEE: \n";
my2.show_bits();
my2.change_bits();
}
//class double file
#include "My_double.h"
#include "My_uint.h"
int main()
{
std::cout << "Enter your double value: \x1b[32m";
double value;
std::cin >> value;
std::cout << "\x1b[0m";
My_double my(value);
std::cout << "Your nuber at IEEE: \n";
my.show_bits();
my.change_bits();
std::cout << "\nEnter your unsigned int value: \x1b[32m";
unsigned int value2;
std::cin >> value2;
std::cout << "\x1b[0m";
My_uint my2(value2);
std::cout << "Your nuber at IEEE: \n";
my2.show_bits();
my2.change_bits();
}
//class double realisation
#include "My_double.h"
#include <conio.h>
void My_double::calculate()
{
unsigned int* c = (unsigned int*)(&value);
first = *c;
second = *(c + 1);
for (int i = 0; i < 32; i++)
{
bits[31 - i] = (second >> i) & 1;//((second << i) & 0x80000000) >> 31;
}
for (int i = 0; i < 32; i++)
{
bits[31 - i + 32] = (first >> i) & 1;//((first << i) & 0x80000000) >> 31;
}
}
void My_double::show_bits()
{
std::cout << "\x1b[31m";
std::cout << bits[0];
std::cout << "\x1b[32m";
for (int i = 1; i < 12; i++)
{
std::cout << bits[i];
}
std::cout << "\x1b[36m";
for (int i = 12; i < 64; i++)
{
std::cout << bits[i];
}
std::cout << "\x1b[0m";
}
void My_double::change_bits()
{
//std::cout << "\n" << first << " " << second << "\n";
int begin = 0;
int quantity = 0;
std::cout << "\nEnter the start point to continue: ";
std::cin >> begin;
while (begin < 1 || begin > 64)
{
std::cout << "\x1b[31mFail, try again: ";
std::cin >> begin;
}
std::cout << "\x1b[0m";
std::cout << "Enter the quantity of bits you plan to change: ";
std::cin >> quantity;
while (quantity < 1 || quantity > 65 - begin)
{
std::cout << "\x1b[31mFail, try again: ";
std::cin >> quantity;
}
std::cout << "\x1b[0m";
std::cout << "Enter new values:\n\n";
show_bits();
std::cout << "\n\x1b[2A";
for (int i = 0; i < begin - 1; i++)
{
std::cout << ' ';
}
char bit = 0;
std::cout << "\x1b[33m";
for (int i = 0; i < quantity; i++)
{
bit = _getch();
bits[begin - 1 + i] = bit - '0';
if ((begin - 1 + i) < 31)
{
if(bit - '0' == 1)
second |= (1 << 32 - begin - i);
else
second &= ~(1 << 32 - begin - i);
}
else
{
if (bit - '0' == 1)
first |= (1 << 64 - begin - i);
else
first &= ~(1 << 64 - begin - i);
}
std::cout << bit;
}
std::cout << "\x1b[0m\n\n";
//std::cout << "\n" << first << " " << second << "\n";
unsigned int shoot_in_the_leg[2];
shoot_in_the_leg[0] = first;
shoot_in_the_leg[1] = second;
double* p_new_value = (double*)shoot_in_the_leg;
value = *p_new_value;
std::cout << "New value will be: \x1b[32m";
std::cout << value;
std::cout << "\x1b[0m\n";
}
//class uint
#pragma once
class My_uint
{
private:
unsigned int value;
unsigned int bits[32];
void calculate();
public:
My_uint(unsigned int _value) : value(_value), bits{}
{
calculate();
}
void change_bits();
void show_bits();
};
//uint realization
#pragma once
#include "My_uint.h"
#include <iostream>
#include <conio.h>
void My_uint::calculate()
{
for (int i = 0; i < 32; i++)
{
bits[i] = ((value << i) & 0x80000000) >> 31;
}
}
void My_uint::change_bits()
{
int begin = 0;
int quantity = 0;
std::cout << "\nEnter the start point to continue: ";
std::cin >> begin;
while (begin < 1 || begin > 32)
{
std::cout << "\x1b[31mFail, try again: ";
std::cin >> begin;
}
std::cout << "\x1b[0m";
std::cout << "Enter the quantity of bits you plan to change: ";
std::cin >> quantity;
while (quantity < 1 || quantity > 33 - begin)
{
std::cout << "\x1b[31mFail, try again: ";
std::cin >> quantity;
}
std::cout << "\x1b[0m";
std::cout << "Enter new values:\n\n";
show_bits();
std::cout << "\n\x1b[2A";
for (int i = 0; i < begin - 1; i++)
{
std::cout << ' ';
}
char bit = 0;
std::cout << "\x1b[33m";
for (int i = 0; i < quantity; i++)
{
bit = _getch();
bits[begin - 1 + i] = bit - '0';
if (bit - '0' == 1)
{
value |= (1 << 32 - begin - i);
}
else
{
value &= ~(1 << 32 - begin - i);
}
std::cout << bit;
}
std::cout << "\x1b[0m\n\n";
std::cout << "New value will be: \x1b[32m";
std::cout << value;
std::cout << "\x1b[0m\n";
}
void My_uint::show_bits()
{
std::cout << "\x1b[34m";
for (int i = 0; i < 32; i++)
{
std::cout << bits[i];
}
std::cout << "\x1b[0m";
}
Важное пояснение:
Было написано 2 варианта решение (соответственно, 2 алгоритма)
Тот, который представлен в отчете, алгоритм использует бинарную логику и арифметику указателей.
Первая версия решения поставленной задачи – алгоритм в явном виде пересчитывает числа и не работает с памятью непосредственно
Я готов предоставить код альтернативной реализации, но для экономии места в отчет он не включен.
Примеры запуска программы: