Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / К курсовой / Методи побудови алгоритмів та їх аналіз / Інформатика_1 (методи побудови алгоритмівта та їх аналіз).doc
Скачиваний:
87
Добавлен:
30.05.2020
Размер:
2.5 Mб
Скачать

Поняття систем числення

Під системою числення розуміють сукупність правил на-йменування та запису чисел.

Справді, для того щоб запропонувати свою власну систему числення, достатньо визначити символи для позначення еле-ментів, з яких потім будуть формуватися числа, правила їх формування та правила виконання дій у цій системі числення. Отже, якщо у вас є бажання, можете проекспериментувати, за-шифрувавши таким чином деяку числову інформацію.

Кількість символів, за допомогою яких можна записати будь-яке число в даній системі числення, називається осно­вою системи числення.

26

Тепер можна пояснити, чому система числения, з якою ви знайомі з дитинства і якою користуються всі навколо вас, нази-вається десятковою. Саме десять цифр міститься в інтервалі між 0 та 9.

Мабуть, цікаво дізнатися, гцо люди не завжди користува-лися саме десятковою системою числення. Раніше у світі було відомо багато інших систем числення. Це можна пояснити тим, що окремі групп людей жили досить відокремлено одні від одних і стосунки між ними були дуже обмежені.

Наприклад, поряд із десятковою системою числення існува-

ла ще й дванадцяткова. Залишки її є і в наш час. Інколи замість

«дванадцять» кажемо «дюжина». Сервіруючи святковий стіл,

рахуємо виделки, ложки, ножі порціями по дванадцять, всі

• сервізи комплектуются на дванадцять персон.

Багато африканських племен користувалися п'ятірковою системою числення.

У народів майя та ацтеків була поширена двадцяткова си­стема числення.

Усі згадані системи числення мали анатомічне походження: двадцяткова, десяткова, п'ятіркова - від кількості пальців на руках, дванадцяткова - від дванадцяти фаланг на чотирьох пальцях однієї руки, не враховуючи великого пальця.

Були системи числення, які, за припущенням істориків, утворилися злиттям кількох систем числення. Прикладом то­му може бути система числення з основою 60, що існувала у Ва-вилоні. Є різні думки та припущення щодо утворення ЦІЄЇ системи числення. Одні дослідники вважають, що вона утвори-лася злиттям шісткової та десяткової систем числення, якими користувалися два різні племені. Інші вважають, що відбулося злиття п'ятіркової та дванадцяткової систем числення. При­найми!, мабуть, саме таким чином між ними було досягнуто згоди. Нам сьогодні складно уявити, яким же чином рахували ці люди! Але історія залишається історією.

Усі ці системи числення дуже подібні між собою, бо правила створення чисел у них однакові. Відрізняються вони лише кількістю символів, за допомогою яких записуються в них числа. Однак в історії систем числення були й інші системи, які суттєво відрізняли їх від згаданих. Розглянемо це питания детальніше.

Розрізняють два типи систем числення - позиційні та не-позиційні.

Позиційними системами числення називають такі системи, в яких «вага» кожної цифри в числі заложить від 'її місцепо-ложення в записі цього числа. Системи числення, які побу­дивши на іиших принципах, називають непозиційними.

27

Наприклад, у записі числа 1212 у десятковій системі числен­ня використано всього дві цифри 1 та 2, кожна з яких зустрі-чається в числі двічі. Перша цифра 1 зліва означає кількість тисяч у числі, а наступив одиниця - кількість десятків. Ліва цифра 2 означає кількість сотень у записаному числі, а остання цифра 2 показує кількість одиниць у числі. Цей приклад де-монструє те, що кожна цифра робить свій внесок у значения числа, який залежить від позиції цифри.

Для наведених прикладів систем числення справджується означення позиційних систем. 3 непозиційною системою ви знайомі, цією системою числення ви неодноразово користу-валися самі та зустрічали в книжках. Це римська система числення. У ній певні числа мають свое символьне позначення, а всі інші числа записуються за допомогою комбінації цих сим-волів, які в сумі дають необхідне число.

Наприклад, I - один, V - п'ять, X - десять, L - п'ятдесят, С - сто, D - п'ятсот, М - тисяча і т. д.

Наведемо приклади деяких чисел у цій системі числення та їхні аналоги у десятковій системі:

LXXXVII - 87; XCIX - 99; MLIV - 1054; CLXVI - 166.

Ви, мабуть, звернули увагу на те, що числа в римській систе-мі числення компонуються із символів у порядку спадання їх значень. Виняток складають лише числа IV (4), IX (9), XL (40), ХС (90), СМ (900) i т. д. Тобто якщо менше за «вагою» число пе­редув більшому, то його треба не додавати до результату, а від-німати. Справді, запис IV (4) компактніший, ніж ИИ, а ХС (90) -компактніший, ніж LXXXX, хоча за значениями вони рівні.

Слід зауважити, що поняття основи системи числення на непозиційні системи не поширюються.

Надалі матимемо справу лише з позиційними системами числення. Для того щоб подальша інформація не викликала зайвих труднощів, давайте спробуемо порахувати предмета у вашій кімнаті в різних системах числення. Будемо пам'ятати, що числа в будь-якій позиційній системі числення утворюють-ся комбінацією цифр цієї системи числення. А саме, коли, ра-хуючи в десятковій системі числення, ми доходимо до числа 9, то переходимо на двоцифрові числа, комбінуючи спочатку циф­ру 1 з усіма іншими цифрами (10, 11,12,..., 19), потім цифру 2 з тими самими цифрами (20, 21, 22, ..., 29) і так далі, поки не дійдемо до числа 99. Шсля цього починаемо утворювати три-цифрові числа за тими самими правилами: 100, 101, ..., 109, 110, 111, ..., 199, 200, 201, .... 999. На перший погляд досить банальні речі! Але саме розуміння цього принципу допоможе вам створювати числа у різних системах числення, коли будете

28

рахувати предмети. Для прикладу давайте розглянемо 10-ву, 8-ву та 5-ву системи числения.

