グローバル変数(PROC)のひっかけ問題出してください

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
セリアさん  
(No.1)
これから試験を受けるものです。
サンプル問題見た、グローバル蓮数の問題について、もっと応用的な意地悪な問題を出してもらえませんか。自分が理解しているかどうか自信がないことがあります。試験で出て解けないと困るので、理解を固めておきたいです。

他のモジュール(PROC)を呼び出す際に、グローバル変数を上書きしたり、あたかも受け渡しして引き継いでいるかのような罠系の問題でお願いいたします。何問かお願いしたいです。

私はマクロを少し書けますので、クラスモジュールの概念と似ているのかな、と思っています。

よろしくお願いいたします。
2024.10.05 07:10
まーぼさん 
FE シルバーマイスター
(No.2)
個人的にはそんな意地悪な問題は出ないんじゃないかなって思います。

理由は、基本情報の擬似言語の問題は特定のプログラミング言語に依存しない一般的な知識を問うものだと思っており、スレ主さんが仰っているグローバル変数云々の問題は、変数のスコープの話だと思いますが、これはプログラミング言語によって細かい仕様が変わります。ですので、擬似言語の問題ではそういったものは出しにくいと思います。

もちろん、私の認識が間違っている可能性もあると思います。私もサンプル問題に目を通しましたが、変数のスコープを問うてるような問題はなかったように思いますが、どの問題が具体的にグローバル変数についての問題だったか教えていただけると嬉しいです。
2024.10.05 09:41
セリアさん  
(No.3)
記憶違いで、掲示板にあった質問でした。
自分も訓練したいと思い、書き込みしました。

2024.07.31 10:33
ねむねむさん質問
グローバル変数とローカル変数について

頭を整理しておきたいので、出る出ないは置いておいて、自作罠問題のかきこみお待ちしております。自分が理解しているか整理したいのです。
2024.10.05 12:25
まーぼさん 
FE シルバーマイスター
(No.4)
グローバル変数とローカル変数について(FE[5547])
https://www.fe-siken.com/s/bbs/5547.html

こちらのスレッドですね。
2024.10.05 12:28
電タックさん 
FE ブロンズマイスター
(No.5)
罠なんか無いですがこんなのはどうでしょうか?
ちょっと簡単すぎるかもしれませんね・・・
※擬似言語の記述は一応マネたので多分あっていると思います

========================================
手続 main を呼び出したとき,出力は「???」となる。
ここで,配列の要素番号は 1 から始まる
========================================
大域:  整数型の配列:  hairetsu  ←  {5, 8, 0, 7, 2}

○main()
_整数型:  n
_hairetsu[4]  ←  hairetsu[4] ー hairetsu[2]
_xMultiple(2)
_hairetsu[4]  ←  hairetsu[4] ー hairetsu[2]
_n  ←  summary()の戻り値
_n  を出力する

○xMultiple(整数型: xx)
_for(i  を  1  から  hairetsuの要素数まで  1  ずつ増やす)
__hairetsu[i]  ←  hairetsu[i] ✕ xx
_endfor

○整数型:  summary()
_整数型:  sum  ←  0

_for(i  を  1  から  hairetsuの要素数まで  1  ずつ増やす)
__sum  ←  sum + hairetsu[i]
_endfor
_return  sum
========================================
2024.10.05 12:37
まーぼさん 
FE シルバーマイスター
(No.6)
こんなものはどうでしょうか?

問.関数procを実行したときに、出力される値は()である。

大域:整数型の変数n←999

⚪︎increase(整数型:n)
__n ← 0
__n ← n + 1

⚪︎proc()
__increase(n)
__nを出力

ア.0
イ.1
ウ.999
エ.1000
2024.10.05 13:37
電タックさん 
FE ブロンズマイスター
(No.7)
ローカル変数とグローバル変数で同名だった時にどうなるか分からなかったんですよね、擬似言語仕様で同名ってよくある言語の扱いで良いのでしょうか

3.プログラム言語
③ 仕様などは,次による。
の部分が②の言語を言ってるような気がして判断つかなかったんですよね
https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000i9dp-att/shiken_yougo_ver5_0.pdf
2024.10.05 14:31
まーぼさん 
FE シルバーマイスター
(No.8)
>電タックさん

個人的には、ローカル変数扱いになるのかなーって思ってますが、IPAの文書には変数のスコープについて記述が見当たらないので、 No.2でも述べたようにこのような問題は出ないと思っています。

そのため、No.6の問題は以下の条件がないと問題として成立しないですかね?
・グローバル変数とローカル変数で同じ変数名を使った場合、その変数はローカル変数として扱う。
2024.10.05 16:07
電タックさん 
FE ブロンズマイスター
(No.9)
擬似言語での挙動はわかりませんが、まーぼさん(No.6)で出してくれている問題が分かればグローバル・ローカルは十分理解できていると思います。
2024.10.05 17:10
キホンさん 
(No.10)
>電タックさん

