Умножение двух восьмеричных чисел - Pascal ABC
Формулировка задачи:
Умножить 216 и 5 в восьмеричной СС, в принципе всё.
Решение задачи: «Умножение двух восьмеричных чисел»
textual
Листинг программы
uses crt; const nmax=1000;//макс. число разрядов во вводимых числах type mas=array[1..2*nmax] of byte;//тип массива, число разрядов *2 для результата function vvod(var a:mas):integer;//ввод чисел var c:char; n:integer; begin n:=0; //количество разрядов repeat c:=readkey; //вводим посимвольно if c in ['0'..'9','A'..'F'] then //если допустимые begin write(c);//выводим n:=n+1; //добавляем разряд if c in ['0'..'9'] then a[n]:=ord(c)-48 //если цифра пишем в массив 0..9 else a[n]:=ord(c)-55 //если буква 10..15 end; if (c=#13)or(n=nmax) then writeln //если Enter или макс. разрядов, новая строка until (c=#13)or(n=nmax);//и выход vvod:=n//кол. разрядов end; //собственно умножение procedure umn(a,b:mas;na,nb:integer;var c:mas;var nc:integer); var i,j,p,k:integer; begin for i:=1 to 2*nmax do c[i]:=0; //обнулим результат for i:=na downto 1 do //перемножим поразрядно for j:=nb downto 1 do begin c[na-i+2+nb-j]:=c[na-i+2+nb-j]+(c[na-i+1+nb-j]+a[i]*b[j])div 16;//в следующий разряд излишки c[na-i+1+nb-j]:=(c[na-i+1+nb-j]+a[i]*b[j])mod 16;//в текущий остаток от деления на 16 end; writeln('Результат:'); {пропускаем начальные нули} i:=2*nmax; while (c[i]=0)and(i>1)do i:=i-1; {выводим результат} for j:=i downto 1 do if c[j] in [0..9] then write(c[j]) else write(chr(c[j]+55)); end; var a,b,c:mas; na,nb,nc:integer; begin writeln('Введите 1 число в СС 16, конец ввода Enter'); na:=vvod(a); writeln('Введите 2 число в СС 16, конец ввода Enter'); nb:=vvod(b); umn(a,b,na,nb,c,nc) end.
Объяснение кода листинга программы
- В функции
vvod
переменнаяn
инициализируется значением 0. Это количество разрядов, которое будет введено. - В цикле
repeat
переменнаяc
считывается с помощью функцииreadkey
. Если введенная цифра или буква соответствует допустимому диапазону, то она выводится на экран, а переменнаяn
увеличивается на 1. Если введенная цифра, то она записывается в соответствующий разряд массиваa
. Если это буква, то она записывается в массивa
с индексомn
. - После ввода всех разрядов, функция
vvod
возвращает значениеn
, которое является количеством введенных разрядов. - В процедуре
umn
переменныеi
,j
,p
иk
инициализируются значениями 1, 2, 2na
и 2nb
соответственно. - В цикле
for
перемножаются разряды числаa
и числаb
. Результат сохраняется в массивеc
. - В цикле
while
пропускаются нулевые значения в массивеc
. - В цикле
for
выводятся результаты умножения. Если введенное числоc[j]
является цифрой, то оно выводится на экран. Если это буква, то выводится символ, соответствующий этой букве, увеличенный на 55. - В конце программы выводится сообщение о том, что введено 1 число в СС 16, и запрашивается ввод 2 числа. Затем вызывается функция
vvod
для ввода двух чисел, и вызывается процедураumn
для их умножения.