10-ва: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ... 8-ва: 0, 1, 2, 3, 4, 5, 6, 7,10, 11, 12, 13, 14, 15, 16, 17, 20, ... 5-ва: 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31, ...

Бачимо, що в ycix системах числения зустрічаються одні й ті самі числа, але значения їхнє в різних системах різне. Для того щоб визначати, в якій системі числения записане дане число, вказуватимемо індексом біля цього числа основу системи чис­ления, в якій воно записане: 58, 1016, 1012.

Ще один важливий висновок зробимо з наведеного прикла­ду - чим менша основа системи числення, тим раніше з'яв-ляється в рахунку число 10, а потім 20 і т. д. Справді, адже цифр в арсеналі таких систем числення менше, тому й дово­диться раніше переходити на створення двоцифрових, трициф-рових чисел.

Зазначимо ще один цікавий факт. Виявляється, що у 10-й системі числення остання цифра 9, у 8-й - 7, а у 5-й - 4. Оскільки першою цифрою в будь-якій системі числення є циф­ра 0, остання можлива цифра в ній завжди на одиницю менша за основу цієї системи числення.

I на останок, звернімо увагу на таку закономірність:

8=10810-106.

Аналогічні рівності можна отримати при порівнянні будь-якої системи числення з десятковою: 210 = Ю2, 410 = 104, 1610 = 1016.

Щоб завершити початкове ознайомлення з позиційними системами числення, давайте порахуємо в системі числення з основою 2:

0,1,10,11,100,101,110, 111,1000, 1001,1010, 1011,1100, 1101,...

Жахливо, чи не так? Замість двоцифрового десяткового чис­ла 13 треба записувати чотирицифрове двійкове число 1101, а далі - ще більшеі Однак виявляється, що для комп'ютера це дуже зручно.

АРИФМЕТИЧНІ ДІЇ В ПОЗИЦІЙНИХ СИСТЕМАХ ЧИСЛЕННЯ

На уроках математики в початковій школі ви вивчили пра­вила користування чотирма арифметичними діями: додаван-ня ( + ), віднімання (-), множення (•) та ділення (:). Виявляєть-ся, що ці правила абсолютно однакові для всіх позиційних систем числення. Але тепер вам треба створити нові таблиці додавання та множення.

29

Перш ніж почати рахувати в різних системах числення, зробимо ще одне суттєве зауваження. Ви, мабуть, звернули увагу на те, що всі розглянуті системы числення використо-вують відомі нам цифри десяткової системи. Це тому, ЩО ЇХНЯ основа менша за десять. При цьому деякі цифри навіть вияв-ляються зайвими! Якщо ж розглянути, наприклад, шістнад-цяткову систему числення, то там справа буде зовсім іншою. Але про це трохи пізніше. А зараз не будемо забувати, що наве­ден! приклади стосуються тільки систем числення, в яких ос­нова менша за 10.

Розглянемо спочатку дію додавання. Додаватимемо числа в стовпчик по розрядах - спочатку одиниці, потім десятки, після них сотні і т. д.

Для того щоб уникнути проблем при додаванні деяких цифр, скористайтеся такою порадою: якщо сума цифр у даній системі числення перевищує 10, то доповніть спочатку перший доданок до повного «десятка» цієї системи числення, а залишок другого доданка додайте після цього до одержаного числа 10.

Приклади:

23 + 23«(23 + 13) + 13«113; 58 + 58 = (58 + 38) + 28-128; 8e + 7n«(89 + le) + 6e-169.

Наводимо приклад додавання більших чисел:

4532в

+ в

53156

14251в

Тепер розглянемо дію віднімання. Пригадаємо, що коли при відніманні в десятковій системі числення в деякому роз-ряді зменшуване менше за від'ємник, то ви позичаєте одиницю у найближчого зліва від нього розряду, значения якого більше за 0. Цей принцип застосовуеться в будь-якій позиційній системі числення. Як ілюстрацію дії віднімання розглянемо приклад:

_500628 376548 102068

Спробуйте отримати результат цього прикладу, виконавши всі дії покроково. А щоб перевірити отриманий результат, ви-конайте додавання:

376548 + 102068 = ?????„.

30

Наступна дія - множення. Хоча її можна розглядати як ба-гатократне додавання, але всі ми пам'ятаємо таблиці множен­ня, які заучували для швидкого виконання цієї дії. Звичайно, що пам'ятати таблиці множення для різних систем числення неможливо. Треба лише забути про десяткову систему числення і перейти у «світ» тієї системи числення, в якій працюємо. При пьому треба користуватися лише цифрами цієї системи числен­ня. Якщо все ж таки важко зорієнтуватися в новій системі чис­лення, то слід замінити множення на багатократне додавання.

Розглянемо приклад, результатом якого можна скористати-ся для перевірки власного результату обчислення:

х5413.

34500„

Насамкінець розглянемо дію ділення. Здається, що вона виглядає найскладнішою серед усіх арифметичних дій, але і з нею нескладно розібратися. Розглянемо такий приклад:

25467: 127 = ?_.

Виконуватимемо дію ділення у стовпчик так само, як і в десятковій системі числення.

Розглянемо перший етап ділення: 25. : 12- = ?-. Скористае-мося тим, що в якій би системі числення ми не рахували, реальна кількість того, що рахуємо, і не збільшиться, і не змен-шиться. Переведемо числа, з якими маемо справу, в десяткову систему числення і виконаємо дії в ній. Число 257 мае два сім-кових «десятки», абодвідесятковісімки: (2 • 10). = (2 ■ 7)]0 = 1410. У числі 25. ще лишилося п'ять сімкових «одиниць». Але ми знаемо, що 57 = 510, тому нам лишилося виконати дію: 1410 + -г 510 = 1910. Аналогічно переведемо число 127 у десяткову си­стему числення:

12.-(1*10 + 2)7-(1*7 + 2)10-910.

Тепер треба лише виконати дію:

1"ю := МО*

За правилами виконання дії' ділення у стовпчик треба вико­нати ділення націло, тобто виділити частку й остачу:

19 9_ 18 2

1

Зробимо висновок з отриманого результату: якщо значения 910 поміститься двічі у числі 1910, то й 127 так само двічі поміс-

