dポイントプレゼントキャンペーン実施中!

整数を読み込んで、その値を0までカウントダウンしながら表示するプログラム作りたいのですが、
while文ではできたのですが、for文ではうまくいきません。
どこが間違っているのでしょうか?

OS:Windows XP
C++Builder X パーソナル

#include <stdio.h>

int main(void)
{
int i;
int num;

printf("整数を入力してください:");
scanf("%d", &num);

for(i = num; i <= 0; --i) {
printf("%d", i);
}
return 0;
}




宜しくお願いします。

A 回答 (9件)

終了条件が問題なのは皆さんの指摘通りです。


せっかくなので、タイプ節約の書き方でも。

...
for(;num >= 0;) printf("%d", num--);
...
    • good
    • 3
この回答へのお礼

ありがとうございました。
僕の持っている参考書には載っていなかったんですが、ちなみに参考書の名前を教えて頂けると嬉しいです^^;

for(;num >= 0;) セミコロンではさむ?間ループと考えていいのでしょうか?

お礼日時:2005/01/23 12:59

すでに最初の質問とまったく関係ない話になってますが、重箱の隅ついでに書いてしまいます(^^;)。


No.8の方の書き換えでも完全ではありません。

C言語ってこんな変な書き方もできてしまうので、、、

int main(void){
int i;
enum {a=2};
{
for( i=0 ; i<=2 ; i++, (enum {a=1})0 )
printf("%d\n", a);
}
return 0;
}
と、
int main(void){
int i;
enum {a=2};
{
i=0;
do{
if( !(i<=2) ) break;
printf("%d\n", a);
} while( i++, (enum {a=1})0, 1 );
}
return 0;
}
は違う結果になります。
こんなのにも対応しようとすると、単純な書き換えでは無理だと思います。
    • good
    • 0

for文をwhileに書き換えるとしたら、こんな感じでしょうか。

。。
A;
do {
if (!(B)) break;
D
} while(C,1);

分かりにくいですね。こういうことを考えるとforへの理解も深まるかもしれません。
    • good
    • 0

重箱の隅をつつくような指摘なので、言おうかどうか迷いましたが、、、



> for(A;B;C){D}
>(A~Dは文だと思ってください。)は、
> A; while(B){ D C }
> と同じです。
多分、No.6の方は理解されていると思いますが、
一般には同じとはいえません。
特にDにcontinue文が含まれていると、直前にCを埋め込まなければなりませんし、
じゃあ、continueの前にCを置くことにすれば等しいといえるか? というと、それでも同じとはいえない場合があります。
for→while の完全な書き換えというのはかなり面倒なのです。

単にforのおおよその意味を理解してもらうためなら、「同じ」と言ってしまってもいいかもしれませんが、「一般に等しい」という誤解を与えかねない表現だったので、余計とは思いながら書かせていただきました。
    • good
    • 1

for文についてまとめてみましょう。


for(A;B;C){
D
}
(A~Dは文だと思ってください。)は、
A;
while(B){
D
C
}
と同じです。従って、例えば、この例では、
for(i=num;i>=0;--i){
printf("%d",i);
}
は、
i=num;
while(i>=0){
printf("%d",i);
--i;
}
と同じです。Aがi=num;で、Bがi>=0で、Cが--iで、Dがprintf("%d",i);です。

ところで、空文というのをご存じでしょうか?セミコロン「;」だけ書いても、「何もしない文」と解釈されて、ちゃんと実行できるというのもです。例えば、
int main(int argc,char[][] argv){
;
;
printf("%s","Hello World");
;
;
}
というようなプログラムを作っても、動くんですよ?意味はありませんが(笑)

で、これが何で関係あるかというと、
for(;num>=0;)printf("%d",num--);
の理解で、空文が必要なんです。さきほどのwhile文への書き換えを行うと、これは、
;
while(num>=0){
printf("%d",num--);
;
}
と、Aが空文;、Bがnum>=0、Cも空文;、Dがprintf("%d",num--);という感じです。

ただ、正直言って、節約型・省略型の記法はおすすめできません。理由は、拡張性が低いからです。
例えば、このカウントダウンをちょっと拡張して、
3. Now counting 3...
のように、前後に二回カウントすることを考えましょう。
節約型でなければ、
for(i=num;i>=0;--i){
printf("%d. Now counting %d...",i,i);
}
と書き換えればよいだけです。ところが、節約型では、
for(;num>=0;)printf("%d. Now counting %d...",num--,num);
では、
3. Now counting 2...
のようになってしまいます。--の位置をよく考えて、
for(;num>=0;)printf("%d. Now counting %d...",num,num--);
とすればうまくいくことは行きますが、--の位置を考えるだけ無駄な思考をします。
{}の省略にしても、「ここはまさか単文ですむだろう」と思っていたところが複文にせざるをえないとか、よくありますので、拡張する予定のあるプログラムを組むのなら、節約はなるべくしないことをおすすめします。
    • good
    • 0

> for(;num >= 0;) セミコロンではさむ?間ループと考えていいのでしょうか?


セミコロンではさむ、というよりは
i=num, --i, があったところに何も書いていないだけと考えればいいです。

num >= 0 のところを省略するのもプログラムとして正しい書き方で、その場合は無限ループになります。

無限ループの書き方は、おもに
for( ; ; ) ... と
whlie(1) ...
の2つの流儀があるようです。

forの中の式を省略してもいいことは、まともな参考書ならたいてい書いてあると思いますが、初心者向けのものだと、読者の混乱を避けるために書いてない場合があるかもしれません。
    • good
    • 0

for(i = num; i <= 0; --i) {


よく見てください。これでは動きません。
このfor文は、

i=numを実行して、
「i<=0である間、」
--iを一ターンごとに実行しながら、実行する。

という意味です。わかりにくいので、例えば、num=3だとすると、

i=3を実行して
「3<=0である間」

分かりましたか?これでは、numにどんな値を入れても、i<=0が成り立たず、「i<=0である間」ではないので、ループを実行せずに終了してしまうのです。

従って、正しくは
for(i=num;i>=0;i--){
です。
i--;と--i;はどちらでもよいはずです。
    • good
    • 1
この回答へのお礼

お返事ありがとうございました。

理解できました。
僕は間違った意味で覚えていました。
for(i = num; i <= 0; --i)の
i <= 0;
は、どおfor文でも、「~まで」と思っていました。
もう一度参考書を見直してみたら、繰り返しするための条件と書いてありました。
ありがとうございました。

お礼日時:2005/01/23 12:56

for 文の「i <= 0;」は誤りで、「i >= 0;」が正しいです。



for 文の2番目の項目は「その式が真である限りループする」ですから、i <= 0; では最初からループを抜けてしまいます。

ちなみに、カウントダウンに 0 を含めないのなら、「i > 0;」です。
    • good
    • 0

どのようにうまくいかないのか解りませんが、


> for(i = num; i <= 0; --i) {
この文の「--i」が引っ掛かりますね。
前置きデクリメントなので、iは1マイナスされた数値から
処理が始まるのでは...
(今、手元のCコンパイラが無いので確かめて無いですけど...)
    • good
    • 0

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