МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Информатика и программирование
Расчётно-графическое задание
Отчет
Выполнила:
Группа: ФБИ-22
Преподаватель:Зайцев М.Г
Схема иерархии логических модулей
Перевод чисел из десятичной системы счисления в шестеричную систему
Число – 206.116
Перевод дробного числа из десятичной системы счисления в шестеричную осуществляется по следующему алгоритму:
Вначале переводится целая часть десятичной дроби в шестеричную систему счисления;
Затем дробная часть десятичной дроби умножается на основание шестеричной системы счисления;
В полученном произведении выделяется целая часть, которая принимается в качестве значения первого после запятой разряда числа в шестеричной системе счисления;
Алгоритм завершается, если дробная часть полученного произведения равна нулю или если достигнута требуемая точность вычислений. В противном случае вычисления продолжаются с предыдущего шага.
206 Делим на 6. Процесс завершается, когда частное меньше основания 6.
Затем переводим дробную часть.
0,116 |
* |
6 |
= |
0,696 |
0,696 |
* |
6 |
= |
4,176 |
0,176 |
* |
6 |
= |
1,056 |
0,056 |
* |
6 |
= |
0,336 |
0,336 |
* |
6 |
= |
2,016 |
0,016 |
* |
6 |
= |
0,096 |
0,096 |
* |
6 |
= |
0,576 |
0,576 |
* |
6 |
= |
3,456 |
0,456 |
* |
6 |
= |
2,736 |
0,736 |
* |
6 |
= |
4,416 |
Составляем число – 206.11610 = 542.04102003246
Программа перевода вещественного десятичного числа а 6-ичное представление
program PCon10ToPFun;
//Перевод десятичного числа в 6-ичное представление
{$APPTYPE CONSOLE}
uses
SysUtils;
const
precision = 10; {точность (кол-во знаков)}
type
Massiv = array[1..precision] of integer;
Osnov = 2..9;
var
n,num: double; {число в десятичной системе}
p: Osnov; {основание}
Re: Boolean;
NP: string;
TruncMas,
FracMas: Massiv; {массивы для целой и дробной частей}
count: integer; {кол-во цифр в целой части}
i,c: integer;
mistake: integer; //позиция ошибки во введённом 10-ичном числе
//---------------------------------------------------------------------------
function Check_number(Npp: string; n: Integer):Boolean;
// Контроль ввода
Var
t: integer;
Begin
n:= 0; // Позиция ошибочно введенного символа
t:= 0;
Result:=TRUE;
If Length(Npp)=0 Then Result:=FALSE;
For n:=1 To Length(Npp) Do begin
if Npp[n] = '.' Then Inc(t);
If Not (Npp[n] In ['0'..'9']) and (Npp[n] <> '.') and (Npp[n] <> '-') or (Npp[n] = ',') Then
begin
Result:=FALSE;
Write('Ошибка ввода, позиция ', n:3,' '); ReadLn;
Break;
end;
end;
if t > 1 then begin Result:=FALSE;
Write('Ошибка ввода, две точки ', Npp,' '); ReadLn;
end;
end;
//---------------------------------------------------------------------------
{переводит целую часть и возвращает ответ в виде массива}
procedure Int10ToP (n10:longint; osn: Osnov;
var TruncMas: Massiv; var count: integer);
begin
count:= 0;
repeat
Inc(count); //счетчик
TruncMas[count]:= n10 mod osn; // остаток от деления
n10:= n10 div osn;
until n10 = 0;
end;
//---------------------------------------------------------------------------
{переводит дробную часть}
procedure Frac10ToP(n10: double; osn: Osnov;
var FracMas: Massiv);
var
i: integer;
begin
for i:= 1 to precision do
begin
FracMas[i]:= Trunc(n10*osn); // выделяет целую часть
n10:= Frac(n10*osn) // выделяет дробную часть
end;
end;
//---------------------------------------------------------------------------
function Check_p(osn: integer):boolean;
//Контроль ввода
begin
Result:=TRUE;
if (osn<2) or (osn>9) then begin
Result:=FALSE;
Write('Ошибка ввода основания системы счисления: ', osn,' '); ReadLn;
end;
end;
//------------------------------------------------------------------------------
begin
mistake:= 0;// позиция ошибочно введенного символа
WriteLn('Введите 10-тичное число и основание системы счисления ; ');
ReadLn(Np);
ReadLn(p);
//проверка введенного числа
Re:= Check_number(Np, mistake);
if Re=FALSE then Exit;
Re:= Check_p(p);
if Re=FALSE then Exit;
Val(Np,n,c);
num:= n;
if num<0 then num:= num*(-1);
Int10ToP(Trunc(num), p, TruncMas, count); // переводит целую часть
Frac10ToP(Frac(num), p, FracMas); // переводит дробную часть
Write('Число в системе с основанием ', p, ':');
if n<0 then Write('-');
for i:= count downto 1 do //запись в обратном порядке
Write(TruncMas[i]);
Write ('.');
for i:= 1 to precision do // дробная часть с точностью 10
Write(FracMas[i]);
ReadLn;
end.