
Лабораторная_работа_1_ЭВМ
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №1
по дисциплине «Организация ЭВМ и систем»
Тема: Исследование внутреннего представления различных
форматов данных
Студент гр. |
|
|
Преподаватель |
|
Ельчанинов М.Н. |
Санкт-Петербург
2022
Цель работы.
Знакомство с внутренним представлением различных типов данных, используемых компьютером при их обработке.
Задание на лабораторную работу.
1. Разработать алгоритм ввода с клавиатуры типов данных float и long и показать на экране их внутреннее представление в двоичной системе счисления.
2. Написать и отладить программу на языке С++, реализующую разработанный алгоритм.
3. В соответствии с заданием дополнить разработанный ранее алгоритм блоками для выполнения преобразования двоичного полученного кода исходного типа данных и последующего вывода преобразованного кода в двоичной системе счисления и в формате исходного данного.
Вид преобразования: поменять местами заданные пользователем группы рядом стоящих бит, номера младших разрядов этих групп и количество бит в группе, вводится с клавиатуры.
Схема алгоритма:
Текст программы:
#include <iostream>
#include <conio.h>
#include <locale.h>
#include <math.h>
#include <bitset>
#include <limits>
#include <climits>
#include <iterator>
#include <algorithm>
#include <string>
#include <Windows.h>
#include <vector>
#undef max
using namespace std;
int key;
int main() {
setlocale(LC_ALL, "rus");
while (key != 27) {
cout << "Выберите тип данных: 1 - float, 2 - long " << endl;
key = _getch();
if (key == '1') {
union
{
float input; // assumes sizeof(float) == sizeof(int)
int output;
} data{};
cout << "Введите число типа float: ";
for (;;) {
if ((std::cin >> data.input).good()) break;
if (std::cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Неверный ввод, повторите.\n";
}
}
std::bitset<sizeof(float)* CHAR_BIT> bits(data.output);
cout << "Двоичное представление вашего числа: " << bits << endl;
cout << "Введите количество бит в группе: ";
int size_group;
cin >> size_group;
cout << "Введите номер младшего бита в 1 группе: ";
int bit_1;
cin >> bit_1;
cout << "Введите номер младшего бита в 2 группе: ";
int bit_2;
cin >> bit_2;
int num = sizeof(bits) / sizeof(bits[0]);
//reverse(bits, num);
string string_bits = bits.to_string();
//string string_bits = "1101101";
string swap_bit_1;
string swap_bit_2;
std::reverse(string_bits.begin(), string_bits.end());
swap_bit_1 = string_bits.substr(bit_1, size_group);
swap_bit_2 = string_bits.substr(bit_2, size_group);
string temp = swap_bit_1;
swap_bit_1 = swap_bit_2;
swap_bit_2 = temp;
string_bits.replace(bit_1, size_group, swap_bit_1);
string_bits.replace(bit_2, size_group, swap_bit_2);
std::reverse(string_bits.begin(), string_bits.end());
cout << "Ваше число и результат работы: " << endl;
cout << bits << endl;
cout << string_bits << endl;
cout << "Чтобы вернуться, нажмите 0 " << endl;
key = _getch();
if (key == 0) {
system("cls");
break;
}
}
if (key == '2') {
long data;
cout << "Введите число типа long: ";
for (;;) {
if ((std::cin >> data).good()) break;
if (std::cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Неверный ввод, повторите.\n";
cout << "Введите число типа long: ";
}
}
std::bitset<16> bits(data);
//std::cout << bits << std::endl;
cout << "Двоичное представление вашего числа: " << bits << endl;
cout << "Введите количество бит в группе: ";
int size_group;
cin >> size_group;
cout << "Введите номер младшего бита в 1 группе: ";
int bit_1;
cin >> bit_1;
cout << "Введите номер младшего бита в 2 группе: ";
int bit_2;
cin >> bit_2;
//reverse(bits, num);
string string_bits = bits.to_string();
//string string_bits = "1101101";
string swap_bit_1;
string swap_bit_2;
std::reverse(string_bits.begin(), string_bits.end());
swap_bit_1 = string_bits.substr(bit_1, size_group);
swap_bit_2 = string_bits.substr(bit_2, size_group);
string temp = swap_bit_1;
swap_bit_1 = swap_bit_2;
swap_bit_2 = temp;
string_bits.replace(bit_1, size_group, swap_bit_1);
string_bits.replace(bit_2, size_group, swap_bit_2);
std::reverse(string_bits.begin(), string_bits.end());
cout << "Ваше число и результат работы: " << endl;
cout << bits << endl;
cout << string_bits << endl;
cout << "Чтобы вернуться, нажмите 0 " << endl;
key = _getch();
if (key == 0) {
system("cls");
break;
}
}
}
return 0;
}