ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 15.12.2021

Просмотров: 336

Скачиваний: 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


Shape15Shape14

1100101110

0101100100

Shape16

0000000000

1100101110

0000000000

1100101110

1100101110

0000000000

0000000000

1100101110

0000000000

0000000000

Shape17

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

Shape18

00, 00001001011


00, 10011101100 - 1260

Shape19

00, 10010110000 - 1200


00, 010011101100

Shape20

00, 100101100000 - 2048+256+64+32=2400



00, 010011101100

Shape21

11, 011010100000

11, 101110001100 0,

Shape22



11, 011100011000

Shape23

00, 100101100000

100, 000001111000 0, 1

Shape24



00, 000011110000

Shape25

11, 011010100000

11, 011110010000 0, 10

Shape26



10, 111100100000

Shape27

00, 100101100000

11, 100010000000 0, 100

Shape28



11, 000100000000

Shape29

00, 100101100000

11, 101001100000 0, 1000

Shape30



11, 010011000000

Shape31

00, 100101100000

11, 111000100000 0, 10000

Shape32



11, 110001000000

Shape33

00, 100101100000

100, 010110100000 0, 100001

Shape34



00, 101101000000

Shape35

11, 011010100000

Shape36

100, 000111100000 0, 1000011




00, 001111000000

Shape37

11, 011010100000

Shape38

11, 101001100000 0, 10000110



11, 010011000000

Shape39

00, 100101100000

Shape40

11, 111000100000 0, 100001100



11, 110001000000

Shape41

00, 100101100000

Shape42

100, 010110100000 0, 1000011001



00, 101101000000

Shape43

11, 011010100000

Shape44

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;

}