アプリ版:「スタンプのみでお礼する」機能のリリースについて

2.配列A(i),i=0,1,2…のm個の要素の平均を計算するアルゴ
リズムを流れ図(flowchart)で表現したい。(a),(b)に入るべき
条件及び処理を書け。なおmは1以上で,mの要素はいずれも正数で
ある。またA(m+1)に0が格納されているものとする。
     開始
     |
    0→i
     |
    0→sum
――→ |
|   ( a )――――――――――
|    |no          |
| A(i)+sum→sum      sum/i→AVE
|   ( b )          |
|    |          AVEを表示
――――             |
                終了
 (注)四角やひし形は省略させていただきます。

これで (b)は i+1=i とわかったのですが、 (a)がどうし
てもわかりません 

本当に困っています どうか心優しい方教えてください。お願い
します。

A 回答 (15件中1~10件)

??と思いましたが,cametanというハンドルがヒントになりました。

その上で読み直してみれば,あなたらしい特徴が表れた回答の文体だと思います。
私が理解できるのは単純な加減乗除レベルなので某サイトのQ&Aには付いていけないのですが,あなたのご活躍はその後も拝見しております。

ANo.12,ANo.14を読み直してみました。
おっしゃるとおり,2.の記述は明らかにヘンで,質問者の書き写し間違いでしょう。私自身,そこを1.のように好意的解釈して回答しているというのもそのとおりだと思います。
    • good
    • 0

おっと、JJon.comさん、お久しぶりです。

