プロが教える店舗&オフィスのセキュリティ対策術

線形リスト上で2個の一次方程式を入力しその和を出力するプログラムを作っています。



.


.

x+3y   このように一文字ずつ入力(改行で区切る)、係数が1の場合は変数のみを入力、ピリオドが入力されたら次の式を入力、またピリオドが入力されたら結果を表示するものです。
考えてみたのですが、「1文字目に2から9までの数字が代入された場合とそうでない場合」「2文字目に+-の符号が代入された場合・・・」「3文字目に・・・」と分岐が多くなりアルゴリズムを考える段階で手詰まりしてしまいました。
どう考えて解けばいいのかお教えください。
この課題の前の課題を参考にしろとのことで、定義には↓のようなものがあります。

type list = ^mojirec;
mojirec = record
moji : char;
kaisu : integer;
next : list
end;

var   found : boolean;
p := head;
while not found and (p<>nil) do
if p^.moji = v then found := true
else p := p^.next;

procedure print( p : list );
begin
if p<> nil then begin
writeln( p^.moji,p^.kaisu );
print( p^.next )
end
end;

A 回答 (1件)

出題者の意図は、多項式の項を要素とする線形リストを作り、検索、更新させることにあるのではないでしょうか。

その前提で考えてみましたのでヒントになりましたら。

まず、例えばrecordを下記のようにするのでは。

type list = ^kourec;
kourec = record
keisu : integer; (*係数。負の場合もある*)
hensu : char; (*変数*)
next : list
end;

x+y.が入力されたら二つのrecordのリストを作ることを考えます。
[+1x]→[+1y]

上記を更に分解すれば、x の入力に対し一つ目のrecordを作って追加、+y の入力に対し二つ目のrecordを作って追加、ピリオドで作成を終了します。

次に 2y の入力に対しリストを検索し、見つかったrecordの係数を変更します。
[+1x]→[+3y]

次にピリオドで表示します。表示のポイントは下記でしょう。
・係数が全てゼロだったら 空です などど表示して終わる。
・係数がゼロだったらそのrecordは表示しない。
・係数が負であれば-符号を表示する。
・初めての表示でなければ符号を表示する。
・係数が1なら省略する。

テストです。下記は空になります。
-z+2y-3x.3x-2y+z.
[-1z]→[+2y]→[-3x] に [+3x]、[-2y]、[+1z] を加える

-----
順番が逆になりましたが文字読み取りとrecord作成のヒントです。エラーチェックするなら例えばフラグを使って許す文字を判定すればよいのでは。

・無限ループ
 ・recordを係数1に初期化する
 ・文字を読むループ
  ・ピリオドなら無限ループ終わり
  ・符号+なら無視。-なら係数に-1を設定する
  ・数字なら係数にかける
  ・英字なら変数に設定し、recordをリストに追加する。文字を読むループ終わり

-----
課題の本質ではないと思いますが仕様を詰める必要があるかもしれません。x+xを許すかとか、y+xのときに表示順をx+yにするかとか。エラーチェックをどこまでやるかとか。
    • good
    • 0
この回答へのお礼

ありがとうございます、参考になりました。

お礼日時:2008/06/05 17:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!