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

ОргЭВМ_лаб1

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

Санкт-Петербургский государственный электротехнический университет имени В. И. Ленина

Кафедра Вычислительной техники

ОТЧЕТ

По лабораторной работе № 1 в дисциплине ОргЭВМ

Работу выполнил: Иванов Серафим Кириллович, 0392

Работу проверил: Ельчанинов М. Н

2021 год

Задание на работу:

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

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

  3. Установить в заданное пользователем состояние определённое количество

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

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

*блок схему предоставить не представляется возможным, поскольку из-за ее громоздкости она будет малоинформативной*

Ниже предоставлен код. Обращаю внимание на то, что он разбит на файлы, поэтому понять может быть сложно. Во избежание этого код продублирован на 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 алгоритма)

  1. Тот, который представлен в отчете, алгоритм использует бинарную логику и арифметику указателей.

  2. Первая версия решения поставленной задачи – алгоритм в явном виде пересчитывает числа и не работает с памятью непосредственно

Я готов предоставить код альтернативной реализации, но для экономии места в отчет он не включен.

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

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