お元気でしたでしょうか?(最初、#8の投稿がJJon.comさんの投稿だと気づきませんでした)

>ゼロは正数ではありません。

いや、それは分かってるんです。
問題はそこじゃなくって、

1.配列Aの要素A(i)が正数なのか

それとも

2.「mの要素」が正数なのか

って事です。
少なくとも配列A(i)の要素=mと言う定義ではないですよね。「要素の個数」がmなんであって、そこが書かれてない以上「好意的解釈」以上にはならないと思いますが、如何でしょう?反面、配列A(i)が正数だ、例えば配列A(i)から0≦i<mの範囲で任意の要素を取り出した時、その要素は正数だ、と言うのならその通りです。
もっとも「フローチャートの流儀とは数学とは違ってそう言うものなんだ」と仰るのであればそれはその通りなのかもしれませんが。
    • good
    • 0

ゼロは正数ではありません。

Wikipediaの「整数#整数の分類」を参照。
http://ja.wikipedia.org/wiki/整数
ANo.11は好意的な解釈ではなく,正実数の正しい定義です。

流れ図(a)の解答として i=m もありうると主張する人は,問題文における「概念の説明」と流れ図における「その概念の実装」を混同しているのです。

問題文において「配列A(i),i=0,1,2…」と説明されている配列要素を,
流れ図中で,A(I)+sum→sum,A(J)>max,A(K)≠0,等々の異なる添字変数で参照するのはごく当たり前のことです。
問題文に登場する i は「配列A の添字の範囲」を概念として説明するための仮の変数であり,「流れ図中で i という名の変数が確保されている」「流れ図中では i 以外の添字変数は存在しない」という具体的な変数の実装を指しているのではありません。

m も同じことです。正数が格納された要素が1個以上ある,その直後には番兵としてゼロが格納されている,その概念を説明するために m という仮の変数を用いたわけです。
問題文中に,説明のための仮の変数 m が登場したからといって,それは,流れ図中に変数 m が存在することを示すものではありませんし,外部から与える引数だという無理な解釈をする必要もありません。
    • good
    • 0

>正数=零より大きい実数


>この理解で良いのじゃないですかね。

うん。僕も「好意的に解釈すると」それでいいとは思っています。
ただし、あくまで「好意的」なんですよね(笑)。

例えば、数学的に言うと、要するに問題文で指示されているAVEってのは

AVE={ΣA_i}/m・・・・・・(和はi=0からi=m-1まで)

ってのは間違いないでしょう。そこは全然疑問を差し挟む余地は無いです。
問題は、#8さんが仰る通り、問題文を良く読んでみると、

1.mは1以上で→mはそもそも「要素の個数」なんで、負になることは無い。ここの解釈は「配列Aには必ずデータが"1つ以上"含まれている、と言う要請

まあ、当たり前と言えば当たり前ですが、これを前提にすれば次の文が全く意味不明なんです。

2.mの要素はいずれも正数である→mの元々の要請は「個数を示す」モノなんで、そもそも「要素」なんか持たない!!!

「個数単位」のmに「要素」なんてないのに、それが書かれているから話がおかしくなってきます(笑)。
これが恐らく#8氏の指摘していた事で、

>A(m)の中身はいくつなのでしょう? 定義されていません。

ってのは全くその通りなんです。
そのまま解釈すると、確かにA_{m+1}=0のはその通りで良いんでしょうが、かと言ってA_{m}=0では「いけない」と言うことは問題文を読む限りどこにも書いてないんですよね(下手すれば負の数でもオーケーって事です)。

まあ、単なる問題文の「書き写し間違い」だと思いたいんですがね(笑)。
    • good
    • 0

正数=零より大きい実数



この理解で良いのじゃないですかね。
よって、

A(i)=0

で正解。
    • good
    • 0

何これ?VBAの問題なんですか?


フローチャートなんて書いた事ないんで分からないんですが(笑)。
確かに問題見る限り、脱出条件がA(m+1)=0なのか、i=mなのか分かりづらいですよね。どっちでも良さそう、ってば良さそうですが。

一般的なプログラムの質問だとすると、別の言語、例えばSchemeを使ってみます。構造的にmが何なのか、と言うのは、実は外部から与える「引数」だとすれば定義がどうの、って考える必要性もありません。ここでは関数aveを定義する、って形で考えてみます。

;;ここから

(define (ave m A) ;関数aveを定義。引数は配列の長さmと配列ls
 (let loop ((i 0) (sum 0) (ls A)) ;iとsumとlsの初期条件の定義。
  (if (zero? (car ls)) ;配列Aの先頭が0だったら?
    (/ sum i) ;sumをiで割る。
    (loop (+ i 1) (+ sum (car ls)) (cdr ls))))) ;更新条件

;;ここまで

例えば、#9さんの実験に従って実行するとすると、この関数aveを走らせる上でm、そして配列(リスト)lsを外部から与えて実行すれば、

;;ここから実行例

> (ave 3 '(10 20 30 0))
20

;;ここまで

となりますね。同じ結果を得られます。(0じゃない要素の和をそれまでの要素の個数で割ればどの道20ですよね?)
ただし、そうすると、mの存在が意味が無くなっちゃうんですよね。果たして番兵が答えなのか?mが答えなのか?
フローチャートは苦手なんで、擬似コードで書き換えてみます。

1.関数aveを引数m、そして引数A(適当な配列)として定義する。
2.初期条件をi(カウンター)=0、sum(配列の要素の和)=0、ls=A(外部から与えられた配列)として局所関数loopを定義する。
3.配列lsの先頭要素(つまりA_i)がゼロだったら、sumをiで割った値を返す。
(なお、Schemeではcarと言う命令はリストの先頭を返す関数)
4.そうじゃなかったら局所関数loopの引数iを1増やして、引数sumにlsの先頭要素を足して、引数lsをlsの先頭要素「以外の」配列として呼び出す。
(Schemeでは、cdrと言う命令はリストの先頭要素を除いたリストを返す関数)

一方、投稿主さんのi=mだったら、ってのもあながち間違いでも無いような気がするんですよね。Schemeだったら次のように書くでしょう。

;;ここから

(define (ave m A)
 (let loop ((i 0) (sum 0) (ls A))
  (if (= i m) ;条件の変更点
    (/ sum i)
    (loop (+ i 1) (+ sum (car ls)) (cdr ls)))))

;;ここまで

これも、#9さんの提示した実験と符号します。やってみるでもない。
つまり、配列(リスト)の長さがあらかじめ分かっているんだったら、最後のAの要素が何であれ、m-1が計算に必要なリストの要素の個数なのは当たり前であって、#6で指摘されている通りなんです。
しかし、これだったら配列側に番兵を設置しておく必要が無い。
問題は、次のような配列、例えば

(3 0 0 8 7 7 1 8 6 0)

を相手にする場合どうするのか?0を発見した時点で計算を終了すべきか?ないしは配列を最後まで計算するのか?で実は答えが変わってくる筈なんです。
従って、#8氏が仰ってる通り、この問題は「バグが含まれている」と言っていいと思います。二通りの解釈が存在する以上「マトモなプログラムにはならない」って事ですよね。

ちなみに、Schemeだったら番兵が無くてもmを定義しなくても「配列の末端まで到達した時点で計算を終了させる」ように書く事も可能です(多分そっちの方がスマートなんじゃないかしら?)。

;;ここから

(define (ave A) ;mは必要無し
 (let loop ((i 0) (sum 0) (ls A))
  (if (null? ls) ;条件変更。配列が空の時点で計算終了。
    (/ sum i)
    (loop (+ i 1) (+ sum (car ls)) (cdr ls)))))

;;ここまで

参考までに。
    • good
    • 0

A(0)をテストすると <>0。

Sum=10
A(1)をテストすると <>0。Sum=10+20=30。
A(2)をテストすると <>0。Sum=10+20+30=60。
A(3)をテストすると =0。Ave=60/3=20。

ですから、配列を一づつテストすればA(3)=0でループから抜ければ良いことに。

A(3)=0でループから抜けるとは、A(i)=0 ですよ。

なお、

m = UBound(A())

は、配列のインデックスの最大値を求めるコード。
ですから、mの値は2です。

この場合、0,1,2を足せば総計は求まります。
この場合は、ループ回数を予め求めてというやり方。

この両者の平均値を求める手法の差が判れば、問題を完全に理解したことに・・・。

ところで、ところで・・・。
質疑応答を見て思ったのですが、質問者はフローを机上で理解しようとしていませんか?
可能ならば何らかの言語で書いたがいいですね。
    • good
    • 0

出題者の想定している(a)の解答は「A(i)=0」でしょう。


次のURLの【番兵法】を参照。
http://tokyo.cool.ne.jp/itcareerup/kaisetsu_1-2- …

ただし。
出題者のミスなのか,質問者の転記ミスなのか不明ですが,
この出題はバグがある間違った出題です。

要素の個数がm個だとするなら,
配列の添字が0から始まりますので,A(0)~A(m-1) でm個の要素です。
A(m+1)に0が格納されているとは書かれていますが,
では A(m)の中身はいくつなのでしょう? 定義されていません。

格納要素はA(0)~A(m-1)で すべて1以上の正数,A(m)が番兵値のゼロ
  あるいは,
格納要素はA(1)~A(m)で すべて1以上の正数,A(m+1)が番兵値のゼロ

など,どちらかに修正すれば正しい出題となります。
ANo.2~ANo.6の回答者は前者の立場を取っています。
    • good
    • 0

補足の補足:



出題者は、次のような回答は期待していませんよ。

m = UBound(A())

の1行がありません。
加えて、配列 a(3)=0 もありません。

Private Sub CommandButton1_Click()
  Dim A(2) As Integer
  Dim i As Integer
  Dim m As Integer
  Dim s As Integer

  A(0) = 10
  A(1) = 20
  A(2) = 30
 
  i = 0
  s = 0
  m = UBound(A())
  For i = 0 To m
    s = s + A(i)
  Next i
  Debug.Print s / i
End Sub

この回答への補足

m = UBound(A())って どういう意味でしょうか?
a(3)=0 もお願いします。

補足日時:2008/01/11 15:29
    • good
    • 0

補足:



出題意図を読み取りましょう。

1、配列の終端を検出してループ抜けることもあるを教えようとしていること。
2、配列のインデックス+1が集計個数であることに気付かせるという目的も。

この2つの目的を察知して下さい。

この回答への補足

1、配列の終端を検出してループ抜けることもあるを教えようとしていること。
→ A(m+1)が ループ抜けることを教えているのですか?それはなぜなのでしょうか・・・

2、配列のインデックス+1が集計個数であることに気付かせるという目的も。
→ これは もっとわかりやすく言ったらどういうこと なのですか?

本当にすみませんl。。。。。

補足日時:2008/01/11 15:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!