31

титься у числі 257, а остача в обох випадках буде однаковою (17 - 110). Шсля такого детального пояснения подальше вико-нання дій не викликатиме труднощів:

2546,47

_147 12,

267 24,

247

12,

212,27

Доведіть, що, використовуючи такий принцип ділення в системах числення з основами, меншими за 10, завжди мати-мемо результат, цифри якого належать даній системі числен­ня. Це твердження справедливе і для систем числення з осно­вою, більшою за 10, але спершу треба домовитися, якими сим­волами позначатимемо цифри, більші за 9.

А тепер представимо у вигляді окремих функцій алгоритми виконання арифметичних дій у заданих системах числення. Для спрощення розглянемо випадок, коли основи цих систем числення не перевищують 9. В іншому випадку необхідно буде домовлятися, яким чином позначати цифри цих систем чис­лення. Обмежимося також цілими числами та відсутністю пе-ревірки коректності введения початкових даних.

Функція додавання може виглядати так:

function add (n, m: longint; p: byte): longint; var c, a: byte; k, rez: longint; begin

k := 1; с := 0; rez := 0; while (n > 0) or (m > 0) do begin

{Порозрядне підсумовування цифр двох чисел І значения с.) a:=(nmod 10) + (mmod 10) +с;

If а > = р (Якщо отримана сума більша за р,)

{то визначаємо кількість одиниць і десятків.} then begin с := a div p; a := a mod p end

else с '.= О', {У протилежному випадку кількість десятків с = 0.)

(Накопичуємо отриманий результат, додавши}

rez := rez + k * а; {наступну цифру у наступний розряд.)

к := к * 10; {Збільшуємо розрядність результату.)

{Відсікаємо оброблену цифру першого числа.} {Відсікаємо оброблену цифру другого числа.}

I n:=ndiv10; | m:=mdiv10; end;

add := rez + k*c; {Повертаємо в основну програму отриманий результат.}

end;

Функція віднімання:

function sub (n, m: longint; p: byte): longint; var c, a: byte; pr: shortint; k, rez: longint; begin pr:= 1; if m > П then {Визначаємо більше з двох чисел і знак результату.}

begin с := n; n := m; m := c; pr := -1 end; k:= 1;c:=0;rez:=0; while (n >0)or(m >0)do

begin {Якщо поточна цифра першого числа не дорівнює 0}

{і для попереднього розряду позичена 1,} if (п mod 10 <> 0) and (с = 1)

{то від поточноі цифри віднімемо 1 І с = 0.} then begin а := (n mod 10) - 1; с := 0 end

{Якщо поточна цифра першого числа дорівнює 0} {І позичена з попереднього розряду 1,}

else if (n mod 10 = 0) and (с = 1)

then a := p {то значения рівне p.)

{У протилежному випадку поточна цифра не змінюється.} else а := n mod 10; а := а — с; {Визначення поточної цифри першого числа.}

{Якщо поточна цифра першого числа більша} if а > = (m mod 10) {за поточну цифру другого,}

then а := а — (m mod 10) {то знаходимо різницю.}

else begin

{Інакше позичимо у старшого розряду десяток, тобто р,} а := а + р - (m mod 10);

с := 1; {визначимо ознаку 1 позичення від старшого розряду.} end;

{Накопичуємо результат віднімання,}

rez := rez + а * к; к:=к*10; n :=ndiv 10; m :=mdiv 10; end; sub := pr * rez; end;

{дописуючи нову цифру у старший розряд.}

{Збільшуємо розрядність результату.}

{Відкидаємо оброблену цифру першого числа.}

{Відкидання обробленої цифри другого числа.}

{Повертаемо результат в основну програму.}

2 Вдюршпшт.» 1» и

33

Функція множення:

function mult(n, m: longint: p: byte): longint; var c, a: byte;

k, k_n, rez, new_n, rez_n: longint; begin

rez_n :=0; k_n := 1;

{Перше число більше, друге - менше.} if m > n then begin с := n; n := m; m := с end;

while m > 0 do {Покрокове множення на кожну цифру другого числа.}

begin

к := 1; с := 0; rez := 0; new_n := n;

{Покрокове множення на кожну цифру першого числа.} while newn > 0 do begin

{Результат множення двох цифр і додавання с.} a:=(new_n mod 10) * (m mod 10) +с;

if a > = p {Якщо результат множення більший за р,}

{то визначити значения цифри і десятка.} then begin с := a div p; a := a mod p end

{У протилежному випадку нічого не переноситься} else с := 0; {в наступний розряд.}

{Накопичення результату приписуванням} rez := rez + k * а; {ново? цифри у старший розряд.}

к := к * 10; {Збільшення розрядності результату.}

{Відсікання обробленоТ цифри першого числа.} new_n .= new_n div 10; end; m := m div 10; {Відсікання обробленої цифри другого числа.}

{Зсув результату на позицію цифри другого числа.} rez := (rez + k * с) * k_n;

{Додавання результату попереднього І поточного множень.} rez_n := add (rezn, rez, p);

k_n := k_n * 10 {Збільшення розрядності результату.}

end; mult := rez_n {Повернення результату в основну програму.}

end;

Функція ділення:

function divis (n, m: longint; p: byte): longint;

var st_n, st_m, st_a: string;

a, b, i: byte;

rez, new_a, ml, k, k1, k2: longint; begin

rez := 0;

Str (n, St_n); {Представления діленого у вигляді рядка.}

Str (m, st_m); {Представления дільника у вигляді рядка.}

ml :=0;k1 :=1;

34

{Переведения дільника в систему числення з основою р.)

for i := 1 to length (strn) do

begin

ml :=m1 + ((m divkl) mod 10)*k1; k1 := k1 * p end; k := 1; {Визначення кількості старших цифр,}

for і := 1 to length (st_n) - length (st_m) {які можна ділити на дільник.}

dok:=k"10; if (n div k) <m then k := k div 10;

{Відсікання тієї частини діленого,} a := n div k; {яка буде ділитися на дільник (а)}

repeat

Str (a, st_a); {Представления значения а у вигляді рядка.}

