package FHEF is new Ada.Numerics.Generic_Elementary_Functions(FH_Float);
use FHEF;
- ExpDecimals: FH_Float := 10.0 ** Decimals;
+ ExpDecimals: constant FH_Float := 10.0 ** Decimals;
Log_Arg_Floor: FH_Float;
Temp: FH_Float;
begin
Decimal_Part_F: FH_Float;
Decimal_Part_I: Integer;
ExpDecimals: constant FH_Float := 10.0 ** Decimals;
+ MNum: FH_Float := Num;
begin
- Integer_Part_F := FH_Float'Floor(Num);
- Decimal_Part_F := (Num - Integer_Part_F) * ExpDecimals;
+ Integer_Part_F := FH_Float'Floor(MNum);
+ Decimal_Part_F := (MNum - Integer_Part_F) * ExpDecimals;
Decimal_Part_I := Integer(Decimal_Part_F);
Integer_Part := To_UB_Text(Ada.Strings.Fixed.Trim(Source => Integer'Image(Integer(Integer_Part_F)), Side => Ada.Strings.Left));
package FHEF is new Ada.Numerics.Generic_Elementary_Functions(FH_Float);
use FHEF;
- EPSILON: constant FH_Float := 10.0 ** (-(Decimals + 1));
ExpDecimals: constant FH_Float := 10.0 ** Decimals;
PNum: FH_Float;
Expanded: FH_Float;
Negative := False;
end if;
- Log_Arg_Floored := FH_Float'Floor(Log(Base => 10.0, X => PNum));
+ Log_Arg_Floored := FH_Float'Floor(Log(Base => 10.0, X => Num));
Expanded := 10.0 ** Log_Arg_Floored;
- --PNum := Round_To_Valid_Nums(PNum, Decimals);
-
- --Ada.Text_IO.Put_Line("EP: " & FH_Float'Image((PNum / Expanded) + EPSILON) & " N: " & FH_Float'Image(PNum / Expanded));
- declare
- FPE: constant FH_Float := FH_Float'Floor((PNum / Expanded) + EPSILON);
- F: constant FH_Float := FH_Float'Floor(PNum / Expanded);
- begin
- --Ada.Text_IO.Put_Line("FPE: " & FH_Float'Image(FPE) & " F: " & FH_Float'Image(F));
- if FPE > F then
- PNum := PNum + (EPSILON * Expanded);
- Integer_Part_F := FPE;
- else
- Integer_Part_F := F;
- end if;
- end;
+ Integer_Part_F := Get_Integer_Part(PNum, Decimals);
--Integer_Part_F := FH_Float'Floor(PNum / Expanded);
--Ada.Text_IO.Put_Line("((PNum / Expanded) - Integer_Part_F) * Expanded = " & FH_Float'Image(((PNum / Expanded) - Integer_Part_F) * Expanded));
Decimal_Part := ((PNum / Expanded) - Integer_Part_F) * ExpDecimals;
Decimal_Part_F: FH_Float;
Decimal_Part_I: Integer;
Exponent_Part_I: Integer;
- ExpDecimals: constant FH_Float := 10.0 ** Decimals;
begin
Split_Integer_Decimal_Exponent_Nums(Num, Decimals, Integer_Part_I, Decimal_Part_F, Exponent_Part_I);
Decimal_Part_I := Integer(Decimal_Part_F);
-- BEGIN: Private functions
+ function Get_Integer_Part(Num: in out FH_Float; Decimals: in Natural) return FH_Float is
+ package FHEF is new Ada.Numerics.Generic_Elementary_Functions(FH_Float);
+ use FHEF;
+
+ EPSILON: constant FH_Float := 10.0 ** (-(Decimals + 1));
+ Log_Arg_Floored: FH_Float;
+ Expanded: FH_Float;
+ Integer_Part_F: FH_Float;
+ begin
+ Log_Arg_Floored := FH_Float'Floor(Log(Base => 10.0, X => Num));
+ Expanded := 10.0 ** Log_Arg_Floored;
+ --PNum := Round_To_Valid_Nums(PNum, Decimals);
+
+ --Ada.Text_IO.Put_Line("EP: " & FH_Float'Image((PNum / Expanded) + EPSILON) & " N: " & FH_Float'Image(PNum / Expanded));
+ declare
+ FPE: constant FH_Float := FH_Float'Floor((Num / Expanded) + EPSILON);
+ F: constant FH_Float := FH_Float'Floor(Num / Expanded);
+ begin
+ --Ada.Text_IO.Put_Line("FPE: " & FH_Float'Image(FPE) & " F: " & FH_Float'Image(F));
+ if FPE > F then
+ Num := Num + (EPSILON * Expanded);
+ Integer_Part_F := FPE;
+ else
+ Integer_Part_F := F;
+ end if;
+ end;
+
+ return Integer_Part_F;
+ end Get_Integer_Part;
+
procedure Prepend_Zeros_To_Text(Num: in FH_Float; Decimals: in Natural; Text: in out UB_Text) is
package FHEF is new Ada.Numerics.Generic_Elementary_Functions(FH_Float);
use FHEF;
with Ada.Strings.Fixed;
with Ada.Text_IO;
with Formatting_Helpers;
+-- For walkthrough generator
+with AWS.Templates;
+
separate(Problem_Generator)
Parameters := (No_Both_Simplifications => False);
Problem.Parameters := Parameters;
+ Problem.Walkthrough_Generated := False;
return Problem;
end Create;
pH: pH_Float;
pH_Answered: pH_Float;
begin
- pH := Calculate_Solution(Problem);
+ pH := Problem.Answer;
-- Verify answer data
if Answer.Find(ANSWER_PH_KEY) = Answer_Info.No_Element then
return Malformed_Answer;
end Get_Parameters;
function Get_Walkthrough(Problem: in out Acidobazic_Problem; Walkthrough: out Walkthrough_Info.Map) return RetCode is
+ package FH is new Formatting_Helpers(pH_Float);
+ use AWS.Templates;
+
+ Atpr_Check: constant pH_Float := Walkthrough_Check_Autoprotolysis(Problem);
+ Dissoc_Check: constant pH_Float := Walkthrough_Check_Dissociation(Problem);
+ c_Ion: pH_Float := Walkthrough_Calculate_Concentration(Problem);
+ Trans_CI: Translate_Set;
+ Trans_AC: Translate_Set;
+ Trans_DC: Translate_Set;
+ c_Ion_I: UB_Text;
+ c_Ion_D: UB_Text;
+ c_Ion_E: UB_Text;
+ Kx_I: UB_Text;
+ Kx_D: UB_Text;
+ Kx_E: UB_Text;
+ cX_I: UB_Text;
+ cX_D: UB_Text;
+ cX_E: UB_Text;
+ Atpr_I: UB_Text;
+ Atpr_D: UB_Text;
+ Atpr_E: UB_Text;
+ Dissoc_I: UB_Text;
+ Dissoc_D: UB_Text;
+ Dissoc_E: UB_Text;
+ TeXCode: UB_Text;
+
+ Ret: RetCode;
begin
- return E_NOTIMPL;
+ if Problem.Walkthrough_Generated then
+ return OK;
+ end if;
+
+ FH.Split_Integer_Decimal_Exponent_Strs(c_Ion, DECIMALS, c_Ion_I, c_Ion_D, c_Ion_E);
+ FH.Split_Integer_Decimal_Exponent_Strs(Problem.Kx, DECIMALS, Kx_I, Kx_D, Kx_E);
+ FH.Split_Integer_Decimal_Exponent_Strs(Problem.cX, DECIMALS, cX_I, cX_D, cX_E);
+ FH.Split_Integer_Decimal_Exponent_Strs(Dissoc_Check, DECIMALS, Dissoc_I, Dissoc_D, Dissoc_E);
+ FH.Split_Integer_Decimal_Exponent_Strs(Atpr_Check, DECIMALS, Atpr_I, Atpr_D, Atpr_E);
+
+ Insert(Trans_CI, Assoc(CONC_ION_INT_KEY, c_Ion_I));
+ Insert(Trans_CI, Assoc(CONC_ION_DEC_KEY, c_Ion_D));
+ Insert(Trans_CI, Assoc(CONC_ION_EXP_KEY, c_Ion_E));
+
+ Insert(Trans_CI, Assoc(CONC_SUBST_INT_KEY, cX_I));
+ Insert(Trans_CI, Assoc(CONC_SUBST_DEC_KEY, cX_D));
+ Insert(Trans_CI, Assoc(CONC_SUBST_EXP_KEY, cX_E));
+
+ Insert(Trans_CI, Assoc(KX_INT_KEY, Kx_I));
+ Insert(Trans_CI, Assoc(KX_DEC_KEY, Kx_D));
+ Insert(Trans_CI, Assoc(KX_EXP_KEY, Kx_E));
+
+ TeXCode := Parse(Filename => WT_T_PREFIX & "ion_conc.ttex", Translations => Trans_CI);
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_ION_CONC, Problem.Resource_Prefix);
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Problem.Add_Tracked_Resource(WT_F_ION_CONC & WT_F_EXTENSION);
+
+ Insert(Trans_DC, Assoc(CONC_ION_INT_KEY, c_Ion_I));
+ Insert(Trans_DC, Assoc(CONC_ION_DEC_KEY, c_Ion_D));
+ Insert(Trans_DC, Assoc(CONC_ION_EXP_KEY, c_Ion_E));
+
+ Insert(Trans_DC, Assoc(CONC_SUBST_INT_KEY, cX_I));
+ Insert(Trans_DC, Assoc(CONC_SUBST_DEC_KEY, cX_D));
+ Insert(Trans_DC, Assoc(CONC_SUBST_EXP_KEY, cX_E));
+
+ Insert(Trans_DC, Assoc(CHECK_DISSOC_INT_KEY, Dissoc_I));
+ Insert(Trans_DC, Assoc(CHECK_DISSOC_DEC_KEY, Dissoc_D));
+ Insert(Trans_DC, Assoc(CHECK_DISSOC_EXP_KEY, Dissoc_E));
+
+ TeXCode := Parse(Filename => WT_T_PREFIX & "check_dissoc.ttex", Translations => Trans_DC);
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_CHECK_DISSOC, Problem.Resource_Prefix);
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Problem.Add_Tracked_Resource(WT_F_CHECK_DISSOC & WT_F_EXTENSION);
+
+ Insert(Trans_AC, Assoc(CONC_ION_INT_KEY, c_Ion_I));
+ Insert(Trans_AC, Assoc(CONC_ION_DEC_KEY, c_Ion_D));
+ Insert(Trans_AC, Assoc(CONC_ION_EXP_KEY, c_Ion_E));
+
+ Insert(Trans_AC, Assoc(CHECK_ATPR_INT_KEY, Atpr_I));
+ Insert(Trans_AC, Assoc(CHECK_ATPR_DEC_KEY, Atpr_D));
+ Insert(Trans_AC, Assoc(CHECK_ATPR_EXP_KEY, Atpr_E));
+
+ TeXCode := Parse(Filename => WT_T_PREFIX & "check_atpr.ttex", Translations => Trans_AC);
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_CHECK_ATPR, Problem.Resource_Prefix);
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Problem.Add_Tracked_Resource(WT_F_CHECK_ATPR & WT_F_EXTENSION);
+
+ case Problem.Simpl is
+ when Both =>
+ declare
+ pH_I: UB_Text;
+ pH_D: UB_Text;
+ Trans_A: Translate_Set;
+ begin
+ FH.Split_Integer_Decimal_Unscaled_Strs(Problem.Answer, DECIMALS, pH_I, pH_D);
+ Insert(Trans_A, Assoc(WT_ANSWER_PH_INT_KEY, pH_I));
+ Insert(Trans_A, Assoc(WT_ANSWER_PH_DEC_KEY, pH_D));
+ Insert(Trans_A, Assoc(CONC_SUBST_INT_KEY, cX_I));
+ Insert(Trans_A, Assoc(CONC_SUBST_DEC_KEY, cX_D));
+ Insert(Trans_A, Assoc(CONC_SUBST_EXP_KEY, cX_E));
+ Insert(Trans_A, Assoc(KX_INT_KEY, Kx_I));
+ Insert(Trans_A, Assoc(KX_DEC_KEY, Kx_D));
+ Insert(Trans_A, Assoc(KX_EXP_KEY, Kx_E));
+
+ case Problem.Subst_Type is
+ when Acid =>
+ TeXCode := Parse(Filename => WT_T_PREFIX & "result_acid.ttex", Translations => Trans_A);
+ when Base =>
+ TeXCode := Parse(Filename => WT_T_PREFIX & "result_base.ttex", Translations => Trans_A);
+ end case;
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_RESULT, Problem.Resource_Prefix);
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Problem.Add_Tracked_Resource(WT_F_RESULT & WT_F_EXTENSION);
+ end;
+
+ when Autoprotolysis =>
+ declare
+ pH_I: UB_Text;
+ pH_D: UB_Text;
+ Trans_PA: Translate_Set;
+ Trans_A: Translate_Set;
+ begin
+ c_Ion := Walkthrough_Calculate_Concentration_With_Dissoc(Problem);
+
+ FH.Split_Integer_Decimal_Unscaled_Strs(Problem.Answer, DECIMALS, pH_I, pH_D);
+ FH.Split_Integer_Decimal_Exponent_Strs(c_Ion, DECIMALS, c_Ion_I, c_Ion_D, c_Ion_E);
+
+ Insert(Trans_PA, Assoc(CONC_ION_INT_KEY, c_Ion_I));
+ Insert(Trans_PA, Assoc(CONC_ION_DEC_KEY, c_Ion_D));
+ Insert(Trans_PA, Assoc(CONC_ION_EXP_KEY, c_Ion_E));
+ Insert(Trans_PA, Assoc(CONC_SUBST_INT_KEY, cX_I));
+ Insert(Trans_PA, Assoc(CONC_SUBST_DEC_KEY, cX_D));
+ Insert(Trans_PA, Assoc(CONC_SUBST_EXP_KEY, cX_E));
+ Insert(Trans_PA, Assoc(KX_INT_KEY, Kx_I));
+ Insert(Trans_PA, Assoc(KX_DEC_KEY, Kx_D));
+ Insert(Trans_PA, Assoc(KX_EXP_KEY, Kx_E));
+ TeXCode := Parse(Filename => WT_T_PREFIX & "with_dissoc.ttex", Translations => Trans_PA);
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_WITH_DISSOC, Problem.Resource_Prefix);
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Problem.Add_Tracked_Resource(WT_F_WITH_DISSOC & WT_F_EXTENSION);
+
+ Insert(Trans_A, Assoc(WT_ANSWER_PH_INT_KEY, pH_I));
+ Insert(Trans_A, Assoc(WT_ANSWER_PH_DEC_KEY, pH_D));
+ Insert(Trans_A, Assoc(CONC_ION_INT_KEY, c_Ion_I));
+ Insert(Trans_A, Assoc(CONC_ION_DEC_KEY, c_Ion_D));
+ Insert(Trans_A, Assoc(CONC_ION_EXP_KEY, c_Ion_E));
+ case Problem.Subst_Type is
+ when Acid =>
+ TeXCode := Parse(Filename => WT_T_PREFIX & "result_acid2.ttex", Translations => Trans_A);
+ when Base =>
+ TeXCode := Parse(Filename => WT_T_PREFIX & "result_base2.ttex", Translations => Trans_A);
+ end case;
+
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_RESULT, Problem.Resource_Prefix);
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Problem.Add_Tracked_Resource(WT_F_RESULT & WT_F_EXTENSION);
+ end;
+ when Dissociation =>
+ declare
+ pH_I: UB_Text;
+ pH_D: UB_Text;
+ Trans_A: Translate_Set;
+ begin
+ FH.Split_Integer_Decimal_Unscaled_Strs(Problem.Answer, DECIMALS, pH_I, pH_D);
+ Insert(Trans_A, Assoc(WT_ANSWER_PH_INT_KEY, pH_I));
+ Insert(Trans_A, Assoc(WT_ANSWER_PH_DEC_KEY, pH_D));
+ Insert(Trans_A, Assoc(CONC_SUBST_INT_KEY, cX_I));
+ Insert(Trans_A, Assoc(CONC_SUBST_DEC_KEY, cX_D));
+ Insert(Trans_A, Assoc(CONC_SUBST_EXP_KEY, cX_E));
+ Insert(Trans_A, Assoc(KX_INT_KEY, Kx_I));
+ Insert(Trans_A, Assoc(KX_DEC_KEY, Kx_D));
+ Insert(Trans_A, Assoc(KX_EXP_KEY, Kx_E));
+
+ case Problem.Subst_Type is
+ when Acid =>
+ TeXCode := Parse(Filename => WT_T_PREFIX & "result_acid_atpr.ttex", Translations => Trans_A);
+ when Base =>
+ TeXCode := Parse(Filename => WT_T_PREFIX & "result_base_atpr.ttex", Translations => Trans_A);
+ end case;
+ if Ret /= OK then
+ return Ret;
+ end if;
+ Ret := Problem_Generator.TeX_To_PNG(TeXCode, WT_F_RESULT, Problem.Resource_Prefix);
+ Problem.Add_Tracked_Resource(WT_F_RESULT & WT_F_EXTENSION);
+ end;
+ end case;
+
+ Problem.Walkthrough_Generated := True;
+ return OK;
end Get_Walkthrough;
procedure New_Problem(Problem: in out Acidobazic_Problem) is
Calculate_Concentration_Limits(cX_Min, cX_Max, Problem.Kx, Problem.Simpl);
Problem.cX := Random_cX(cX_Min, cX_Max);
+
+ Problem.Answer := Calculate_Solution(Problem);
end New_Problem;
function Set_Parameters(Problem: in out Acidobazic_Problem; Parameters: in Parameters_Info.Map) return RetCode is
-- We are ignoring autoprotolysis and taking dissociation into account
when Autoprotolysis =>
declare
- D: pH_Float;
- X_1: pH_Float;
- X_2: pH_Float;
pX: pH_Float;
begin
- -- Solve the quadratic equation
- D := (Problem.Kx ** 2.0) + (4.0 * Problem.Kx * Problem.cX);
- if D < 0.0 then
- raise Constraint_Error;
- end if;
- D := D ** 0.5;
- X_1 := (-Problem.Kx + D) / 2.0;
- X_2 := (-Problem.Kx - D) / 2.0;
- pX := X_To_pX(pH_Float'Max(X_1, X_2));
+ pX := Walkthrough_Calculate_Concentration_With_Dissoc(Problem);
+ pX := X_To_pX(pX);
if Problem.Subst_Type = Base then
return 14.0 - pX;
else
return MEF.Log(Base => 10.0, X => X) * (-1.0);
end X_To_pX;
+ -- Walkthrough functiokns
+ function Walkthrough_Calculate_Concentration(Problem: in Acidobazic_Problem) return pH_Float is
+ package MEF is new Ada.Numerics.Generic_Elementary_Functions(pH_Float);
+ use MEF;
+ begin
+ return (Problem.Kx * Problem.cX) ** (0.5);
+ end Walkthrough_Calculate_Concentration;
+
+ function Walkthrough_Calculate_Concentration_With_Dissoc(Problem: in Acidobazic_Problem) return pH_Float is
+ package MEF is new Ada.Numerics.Generic_Elementary_Functions(pH_Float);
+ use MEF;
+
+ D: pH_Float;
+ X_1: pH_Float;
+ X_2: pH_Float;
+ begin
+ -- Solve the quadratic equation
+ D := (Problem.Kx ** 2.0) + (4.0 * Problem.Kx * Problem.cX);
+ if D < 0.0 then
+ raise Constraint_Error;
+ end if;
+ D := D ** 0.5;
+ X_1 := (-Problem.Kx + D) / 2.0;
+ X_2 := (-Problem.Kx - D) / 2.0;
+ return pH_Float'Max(X_1, X_2);
+ end Walkthrough_Calculate_Concentration_With_Dissoc;
+
+ function Walkthrough_Check_Autoprotolysis(Problem: in Acidobazic_Problem) return pH_Float is
+ package MEF is new Ada.Numerics.Generic_Elementary_Functions(pH_Float);
+ use MEF;
+ begin
+ return K_W / (Problem.Kx * Problem.cX);
+ end Walkthrough_Check_Autoprotolysis;
+
+ function Walkthrough_Check_Dissociation(Problem: in Acidobazic_Problem) return pH_Float is
+ package MEF is new Ada.Numerics.Generic_Elementary_Functions(pH_Float);
+ use MEF;
+ begin
+ return ((Problem.Kx * Problem.cX) ** (0.5)) / Problem.cX;
+ end Walkthrough_Check_Dissociation;
+
+ -- Destructor
+ overriding procedure Finalize(Problem: in out Acidobazic_Problem) is
+ begin
+ Problem.Free_Tracked_Resources;
+ end Finalize;
+
end Acidobazic_Suite;
with Global_Types;
with Problem_Generator_Syswides;
+with Ada.Containers.Indefinite_Doubly_Linked_Lists;
with Ada.Finalization;
with Ada.Strings.Unbounded;
with Cairo;
function Get_Problem(P_Type: in Problem_Type) return access Chem_Problem'Class;
private
+ function TeX_To_PNG(TeXCode: in UB_Text; Filename: in String; Resource_Prefix: in Ada.Strings.Unbounded.Unbounded_String) return RetCode;
+ package Resource_List is new Ada.Containers.Indefinite_Doubly_Linked_Lists(Element_Type => String);
type Chem_Problem is abstract limited new Ada.Finalization.Limited_Controlled with
record
Resource_Prefix: Ada.Strings.Unbounded.Unbounded_String;
+ TRL: Resource_List.List;
end record;
+ procedure Add_Tracked_Resource(Problem: in out Chem_Problem; Name: in String);
+ procedure Free_Tracked_Resources(Problem: in out Chem_Problem);
+
+ WALKTHROUGH_TEMPLATES_PATH: constant String := "walkthrough_templates/";
package Acidobazic_Suite is
use Problem_Generator_Syswides.Acidobazic_Suite;
function Get_Parameters(Problem: in out Acidobazic_Problem; Parameters: out Parameters_Info.Map) return RetCode;
function Get_Walkthrough(Problem: in out Acidobazic_Problem; Walkthrough: out Walkthrough_Info.Map) return RetCode;
function Set_Parameters(Problem: in out Acidobazic_Problem; Parameters: in Parameters_Info.Map) return RetCode;
+ overriding procedure Finalize(Problem: in out Acidobazic_Problem);
private
type pH_Float is digits 15;
function Random_Kx return pH_Float;
function Random_Simplification(Kx: in pH_Float; No_Both_Simplifications: in Boolean) return Simplification;
function X_To_pX(X: in pH_Float) return pH_Float;
+ function Walkthrough_Calculate_Concentration(Problem: in Acidobazic_Problem) return pH_Float;
+ function Walkthrough_Calculate_Concentration_With_Dissoc(Problem: in Acidobazic_Problem) return pH_Float;
+ function Walkthrough_Check_Autoprotolysis(Problem: in Acidobazic_Problem) return pH_Float;
+ function Walkthrough_Check_Dissociation(Problem: in Acidobazic_Problem) return pH_Float;
type Acidobazic_Problem is new Problem_Generator.Chem_Problem with
record
Parameters: Acidobazic_Parameters;
Simpl: Simplification;
Subst_Type: Substance_Type;
+ Walkthrough_Generated: Boolean;
end record;
Acidic_Min_pH: constant pH_Float := 1.75;
MAX_CONCENTRATION_DIFF: constant pH_Float := 0.75;
CONCENTRATION_HARD_MIN_LIMIT: constant pH_Float := 1.0E-6;
DECIMALS: constant Natural := 3;
+ --
+ CHECK_ATPR_INT_KEY: constant String := "CHECK_ATPR_INT";
+ CHECK_ATPR_DEC_KEY: constant String := "CHECK_ATPR_DEC";
+ CHECK_ATPR_EXP_KEY: constant String := "CHECK_ATPR_EXP";
+ CHECK_DISSOC_INT_KEY: constant String := "CHECK_DISSOC_INT";
+ CHECK_DISSOC_DEC_KEY: constant String := "CHECK_DISSOC_DEC";
+ CHECK_DISSOC_EXP_KEY: constant String := "CHECK_DISSOC_EXP";
+ CONC_ION_INT_KEY: constant String := "CONC_ION_INT";
+ CONC_ION_DEC_KEY: constant String := "CONC_ION_DEC";
+ CONC_ION_EXP_KEY: constant String := "CONC_ION_EXP";
+ CONC_SUBST_INT_KEY: constant String := "CONC_SUBST_INT";
+ CONC_SUBST_DEC_KEY: constant String := "CONC_SUBST_DEC";
+ CONC_SUBST_EXP_KEY: constant String := "CONC_SUBST_EXP";
+ KX_INT_KEY: constant String := "KX_INT";
+ KX_DEC_KEY: constant String := "KX_DEC";
+ KX_EXP_KEY: constant String := "KX_EXP";
+ WT_ANSWER_PH_INT_KEY: constant String := "WT_ANSWER_PH_INT";
+ WT_ANSWER_PH_DEC_KEY: constant String := "WT_ANSWER_PH_DEC";
+ --
+ WT_F_EXTENSION: constant String := ".png";
+ WT_F_RESULT: constant String := "result";
+ WT_F_ION_CONC: constant String := "ion_conc";
+ WT_F_CHECK_ATPR: constant String := "check_atpr";
+ WT_F_CHECK_DISSOC: constant String := "check_dissoc";
+ WT_F_WITH_DISSOC: constant String := "with_dissoc";
+ --
+ WT_T_PREFIX: constant String := WALKTHROUGH_TEMPLATES_PATH & "acidobazic_suite/";
end Acidobazic_Suite;
X_AXIS_UNITS_TEXT: constant String := "V (odměrný roztok) [mL]";
Y_AXIS_UNITS_TEXT: constant String := "pH";
--
- TITRATION_CURVE_FILENAME: constant String := "-curve.png";
+ TITRATION_CURVE_FILENAME: constant String := "curve.png";
end Titration_Curve_Suite;