Функции сложения и вычитания
Сложение. Функция BinPlus Функция бинарного сложения работает по следующему алгоритму.
Вычитание. Функция BinMinus. Принцип работа данной функции основан на тождестве a-b=a+(-b).
Библиографический список
1. Turbo Pascal 7.0.(том 1)/ Фаронов., Питер. Прес.,2000г. 2. "Введение в информатику. Лабораторные работы." / Авт.-сост. А.П. Шестаков; Перм. ун-т. — Пермь, 1999. (Ч. I — 56 с.) Основы информатики/ Савельев А.Я., МГТУ им. Баумана. Приложение
Исходный текст программы
{для реализации данной программы взята 8 разрядная двоичная сетка} {следовательно диапазон значений должен быть с пределах от -127..127} Program CourceProject_v1_13; uses Crt; const Group=’246’; Name=’’; {Фамилия И.О. студента} PrepName=’’; {Фамилия И.О. преподавателя} InFileName=’in.txt’; OutFileName=’Out.txt’; function StrToVal(Ch:Char):byte; var value,code:integer; begin val(Ch,value,code); StrToVal:=value; end; function ValToStr(val:byte):Char; var ch:string; begin Str(val,ch); ValToStr:=ch[1]; end; {Перевод из десятичной в 2-16 систему счисления} function DecToBase(Decimal: LongInt; const Base: Byte): String; const Symbols: String[16] = ’0123456789ABCDEF’; var scratch: String; remainder: Byte; temp:byte; begin {инверсия числа если знак его "-"} if Decimal<0 then Decimal:=(256-abs(Decimal)); scratch:= ’’; repeat remainder:= Decimal mod Base; {остаток от деления } scratch:= Symbols[remainder + 1] + scratch; {символ соотв. остатку} Decimal:= Decimal div Base; {собс-но деление} until (Decimal = 0); DecToBase:= scratch; end; {Перевод из 2-16 в 10ю систему счисления} function BaseToInt(Value: String;Base:byte): LongInt; var i,m,Result,c: Integer; begin Result:=0; m:=1; for i:=Length(Value) downto 1 do begin if i=(Length(Value)-1) then m:=base; case Value[i] of ’A’:c:=10; ’B’:c:=11; ’C’:c:=12; ’D’:c:=13; ’E’:c:=14; ’F’:c:=15; else c:=StrToval(Value[i]) end;{case} result:=result+m*c; m:=m*base; end; {находим знак числа} if result>127 then result:=result-256; BaseToInt:=Result; end; {подготовка чисел к вып. арифм. действий}
procedure Prepare(var Value1,Value2:string;var Len:byte); var i,j,m:byte; temp:string; begin {выбираем самое длинное число} i:=length(Value1); j:=length(Value2); len:=i; if i>j then begin len:=i; {дополняем меньшую строку нулями до равного колва символов} for m:=1 to (i-j) do insert(’0’,Value2,1); end else {j>i} begin len:=j; {дополняем меньшую строку нулями до равного колва символов} for m:=1 to (j-i) do insert(’0’,Value1,1); end; end; {двоичное сложение} function BinPlus(BIN1,BIN2:string):String; var summ:string[50]; temp,pl_razryad:integer; k,m:byte; begin summ:=’’; pl_razryad:=0; {подготовка к сложению чисел} Prepare(BIN1,BIN2,k); for m:=k downto 1 do begin {Складываем соотвествующие разряды + "что на ум пошло"} temp:=StrToVal(BIN1[m])+StrToVal(BIN2[m])+pl_razryad; {обнуляем то что на "ум пошло"} pl_razryad:=0; If temp>7 then begin inc(pl_razryad); temp:=temp-2; end; {избавляемся от переполнения разрядной сетки} if length(summ)<=8 then insert(ValToStr(temp),summ,1); end; {еслои после сложения двух числел что-то осталось "в уме" добавляем еще один разряд} if pl_razryad<>0 then insert(valtostr(pl_razryad),summ,1); BINPlus:=summ; end; {двоичное вычитание} function BinMinus(BIN1,BIN2:string):String; var inverseBIN2:string[8]; begin {т.к. вычитание есть сложение первой величины и второй величины взятой с инверсией, то можно делать так} {инверсия величины BIN2} inverseBIN2:=DecToBase(-BaseToInt(BIN2,2),2); {сложение BIN1 и инверсной Bin2} BinMinus:=BinPlus(BIN1,inverseBIN2); end; {Вывод лого} procedure Logo; var i:byte; begin ClrScr; {отрисуем рамку} GotoXY(1,1); TextColor(3); for i:=1 to 80 do Write(’*’); for i:=1 to 22 do Write(’*’,’*’:79); for i:=1 to 80 do Write(’*’); {Конец рамки} {Выводим текст} GotoXY(25,10); Write(’К У Р С О В А Я Р А Б О Т А’); GotoXY(27,12); Write(’по дисциплине "ИНФОРМАТИКА"’); GotoXY(65,17); Write(’Выполнила:’); GotoXY(65,18); Write(’ст.гр.’,Group); GotoXY(65,19); Write(Name); GotoXY(65,20); Write(’Проверил:’); GotoXY(65,21); Write(PrepName); end; var FileIn:Text; {Файл исходных данных } FileOut:Text; {Файл результатов выполнения программы} Int1,Int2:integer; {исх. данные из файла } Hex1,BIN1:String; {Число в различных системах счисления} Hex2,BIN2:String; {Число в различных системах счисления} ResMin,ResPlus:string; {Результат выполнения ар. действий} begin {тело}
Logo; {Показываем лого нашей работы } GotoXY(23,25); WriteLn(’Для продолжения нажмите любую клавишу...’); repeat until KeyPressed; {Читаем из файла необходимые данные} Assign(FileIn,InFileName);Reset(FileIn); ReadLn(FileIn,Int1); {читаем первое число } ReadLn(FileIn,Int2); {читаем второе число } Close(FileIn); {Создаем условия для работы программы} HEX1:=DecToBase(int1,16); {Переводим первое число в HEX} HEX2:=DecToBase(int2,16); {Переводим второе число в HEX} BIN1:=DecToBase(BaseToInt(HEX1,16),2);{перевод из 16 в двоичную с-му} BIN2:=DecToBase(BaseToInt(HEX2,16),2);{перевод из 16 в двоичную с-му} ResPlus:=BINPlus(BIN1,BIN2); {Выполняем сложение 2й с-ме } {приводим р-т сложения к заданному виду, т.е. в 16ю с-му} ResPlus:=DecToBase(BaseToInt(ResPlus,2),16); ResMin:=BINMinus(BIN1,BIN2); {Выполняем вычитание 2й с-ме } {приводим р-т вычитания к заданному виду, т.е. в 16ю с-му} ResMin:=DecToBase(BaseToInt(ResMin,2),16); Assign(FileOut,OutFileName);Rewrite(FileOut); WriteLn(FileOut,’Исходные данные:’); WriteLn(FileOut,’ Число 1:’,BaseToInt(HEX1,16)); WriteLn(FileOut,’ Число 2:’,BaseToInt(HEX2,16)); WriteLn(FileOut); WriteLn(FileOut,’Pезультат выполнения программы:’); WriteLn(FileOut,’ Сложение:’,BaseToInt(ResPlus,16)); WriteLn(FileOut,’ Вычитание:’,BaseToInt(ResMin,16)); Cloose(FileOut); end.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|