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

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

新規登録して質問してみよう
ただいま回答率
85.37%
基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

解決済

1回答

399閲覧

【基本情報技術者】テキストの問題について

yukiton

総合スコア1

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

1グッド

0クリップ

投稿2024/08/05 08:07

テキストの問題について質問があります。

某問題集を解いていると、以下のような問題がありました。

次の手続きproAの処理が終了した直後に、「A」が何文字出力されたか答えなさい。
(疑似言語で書かれていましたが、そのまま使うとまずい気がするのでpythonのプログラムに置き換えます。
グローバル変数は関数内で使えない等色々あると思いますが、目を瞑っていただけると助かります)

大域変数:a = "A"

def proA():
print(a)
a = "B"
print(a)
proB(a)
proC()

def proB(b):
print(b)
a = b
print(a)

def proC():
print(a)
a = "C"
print(a)

proA()

上記の問題にて、答えは"ABBBAC"であると記載されています。
しかし、aは大域変数として定義されており、関数proA内で操作されているため、答えは"ABBBBC"になるのではないかと思っています。
恐らく大域変数として関数外で定義されているため、proAから参照したときとproCから参照したときで出力される文字列が違うという趣旨の問題だと思うのですが、proA内で大域変数にBを代入しているため、proC内から参照したときもBで出力される認識でした。
この場合どちらが正しいのでしょうか。
また、言語によって出力される内容が違う可能性などもあるのでしょうか。
そもそも大域変数=グローバル変数という認識であっているのでしょうか。

拙い質問で申し訳ありませんが、ご回答いただけると助かります。

mochisio👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

TakaiY

2024/08/05 08:45 編集

pythonはインデントがないと何もわからないので、質問を編集して、コードの挿入ボタン</> を押して出てくる、```と``` の間にコードを入れて、言語を指定してください。 あと、言語が違うと変数のスコープの扱いも異なるので、違う言語に書き換えても正しい回答は得られないと思います。
meg_

2024/08/05 09:34

> 某問題集を解いていると、以下のような問題がありました。 > (疑似言語で書かれていましたが、そのまま使うとまずい気がするのでpythonのプログラムに置き換えます。 引用の範囲であれば問題ない場合もありますのでその問題集のルールに従ってそのまま問題を載せることはできませんか?
yukiton

2024/08/05 13:38

質問への回答ありがとうございます。 今回は解決しましたが、次回以降の質問の際はTakaiYさんのおっしゃる方法で質問させていただきます。 言語の仕様によって出力結果が変わってしまうこともあるのですね。とても勉強になりました。 ありがとうございます。
guest

回答1

0

ベストアンサー

お書きのコードで3つの関数がネストされていない前提だと、global aを適宜追加したとして、

答えは"ABBBBC"になるのではないかと思っています。

ですね。

上記の問題にて、答えは"ABBBAC"であると記載されています。

であるとすると、
・言語が違うので違う結果になる
・質問者がPythonに書き直した際の間違い
・テキストの誤り
のどれかでしょう。

・言語が違うので違う結果になる

の前提で調べてみました。
基本情報技術者試験の言語ならIPAサイトに言語仕様が書いてあるだろうと見てみると、変数宣言文のある言語のようなので、そこには明記されていませんが、おそらく「グローバル変数と同名のローカル変数を宣言可能で、その名前は宣言以降はローカル変数名となる(宣言以前はグローバル変数名)」と言うことかと思います。

で、おそらく関数中のa = ~~~は全部「グローバル変数と同名のローカル変数を宣言してそれへの代入」ということかと。
Pythonだとそういうことはできない(変数名を別のものにする必要がある)です(なんか技があるかも知れませんが)。

CやJavaScript等だと、関数中に局所的な変数のスコープ範囲を作れるので、同名でも可能です。

JavaScript

1let a = "A"; 2function proA(){ 3 console.log(a); 4 { 5 let a = "B"; 6 console.log(a); 7 proB(a); 8 proC(); 9 } 10} 11function proB(b){ 12 console.log(b); 13 let a = b; 14 console.log(a); 15} 16function proC(){ 17 console.log(a); 18 { 19 let a = "C"; 20 console.log(a); 21 } 22} 23proA();

結果は、ABBBACです。

投稿2024/08/05 10:08

編集2024/08/05 10:15
otn

総合スコア85773

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

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

yukiton

2024/08/05 13:33

解説文を読み返してみるとotnさんのおっしゃる通り、グローバル変数と同名の変数でも関数の中で定義しているものはすべてローカル変数として扱うようです。 言語によっても仕様が違うとのこと、JavaScriptを例に出して回答頂きすごく分かりやすかったです。 質問への回答ありがとうございました。
umimi

2024/08/08 13:32

> で、おそらく関数中のa = ~~~は全部「グローバル変数と同名のローカル変数を宣言してそれへの代入」ということかと。Pythonだとそういうことはできない(変数名を別のものにする必要がある)です(なんか技があるかも知れませんが)。 どこの Python の話ですか ? 参考: https://pouhon.net/python-scope/2236/ [Python]スコープの基本概念とUnboundLocalErrorの回避方法(ja)
otn

2024/08/08 15:12 編集

umimiさん 仰りたいことが分かりません。「関数の中で、関数を定義すれば子関数の中では別のスコープを作れる」ということであれば、もちろんそうなのですが、私が書いたのは「一つの関数の中で同じ名前の変数が、グローバル変数でもありローカル変数でもあるということはできない」ということです。 インデントが付かないですけど、コードで書くと、 def proA(): #ここに何か書いてもいいけど、 print(a) #この行のaはグローバル変数で、 #ここに何か書くことによって a = "B" #この行のaをローカル変数にする事は出来ない ああ、「子関数も、親の一つの関数の中だろ?」ということですかね。まあ、確かに「外」ではないですけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問