この穴埋め問題の疑問

[戻る]
2005/06/14(火) 22:02:35
次に示すのは、要素数が5で要素型がint型の配列aの各要素に対して、先頭から
順に1,3,5,7,9を代入するプログラムの穴埋め問題です。

i=5;
while(i-->0)
 a[i]=?

この?の部分は一応、9-2*iという答えが入るように言われたのですが、
自分には11-2*iになるように思えるのです。

もし本当に9-2*iが正解なら、なぜそうなるのか教えて下さい。

Blue 2005/06/14(火) 22:25:49
>while(i-->0)
の時点で
iの値が -1 されます。
よって
最初の ? のときの i は 4 です。

9 − 2 × 4 = 1

というわけです。

ついでいにいうと

while( i-- > 0 )
で判定している時点では i の値はまだ 5 です。
この判定式をすぎると -1 されます。

while(i-->0) // ここでは i = 5
 a[i]=?      // ここでは i = 4

ここを参考にしてみては
http://www9.plala.or.jp/sgwr-t/c/sec03.html#s3-3

2005/06/14(火) 22:53:18
Blueさん返信ありがとうございます。

しかし一応、「>0」ということになってるので、
4からになってしまうと要素数の方はどうなってしまうのでしょう?

要素数は5だと決まってるんですが、4から始まったら
1までしか無理なので要素数が4になってしまいませんか?

ここで困惑してます。

reshia 2005/06/14(火) 22:54:59
> 要素数は5だと決まってるんですが、4から始まったら
ですから、条件判定の段階では、5なんです。
条件判定が終わった後に4になるのですよ。

2005/06/14(火) 23:00:48
ここで言うiというのは単なる番号であって要素数ではありませんよね?
番号は減っても、要素数まで減っていいんでしょうか?

reshia 2005/06/14(火) 23:05:46
//----------------------------
#define MAX 10

int main(void)
{
  int i;
  int a[MAX];

  i = 5;
  while( i-- > 0 ) {
    a[i] = 9 - 2 * i;
  }

  return 0;
}
//----------------------------
となっていると考えれば良いのでは?
iは単なる番号(配列の添え字)。
iを減らしたからといって、要素数が減るわけではない。

Blue 2005/06/14(火) 23:18:20
分けて書くと

i = 5;
while ( i > 0 )
{
    i = i - 1; // i--;
    a[ i ] = 9 - 2 * i;
}
になります。

配列は
int a[ 5 ];
とかくと、
a[ 0 ] 〜 a[ 4 ] までint型変数を格納できます。

isshi 2005/06/14(火) 23:21:40
9-2*i も間違いでは?
a[0] = 1 にしたいのですよね?

2005/06/14(火) 23:24:17
どうも>0という部分が引っかかります。

iが4,3,2,1までだということだから
要素数は4になってしまうじゃないですか?
それでいいんですかね?

Blue 2005/06/14(火) 23:28:06
>9-2*i も間違いでは?
>a[0] = 1 にしたいのですよね?
ほんとだw

単純に
2 * i + 1 ですかね。
(添え字を変えて a[ MAX - i - 1 ] = 9 - 2 * i かも)

Blue 2005/06/14(火) 23:31:43
>iが4,3,2,1までだということだから
だから
whileの条件文の時には値は変わっていないの。

1.
while ( 5 > 0 )
{
   a[ 4 ] = 9 - 2 *  4;
} 

2.
while ( 4 > 0 )
{
   a[ 3 ] = 9 - 2 * 3;
}

3.
while ( 3 > 0 )
{
   a[ 2 ] = 9 - 2 * 2;
}

4.
while ( 2 > 0 )
{
   a[ 1 ] = 9 - 2 * 2;
}

5.
while ( 1 > 0 )
{
   a[ 0 ] = 9 - 2 * 0;
}

6.
while ( 0 > 0 )

reshia 2005/06/14(火) 23:31:54
あ・・。
答えにあわせると
>int型の配列aの各要素に対して、先頭から順に1,3,5,7,9を代入するプログラム
は、「後方から」ということに。

問題を答えに合わせるか、問題に答えを合わせるか。

Blue 2005/06/14(火) 23:33:47
凡みすってた。
>4.
>while ( 2 > 0 )
>{
>   a[ 1 ] = 9 - 2 * 2;
>}
a[ 1 ] = 9 - 2 * 1;
でした。

いい忘れたけど、
これらは i をそのときの値におきかえたものです。

Blue 2005/06/14(火) 23:40:58
>(添え字を変えて a[ MAX - i - 1 ] = 9 - 2 * i かも)
さらに。。。。みすってたし。。。 orz

