線形リスト上で2個の一次方程式を入力しその和を出力するプログラムを作っています。
x
+
y
.
2
y
.
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;
No.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にするかとか。エラーチェックをどこまでやるかとか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/06/15 14:11
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
プログラミング初心者です。 Py...
-
C言語scanf_sで何故か2回入力に...
-
小数か整数かを判定する方法
-
正負を反転させて出力するプロ...
-
2進数の1の数を数える問題
-
java初心者です。入力されたの...
-
VB.NETで16進数+16進数や16進...
-
enterでループ終了
-
cout関数を使っているのですが...
-
Java 6人分の得点を入力し、平...
-
if文の条件にscanf関数を使うと…?
-
double型が正常に認識されてい...
-
数字以外が入力されたらエラー...
-
入力されたとき,何も入力しな...
-
C言語でつるかめ算をするにはど...
-
Eclipseコンソール表示を、リセ...
-
C言語 逆ピラミッドの作り方
-
scanf が無視されます
-
コマンドプロンプトからのEOFの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報