Разложение целой и дробной частей вещественных чисел по ячейкам матрицы

Задача

Вводятся пять вещественных чисел. Записать в первый столбец матрицы целую часть чисел, во второй - дробную часть, приведенную к пятизначному целому, в третий столбец - знак числа: 0 для положительных чисел и 1 - для отрицательных.

Например, если вводится число 3.234093, то в первой ячейке строки присваивается 3, второй присваивается 23409, а третьей - число 0.

Пояснение к задаче и алгоритм решения

В большинстве языков программирования предусмотрена функция, позволяющая отбросить дробную часть вещественного числа. А также функция, возвращающая абсолютное значение числа. С помощью этих двух функций можно получить целую часть введенного числа.

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

  1. Получить целую часть числа.
  2. Вычесть ее из исходного числа, в результате чего получится вещественное число у которого целая часть равна 0.
  3. Умножить полученное вещественное число на 100000 (т.к. учитываются пять знаков после запятой).
  4. Снова отбросить дробную часть.
  5. Избавиться от знака.

Цикл заполнения матрицы не будет включать внутреннего цикла. Каждая из трех ячеек текущей строки заполняется отдельно по собственной "формуле".

Исходный код на языке программирования Pascal

const
    N = 5;
var
    a: array[1..N,1..3] of longint;
    f: real;
    i,j: byte;
 
begin
    for i:=1 to N do begin
        read(f);
        a[i,1] := abs(trunc(f));
        a[i,2] := abs(trunc((f - trunc(f)) * 100000));
        if f >= 0 then a[i,3] := 0
        else a[i,3] := 1;
    end;
    writeln;
    for i:=1 to N do begin
        for j:=1 to 3 do
            write(a[i,j],' ');
        writeln;
    end;
end.

Пример(ы) выполнения программы на языке Pascal

-1.567 2.345667 3.2 9.0011 -2.2558015

1 56699 1
2 34566 0
3 20000 0
9 109 0
2 25580 1

Особенности решения на языке программирования Pascal

Неточный вывод в 4-ой строке матрицы связан с проблемами двоичной арифметики.

Исходный код на языке программирования C

#include <stdio.h>
#define N 5
main() {
    int a[N][3], i, j;
    float f;
 
    for (i=0; i<N; i++) {
        scanf("%f", &f);
        a[i][0] = abs((int)f);
        a[i][1] = abs((int)((f - a[i][0]) * 100000));
        if (f >=0) a[i][2] = 0;
        else a[i][2] = 1;        
    }
 
    for (i=0; i<N; i++) {
        for (j=0; j<3; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
}

Пример(ы) выполнения программы на языке C

5.45 -4.34 9.03 0.45 -3.8903234
5 44999 0
4 834000 1
9 2999 0
0 45000 0
3 689032 1

Особенности решения на языке программирования C

Преобразование дробной части к целому сильно искажает результат.

Исходный код на языке программирования Python

from random import random
N = 5
a = []
for i in range(N):
    z = []
    f = float(input())
    z.append(abs(int(f)))
    z.append(abs(int((f - int(f))*100000)))
    if f >= 0:
        z.append(0)
    else:
        z.append(1)
    a.append(z)
 
for i in a:
    print(i)

Пример(ы) выполнения программы на языке Python

5.3452        
-7.43525
-4.9458044
9.00022
4.45
[5, 34520, 0]
[7, 43524, 1]
[4, 94580, 1]
[9, 22, 0]
[4, 45000, 0]

Исходный код на языке программирования КуМир

алг
нач
  цел N=5
  цел таб a[1:N,1:3]
  цел i, j
  вещ f
  нц для i от 1 до N
    ввод f
    a[i,1] := int(abs(f))
    a[i,2] := int((abs(f)-a[i,1]) * 100000)
    если f >= 0 то a[i,3] := 0
     иначе a[i,3] := 1 все
  кц
 
  вывод нс
  нц для i от 1 до N
    нц для j от 1 до 3
      вывод a[i,j], " "
    кц
    вывод нс
  кц
кон

Пример(ы) выполнения программы на языке КуМир

4.4
1.000103
-3.999
-0.003421
2

4 40000 0
1 10 0
3 99900 1
0 342 1
2 0 0

Исходный код на языке программирования Basic

dim a(5,3)
for i=0 to 4
        input f
        a[i,0] = abs(int(f))
        a[i,1] = abs(int((f - int(f)) *100000))
        if f >= 0 then
                a[i,2] = 0
        else
                a[i,2] = 1
        endif
next i
 
for i=0 to 4
        for j=0 to 2
                print a[i,j] + " ";
        next j
        print
next i

Пример(ы) выполнения программы на языке Basic

6.54
-4.5434535
0.00234
0.0300002
-1.90
6 54000 0
4 54345 1
0 234 0
0 3000 0
1 89999 1

Особенности решения на языке программирования Basic

В последней строке наблюдается эффект от двоичного представления вещественных чисел.

Тема

Матрицы

Уровень сложности

Средний

Дата публикации