Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
1. Лабораторная работа №1.
«Преобразование целых десятичных чисел в двоичный вид».
Выполненные работы необходимо присылать тьютору по адресу michnick@aspu.ru. Студенту необходимо выбрать себе один вариант и реализовать программу на любом языке компилируемом языке программирования. Тьютору предоставлять откомпилированный вариант и полные исходные тексты.
Целью данной работы является моделирование преобразований целочисленных величин как в операционной системе, так и в процессоре.
1.1 Задание на лабораторную работу.
С клавиатуры вводится целое число. Необходимо вывести его двоичное представление на экран.
Программа должна поддерживать все целочисленные типы данных языка реализации (char, int, long int, unsigned int, unsigned long int для языка C/C++, integer, byte, word, shorting, longint для Pascal/Delphi).
Отрицательные числа выводятся в дополнительном коде.
Необходимо также решить обратную задачу: преобразовать двоичное число в десятичный вид.
Замечания:
1. Дополнительный код образуется из прямого путем инверсии бит и прибавления единицы:
Пример: -5: 5 = 00000101, -5 = not(5)+1 = 11111010+1 = 11111011
2. Запрещается использовать для машинно-зависимые методы и библиотеки языков программирования.
1. В качестве одного из вариантов решения предлагается следующие алгоритм на псевдоязыке:
program Translate1;
s : string;
begin
enter(a);
s:=;
while a<>0 do
if (abs(a) mod 2) then s:=1+s else s:=0+s;
a:=abs(a) div 2;
end while;
if a<0 then
mind:=0;
for i:=1 to 8 do
k:=val(s[8-i+1])+1+mind;
s[8-i+1]:=k;
if k=2 then begin
s[8-i+1]:=0; mind:=1;
endif
if k=3 then begin
s[8-i+1]:=1; mind:=1;
endif
endfor
endif
end;
где div и mod - операции целочисленного деления и деления по модулю соответственно.
program Translate1;
s : string;
begin
enter(a);
s:=;
while a<>0 do
if (abs(a) shr 1) and (1 shl (sizeof(a)+1) + 1) then s:=1+s else s:=0+s;
a:=abs(a) shr 2;
end while;
if a<0 then
mind:=0;
for i:=1 to 8 do
k:=val(s[8-i+1])+1+mind;
s[8-i+1]:=k;
if k=2 then begin
s[8-i+1]:=0; mind:=1;
endif
if k=3 then begin
s[8-i+1]:=1; mind:=1;
endif
endfor
endif
end;
где shr и sizeof - операции сдвига вправо и определения размера типа в битах соответственно.
С клавиатуры вводится целое число. Необходимо вывести его двоичное представление на экран. Ниже приведен разработанный код:
Dim d As Long, j As Integer, u As String /// объявляем переменные
For i = 0 To 31 ///на форме обнуляем массив двоичного числа
Text2(i).Text = "0"
Next
If (Val(Text1.Text) >= -2147483648# And Val(Text1.Text) <= 2147483647 And
Val(Text1.Text) <> 0) Then /// проверка на допустимые значения
d = Val(Text1.Text) ///считываем число в переменную d
i = 32
While (d <> 0) /// и пока она не равна нулю делим на два с остатком
i = i - 1
If (d Mod 2) Then
Text2(i).Text = "1"
Else
Text2(i).Text = "0"
End If
d = d \ 2
Wend
d = Val(Text1.Text) /// еще раз считываем число
If d < 0 Then /// если оно отрицательно
Invert_cod_For_dec_in_bin /// вызываем процедуру
End If
Else: MsgBox "Vvedite celoi chislo -2.147.483.648 do 2.147.483.647!", vbOKOnly, "Oshibka"
End If
Код процедуры Invert_cod_For_dec_in_bin :
Sub Inversia()
For i = 31 To 0 Step -1 ///начинаем идти с конца массива и меняем нули на единицы и наоборот
If Val(Text2(i).Text) = 0 Then
Text2(i).Text = "1"
Else
Text2(i).Text = "0"
End If
Next i
///побайтовое прибавление единицы
///начинаем идти с конца массива и как только находим первый ноль меняем его на единицу и все единицы до него меняем на нули
For i = 31 To 0 Step -1
If Text2(i).Text = "0" Then
Text2(i).Text = "1"
For j = i + 1 To 31
Text2(j).Text = 0
Next
Exit For
End If
Next i
End Sub
Разработанный код:
Dim d As Long, j As Integer, u As String /// объявляем переменные
j = 0
d = 0
If Val(Text2(0).Text) = 0 Then ///если данное двоичное число положительно т.е. старший бит равен нулю, то переводим
For i = 31 To 0 Step -1
Text1.Text = Val(Text1.Text) + (Val(Text2(i).Text) * 2 ^ j)
j = j + 1
Next i
Else ///если отрицательно
Invert_cod_For_bin_in_dec ///вызываем процедуру
d = 0
j = 0
For i = 31 To 0 Step -1 ///формируем десятичное число в виде строки
Text1.Text = Val(Text1.Text) + (mas(i) * 2 ^ j)
j = j + 1
Next i
u = "-" + Text1.Text ///помещаем знак минус вначале строки
Text1.Text = u
End If
Код процедуры Invert_cod_For_bin_in_dec :
Dim mas(0 To 31) As Integer
Sub Inversia2()
For i = 31 To 0 Step -1 ///начиная идти с конца массива, записываем каждый бит в массив mass и меняем нули на единицы и наоборот
mas(i) = Val(Text2(i).Text)
If mas(i) = 0 Then
mas(i) = 1
Else mas(i) = 0
End If
Next i
///побайтовое прибавление единицы
///начинаем идти с конца массива и как только находим первый ноль меняем его на единицу и все единицы до него меняем на нули
For i = 31 To 0 Step -1
If mas(i) = 0 Then
mas(i) = 1
For j = i + 1 To 31
mas(i) = 0
Next
Exit For
End If
Next i
End Sub