new_a:=0; k1 := 1;k2:= 1;

{Переведения а в систему числення з основою р.} for i := 1 to length (st_a) do begin

I new_a := new_a + ((a div k2) mod 10) * k1; | k1 :=k1 *p;k2:=k2* 10 end; b := newa div ml; {Визначення поточної цифри у результаті ділення.} rez := rez* 10 + b; {Накопичення результату ділення.}

{Визначення залишку від поточного ділення.} а := sub (a, mult(m, b, р), р);

к := к div 10; {Зменшення розрядності діленого.}

{Знесеиня наступноі цифри діленого для наступного ділення.} if к > 0 then а := а * 10 + ((n div к) mod 10);

{Дописування цифри 0 до результату ділення у разі} while (а < m) and (к > = 10) do {неможливостіділенняанадільник.} begin

rez := rez* 10; k:=kdiv10;

a := a*10 + ((n div k) mod 10); end; until k= 1; str (a, St_a); {Представления а у вигляді рядка.}

new_a:=0;k1 := 1; k2:= 1;

{Переведения а в систему числення з основою р.} for i := 1 to length (st_a) do begin

new_a := new_a + {{a div k2) mod 10) * k1; k1 :=k1 *p;k2:=k2*10 end; b := new_a div m 1; {Визначення результату ділення а на дільник.}

rez := rez * 10 + b; {Дописування останньоТ цифри до результату ділення.} divis := rez; {Повернення результату в основну програму.}

end;

35

ПЕРЕВЕДЕНИЯ ЧИСЕЛ 3 ОДНІЄЇ СИСТЕМИ ЧИСЛЕННЯ В ІНШУ

Ми вже частково торкнулися проблеми переведения чисел 3 однієї системи числення в іншу, маючи справу з системами числення, основа яких менша за 10. Тепер розглянемо загальні правила переведения чисел з однієї системи числення в іншу.

Переведения чисел з 10-Ї системи числення в систему числення 3 ОСНОВОЮ Р

Розглянемо спочатку цілі числа і для прикладу візьмемо деяке число у 10-й системі числення. Нехай це буде число 12310. За законами арифметики можемо про це число сказати, що в ньому одна сотня, два десятки й три одиниці. 3 іншого бо­ку, щоб дізнатися, скільки в заданому числі одиниць, треба визначити остачу від ділення цього числа націло на 10:

123

120

3

10 12

Молодшу цифру числа ми визначили - це 3. Для визначення наступної цифри - кількості десятків - треба частку від по-переднього ділення (12) знову розділити на 10 і знайти остачу:

10 1

12

~10

2

На цьому кроці ми визначили ще й кількість сотень! Адже знайдену частку від ділення (1) вже не треба більше ділити на 10, бо вона менша за 10 і озпачає кількість сотень. Це прави­ло дійсне для виділення цифр будь-якого десяткового числа.

А тепер проаналізуємо наші дії з точки зору системи чис­лення з основою 10. На першому кроці ми поділили число на основу цієї системи числення, щоб з'ясувати, скільки в цьому числі повних десятків. Отримана остача від цього ділення ви-значає кількість одиниць. Далі цей процес продовжили для визначення останніх цифр, поки не отримали частку, меншу за основу цієї системи числення, тобто 10. Так само можна ви-значитися з переведениям числа 123 у сімкову систему числен­ня. Згадавши, що 107 = 710, виконуватимемо ділення в зручній десятковій системі числення, тобто на 710. Остача від такого ділення націло дасть кількість одиниць у заданому числі у сім-ковій системі числення. Зауважимо, що результат такого ді-лення буде завжди меншим за 7, тобто є цифрою цієї системи

36

числення. Цей процес, за аналогією з десятковою системою числення, продовжуватимемо доти, поки не отримаемо частку, меншу за 710. Ось як виглядатиме переведения числа 123 з де-сяткової системи числення у сімкову:

123 7

2

"7 17 7_

53 14

49 "

4-—I Стрілками показаний шлях запису отриманого числа у сім-ковій системі числення. Справді, перша отримана цифра — це кількість одиниць, а остання - кількість 72 {7210 = 10,):

12310 = 2347.

Зверніть увагу на те, що чим менша основа системи числен­ня, в яку переводиться число, тим більший отриманий резуль­тат. Це може бути використано як попередній контроль реаль-ності отриманого результату.

Отже, сформулюемо правило переведения будь-якого десят-кового числа в іншу систему числення.

Для переведения цілого десяткового числа в систему чис­лення з основою Р перш за все треба полілиги націло задане число на Р, тобто на основу системи числення, в яку здійснюється переведения. Остача від цього ділення буде наймолодшою цифрою шуканого числа, а частку треба зно-ву поділити націло на Р для знаходження наступної цифри шуканого числа як остачі від ділення. Цей процес треба продовжувати доти, доки частка від ділення націло не стане менша за Р. Це й буде старша цифра шуканого числа. Для запису результату переведения в систему числення з осно­вою Р треба останню частку та раніше отримані остачі запи-сати у зворотному порядку.

Десятков! дроби треба переводити в іншу систему числення в два етапи: окремо цілу частину і окремо дробову. Правило для переведения дробової частини десяткового числа формулюєть-сятак:

Для переведения дробової частили десяткового числа в си­стему числення з основою Р треба покроково множити ЇЇ на основу системи числення Р, відокремлюючи цілу частину отримуваних добутків, яка при наступному множенні не враховується. Відокремлені цілі частини послідовно будуть складати цифри дробової частини шуканого числа.

37

Розглянемо такий приклад:

Виконуючи дії за сформульованим правилом, отримаємо:

0

125

ft

6

0

750

*

6

4

500

*

6

3

000

Запишемо результат переведения 0,12510 = 0,0436. У цьому прикладі нам повезло, бо настав момент, коли на третьому кро-ці отримано нульову дробову частину. Тобто заданому числу відповідає точний аналог в іншій системі числення. Але таке бу-вае не завжди. У цьому випадку треба обмежитися деякою точ-ністю при переведенні заданого числа в іншу систему числення.

