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.
 

AltStyle によって変換されたページ (->オリジナル) /