失礼いたします。

========================================
手続 main を呼び出したとき,出力は「???」となる。
ここで,配列の要素番号は 1 から始まる
========================================

以下略....

この問題の答えは何でしょうか?
ご回答お願いいたします。
2024.10.05 20:39
セリアさん  
(No.11)
書き込み頂いた方ありがとうございます!!
先般仕事から帰ってきました!!
解いてみたところ、
電タックさんの問題⇒12
まーぼさんの問題⇒イ(1)
になりました。
ご回答お願いいたします。
2つとも間違っている場合笑ってやってくださいw

それから、まーぼさんの問題すごくよいです!!
もっとこのタイプの問題が欲しいです!!
どの値を返すのか、プロシージャ間の受け渡しがどうなっているのか一瞬迷うもの(罠)、大歓迎です!!
2024.10.06 01:00
電タックさん 
FE ブロンズマイスター
(No.12)
(No.5)で出したのは12であっていると思います。
(No.6)は、私は別の答えな気がします。
2024.10.06 11:44
まーぼさん 
FE シルバーマイスター
(No.13)
No.6の答えは999想定です。

increaseでnに0に代入されたり、1加算される処理はローカル変数なのでグローバル変数には何の影響もありません。
一方、proc関数の中でのnの出力のnはグローバル変数で、グローバル変数は1行目の代入から何も変更はないため、999が出力されます。
2024.10.06 12:12
セリアさん  
(No.14)
電タックさん、解答ありがとうございます!
正解していて良かった笑

まーぼさんの解答、承知しました。
試験を受ける前に勘違いを正せて良かったです。
迷いもなくグローバル変数に代入をしていて、愕然としましたが、認識を正せて心より嬉しいです!!

お二人には感謝です!
不出来な自分にまたの出題、心よりお待ちしております。
2024.10.06 13:29
セリアさん  
(No.15)
まーぼさんの出題をvbaで実行したら、代入の段階でエラーでました。
ちなみにpublic constで定義しました。
2024.10.07 08:19
あるごさん 
(No.16)
VBA(excel)で3種類作ってみました。
「public const」で作成すると定数になるので値の変更ができません。

Public n As Integer
Public a As Integer
Public b As Integer

Sub increase(n As Integer)
  n = 0
  n = n + 1
End Sub

'ByRef:参照型
Sub increase2(ByRef a As Integer)
  a = 0
  a = a + 1
End Sub

'ByVal:基本データ型
Sub increase3(ByVal b As Integer)
  b = 0
  b = b + 1
End Sub

Sub proc()
  n = 999 '初期値をセット
  increase n
  Sheet1.Cells(1, 1) = n
  
  a = 999 '初期値をセット
  increase2 a
  Sheet1.Cells(2, 1) = a
  
  b = 999 '初期値をセット
  increase3 b
  Sheet1.Cells(3, 1) = b
  
End Sub

なお、プログラム言語によって引数で指定した変数は、
基本データ型(プリミティブ型)と「参照型」の2種類があります。
VBA(excel)の場合は、関数の引数の型のデフォルトは、「参照型」ですので
出題した内容と同じにするなら「ByVal」の記載が必要になります。
・ByVal:基本データ型(プリミティブ型)
・Byref(未指定):参照型
※勉強する言語によって違いますのでお気を付けください。

B科目のアルゴリズムは、
関数の引数の変数は、基本データ型(プリミティブ型)だと思いますので
引数で指定した変数の値は、変わりません。
旧試験の「午後」のアルゴリズムでは、「参照型」の場合は、問題文に記載がありましたので
新試験も「参照型」で出題するときは、記載があると思います。
(そもそも判断があやふやな問題は出ないと思います。)

また、「インフォテックサーブ」の「問80」は、記載がありませんが「参照型」で解く必要があります。
もとになっている「2011年春期特別問8」を確認すると、「参照型」の記載があります。
(昔は、変数を引数に渡す場合は、この問題のように記載がありました。)

以上です〆
2024.10.09 14:02
セリアさん  
(No.17)
この投稿は投稿者により削除されました。(2024.10.11 00:40)
2024.10.11 00:40
セリアさん  
(No.18)
あるごさんはじめまして!!
大域変数の意味を勘違いしていました。
constは定数でしたね。

そして、
n=1
a=1
b=999

になりました!!
参照渡しと値渡しの件、ご丁寧にありがとうございます!!
理解が深まりました。
2024.10.11 00:41

返信投稿用フォーム

※CBT試験では出題内容の公開が禁止されているため、直接的・間接的を問わず、出題内容や難易度を尋ねる質問は厳禁です。
※宣伝や迷惑行為を防止するため、当サイト、姉妹サイト、IPAサイト以外のURLを含む記事の投稿はできません。

投稿記事削除用フォーム

投稿番号:
パスワード:

その他のスレッド


Pagetop