2013-12-18 2 views
0

У меня есть программа Ada для вычисления среднего и стандартного отклонения 200 значений, взятых из файла, и они оба работают правильно. эти пакеты имеют тип float, как превратить их в общий тип?Как сделать пакет в Ada универсальным пакетом?

Средний пакет объявления файла:

with Text_IO; 
package avg is 
    type int_array is Array (1..200) of integer; 
    function avrage (ParArray: int_array) return float; 
end avg; 

и среднее тело пакета:

with Text_IO; 
WITH Ada.Integer_Text_IO; USE Ada.Integer_Text_IO; 
package body avg is 
function avrage (ParArray: int_array) return float is 
    result: float :=0.0; 
    final:float :=0.0; 
    myarray: int_array:=ParArray; 
begin 
    for v in myarray'Range loop 
    result:= result + float(myarray(v)); 
    end loop; 
    final:=result/200.0; 
    return final; 
end avrage; 
end avg; 

Я называю этот пакет в моей основной программе, «с» и «использовать». пожалуйста, скажите мне, что делать

+0

Почему вы имеете 'с' пакете Text_IO; если вы не обратитесь к все, что объявлено в 'Text_IO'? –

+0

Почему вы используете 'avg' и' avrage'? Почему бы не использовать 'Средние' и' Средние' (или, возможно, 'Статистика' и' Средние')? И почему вы копируете 'ParArray' в' myarray'? –

+0

, потому что мне сказали, что я не могу изменить массив параметров, поэтому я только что создал локальный массив в функции и заставил его вернуть локальный массив. @SimonWright –

ответ

1

Вы не говорите, что хотите, чтобы ваш пакет был общим в.

Я предполагаю, что вы хотите, чтобы вход будет массив (Input_Values ниже) некоторого типа Input_Value индексируется Input_Index, и вы хотите, чтобы вывод, что какая-то типа с плавающей точкой Result_Value. Вам понадобится функция To_Result_Value для преобразования Input_Value в Result_Value.

generic 
    type Input_Value is private; 
    type Input_Index is (<>); 
    type Input_Values is array (Input_Index range <>) of Input_Value; 
    type Result_Value is digits <>; 
    with function To_Result_Value (X : Input_Value) return Result_Value; 
package Statistics is 
    function Mean (Input : Input_Values) return Result_Value; 
end Statistics; 

... с реализацией:

package body Statistics is 
    function Mean (Input : Input_Values) return Result_Value is 
     Sum : Result_Value := 0.0; 
    begin 
     for I of Input loop 
     Sum := Sum + To_Result_Value (I); 
     end loop; 
     return Sum/Result_Value (Input’Length); 
    end Mean; 
end Statistics; 

... и немного демо:

with Ada.Text_IO; 
with Statistics; 
procedure Demo is 
    type Arr is array (Integer range <>) of Integer; 
    function To_Float (X : Integer) return Float is 
    begin 
     return Float (X); 
    end To_Float; 
    package Avg is new Statistics (Input_Value => Integer, 
            Input_Index => Integer, 
            Input_Values => Arr, 
            Result_Value => Float, 
            To_Result_Value => To_Float); 
    A : Arr := (1, 2, 3, 4, 5); 
    M : Float; 
begin 
    M := Avg.Mean (A); 
    Ada.Text_IO.Put_Line ("mean is " & Float'Image (M)); 
end Demo; 
+0

Большое спасибо, что вы сделали PERFECT. Знаете ли вы хорошие учебники об ADA? –

+0

Это не достаточно общее, мне нужно иметь возможность вставлять float/Integer и иметь возможность получать float/Integer в выходном файле. Я попытался изменить функцию To_Float и инициирование пакета, но я получаю сообщение об ошибке, указывающее, что тип float в создании экземпляра «Result_Value» вы сделали цифрой типа Result_Vlaue, могу ли я сделать его приватным? –

+0

Вы * можете * сделать 'Result_Value'' private', но тогда вам нужно будет добавить общие параметры для '' + "', '"/"', начального (нулевого) значения для суммирования и преобразования из 'Integer' в' Result_Value' (для преобразования 'Input'Length'). И если 'Result_Value' является целым типом, я бы подумал, что у вас возникнут проблемы с округлением/усечением при делении на длину входного массива? Вы всегда можете получить результат с плавающей запятой и заставить вызывающего сделать преобразование в требуемый тип, что даст им гораздо больший контроль. См. [This] (https://www.dropbox.com/s/wn2579wrqxun1l0/statistics.ada). –

Смежные вопросы