MAXは配列数だと思ってたら、reshiaさんが書き直したときの値でしたね。。。
#define MAX 5
として
a[ MAX - i - 1 ] = 9 - 2 * i;
でした。

reshia 2005/06/14(火) 23:44:39
>MAXは配列数だと思ってたら、reshiaさんが書き直したときの値でしたね。。。
あぁ、それは申し訳ないです(ペコリ)。

ほんと何となく、
別に配列の要素数と i の無関係さを強調するために、
10にしちゃったので・・。

2005/06/14(火) 23:50:47
whileの中では、>0という条件でしたけど、その後の
a[i]の部分では、iに0まで入れることができると
考えていいんですかね?1までではなく。

Blue 2005/06/15(水) 00:10:17
>whileの中では、>0という条件でしたけど、その後の
>a[i]の部分では、iに0まで入れることができると
>考えていいんですかね?1までではなく。
イマイチ理解できてないぽいですが。。。

以下のソースをコンパイル実行してください。
# コンパイラがないならば
# http://www9.plala.or.jp/sgwr-t/detail/EnvSet.html
# を参考に手に入れてください。

#include <stdio.h>

#define MAX 5

int main( void )
{
    int i;
    int a[ MAX ];
    
    i = 5;
    while ( printf( "whileの条件式中 i = %d\n", i ), i-- > 0 )
    {
        printf( "whileの条件式後 i = %d\n", i );
        a[ MAX - i - 1 ] = 9 - 2 * i;
        printf( "a[ %d ] = %d\n\n", MAX - i - 1, a[ MAX - i - 1 ]  );
    }
    return 0;
}

2005/06/15(水) 00:17:50
>whileの中では、>0という条件でしたけど、その後の
>a[i]の部分では、iに0まで入れることができると
>考えていいんですかね?1までではなく。
とりあえず、これがYESかNOかだけをお聞きしたいのです。

Blue 2005/06/15(水) 00:38:39
>とりあえず、これがYESかNOかだけをお聞きしたいのです。
私的には NO で。

そのような返信をする前に、ちゃんとレス読んでますか?

i = 1;

while ( i-- > 0 )
{
    // ここの i の値は 0 ですよ!
}

# これ以上のレスはしないようにします。
# もっと説明のうまい方におねがいしてください。

reshia 2005/06/15(水) 00:47:52
# まとめ。
whileの条件式中では、iは5,4,3,2,1,0,-1の値をとります
whileに続く文の中、a[i]のiは、4,3,2,1,0の値をとります
whileを抜けた後のiは、-1

わからないというなら、
もっと自分でプログラムをつくることです・・・(ウダウダ)
習うより慣れろ・・・(ウダウダ)


# まとめへの疑問(自己)
whileの条件式中に-1になりますよね?
条件評価が終わった後に、whileを抜けるのか?
ディクリメントした後に、whileを抜けるのか?

2005/06/15(水) 01:14:19
>whileの条件式中では、iは5,4,3,2,1,0,-1の値をとります
i>0という条件下で、なぜ0と-1が入るのでしょうか?

reshia 2005/06/15(水) 01:33:07
> i>0という条件下で、なぜ0と-1が入るのでしょうか?
0のときに条件が評価されて、whileを抜けるし、
whileを抜ける前に i-- されるから。

reshia 2005/06/15(水) 01:37:24
ちょっと違うか。
whileの条件式が評価されて、i--されてから
条件式が真か偽かでwhile続行か終了かに処理が流れる。

だから、0>0は偽でwhileは抜けるんだけど、while終了の前にi--されてiは-1。

Blueさんの書き込みのソース
>Blue 2005/06/14(火) 23:18:20
では、5から0まで。
whileを抜けた後のiの値も0。

PATIO 2005/06/15(水) 11:25:21
前置デクリメントと後置デクリメントが値を更新するタイミングを
考えれば、自ずと答えは出てきます。
この辺はしっかり理解した方がいいです。
パターンだけで覚えてしまうと応用が効きませんから。

ちゃんと理解して無いと

i = 5;
while(i-- > 0)
{
   :
   :
}

このループの後、iの値がいくつになっているか理解できない事になります。
このループの後にiの値を利用するような場面があった時に困る事になると思いますよ。

超初心者 2005/06/15(水) 20:16:16
> whileの中では、>0という条件でしたけど、その後の> i>0という条件下で、なぜ0と-1が入るのでしょうか?
など
これら発言から考えて後置インクリメントを無視してますな。

while( i-- > 0 )
{
  a[i] = 9 - 2 * i;
}
は、
while( i > 0 )
{
  i = i - 1;
  a[i] = 9 - 2 * i;
}
i = i - 1;
と
同じ結果だろ。

古いスレッドには追加発言できません。