Contributor: KD TART                  

{
> I'm currently working on a small program for a Turbo Pascal class
> I am taking.  The assignment is to write a program that solves a system
> of equations via Cramer's Rule.  For example:
>
> 4x - 3y + 9z = 21
> 5x - 43y - 3z = 45
> 34x - 394y + 32z = 9
>
> and then find values for x, y, and z.
>
>    Now this is no problem:  I simply get input into a 3 x 4 array, which
> would look like this for the sample above:
>
> 4    -3     9     21
> 5    -43    -3    45
> 34   -394   32    9
>
>    The problem I am having is getting this input from the user.  Now I
> have thought of a few ways to accomplish this, namely:
>
> (1) Ask the user to enter the coefficients and the answer on a line and
> hit return, and do this for each equation--this method allows me to put the
> data directly into the array.
>
> (2) Give a rigid example of how and where to enter the equation, for
> example #####x(sign)#####y(sign)#####z = #####
> so I know where to read for the values to put into the array.
>
> (3) Possibly use the Val procedure and ask the user to input all number
> as in #1, but separate the numbers with dashes.
>
> (4) Possibly convert string values to their ascii equivalent, and see if
> they are numbers, turning non numbers into spaces.
>
> But, what I would rather do is to prompt the user for the whole equation
> and have him/her type it out naturally and then pick the numbers out of
> it to put into the 3x4 array.  Example:
>
> Enter equation #1:
> 3x + 4y - 8z = 45
> ...
>
>    This would seem to require storing the input as a string, and as far
> as I know, you can't pick values of a string (except in a limited sense
> with the Val function as touched upon above).  But I think that it has
> to be possible for me to process a naturally typed out equation!  And I
> would appreciate pointers to that effect.

The following code, written in Turbo Pascal 6, should do what you
want. You may want to test it more thoroughly than I did, and tidy up
the code a bit. It checks for validity of input. Values are stored as
reals.

It reads in the equation, and puts the values into the global array
eq_array.
}

program input_equations(input, output);

type
  eq_string = string[40];

var
  instr :eq_string;
  eq_array :array [1..3, 1..4] of real;
  eq_num :byte;
  x, y, z, answer :real;
  eq_ok :boolean;


procedure prepare_equation_string (var s :eq_string);
{ Removes spaces and converts all letter to upper case }
var
  tempstr :eq_string;
  n :byte;
begin
  tempstr := '';
  for n := 1 to length(s) do
    if s[n] <> ' ' then tempstr := tempstr + upcase(s[n]);
  s := tempstr
end;

function get_arguments (s :eq_string; var a1, a2, a3 :eq_string) :boolean;
{ Splits equation into argument.
  eg, if s='3X+4Y-Z', then a1='3X', a2='+4Y', a3='-Z'.

If any argument is blank, or there are more than 3 arguments,
returns FALSE, otherwise returns TRUE }

  function next_arg (s :eq_string) :eq_string;
  var
    n :byte;
  begin
    n := 2;
    while (n <= length(s)) and not (s[n] in ['+', '-']) do
      inc (n);
    next_arg := copy (s, 1, n-1);
  end;

begin
  a1 := next_arg (s);
  delete (s, 1, length(a1));
  a2 := next_arg (s);
  delete (s, 1, length(a2));
  a3 := next_arg (s);
  delete (s, 1, length(a3));
  get_arguments := ((length(a1)*length(a2)*length(a3)) > 0) and
                   (s = '')
end;

function assign_values (var x, y, z :real; a1, a2, a3 :eq_string) :boolean;
var
  x_assigned, y_assigned, z_assigned, ok_so_far :boolean;

    function assign_value (s :eq_string) :boolean;
    var
      id :char;
      value :real;
      resultcode :integer;
      ok :boolean;
    begin
      id := s[length(s)];
      delete (s, length(s), 1);
      if (s = '') or (s = '+') then
        s := '1';
      if s = '-' then
        s := '-1';
      val (s, value, resultcode);
      ok := (resultcode = 0);
      case id of
        'X' : begin
                x := value;
                x_assigned := true
              end;
        'Y' : begin
                y := value;
                y_assigned := true
              end;
        'Z' : begin
                z := value;
                z_assigned := true
              end
      else
        ok := false
      end;
      assign_value := ok
    end;

begin
  x_assigned := false;
  y_assigned := false;
  z_assigned := false;
  ok_so_far  := assign_value (a1);
  ok_so_far  := ok_so_far and assign_value (a2);
  ok_so_far  := ok_so_far and assign_value (a3);
  assign_values := ok_so_far and x_assigned and y_assigned and z_assigned;
end;

function extract_values(s : eq_string; var x, y, z, ans : real) : boolean;
var
  ok_so_far : boolean;
  n : byte;
  lhs, rhs,
  a1, a2, a3 : eq_string;
  resultcode : integer;

begin
  ok_so_far := true;
  prepare_equation_string(s);
  n := pos ('=', s);
  if n = 0 then
    ok_so_far := false                     { No = in equation }
  else
  begin
    rhs := copy (s, n+1, length(s)-n);
    if pos ('=', rhs) > 0 then
      ok_so_far := false                 { More than one = in equation }
    else
    begin
      lhs := copy (s, 1, n-1);
      if (lhs = '') or (rhs = '') then
        ok_so_far := false             { At least one side of equation }
      else                             { is blank }
      begin
        ok_so_far := get_arguments (lhs, a1, a2, a3);
        ok_so_far := ok_so_far and assign_values (x, y, z, a1, a2, a3);
        val (rhs, ans, resultcode);
        ok_so_far := ok_so_far and (resultcode = 0)
      end;
    end;
  end;
  extract_values := ok_so_far;
end;

begin
  for eq_num := 1 to 3 do
  begin
    repeat
      write ('Equation ', eq_num, ': ');
      readln (instr);
      eq_ok := extract_values (instr, x, y, z, answer);
      if not eq_ok then
        writeln ('Equation not in suitable format, try again');
    until eq_ok;
    eq_array [eq_num, 1] := x;
    eq_array [eq_num, 2] := y;
    eq_array [eq_num, 3] := z;
    eq_array [eq_num, 4] := answer;
  end;
end.