Доведіть, що при переведенні дробової частини десяткових чисел в іншу систему числення цілі частини, ЯКІ ВІДОК-ремлюються при множенні, завжди будуть цифрами тіє'ї систе-ми числення, в яку здійснюється переведения!

Розглянемо, як виглядатиме процедура, що реалізує алго­ритм переведения десяткових чисел у будь-яку іншу вказану систему числення. Для спрощення переводйтимемо числа в систему числення, основа якої менша за 10.

procedure to_p (n: longint; p: byte); begin

k := 1; {Контроль завершения процесу переведения.}

while n > = р do begin

a[k] := n mod p; {Визначення поточної цифри переведеного числа.} П := П div p; {Визначення поточної частки від ділення.}

{Визначення порядкового номера наступної цифри результату.) inc(k); end;

{Запис у результуючий масив останньої визначеної} a[k] := п {цифри, яка є останньою часткою.}

end;

Виведення результату переведения заданого числа в систему числення з основою Р можна здійснити за допомогою такого циклу:

for i := k downto 1 do write(a[i]);

38

Переведения чисел із системи числення з основою Р у 10-ву систему числення

Для визначення правила переведения чисел із будь-якої си­стеми числення в десяткову пригадаємо, що кожне число мож-на представити у вигляді суми, записано! за степенями основи пдєї системи числення.

Розглянемо це на прикладі:

12310 - (1 • 100 + 2 • 10 + 3)10 - (1 • 102 + 2 • 101 + 3 ■ 10°)10.

Але це справджується не лише для десяткової системи чис­лення. Наприклад, у числі 2347 двічі присутнє число 1007, три рази число 107, чотири рази число 1г Це означав, що справед-ливий запис:

2347 = (2 • 108 + 3 • 101 + 4 • 10°)7.

У загальному випадку довільне число в будь-якій системі числення можна представити у вигляді:

