python
1shiki = input("43+") 2 3stack = "" 4nagasa = len(shiki) 5i = 0 6 7while i < 3: 8 if shiki[i] == "+": 9 r2 = int(stack[0]) 10 r1 = int(stack[1]) 11 kotae = r1 + r2 12 13 kotae = str(kotae) 14 stack = stack[2:] 15 stack = kotae + stack 16 else: 17 stack = shiki[i] + stack 18 19i = i + 1 20 21print(stack[0])
このプログラムを引き算にしたいのですが、符号を+から-に変えるだけで良いのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
インデントがなくコードが読めません(実行できません)。以下を参考に修正ください。
https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif
2021/06/15 14:26 編集
インデントが表示できるようになっていますが、このプログラムは動きません。インデントがおかしいです。
そちらの手元にある「動いている」プログラムを、打ち直すのでなくコピー&ペーストで貼り付けてください。

回答2件
0
Python
1shiki = input("RPN formula:") 2 3stack = [] 4 5i = 0 6while i < len(shiki): 7 ch = shiki[i] 8 if ch == "+": 9 r2 = int(stack.pop()) 10 r1 = int(stack.pop()) 11 kotae = r1 + r2 12 stack.append(kotae) 13 elif ch == "-": 14 r2 = int(stack.pop()) 15 r1 = int(stack.pop()) 16 kotae = r2 - r1 17 stack.append(kotae) 18 elif ch == "*": 19 r2 = int(stack.pop()) 20 r1 = int(stack.pop()) 21 kotae = r1 * r2 22 stack.append(kotae) 23 elif ch == "/": 24 r2 = int(stack.pop()) 25 r1 = int(stack.pop()) 26 kotae = r2 / r1 27 stack.append(kotae) 28 else: 29 stack.append(int(ch)) 30 i = i + 1 31print(stack)
投稿2021/06/16 05:07
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
2箇所「-」に変えればとりあえずは動くようになると思います。
また、変えるのでなく、elif節で追加するようにすれば、足し算も引き算も両方できるようになります。
ただ、入力をがべたがきで、スタックが文字列なので、
- 足し算としても、答えも含めて1桁しか対応していない。
- 引き算の場合、負の数にも対応できない。
という問題があるので、
- 入力はスペースで分けて入力してもらう。「14 23 +」のように。
- スタックは、文字列でなく、リストにする。格納する数値は文字列でなく数値に変換して入れたほうが扱いやすいでしょう。
とすることで、乗除や各種関数なども扱えるようにしやすくなりますよ。
投稿2021/06/15 14:45
編集2021/06/15 14:47総合スコア14534
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
ありがとうございます。
12+ 3+
という計算をするには、12+をして、33+と2つ分けてプログラムするのでしょうか?
今の作りのままやるんですか?
入力はどのようなものを想定していますか? 「12+3+」ですか?
それとも、「12+」をやって答えが出てから「3+」を入れられるようにする?
12+3+を入力したいです
23+1-
321-+
というのもやりたいと思っています
今の作りのままで進めるのは反対ですがいちおう答えます。
whileのループは現状3ですが、文字列の長さを数えてその回数回すようにする。(すでにnagasaにありますね)
回答にも書きましたが、elifを使って「+」の場合の処理と「ー」の場合の処理を両方書く。
ですべて対応できるようになります。
ちなみに。以前も指摘されてましたが、
shiki = input("43+")
の"43+"は表示しているだけなので、不要です。
shiki = input("式を入力:")
とかのほうがいいでしょう。
その場合43+はどこに書けばよいのでしょうか?
きちんと計算できるでしょうか?
? このプログラム、動かしたことありますか?
プログラムを起動すると、入力待ちになって、そこに式を入力するんですよ?
すみません。そうでしたね。ありがとうございます
12+3+の場合は、ifとelseを使えばよいのでしょうか
また、23+1-というような+、-どちらもある場合、ifとelifだけを使うのでしょうか
回答にも書きましたが、
・ whlieの条件を固定の3でなくnagasaにする。
で、長い式も対応できます。(12+3+ )
・ 以下のような構造にずれば、+ー両方対応できます。
if + なら
+の処理(今あるやつ)
elif -なら
- の処理
else
数字なのでスタックに積む
12+3+の場合、
while i < nagasa:
if shiki[i] == "+":
r3 = int(stack[0])
r2 = int(stack[1])
r1 = int(stack[2])
kotae = r1 + r2 + r3
kotae = str(kotae)
stack = stack[2:]
ここの部分はこれであってますでしょうか?
違います。
逆ポーランド記法の仕組みを改めて確認ください。
「+」が入ればスタックを 2つ取り出してそれらを足してスタックに戻す
でOKです。 なので、最初の処理のままでよいのです。
12+3+ の場合、 以下の動作です。[] はスタック
1をスタックに入れる [1]
2をスタックに入れる [1 2]
+なのでスタックから2つとり []
足してスタックに戻す [3]
3 をスタックに入れる [3 3]
+なのでスタックから2つとり 足してスタックに戻す [6]
while i < nagasa:
if shiki[i] == "+":
r2 = int(stack[0])
r1 = int(stack[1])
kotae = r1 + r2
ここまでが、+なのでスタックから2つとり 足してスタックに戻す [3]
ここからどう書けばいいのか分かりません。
r = int(stack[]) のようにするのでしょうか?
もともとある以下の部分がそれです。
kotae = str(kotae) # 答えを文字列にする
stack = stack[2:] # スタックから2つ取りのぞく
stack = kotae + stack # スタックに答を戻す
ようするに、「 if shiki[i] == "+":」の内容は成にも変えなくてOKです。
elseの部分を変えるということでしょうか
すみません。理解が乏しくて。
単に、12+3+ を計算できるようにするだけなら、whileのループの回数を3固定から文字列の長さ(nagasa)に変更するだけでできます。
elseの部分も変える必要はありません。
ありがとうございます
23+1-
のときは、
while i < nagasa:
if shiki[i] == "+":
r2 = int(stack[0])
r1 = int(stack[1])
kotae = r1 + r2
kotae = str(kotae) # 答えを文字列にする
stack = stack[2:] # スタックから2つ取りのぞく
stack = kotae + stack
elif shiki[i] =="-":
・
・
・
という感じなのでしょうか?
そうです。そこには引き算の処理が入りますが、ほぼ足し算と同じで計算だけ違う処理になりますね。
shiki = input("式を入れてください")
stack = ""
nagasa = len(shiki)
i = 0
while i < nagasa:
if shiki[i] == "+":
r2 = int(stack[0])
r1 = int(stack[1])
kotae = r1 + r2
kotae = str(kotae)
stack = stack[2:]
stack = kotae + stack
elif shiki[i] == "-":
r2 = int(stack[0])
r1 = int(stack[1])
kotae = r1 - r2
kotae = str(kotae)
stack = stack[2:]
stack = kotae - stack
else:
stack = shiki[i] + stack
i = i + 1
print(stack[0])
これで実行してみたんですが、エラーがでました。どこが違うのでしょうか?
エラーが出ましただけではわかりませんよ。
ですが、
kotae - stack
は違います。 ここは + です。
質問のやりとりを見ていると、コードの内容をあまり理解されていないように思います。
そうでなければ、ここをマイナスにはしません。
このコード、ご自分で作られたものではありませんよね?
以下の作業をしてコードの動作を理解することをお勧めします。まずは最初のコードからがいいでしょう。
・ 一行一行、何をしている コードなのか理解する。
・ 動作させてみたときの流れを書き出す (特に変数になにが入てちるか)
・ デバックで動作させて一行ずつ実行して、その時々の変数の値が想定のものになっているか確認する。
デバッグできないのであれば、コードのいろいろなところにprint式を入れて、変数の値を表示する。出てきた結果が想定したものになっているかどうか確認する。
わかりました
作業の中でわからないことが出てきたらそれについての質問を立ててみてください。
stack = kotae + stack
の部分について、
なぜ、stackを足すのでしょうか
計算は足すになっていますが、kotaeもstackも両方文字列なので、操作そのものは文字列の連結です。そして、このプログラムでは、数字をスタックに入れる動作をこの処理で表わしています。
ロジック的には、答えをスタックに積むことで、計算を継続できるようになります。また、最後にスタックの先頭に答えが入っているのでそれを表示しています。
ありがとうございます

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。