ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 15.12.2021
Просмотров: 342
Скачиваний: 3
2.3 Завдання 3
Знайти добуток чисел K=814 та L=356 в двійковій системі числення на основі алгоритму множення з старших розрядів множника.
K=814
Рисунок 2.3.1 – переведення числа 814 у двійкову систему числення
81410 = 11001011102
L=356
Рисунок 2.3.2 – переведення числа 356 у двійкову систему числення
35610 =1011001002
Kпр = 00, 1100101110
Lпр = 00, 0101100100
1100101110
0101100100
0000000000
1100101110
0000000000
1100101110
1100101110
0000000000
0000000000
1100101110
0000000000
0000000000
1000110101111111000
Рисунок 2.3.3 – знаходження добутоку чисел 814 та 356 в двійковій системі числення на основі алгоритму множення з старших розрядів множника
Відповідь: І=1000110101111111000
2.4 Завдання 4
Знайти частку та залишок від ділення числа M=1260 на R=75, використовуючи алгоритм з відновленням залишку.
Для подальшого рішення завдання знаходимо за стандартним алгоритмом число M=1260 в двійковому варіанті
Рисунок 2.4.1 – переведення числа 1260 у двійкову систему числення
126010 =100111011002
Mпр = 00, 10011101100
R =75
Рисунок 2.4.2 – переведення числа 75 у двійкову систему числення
7510 =10010112
Rпр = 00, 1001011
Оскільки, ми не можемо поділити число 1260 на число 75, то ми зсуваємо прямий код числа 75 вліво, доти, доки воно не стане більшим за число 1260. В результаті ми зсунули 75 на 5 одиниць вліво і отримали 00, 100101100000 в двійковій системі числення, яке рівне числу 2400 в десятковій системі числення.
00, 10011101100
00, 00001001011
00, 10011101100 - 1260
00, 10010110000 - 1200
00, 010011101100
00, 100101100000 - 2048+256+64+32=2400
00, 010011101100
11, 011010100000
11, 101110001100 0,
11, 011100011000
00, 100101100000
100, 000001111000 0, 1
00, 000011110000
11, 011010100000
11, 011110010000 0, 10
10, 111100100000
00, 100101100000
11, 100010000000 0, 100
11, 000100000000
00, 100101100000
11, 101001100000 0, 1000
11, 010011000000
00, 100101100000
11, 111000100000 0, 10000
11, 110001000000
00, 100101100000
100, 010110100000 0, 100001
00, 101101000000
11, 011010100000
100, 000111100000 0, 1000011
00, 001111000000
11, 011010100000
11, 101001100000 0, 10000110
11, 010011000000
00, 100101100000
11, 111000100000 0, 100001100
11, 110001000000
00, 100101100000
100, 010110100000 0, 1000011001
00, 101101000000
11, 011010100000
100, 000111100000 0, 10000110011
В результаті ми отримали таке число - 00, 10000110011. Оскільки ми повинні отримати частку та залишок від ділення числа 1260 на 75, то перенесемо кому вправо на 5 одиниць. Остаточним результатом ділення є число:
10000, 110011
2.5 Завдання 5
Розробити програму для додавання та віднімання чисел з плаваючою комою в двійковій арифметиці для доповняльного коду. Провести тестування роботи програми.
Алгоритм виконання дій однаковий і на С++, і на мові Pascal:
Програма приймає 4 числа: мантису і порядок числа А, мантису і порядок числа B. Результатом програми є мантиса і порядок числа С, що є сумою чисел А і B.
Програма працює з цілими числами, як з додатніми, так і від'ємними. Тобто фактично вона виконує додавання та віднімання чисел з плаваючою комою в двійковій системі числення.
Програма складається з декількох процедур. Розглянемо кожну з них. Процедура dbl переводить мантиси і порядки заданих чисел і записує двійкові коди до відповідних масивів. Процедура dpvn переводить отримані двійкові коди у доповняльні коди. Зауважимо, що доповняльний код додатного числа рівний прямому коду цього числа. Процедура sdvg проводить сдвиг мантиси більшого числа на відповідну кількість розрядів вліво. Тим самим зрівнюються порядки доданків для подальших дій. Процедура sum безпосередньо виконує процес додавання мантис чисел за правилами додавання. Процедури dpvnp i dpvnc переводять отримані коди мантиси і порядку у прямий код. Головна фунція main викликає по черзі описані вище процедури і виводить на екран проміжні результати і відповідь.
а) Розробка програми мовою Pascal:
Дана програма (лістинг наведено у додатку А) розроблена для додавання та віднімання чисел з плаваючою комою в двійковій арифметиці для доповняльного коду.
Проведемо тестування програми:
Рисунок 2.5.1 – тестування програми на мові Pascal
Рисунок 2.5.2 – тестування програми на мові Pascal
б) Розробка програми на мові С++:
Дана програма (лістинг наведено у додатку B) виконує перевід з вісімкової у десяткову систему числення цілі числа.
Проведемо тестування роботи програми:
Рисунок 2.5.3 – тестування програми на мові С
Рисунок 2.5.4 – тестування програми на мові С
ВИСНОВКИ
В процесі налагодження програм та в деяких інших ситуаціях у програмуванні актуальною є проблема переведення чисел з однієї позиційної системи числення в іншу. Якщо основа нової системи числення дорівнює деякому степеню старої системи числення, то алгоритм переводу дуже простий: потрібно згрупувати справа наліво розряди в кількості, що дорівнює показнику степеня і замінити цю групу розрядів відповідним символом нової системи числення. Цим алгоритмом зручно користуватися коли потрібно перевести число з двійкової системи числення у вісімкову або шістнадцяткову. Наприклад, 101102=10 110=268, 10111002=101 1100=5C8
Якщо основа однієї системи числення дорівнює деякому степеню іншої, то перевід тривіальний. У протилежному випадкові користуються правилами переведення числа з однієї позиційної системи числення в іншу (найчастіше для переведення із двійкової, вісімкової та шістнадцяткової систем числення у десяткову, і навпаки).
При дослідженні арифметичних операцій у різних системах числення, я звернув увагу на переваги двійкової системи для виконання обчислень. Рекомендація з використання двійкової системи для побудови обчислювальних машин в літературі вперше зустрічається у французького інженера Р.Вальта (1931). До такої ж думки дійшли одночасно і незалежно німець К.Цузе (1934), американець болгарського походження Д.Атанасов (1937).
Зацікавившись дослідженням систем числення та їх використанням на ЕОМ, я дізнався, що найбільш економічними і найбільш швидкодійнішими були б комп’ютери, якби вони використовували систему числення з основою 2,718281828....(основа натуральних логарифмів).
Але технічно вони були б дуже складними. Реалізація близької до неї трійкової системи теж не спрощує конструкцію.
Отже, найближчою до оптимальної залишається двійкова система, яка й застосовується в сучасних комп’ютерах.
ПЕРЕЛІК ПОСИЛАНЬ
1. Фримен Эр., Фримен Эл., Бейтс Б., Сьерра К: Паттерны проектирования Под общ. – К.: Выща шк. Головное изд-во, 2011. – 656 с., 124 ил. – Библиогр.: 21 назв.
2. Краскевич В. Е., К. Х. Зеленский, В. И. Гречко. Численные методы в инженерных исследованиях -К.: Вища шк. Головное изд-во,2002 -263 с.
3. Савельев А. Я. Прикладная теория цифровых автоматов: Учеб. для вузов по спец. ЭВМ. – М.: Высш. шк., 2005 – 272 с.: ил.
4. Пєтух А.М., Войтко В. В. Прикладна теорія цифрових автоматів. Навчальний посібник. – Вінниця: ВНТУ, 2001. – 77 с.
5. Каган Б.М. Электронные вычислительные машины и системы, М.: Энергоатомиздат, 2004.
6. А. В. Рудаков. Технология разработки программных продуктов. Учебное пособие. – К. : Академия, 2006. – 180 с.
7. Рабинович З.Л., Рамалаускас В.А. Типові операції в обчислювальних машинах. – К. : Техніка, 2000. – 264 с.
8. Напрасник М.В. Мікропроцесори і мікро ЕОМ: Учебн. посібник для техн. – М. : Вища школа, 2001. – 192 с.
9. Зубчук В.И.,Сигорский В.П., Шкуро А.Н. Довідник по цифровий схемотехниці. – К. : Техніка, 2008. – 448 с.
10. В. И. Грекул, Г. Н. Денищенко, Н. Л. Коровкина Проектирование информационных систем. – М. :2005. – 240 с.
11. Фигурнов В.Э. IBM PC для користувача. - М.: ИНФРА-М, 1996. – 432 с.
12. Балашов Е.П., Григор'єв В.Л., Петров Г.А. Мікро- і мини-ЭВМ: Навчальний посібник для вузів. - Л. : 2007. – 376 с.
ДОДАТОК А
Лістинги програм
а)Лістинг програми на мові Pascal:
Program KursovaRobotaZhuravel;
uses crt;
var
am,bm,ap,bp,sdvig,dif : integer;
amd,apd,bmd,bpd: array[1..50] of integer;
amddp,apddp,bmddp,bpddp:array[1..50] of integer;
i,j,num,n1,n2,p:integer;
c:array[1..50] of integer;
procedure dbl(am,ap,bm,bp:integer);
begin
for i:=1 to 50 do
begin
amd[i]:=0; apd[i]:=0; bmd[i]:=0; bpd[i]:=0;
end;
if (am<0) then begin amd[1]:=1; amd[2]:=1; am:=am*-1; end;
if (ap<0) then begin apd[1]:=1; apd[2]:=1; ap:=ap*-1; end;
if (bm<0) then begin bmd[1]:=1; bmd[2]:=1; bm:=bm*-1; end;
if (bp<0) then begin bpd[1]:=1; bpd[2]:=1; bp:=bp*-1; end;
num:=50; while (am>0) do
begin
amd[num]:=am mod 2; am:=am div 2; num:=num-1;
end;
num:=50; while (ap>0) do
begin
apd[num]:=ap mod 2; ap:=ap div 2; num:=num-1;
end;
num:=50; while (bm>0) do
begin
bmd[num]:=bm mod 2; bm:=bm div 2; num:=num-1;
end;
num:=50; while (bp>0) do
begin
bpd[num]:=bp mod 2; bp:=bp div 2; num:=num-1;
end;
end;
procedure dpvn;
begin
for i:=1 to 50 do
begin
amddp[i]:=amd[i];
apddp[i]:=apd[i];
bmddp[i]:=bmd[i];
bpddp[i]:=bpd[i];
end;
if (amddp[1]=1) then
begin
p:=1;
for i:=3 to 50 do amddp[i]:=1-amddp[i];
for i:=50 downto 3 do
begin
p:=p+amddp[i]; amddp[i]:=p mod 2; p:=p div 2;
end;
end;
if (apddp[1]=1) then
begin
p:=1;
for i:=3 to 50 do apddp[i]:=1-apddp[i];
for i:=50 downto 3 do
begin
p:=p+apddp[i]; apddp[i]:=p mod 2; p:=p div 2;
end;
end;
if (bmddp[1]=1) then
begin
p:=1;
for i:=3 to 50 do bmddp[i]:=1-bmddp[i];
for i:=50 downto 3 do
begin
p:=p+bmddp[i]; bmddp[i]:=p mod 2; p:=p div 2;
end;
end;
if (bpddp[1]=1) then
begin
p:=1;
for i:=3 to 50 do bpddp[i]:=1-bpddp[i];
for i:=50 downto 3 do
begin
p:=p+bpddp[i]; bpddp[i]:=p mod 2; p:=p div 2;
end;
end;
end;
procedure sdvg(n:integer);
begin
if (n>0) then
begin
for i:=1 to 50 do apddp[i]:=bpddp[i];
for j:=1 to n do
begin
for i:=3 to 49 do amddp[i]:=amddp[i+1];
amddp[50]:=0;
end;
end;
if (n<0) then
begin
n:=n*-1;
for i:=1 to 50 do bpddp[i]:=apddp[i];
for j:=1 to n do
begin
for i:=3 to 49 do bmddp[i]:=bmddp[i+1];
bmddp[50]:=0;
end;
end;
end;
procedure sum(znak:integer);
begin
p:=0;
if (znak=0) then
begin
for i:=50 downto 3 do
begin
p:=p+amddp[i]+bmddp[i];
c[i]:=p mod 2;
p:=p div 2;
end;
c[1]:=amddp[1]; c[2]:=c[1];
end;
if (znak=1) then
begin
for i:=50 downto 1 do
begin
p:=p+amddp[i]+bmddp[i];
c[i]:=p mod 2;
p:=p div 2;
end;
end;
end;
procedure dpvnc;
begin
if (c[1]=1) then
begin
p:=1;
for i:=3 to 50 do c[i]:=1-c[i];
for i:=50 downto 3 do
begin
p:=p+c[i];
c[i]:=p mod 2;
p:=p div 2;
end;
end;
end;
procedure dpvnp;
begin
if (apddp[1]=1) then
begin
p:=1;
for i:=3 to 50 do apddp[i]:=1-apddp[i];
for i:=50 downto 3 do
begin
p:=p+apddp[i];
apddp[i]:=p mod 2;
p:=p div 2;
end;
end;
end;
BEGIN
clrscr;
dif:=0; n1:=3; n2:=3;
writeln('Vvedit mantisy i poryadok 4isla A. A= m * 2^p.');
readln(am,ap);
writeln('Vvedit mantisy i poryadok 4isla B. B= m * 2^p.');
readln(bm,bp);
sdvig:=ap-bp;
if (am*bm<0) then dif:=1;
dbl(am,ap,bm,bp);
dpvn;
sdvg(sdvig);
for i:=1 to 50 do begin write(amddp[i]); if (i=2) then write('.'); end;
writeln;
for i:=1 to 50 do begin write(bmddp[i]); if (i=2) then write('.'); end;
writeln;
for i:=1 to 50 do write('-'); writeln;
sum(dif);
for i:=1 to 50 do begin write(c[i]); if (i=2) then write('.'); end;
writeln;
dpvnc; dpvnp;
while (c[n1]=0) do n1:=n1+1;
while (apddp[n2]=0) do n2:=n2+1;
writeln('Result:');
write(c[1],c[2],'.');
for i:=n1 to 50 do write(c[i]); write(' * 2^');
write(apddp[1],apddp[2],'.');
for i:=n2 to 50 do write(apddp[i]); writeln;
readln;
END.
б)Лістинг програми на мові C++:
#include <iostream>
using namespace std;
#define ABS(a) ((a>0)?a:-(a))
#define FOR(i,a,b) for (i=(a);i<(b);i++)
#define FORR(i,a,b) for (i=(a);i>=(b);i--)
int Am,Ap,Bm,Bp,sdvig,dif=0; //числа, здвиг, різність знаків чисел
int Amd[50],Apd[50],Bmd[50],Bpd[50]; //масиви двійкового запису мантис та порядків
int Amddp[50],Apddp[50],Bmddp[50],Bpddp[50]; //масиви двійкового запису мантис та порядків
//в доповняльних кодах
int num,i,j,n1=2,n2=2; //допоміжні змінні
int C[50]; //мантиса результату
void dbl(int Am,int Ap,int Bm,int Bp) // переведення чисел у двійковий код
{
FOR(i,0,50) {Amd[i]=Apd[i]=Bmd[i]=Bpd[i]=0;}
if (Am<0) Amd[0]=Amd[1]=1;
if (Ap<0) Apd[0]=Apd[1]=1;
if (Bm<0) Bmd[0]=Bmd[1]=1;
if (Bp<0) Bpd[0]=Bpd[1]=1;
Am=ABS(Am); Ap=ABS(Ap); Bm=ABS(Bm); Bp=ABS(Bp);
num=49; do { Amd[num]=Am&1; Am>>=1; num--;} while (Am>0);
num=49; do { Apd[num]=Ap&1; Ap>>=1; num--;} while (Ap>0);
num=49; do { Bmd[num]=Bm&1; Bm>>=1; num--;} while (Bm>0);
num=49; do { Bpd[num]=Bp&1; Bp>>=1; num--;} while (Bp>0);
}
void dpvn() // переведення чисел у доповняльний код
{
FOR(i,0,50)
{
Amddp[i]=Amd[i];
Apddp[i]=Apd[i];
Bmddp[i]=Bmd[i];
Bpddp[i]=Bpd[i];
}
if (Amddp[0]==1)
{
int p=1;
FOR(i,2,50) Amddp[i]=1-Amddp[i];
FORR(i,49,2) {p+=Amddp[i]; Amddp[i]=p%2; p/=2; }
}
if (Apddp[0]==1)
{
int p=1;
FOR(i,2,50) Apddp[i]=1-Apddp[i];
FORR(i,49,2) {p+=Apddp[i]; Apddp[i]=p%2; p/=2; }
}
if (Bmddp[0]==1)
{
int p=1;
FOR(i,2,50) Bmddp[i]=1-Bmddp[i];
FORR(i,49,2) {p+=Bmddp[i]; Bmddp[i]=p%2; p/=2; }
}
if (Bpddp[0]==1)
{
int p=1;
FOR(i,2,50) Bpddp[i]=1-Bpddp[i];
FORR(i,49,2) {p+=Bpddp[i]; Bpddp[i]=p%2; p/=2; }
}
}
void dpvnc() // переведення мантиси результату у прямий код
{
if (C[0]==1)
{
int p=1;
FOR(i,2,50) C[i]=1-C[i];
FORR(i,49,2) {p+=C[i]; C[i]=p%2; p/=2; }
}
}
void dpvnp() // переведення порядку результату у прямий код
{
if (Apddp[0]==1)
{
int p=1;
FOR(i,2,50) Apddp[i]=1-Apddp[i];
FORR(i,49,2) {p+=Apddp[i]; Apddp[i]=p%2; p/=2; }
}
}
void sdvg(int n) // здвиг числа з більшим порядком вліво
{
if (n>0)
{
FOR(i,0,50) Apddp[i]=Bpddp[i];
FOR(j,0,n) { FOR(i,2,49) Amddp[i]=Amddp[i+1]; Amddp[49]=0; }
}
if (n<0)
{
n=ABS(n);
FOR(i,0,50) Bpddp[i]=Apddp[i];
FOR(j,0,n) { FOR(i,2,49) Bmddp[i]=Bmddp[i+1]; Bmddp[49]=0; }
}
}
void sum(int znak) // процес додавання
{
int p=0;
if (znak==0)
{
FORR(i,49,2)
{
p=p+Amddp[i]+Bmddp[i];
C[i]=p%2;
p/=2;
}
C[0]=C[1]=Amddp[0];
}
else
{
FORR(i,49,0)
{
p=p+Amddp[i]+Bmddp[i];
C[i]=p%2;
p/=2;
}
}
}
int main()
{
cout << "Vvedit' mantusy i poryadok chusla A. A = m * 2^p.\n";
cin >> Am >> Ap;
cout << "Vvedit' mantusy i poryadok chusla B. B = m * 2^p.\n";
cin >> Bm >> Bp;
sdvig=Ap-Bp; if (Am*Bm<0) dif=1;
dbl(Am,Ap,Bm,Bp);
dpvn();
sdvg(sdvig);
FOR(i,0,50) {cout << Amddp[i]; if (i==1) cout << '.'; if (i==49) cout << endl;}
cout << "+\n";
FOR(i,0,50) {cout << Bmddp[i]; if (i==1) cout << '.'; if (i==49) cout << endl;}
sum(dif);
cout << "=\n";
FOR(i,0,50) {cout << C[i]; if (i==1) cout << '.'; if (i==49) cout << endl << endl;}
dpvnc(); dpvnp();
while (C[n1]==0) n1++; while (Apddp[n2]==0) n2++;
cout << "Result : \n";
cout << C[0] << C[1] << "."; FOR(i,n1,50) cout << C[i]; cout << " * 2 ^ ";
cout << Apddp[0] << Apddp[1] << "."; FOR(i,n2,50) cout << Apddp[i]; cout << endl;
return 0;
}