Write float arrays to a text file: Difference between revisions

From Rosetta Code
Content added Content deleted
(Ada solution fixed (writes in any file, rather than to Standard_Output))
Line 18: Line 18:
This task is intended as a subtask for [[Measure relative performance of sorting algorithms implementations]].
This task is intended as a subtask for [[Measure relative performance of sorting algorithms implementations]].
=={{header|Ada}}==
=={{header|Ada}}==
<Ada>
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;


procedure Write_Float_Array is
-- !! I don't know Ada, but I can't see where this procedure writes to
type Float_Array is array (1..4) of Float;
-- !! a file. The spec calls for more than printing to stdout.
procedure Write_Columns

( File : File_Type;
with Ada.Text_Io;
X : Float_Array;
with Ada.Float_Text_Io;
Y : Float_Array;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
X_Pres : Natural := 3;
Y_Pres : Natural := 5
procedure Write_Float_Array is
) is
type Float_Array is array(1..4) of Float;
begin
X : Float_Array := (1.0, 2.0, 3.0, 1.0e11);
Y : Float_Array ;
for I in Float_Array'range loop
Put (File => File, Item => X(I), Fore => 1, Aft => X_Pres - 1);
procedure Write_Columns(X : Float_Array; Y : Float_Array; X_Pres : Natural := 3; Y_Pres : Natural := 5) is
Put (File, " ");
begin
Put (File => File, Item => Y(I), Fore => 1, Aft => Y_Pres - 1);
for I in Float_Array'range loop
New_Line (File);
Ada.Float_Text_Io.Put(Item => X(I), Fore => 1, Aft => X_Pres - 1);
Ada.Text_IO.Put(" ");
end loop;
end Write_Columns;
Ada.Float_Text_Io.Put(Item => Y(I), Fore => 1, Aft => Y_Pres - 1);
Ada.Text_Io.New_Line;
end loop;
File : File_Type;
X : Float_Array := (1.0, 2.0, 3.0, 1.0e11);
end Write_Columns;
Y : Float_Array;
begin
begin
for I in Float_Array'range loop
Y(I) := Sqrt(X(I));
Put ("Tell us the file name to write:");
Create (File, Out_File, Get_Line);
end loop;
for I in Float_Array'range loop
Write_columns(X, Y);
Y(I) := Sqrt (X (I));
end Write_Float_Array;
end loop;

Write_columns (File, X, Y);
Close (File);
end Write_Float_Array;
</Ada>
=={{header|Fortran}}==
=={{header|Fortran}}==
In ANSI FORTRAN 77 or later use OPEN STATEMENT, and formatted WRITE statement with implied DO loop:
In ANSI FORTRAN 77 or later use OPEN STATEMENT, and formatted WRITE statement with implied DO loop:

Revision as of 07:26, 5 June 2008

Task
Write float arrays to a text file
You are encouraged to solve this task according to the task description, using any language you may know.

Write two equal-sized numerical arrays `x' and `y' to a two-column text file named `filename'.

The first column of the file contains values from an `x'-array with a given `xprecision', the second -- values from `y'-array with `yprecision'.

For example, considering:

   x = {1, 2, 3, 1e11};
   y = {1, 1.4142135623730951, 1.7320508075688772, 316227.76601683791}; /* sqrt(x) */
   xprecision = 3;
   yprecision = 5;

The file is:

   1    1
   2    1.4142
   3    1.7321
   1e+011   3.1623e+005

This task is intended as a subtask for Measure relative performance of sorting algorithms implementations.

Ada

<Ada> with Ada.Text_IO; use Ada.Text_IO; with Ada.Float_Text_IO; use Ada.Float_Text_IO; with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;

procedure Write_Float_Array is

  type Float_Array is array (1..4) of Float;
  procedure Write_Columns
            (  File   : File_Type;
               X      : Float_Array;
               Y      : Float_Array;
               X_Pres : Natural := 3;
               Y_Pres : Natural := 5
            ) is
  begin
     for I in Float_Array'range loop
        Put (File => File, Item => X(I), Fore => 1, Aft => X_Pres - 1);
        Put (File, " ");
        Put (File => File, Item => Y(I), Fore => 1, Aft => Y_Pres - 1);
        New_Line (File);
     end loop;
  end Write_Columns;
  
  File : File_Type;
  X : Float_Array := (1.0, 2.0, 3.0, 1.0e11);
  Y : Float_Array;

begin

  Put ("Tell us the file name to write:");
  Create (File, Out_File, Get_Line);
  for I in Float_Array'range loop
     Y(I) := Sqrt (X (I));
  end loop;
  Write_columns (File, X, Y);
  Close (File);

end Write_Float_Array; </Ada>

Fortran

In ANSI FORTRAN 77 or later use OPEN STATEMENT, and formatted WRITE statement with implied DO loop:

     real x(4), y(4)
     data x / 1.0, 2.0, 4.0, 1.0e11 /
     
     do 10 i = 1, 4
        y = sqrt(x)
  10 continue
     
     open(unit=15, file='two_cols.txt', status='new')
     write(15,'(f20.3,f21.4)') (x(I), y(I), I = 1, 4)
     end

IDL

; the data:
x = [1,2,3,1e11]
y=sqrt(x)
xprecision=3
yprecision=5
 
; NOT how one would do things in IDL, but in the spirit of the task - the output format:
form = string(xprecision,yprecision,format='("(G0.",I0.0,",1x,G0.",I0.0,")")')
 
; file I/O:
openw,unit,"datafile.txt",/get
  for i = 1L, n_elements(x) do printf, unit, x[i-1],y[i-1],format=form
free_lun,unit

The file "datafile.txt" then contains the following:

1 1
2 1.4142
3 1.7321
1E+011 3.1623E+005

This is fairly ugly and un-IDLish. For example one shouldn't just rely on x and y having the same size. And if data is output in human-readable form, it should probably be lined up more nicely. And if it really has to be in two-column format with x and y side by side, one might consider running ASCII_Template or some such instead of that ugly hand-formatting.

J

   require 'files'            NB.  for fwrites
   
   x          =.  1 2 3 1e11
   y          =.  %: x        NB.  y is sqrt(x)
   
   xprecision =.  3
   yprecision =.  5
   
   filename   =.  'whatever.txt'
   
   data       =.  (0 j. xprecision,yprecision) ": x,.y
   
   data fwrites filename

Python

Works with: Python version 2.6
import itertools
def writedat(filename, x, y, xprecision=3, yprecision=5):
    with open(filename,'w') as f:
        for a, b in itertools.izip(x, y):
            f.write("%.*g\t%.*g\n" % (xprecision, a, yprecision, b))

Example usage

>>> import math
>>> x = [1, 2, 3, 1e11]
>>> y = map(math.sqrt, x)
>>> y
[1.0, 1.4142135623730951, 1.7320508075688772, 316227.76601683791]
>>> writedat("sqrt.dat", x, y)
>>> # check 
...
>>> for line in open('sqrt.dat'):
...   print line,
...
1       1
2       1.4142
3       1.7321
1e+011  3.1623e+005