(а,а1а2...ап)р = (а0 • 10" + а,- Ю-1 + а2 • Ю""2 + ... + а„ • 10°)р.

Оскільки ми вже знаемо, що в різних системах числення е числа, які відповідають одне одному, і правила виконання арифметичних дій у різних системах числення однакові, то й результат обчислення не зміниться, якщо замінити всі числа в даній системі числення числами, що відповідають їм в іншій системі, та виконати над ними ті самі арифметичні дії. Скорис-таемося цим для одного з наших прикладів:

2347 = (2 • 102 + 3 ■ 10і + 4 • 10°). = = (2 ■ 72 + 3 • 7і + 4 • 7°)10 - 12310.

Отже, ми перевірили результат попереднього переведения 3 десяткової системи числення у сімкову, яке виконали раніше.

Сформулюємо правило переведения чисел із системи чис­лення з основою Р у десяткову систему числення.

: Для переведения будь-якого числа із системи числення з ос­новою Р у десяткову систему числення треба задане число записати у вигляді суми за степенями основи даної системи числення, тобто 10 , потім замінити усі числа на відповідні їм десяткові числа та виконати вказані арифметичні дії в десятковій системі числення.

При переведенні дробових чисел із системи числення з осно­вою Р в десяткову систему числення треба користуватися тим самим правилом, враховуючи лише, що для дробової частини показники основи системи числення будуть від'ємними:

39

321,12, = (3 • 102 + 2 • 10і + 1 • 10° + 1 • 10"1 + 2 • 10'2)4 = = (3 • 42 + 2 • 41 + 1 ■ 4° + 1 • 4"1 + 2 • 4"2)10 - 57, 37510.

Перейдемо до представления алгоритму переведения чисел із системи числення з основою Р у десяткову у вигляді процеду-ри мовою Pascal. Розглянемо випадок, коли Р < 10:

procedure to 10 (n: longint; р: byte; var rez: iongint); var k: longint; begin

k := 1; rez := 0;

while n > 0 do {Контроль завершения процесу переведения.}

begin {Формування результату переведения додаванням а, * f*.}

rez := rez + (n mod 10) * k;

П := П div 10; {Визначення наступно! цифри заданого числа.}

к := к * р; {Визначення степенів основи системи числення.}

end; end;

У всіх наведених прикладах ми мали справу з системами числення, основи яких не перевищували 10. Але не не є істот-ним обмеженням, потрібно лише домовитися, як позначати цифри, більші за 9 у системах числення, основа яких більша за 10. Прикладом такої системи числення є шістнадцяткова система, з якою ми зараз ознайомимося.

ЗВ'ЯЗОК МІЖ СИСТЕМАМИ ЧИСЛЕННЯ 3 ОСНОВОЮ 2*

Між системами числення з основами 2, 8 і 16 є чудовий зв'язок. Розглянемо спочатку співвідношення між цифрами ві-сімкової системи числення та відповідними їм числами двійко-вої системи (табл. 1).

Таблица 1

8-ва система числення

2-ва система числення

0

000

1

001

2

010

3

011

4

100

5

101

6

110

7

111

40

Отримати цю таблицю неважно і немае потреби її запам'я-товувати, оскільки, збільшуючи цифри вісімкової системи чис­ления, одночасно збільшуємо відповідні їм числа двійкової си­стеми. Пам'ятаючи це, завжди можна відтворити цю таблицю. Зверніть увагу на те, що в правій частині таблиці містяться всі можливі комбінації двійкових цифр у трьох позиціях. Ці три цифри називають тріадою. Тобто можна сказати, що кожній цифрі вісімкової системи числення відповідає певна тріада двійкових цифр. Чому саме тріада, а не менше і не більше? А справа у тім, що 23 = 8. Справді, створюючи у трьох позиціях за допомогою двох цифр 0 та 1 усі можливі комбінації, зможе-мо нарахувати їх тільки вісім. Враховуючи цю закономірність, сформулюємо правило переведения чисел.

ІДля переведення чисел із вісімкової снстеми числення у двійкову достатньо замінити кожну цифру вісімкового чис­ла на відповідну йому тріаду двійкових цифр, зберігаючи послідовність цифр у заданому числі.

Наприклад,

351068 = 011 101 001 000 1102 = 111010010001102.

Для переведення чисел із двійкової системи числення у ВІ-сімкову треба розбити двійкове число на тріади справа налі-во і замінити кожну тріаду відповідною вісімковою цифрою, зберігаючи послідовність тріад, а саме:

101001100000111012 = 010 100 110 000 011 1012 = 2460358.

Тепер перейдемо до ознайомлення з шістнадцятковою си­стемою числення таїї зв'язком із двійковою системою. Розгля-немо таблицю 2.

Таблиця2

16-ва система числення

2-ва система числення

16-ва система числення

2-ва система числення

0

0000

8

1000

1

0001

9

1001

2

0010

А

1010

3

ООН

В

1011

4

0100

С

1100

5

0101

D

1101

6

ОНО

Е

1110

7

0111

F

1111

41

За аналогією з вісімковою системою числення можна зроби-ти висновок, що кожній цифрі шістнадцяткової системи чис­лення відповідає тетрада двійкових цифр.

Зверніть увагу на те, як ми позначили символи шістнад-цяткової системи числення, які більші за 9. Крім того, зверніть увагу на співвідношення 2' = 16, пригадайте, що 23 = 8, і прове-діть аналогію.

Для переведения шістнадцяткового числа у двійкову систе­му числення достатньо кожну цифру заданого числа замі-нити відповідною тетрадою двійкових цифр, зберігаючи їх послідовність.

Наприклад, АВ9С116 = 1010 1011 1001 1100 00012.

ІДля переведения чисел із двійкової системи числення у ШІСТ-надцяткову треба розбити задане число на тетради справа наліво і замінити кожну тетраду відповідною шістнадцятко-вою цифрою.

Розглянемо вже знайомий приклад: 101001100000111012 = 0001 0100 1100 0001 11012 = 14C1D16.

Проаналізувавши наведені правила, можна відповісти на таке запитання: скільки потрібно двійкових цифр для того, щоб зобразити будь-яку цифру системи числення з основою 32 у двійковій системі? Справді, п'ять, адже 25 - 32.

Шдсумовуючи все вищесказане, можна відповісти на за­питання: яке відношення мають системи числення до основ алгоритмізації? А відповідь буде такою.

По-перше, тепер нам зрозуміло, за якими правилами пере-водяться десяткові числа, які ви визначаєте в програмах, у двій-кову систему числення, в якій працює комп'ютер, і навпаки.

По-друге, при програмуванні для компактності будь-яка двійкова інформація задається у шістнадцятковому вигляді.

По-третє, тепер зрозуміло, чому порції інформації, якими при роботі обмінюються різні компоненти комп'ютера, скла-даються саме з 8, 16 та 32 бітів. Пригадайте про розрядність комп'ютерів!

Чи можна реалізувати на комп'ютері переведения чисел з однієї системи числення в іншу для випадку, коли їхні основи є степенями числа 2? Зрозуміло, що така можливість існує. Представимо фрагмент програми, що реалізує переведения чисел із вісімкової системи числення у двійкову і навпаки:

function _8_2 (у: string): string; begin

ify = '0'then_8_2:='000';

42

if у if у if у if у if у if у if у end; function begin

if У

ify ify ify ify ify ify ify end;

Tthen

8 2

= '001';

'2' then

8 2

= '010';

'3'then

8 2

= '011';

'4' then

8 2

= 400';

'5' then

8 2

= '101';

'б' then

8 2

= '110';

T then

8 2

= '111';

_2_8 (y: string): string;

=

'О';

=

T;

.=

'2';

=

'З';

•=

■4'-

::-

'5'

:=

'6'

:=

T

'000'then _2_8 •001'then _2_8 '010'then _2_8 '011' then _2_8 ' 100'then _2_8 401'then _2_8 '110'then _2_8 '111'then 2 8

Якщо кількість символів у двійковому представленні за-даного числа не є кратною числу 3, то для коректної заміни тріад двійкового числа на відповідні цифри вісімкової системи числення треба це число спереду доповнити нулями:

writefx = '); readln(x); i := length(x);

if (ch = '2') and (i mod 3 <> 0) then if i mod 3 = 1

then x := '00' + x elsex := '0' + x;

Виклик функцій, що забезпечують переведения чисел із двійкової системи числення у вісімкову і навпаки, можна орга-нізувати так:

i := length(x);

у:=";

while i >= 1 do . case ch of

'1': begin у :=_8_2(x[i]) + y; dec(i, 1)end; | '2': begin у := _2_8 (copy(x, i - 2, 3)) + y; dec(i, 3) end; end;

Аналогічним чином можна реалізувати переведения чисел із двійкової системи числення у шістнадцяткову і навпаки.

ОДНОРОЗРЯДНИЙ СУМАТОР

Ми вже підкреслювали важливість двійкової системи чис­лення для роботи комп'ютера і знаємо, яким чином виконують-

43

ся дії в цій системі числення. Тепер треба з'ясувати, як це ро-бить сам комп'ютер.

Виявляється, що всі арифметичні дії в комп'ютері зведені до однієї дії додавання і виконує її спеціальний електронний пристрій — однорозрядний суматор.

Дія множення виконується як багатократне додавання, від-німання зводиться до додавання, а ділення розглядається як багатократне віднімання, причому за часом таке виконання дій набагато економніше, ніж програмування безпосередніх пра­вил їх виконання.

Розглянемо спочатку, як на логічному рівні побудований однорозрядний суматор. Для цього розглянемо конкретний приклад додавання двох чисел у двійковій системі числення і намагатимемося помітити закономірність у наших діях.

Пригадаємо, що при додаванні у стовпчик результат до­давання завжди розбиваемо на дві частини: кількість одиниць і кількість десятків. Перша цифра записується у тому самому розряді результату, а друга запам'ятовуеться, щоб врахувати и при додаванні у наступному розряді. Це означав, що в роботі завжди буде п'ять величин: два розряди, які додаємо (a, b), кількість десятків, яку запам'ятали від додавання у попе-редньому розряді (с), та кількість одиниць і десятків, що одер-жуються в результаті додавання в даному розряді числа (п, т).

Для пояснения розглянемо невеличкий приклад:

1111

+

ПО

????

1-й крок. При додаванні в наймолодшому розряді вра-ховуемо, що значения розряду від попереднього додавання від-сутнє, оскільки його просто ще не було, а значения інших роз-рядів можна визначити так:

а = 1,6 = 0,с = 0.

Виконуючи дію додавання в цьому розряді (1 + 0 - 1), ви-значимо кількість одиниць (л) і десятків (т) в отриманому ре­зультат!:

п = 1, т = 0.

У стовпчик можна записати:

+ 0

4-

пи

+

ПО

???1

44

2-й крок. Бачимо, що а = 1, Ь = 1, а трете значения с, почи-наючи з другого кроку, дорівнює значению т на попередньому кроці, тобто с = т » 0. Тепер можемо записати додавання на другому кроці 1 + 1 + 0 = 10.

Тобто отримаемо п = 0, т. = 1:

+ 1 І

1111

+ 110

??01

3-й крок. Оскільки а = 1,Ь = 1,с = т = 1,то1 + 1 + 1 = 11. Отримуємо п - 1 і т = 1:

+ 1

І

1111

+ 110

?101

4-й крок. На оетанньому кроці а = 1, 6 = 0, с = т = 1, 1 + 0 +

+ 1-10.

Запишемо результат додавання у цьому розряді:

+ 1 І

1111

+ 110

0101

5-й крок. Оскільки цифри в доданках уже вичерпані, то за-лишилося проаналізувати значения с = т. Якщо воно дорів-нює 0, то попередній крок був останнім і знайдений результат є відповіддю. Якщо ж с = 1, то в результаті отримується число на порядок більше від найбільшого з двох доданків і найстаршою цифрою в ньому буде 1. Так було і в нашому прикладі:

1111

+ 110

10101

Який же висновок можна зробити з цього прикладу? На кожному кроці ми додавали три величини а, Ь, с і отримували дві величини птат. Значениями цих величин завжди є двійко-ві цифри. Умовно можна сказати, що ми визначили закон пе-ретворення значень трьох величин у значения двох величин у двійковій системі числення. Схематично це можна зобразити так (мал. 2).

45

а

ЗАКОН ПЕРЕТВОРЕННЯ

п к

b

*

с

m >

i

Мал. 2

Оскільки кількість можливих двійкових значень для трьох величин скінченна і дорівнює 8, то неважко записати їх закон перетворення у двійкові значения двох величин. Це відображе-но в таблиці 3.

Таблиця3

а

0

1

0

0

1

0

1

1

Ь

0

0

1

0

1

1

0

1

с

0

0

0

1

0

1

1

1

п

0

1

1

1

0

0

0

1

пг

0

0

0

0

1

1

1

1

Виявляється, що неважно сконструювати електронний пристрій, який працюватиме за таким законом. На вході тако­го пристрою буде знаходитися три провідники, на які подава-тиметься електричнии струм, а на виході - два провідники, на які струм надходитиме. Такий пристрій називається однороз-рядним суматпором.

Ми вже згадували про те, що операція віднімання в ком-п'ютері зведена до операції додавання. Розглянемо правило, яке використовується для отримання різниці між двома числа­ми. Нехай треба виконати дію 10010 - 6410. ЇЇ можна розглянути і в такому вигляді:

10010 + (-64)10.

Тому треба знайти аналог числа 64 у від'ємній область Спочатку переведемо це число у двійкову систему числення:

6410 - 10000002.

Під час робота комп'ютера обробляються восьмирозрядні, шістнадцятирозрядні, тридцятидвохрозрядні порції інфор-мації, тому отриманий двійковий аналог числа 6410 доповнимо до восьми цифр:

10000002 = 01000000,.

46

Наступний крок полягає в отриманні інверсії останнього эображення. Тобто всі цифри 12 необхідно замінити на 02 і нав-паки:

ІНВЄОСІЯ

010000002 « * 101111112.

Тепер додамо до результату інверсії число 12:

10111111,

+ 2

h

110000002

Цей результат і є двійковим значениям числа -6410. Переві-римо це звичайним чином. Для десяткової системи числення справедлива рівність 6410 + (-64)10 ■ 010.

Такий самий результат повинні отримати і в двійковій си­стем! числення:

010000002

110000002

1000000002

Оскільки в отриманому результат! старша цифра, тобто 1, внйшла за межі обумовленої на початку розрядності (восьми розрядів), то вона буде втрачена. Це означае, що підтверджено справедливість нашого результату.

Запитання для самоконтролю

  1. Що таке система числення?

  2. Що розуміють під основою системи числення?

  3. Які основні причини виникнення різних систем числення? За-лишки яких систем числення зустрічаються сьогодні?

  4. На які два типи можна поділити всі існуючі системи числення? Дайте їм означения та наведіть приклади.

  5. Які існують арифметичні операції в різних системах числення?

  6. Сформулюйте правило переведения чисел з 10-Ї системи чис­лення в систему числення з основою Р і навпаки.

  7. У чому полягає зв'язок між системами числення з основою 2*?

  8. Сформулюйте правило переведения двійкових чисел у вісімкову та шістнадцяткову системи числення.

  9. Яке призначення однорозрядного суматора? За яким законом він працює?

Завдання

1. Виконайте арифметичну дію:

1)3546 + 121в; 3) 100018 + 77778;

