この穴埋め問題の疑問 – プログラミング – Home

通知
すべてクリア

この穴埋め問題の疑問

固定ページ 1 / 2

五
 五
(@五)
ゲスト
結合: 19年前
投稿: 7
Topic starter  

次に示すのは、要素数が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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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


返信引用
五
 五
(@五)
ゲスト
結合: 19年前
投稿: 7
Topic starter  

Blueさん返信ありがとうございます。

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

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

ここで困惑してます。


返信引用
reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

> 要素数は5だと決まってるんですが、4から始まったら
ですから、条件判定の段階では、5なんです。
条件判定が終わった後に4になるのですよ。


返信引用
五
 五
(@五)
ゲスト
結合: 19年前
投稿: 7
Topic starter  

ここで言うiというのは単なる番号であって要素数ではありませんよね?
番号は減っても、要素数まで減っていいんでしょうか?


返信引用
reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

//----------------------------
#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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

分けて書くと

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

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


返信引用
isshi
 isshi
(@isshi)
ゲスト
結合: 21年前
投稿: 41
 

9-2*i も間違いでは?
a[0] = 1 にしたいのですよね?


返信引用
五
 五
(@五)
ゲスト
結合: 19年前
投稿: 7
Topic starter  

どうも>0という部分が引っかかります。

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>9-2*i も間違いでは?
>a[0] = 1 にしたいのですよね?
ほんとだw

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

凡みすってた。
>4.
>while ( 2 > 0 )
>{
> a[ 1 ] = 9 - 2 * 2;
>}
a[ 1 ] = 9 - 2 * 1;
でした。

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>(添え字を変えて a[ MAX - i - 1 ] = 9 - 2 * i かも)
さらに。。。。みすってたし。。。 orz

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


返信引用
reshia
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

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

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


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました