質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1971閲覧

逆ポーランド記法の足し算と引き算について(このプログラムを引き算に変えるには符号をマイナスにすれば良いですか?)

A_.

総合スコア5

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/15 14:04

編集2021/06/15 14:37

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2021/06/15 14:26 編集

インデントが表示できるようになっていますが、このプログラムは動きません。インデントがおかしいです。 そちらの手元にある「動いている」プログラムを、打ち直すのでなくコピー&ペーストで貼り付けてください。
guest

回答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

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

2箇所「-」に変えればとりあえずは動くようになると思います。
また、変えるのでなく、elif節で追加するようにすれば、足し算も引き算も両方できるようになります。

ただ、入力をがべたがきで、スタックが文字列なので、

  • 足し算としても、答えも含めて1桁しか対応していない。
  • 引き算の場合、負の数にも対応できない。

という問題があるので、

  • 入力はスペースで分けて入力してもらう。「14 23 +」のように。
  • スタックは、文字列でなく、リストにする。格納する数値は文字列でなく数値に変換して入れたほうが扱いやすいでしょう。

とすることで、乗除や各種関数なども扱えるようにしやすくなりますよ。

投稿2021/06/15 14:45

編集2021/06/15 14:47
TakaiY

総合スコア12745

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A_.

2021/06/15 14:53

ありがとうございます。 12+ 3+ という計算をするには、12+をして、33+と2つ分けてプログラムするのでしょうか?
TakaiY

2021/06/15 15:01 編集

今の作りのままやるんですか? 入力はどのようなものを想定していますか? 「12+3+」ですか? それとも、「12+」をやって答えが出てから「3+」を入れられるようにする?
A_.

2021/06/15 15:02

12+3+を入力したいです
A_.

2021/06/15 15:04

23+1- 321-+ というのもやりたいと思っています
TakaiY

2021/06/15 15:12 編集

今の作りのままで進めるのは反対ですがいちおう答えます。 whileのループは現状3ですが、文字列の長さを数えてその回数回すようにする。(すでにnagasaにありますね) 回答にも書きましたが、elifを使って「+」の場合の処理と「ー」の場合の処理を両方書く。 ですべて対応できるようになります。
TakaiY

2021/06/15 15:13

ちなみに。以前も指摘されてましたが、 shiki = input("43+") の"43+"は表示しているだけなので、不要です。 shiki = input("式を入力:") とかのほうがいいでしょう。
A_.

2021/06/15 15:17

その場合43+はどこに書けばよいのでしょうか? きちんと計算できるでしょうか?
TakaiY

2021/06/15 15:21

? このプログラム、動かしたことありますか? プログラムを起動すると、入力待ちになって、そこに式を入力するんですよ?
A_.

2021/06/15 15:22

すみません。そうでしたね。ありがとうございます
A_.

2021/06/15 22:51

12+3+の場合は、ifとelseを使えばよいのでしょうか また、23+1-というような+、-どちらもある場合、ifとelifだけを使うのでしょうか
TakaiY

2021/06/16 00:41

回答にも書きましたが、 ・ whlieの条件を固定の3でなくnagasaにする。 で、長い式も対応できます。(12+3+ ) ・ 以下のような構造にずれば、+ー両方対応できます。 if + なら +の処理(今あるやつ) elif -なら - の処理 else 数字なのでスタックに積む
A_.

2021/06/16 06:10

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:] ここの部分はこれであってますでしょうか?
TakaiY

2021/06/16 06:21 編集

違います。 逆ポーランド記法の仕組みを改めて確認ください。 「+」が入ればスタックを 2つ取り出してそれらを足してスタックに戻す でOKです。 なので、最初の処理のままでよいのです。 12+3+ の場合、 以下の動作です。[] はスタック 1をスタックに入れる [1] 2をスタックに入れる [1 2] +なのでスタックから2つとり [] 足してスタックに戻す [3] 3 をスタックに入れる [3 3] +なのでスタックから2つとり 足してスタックに戻す [6]
A_.

2021/06/16 06:47

while i < nagasa: if shiki[i] == "+": r2 = int(stack[0]) r1 = int(stack[1]) kotae = r1 + r2 ここまでが、+なのでスタックから2つとり 足してスタックに戻す [3] ここからどう書けばいいのか分かりません。 r = int(stack[]) のようにするのでしょうか?
TakaiY

2021/06/16 07:03

もともとある以下の部分がそれです。 kotae = str(kotae) # 答えを文字列にする stack = stack[2:] # スタックから2つ取りのぞく stack = kotae + stack # スタックに答を戻す
TakaiY

2021/06/16 07:10

ようするに、「 if shiki[i] == "+":」の内容は成にも変えなくてOKです。
A_.

2021/06/16 07:15

elseの部分を変えるということでしょうか
A_.

2021/06/16 07:18

すみません。理解が乏しくて。
TakaiY

2021/06/16 07:30

単に、12+3+ を計算できるようにするだけなら、whileのループの回数を3固定から文字列の長さ(nagasa)に変更するだけでできます。 elseの部分も変える必要はありません。
A_.

2021/06/16 09:09

ありがとうございます 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] =="-":   ・   ・   ・ という感じなのでしょうか?
TakaiY

2021/06/16 09:19

そうです。そこには引き算の処理が入りますが、ほぼ足し算と同じで計算だけ違う処理になりますね。
A_.

2021/06/16 09:57

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]) これで実行してみたんですが、エラーがでました。どこが違うのでしょうか?
TakaiY

2021/06/16 10:03

エラーが出ましただけではわかりませんよ。 ですが、 kotae - stack は違います。 ここは + です。
TakaiY

2021/06/16 10:10 編集

質問のやりとりを見ていると、コードの内容をあまり理解されていないように思います。 そうでなければ、ここをマイナスにはしません。 このコード、ご自分で作られたものではありませんよね? 以下の作業をしてコードの動作を理解することをお勧めします。まずは最初のコードからがいいでしょう。 ・ 一行一行、何をしている コードなのか理解する。 ・ 動作させてみたときの流れを書き出す (特に変数になにが入てちるか) ・ デバックで動作させて一行ずつ実行して、その時々の変数の値が想定のものになっているか確認する。 デバッグできないのであれば、コードのいろいろなところにprint式を入れて、変数の値を表示する。出てきた結果が想定したものになっているかどうか確認する。
A_.

2021/06/16 10:14

わかりました
TakaiY

2021/06/16 10:35

作業の中でわからないことが出てきたらそれについての質問を立ててみてください。
A_.

2021/06/16 10:54

stack = kotae + stack の部分について、 なぜ、stackを足すのでしょうか
TakaiY

2021/06/16 11:07

計算は足すになっていますが、kotaeもstackも両方文字列なので、操作そのものは文字列の連結です。そして、このプログラムでは、数字をスタックに入れる動作をこの処理で表わしています。 ロジック的には、答えをスタックに積むことで、計算を継続できるようになります。また、最後にスタックの先頭に答えが入っているのでそれを表示しています。
A_.

2021/06/16 11:11

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問