2) 6666. + 17; 4) 22223 + 22223;

  1. 7589 - 632„;

  2. 3124 - 1234; 7)555558-177778; 8) 400025 - 333335; 9)123-23;

10) 64205, • 47;

11)789-119;

12)3528-1018;

13)246:26;

  1. 1537: 37;

  2. 20025: 45; 16)111114:24.

2. Переведіть число з однієї системи числення в іншу:

1) 199610 - ?5; 2)1838,,, = ?,; 3)8048610 = ?8; 4)32110 = ?2; 5)5555 -?

10'

10'

6) 100405 - ?10 7)18389 = ?10; 8) 20103в-? 9)3248-?з 10)10106=.?5 11)77778«?9 12) 50047 - ?2

13)10000111101111000012- ?8 - ?

  1. 1110001100011112 = ?8 = ?16;

  2. 1010101010102 - ?8 = ?16;

  3. 1000011100011002 = ?8 = ?16; 17)561248 = ?2 = ?,6; 18) 77777778 = ?2 = ?16; 19)100018-?2 = ?16; 20)121318 = ?2 = ?16; 21)1A9DE,6 = ?2 = ?8;

  1. FFFFF16 - ?2 = ?8;

  2. ABCDEF916 = ?2 = ?8;

  3. 20202016 = ?2 = ?8.

