|
Деление чисел в нормализованной форме
Деление чисел в нормализованной форме
14 Министерство образования и науки Российской Федерации Федеральное агентство по образованию Марийский государственный технический университет Кафедра информатики и системного программирования Курсовая работа по дисциплине информатика на тему: Деление чисел в нормализованной форме Выполнила: студент ИВТ-11 Васильев Иван Федорович Проверила: старший преподаватель Кафедры ИиСП Иванова И.Н. Йошкар-Ола 2009 Содержание - 1. Теоретическая часть
- 1.1 Теория
- 1.2 Описание метода решения
- 2. Алгоритм (блок-схема) работы программы
- 2.1 Листинг программы
- 2.2 Тестирование программы
- 3. Вывод
ВведениеПостановка задачи:Ввод: два числа в десятичной СС в естественной форме. Программа переводит числа в нормализованную форму, делит нормализованные числа.Вывод: частное от деления в нормализованной форме в десятичной СС.В данной курсовой работе показан один из алгоритмов деления чисел в нормализованной форме. Такие программы удобны для быстрого получения нормализованного произведения чисел с помощью TP Pascal. Для реализации поставленной задачи я использовала теоретические сведения из курса информатики и ПнаЯВУ, а также полученные ранее знания в области программирования.1. Теоретическая часть1.1 ТеорияПусть имеются два числа X1 = M1·pk1 и X2 = M2·pk2 (здесь индексы у мантиссы и порядка означают не систему счисления, а служат номерами чисел). Умножение должно начинаться с выявления большего из k1 и k2, нахождения модуля их разности k =|k1 - k2| и сдвига вправо на k разрядов мантиссы того числа, у которого k оказался меньше. Операция деления, проводимая как над целыми, так и вещественными числами, приводит в общем случае к появлению вещественного числа, поэтому целые числа предварительно преобразуются в вещественный тип, т.е. переводятся в нормализованную форму. Очевидно, при делении X1X2 мантисса частного M = M1/M2, а порядок k = k1-k2. При этом непосредственно операция деления сводится к сдвигу делителя вправо и последовательному вычитанию его из делителя (т.е. сложения с дополнительным кодом вычитаемого). Как и в предыдущих операциях, результат деления при необходимости нормализуется.1.2 Описание метода решенияМетод решения заключается в считывании из INPUT в файл чисел, переписывании чисел без разделения их на целую и дробную части, подсчитывании количества разрядов чисел, выбора большего разряда, и сдвига вправо на k разрядов меньшего числа, затем деления нормализованных чисел, если возникает необходимость - нормализации результата, и вывода суммы в OUTPUT.2. Алгоритм (блок-схема) работы программы2.1 Листинг программыПрограмма считывает числа в файл, убирает `. ', считает количество разрядов - k умножаем на 10, до тех пор пока не дойдем до дробной части, с помощью IF THEN ELSE находим больший k у одного из чисел, а к меньшему числу добавляем нули, тем самым сдвигая его вправо, в то же время делим больший k на 1 разряд, предварительно присвоив его другому элементу, до тех пор пока k1 не будет равно k2, записываем в файл числа построчно, начиная с “0. ” - для нормализации, затем нули (если таковые имеются), и само число без “. ”. Считываем записанное построчно как числа и выполняем деление. Часто возникают ситуации, когда необходима нормализация результата, его нормализуем таким же образом как и вводимые числа. Выводим результат + “*k”.PROGRAM DELENIEVNORMFORME;USES CRT;CONSTpt='0. ';z='0';x1=10;VARlst1,lst2: INTEGER;j,x,M,k1,k2,k: REAL;st,st1,st2,jst,xst: string;temp,temp1: text;Ch: CHAR;BEGINASSIGN (temp, 'temp. DAT'); { Создаем временные файлы, для промежуточных преобразований над числами }ASSIGN (temp1, 'temp1. DAT');REWRITE (temp);REWRITE (temp1);WRITELN ('Введите первое число: '); {Считываем оба числа в файл}READ (st);WRITELN (temp,st);WRITELN ('Введите второе число: ');READLN;READLN (st);WRITE (temp,st);k1: =1;k2: =1;RESET (temp);WHILE NOT EOF (temp) {Переписываем числа во второй файл, убирая '. '}DOBEGINWHILE NOT EOLN (temp)DOBEGINREAD (temp,Ch);IF (Ch = '. ')THENELSEWRITE (temp1,Ch);END;READLN (temp);WRITELN (temp1)END;RESET (temp);REPEAT {Считаем количество разрядов первого числа}BEGINREAD (temp,Ch);k1: =k1*x1;ENDUNTIL (Ch = '. ') OR (EOLN (temp));READLN (temp);REPEAT {Считаем количество разрядов второго числа}BEGINREAD (temp,Ch);k2: =k2*x1;ENDUNTIL (Ch = '. ') OR (EOLN (temp));RESET (temp1);REWRITE (temp);st1: ='';st2: ='';IF k1>k2 {ищем на сколько разрядов сдвигать вправо меньшее число }THENBEGINk: =k1/k2;READLN (temp1,st);READ (temp1,st);REPEATBEGINst2: =st2 + z;k1: =k1/x1;END;UNTIL k2=k1;ENDELSEIF k1<k2THENBEGINk: =k2/k1;READ (temp1,st);REPEATBEGINst1: =st1 + z;k2: =k2/x1;ENDUNTIL k2=k1;ENDELSEk: =k1;st1: =pt+st1; {Нормализуем числа}st2: =pt+st2;RESET (temp1);REWRITE (temp);READLN (temp1,jst);READ (temp1,xst);WRITE (temp,st1,jst);WRITELN (temp);WRITE (temp,st2,xst);RESET (temp);READLN (temp,j);READ (temp,x);M: = (j/x); {делим}IF M > 1 { при необходимости результат деления нормализуем }THENBEGINREWRITE (temp);REWRITE (temp1);WRITE (temp,M: 1: 10);RESET (temp);WHILE NOT EOLN (temp)DOBEGINREAD (temp,Ch);IF Ch = '. 'THENELSEWRITE (temp1,Ch);END;RESET (temp1);READ (temp1,st);WRITE ('Частное от деления в нормализованной форме: ','0. ',st,'*',k: 1: 0);ENDELSEWRITE ('Частное от деления в нормализованной форме: ', M: 1: 10,'*',k: 1: 0);END.2.2 Тестирование программыДля тестирования введем два числаНа выходе имеем частное от деления в нормализованной форме3. ВыводПри выполнении этой курсовой работы, был составлен наиболее оптимальный алгоритм деления чисел в нормализованной форме. Более глубоко изучена работа со строковыми данными и типами REAL и INTEGER. Эта программа в первую очередь наиболее необходима людям, которые вручную делят числа в нормализованной форме, чтобы заменить ручной труд на машинный.
|
|