Write float arrays to a text file: Difference between revisions
(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; |
|||
⚫ | |||
⚫ | |||
-- !! I don't know Ada, but I can't see where this procedure writes to |
|||
⚫ | |||
-- !! a file. The spec calls for more than printing to stdout. |
|||
⚫ | |||
( File : File_Type; |
|||
with Ada.Text_Io; |
|||
X : Float_Array; |
|||
with Ada.Float_Text_Io; |
|||
Y : Float_Array; |
|||
⚫ | |||
X_Pres : Natural := 3; |
|||
Y_Pres : Natural := 5 |
|||
⚫ | |||
) is |
|||
⚫ | |||
⚫ | |||
⚫ | |||
for I in Float_Array'range loop |
|||
⚫ | |||
procedure Write_Columns(X : Float_Array; Y : Float_Array; X_Pres : Natural := 3; Y_Pres : Natural := 5) is |
|||
Put (File, " "); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
New_Line (File); |
|||
⚫ | |||
end loop; |
|||
end Write_Columns; |
|||
⚫ | |||
Ada.Text_Io.New_Line; |
|||
File : File_Type; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
begin |
|||
⚫ | |||
Put ("Tell us the file name to write:"); |
|||
Create (File, Out_File, Get_Line); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
Y(I) := Sqrt (X (I)); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
Close (File); |
|||
⚫ | |||
</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
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
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