次に示すのは、要素数が5で要素型がint型の配列aの各要素に対して、先頭から
順に1,3,5,7,9を代入するプログラムの穴埋め問題です。
i=5;
while(i-->0)
a[i]=?
この?の部分は一応、9-2*iという答えが入るように言われたのですが、
自分には11-2*iになるように思えるのです。
もし本当に9-2*iが正解なら、なぜそうなるのか教えて下さい。
>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
Blueさん返信ありがとうございます。
しかし一応、「>0」ということになってるので、
4からになってしまうと要素数の方はどうなってしまうのでしょう?
要素数は5だと決まってるんですが、4から始まったら
1までしか無理なので要素数が4になってしまいませんか?
ここで困惑してます。
> 要素数は5だと決まってるんですが、4から始まったら
ですから、条件判定の段階では、5なんです。
条件判定が終わった後に4になるのですよ。
ここで言うiというのは単なる番号であって要素数ではありませんよね?
番号は減っても、要素数まで減っていいんでしょうか?
//----------------------------
#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を減らしたからといって、要素数が減るわけではない。
分けて書くと
i = 5;
while ( i > 0 )
{
i = i - 1; // i--;
a[ i ] = 9 - 2 * i;
}
になります。
配列は
int a[ 5 ];
とかくと、
a[ 0 ] ~ a[ 4 ] までint型変数を格納できます。
9-2*i も間違いでは?
a[0] = 1 にしたいのですよね?
どうも>0という部分が引っかかります。
iが4,3,2,1までだということだから
要素数は4になってしまうじゃないですか?
それでいいんですかね?
>9-2*i も間違いでは?
>a[0] = 1 にしたいのですよね?
ほんとだw
単純に
2 * i + 1 ですかね。
(添え字を変えて a[ MAX - i - 1 ] = 9 - 2 * i かも)
>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 )
あ・・。
答えにあわせると
>int型の配列aの各要素に対して、先頭から順に1,3,5,7,9を代入するプログラム
は、「後方から」ということに。
問題を答えに合わせるか、問題に答えを合わせるか。
凡みすってた。
>4.
>while ( 2 > 0 )
>{
> a[ 1 ] = 9 - 2 * 2;
>}
a[ 1 ] = 9 - 2 * 1;
でした。
いい忘れたけど、
これらは i をそのときの値におきかえたものです。
>(添え字を変えて a[ MAX - i - 1 ] = 9 - 2 * i かも)
さらに。。。。みすってたし。。。 orz
MAXは配列数だと思ってたら、reshiaさんが書き直したときの値でしたね。。。
#define MAX 5
として
a[ MAX - i - 1 ] = 9 - 2 * i;
でした。
>MAXは配列数だと思ってたら、reshiaさんが書き直したときの値でしたね。。。
あぁ、それは申し訳ないです(ペコリ)。
ほんと何となく、
別に配列の要素数と i の無関係さを強調するために、
10にしちゃったので・・。