II

48

3. Заповніть порожні клітинки таблиці множення.

1)

Система числення з основою 5

1

2

3

4

10

1

1

2

3

4

10

2

2

4

11

3

3

11

4

4

10

10

2)

Система числення з основою 6

1

2

3

4

5

10

1

1

2

3

4

5

10

2

2

4

10

3

3

10

4

4

12

5

5

10

10

3)

4)

Система числення з основою 8

1

2

3

4

5

6

7

10

1

1

2

3

4

5

6

7

10

2

2

4

6

10

12

3

3

6

4

4

10

5

5

12

6

6

7

7

10

10

Система числення з основою 9

1

2

3

4

5

6

7

8

10

1

1

2

3

4

5

6

7

8

10

2

2

4

6

8

11

3

3

6

10

4

4

8

13

5

5

11

6

6

13

7

7

15

8

8

10

10

4. Визначте, в яких системах числення виконані наступні дії:

1) 44444 +

1

100000;

2) 72543

3333 76076;

3) 101010

10101 111111;

4) 123123

12220

140343;

5) 43312 + 4343430

4431142;

6) _1000

1

ill;

7) 12222

3

12216;

8)_ 8 100 81;

49

9) _ 12304 10) _ 33333

5 444

11277; 32556.

5. Відновіть пропущені цифри в числах і визначте систему числення, в якій виконані ці дії:

1) 2322? 2) 47536 3) ?2?2?

' + + +

?133 ?1?1? 979?9

30401; 100351; 103030.

6. У якій системі числення справедлива рівність:

1)10 + 10 = 20; 4)2+6-10;

2) 10 10 = 100; 5)100 + 1 = 101;

3)11-10 = 1; 6)20-16-1?

7. Чи існує система числення, в якій одночасно справ- джуються такі рівності:

1)4 + 5 = 10та4-5 = 22; 2)2 + 3 = 5та2-3 = 11; 3)3 + 4 = 7таЗ-4 = 11?

8. Знайдіть помилки в запису деяких чисел:

1) 1234; 3) 5277; 5) 11110;

2)А9В18; 4)АВ912; 6) 8028.

9. Був час, коли інформація для обробки на обчислювальних машинах набивалася на спеціальних картках, що носили назву перфокарт. При цьому вся інформація кодувалася пристроями, що називалися перфораторами, і мала вигляд пробитих і не пробитих у стовпчик дірочок на перфокарті. Визначте, які чис­ ла набиті на фрагменті перфокарти (мал. 3), якщо вважати, що один стовпчик - це одне число.

D

П

1

1

DID

D

D

1

1 1

1

0

1

1

III

D

D

1

1 D

1

D

п

D 1 1

D

D

D

1 D

D

1

1

1 1 D

D

1

D

1 1

D D

1

1

DID

D D

D

1 D

1

1

1

1

1 D 1

D

1

1

1 1

1

D

1

D D 1

п

1

1

1 1

П

С

1 1

1 D 1

D

1

1

1 1

Мал. 3 50

Запишіть ці числа в двійковій, вісімковій, шістнадцятковій та десятковій системах числення.

  1. Було 11 яблук. Коли кожне з них розрізали навпіл, ста­до 110 половинок. У якій системі числення вівся підрахунок?

  2. Класний керівник на батьківських зборах сказав: «У на­шему класі навчається 24 дівчинки та 32 хлопчики, разом -100 учнів». У якій системі числення повинні вміти рахувати •втьки?

  3. Один хлопчик вихвалявся: «У мене 100 братів. Молод-zioMy 1000 років, а старшому 1111 років. Старший учиться у 1001 класі». Чи може таке бути?

  4. 3 інопланетного корабля, що приземлився у дворі шко-ди, вийшло 25 прибульців. Шд час знайомства вони дали зна­ти, що їх 41. Якщо вважати, що в них, так як і у нас, система числення мае анатомічне походження, то скільки пальців вони мають на одній руці?

  5. У деяких телевізійних передачах поточний рік указують у римській системі числення. Спробуите записати його самі в аій системі числення.

  6. Один восьмикласник, після того як у школі на уроках інформатики він ознайомився із системами числення, сказав мамі: «З'ясувалося, що в мене на кожній руці по 5 пальців, а на обох ногах разом 13!». Яку систему числення він мав на увазі?

  7. У скільки разів зменшиться число 112003, якщо справа забрати: 1) один нуль; 2) два нулі?

  8. Розробіть меню-орієнтовану програму, що виконує ариф-метичні дії над двома заданими числами в системі числення з основою Р (Р < 10).

  1. Розробіть меню-орієнтовану програму, що переводить числа з десяткової системи числення у систему числення з ос­новою Р(Р < 10).

  2. Розробіть меню-орієнтовану програму, що переводить числа із системи числення з основою Р (Р < 10) у десяткову си­стему числення.

  3. Розробіть меню-орієнтовану програму, що переводить числа із систем числення, основи яких дорівнюють 2*, у десяткову систему числення.

Для подальшої предметно! і професійної розмови щодо пи-тань ефективного використания інформації при побудові алго­ритмов без ознайомлення з и розміщенням у пам'яті комп'юте-ра нам не обійтися.

Дані, якими оперує комп'ютер, можна поділити на коди ма-шинних команд, за допомогою яких виконуються всі операції, та інформацію, якою вони оперують. У свою чергу інформацію можна розглядати як числову, символьну і рядкову.

51

Оскільки нашою метою є ознайомлення з методами створен-ня алгоритмів, які залежать, у першу чергу, від представления інформації, то зупинимося на розгляді саме цих питань.

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз