
整数を読み込んで、その値を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;
}
宜しくお願いします。
No.9
- 回答日時:
すでに最初の質問とまったく関係ない話になってますが、重箱の隅ついでに書いてしまいます(^^;)。
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;
}
は違う結果になります。
こんなのにも対応しようとすると、単純な書き換えでは無理だと思います。
No.8
- 回答日時:
for文をwhileに書き換えるとしたら、こんな感じでしょうか。
。。A;
do {
if (!(B)) break;
D
} while(C,1);
分かりにくいですね。こういうことを考えるとforへの理解も深まるかもしれません。
No.7
- 回答日時:
重箱の隅をつつくような指摘なので、言おうかどうか迷いましたが、、、
> for(A;B;C){D}
>(A~Dは文だと思ってください。)は、
> A; while(B){ D C }
> と同じです。
多分、No.6の方は理解されていると思いますが、
一般には同じとはいえません。
特にDにcontinue文が含まれていると、直前にCを埋め込まなければなりませんし、
じゃあ、continueの前にCを置くことにすれば等しいといえるか? というと、それでも同じとはいえない場合があります。
for→while の完全な書き換えというのはかなり面倒なのです。
単にforのおおよその意味を理解してもらうためなら、「同じ」と言ってしまってもいいかもしれませんが、「一般に等しい」という誤解を与えかねない表現だったので、余計とは思いながら書かせていただきました。
No.6
- 回答日時:
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--);
とすればうまくいくことは行きますが、--の位置を考えるだけ無駄な思考をします。
{}の省略にしても、「ここはまさか単文ですむだろう」と思っていたところが複文にせざるをえないとか、よくありますので、拡張する予定のあるプログラムを組むのなら、節約はなるべくしないことをおすすめします。
No.5
- 回答日時:
> for(;num >= 0;) セミコロンではさむ?間ループと考えていいのでしょうか?
セミコロンではさむ、というよりは
i=num, --i, があったところに何も書いていないだけと考えればいいです。
num >= 0 のところを省略するのもプログラムとして正しい書き方で、その場合は無限ループになります。
無限ループの書き方は、おもに
for( ; ; ) ... と
whlie(1) ...
の2つの流儀があるようです。
forの中の式を省略してもいいことは、まともな参考書ならたいてい書いてあると思いますが、初心者向けのものだと、読者の混乱を避けるために書いてない場合があるかもしれません。
No.3
- 回答日時:
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;はどちらでもよいはずです。
お返事ありがとうございました。
理解できました。
僕は間違った意味で覚えていました。
for(i = num; i <= 0; --i)の
i <= 0;
は、どおfor文でも、「~まで」と思っていました。
もう一度参考書を見直してみたら、繰り返しするための条件と書いてありました。
ありがとうございました。

No.2
- 回答日時:
for 文の「i <= 0;」は誤りで、「i >= 0;」が正しいです。
for 文の2番目の項目は「その式が真である限りループする」ですから、i <= 0; では最初からループを抜けてしまいます。
ちなみに、カウントダウンに 0 を含めないのなら、「i > 0;」です。
No.1
- 回答日時:
どのようにうまくいかないのか解りませんが、
> for(i = num; i <= 0; --i) {
この文の「--i」が引っ掛かりますね。
前置きデクリメントなので、iは1マイナスされた数値から
処理が始まるのでは...
(今、手元のCコンパイラが無いので確かめて無いですけど...)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
getcの改行判定
-
配列を関数に渡す方法
-
初心者です。for文、if文を使っ...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
既定のコンストラクタがありま...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
a^2の√=a が成り立たない場合
-
VB6.0での小数点の扱いについて
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
c languageで 簡単な質問があ...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
プログラムでの数字につく”f”の...
-
C言語で複数列のデータを1列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を使って魔方陣
-
C言語 数字以外を入力させない...
-
10進数からN進数に変換するプロ...
-
配列を関数に渡す方法
-
scanfが実行されません
-
C言語で電卓を作成する。
-
C言語・最大値を算出するプロ...
-
C言語階乗の総和を求める
-
実行すると if文 に矛盾
-
計算結果がlong型以上になる場...
-
C言語プログラム
-
C言語。どうしてコンパイルでき...
-
c言語for文
-
getcの改行判定
-
C言語で勉強中(max,min)の出し方
-
C言語 プログラム
-
SIGALRMでプロセス終了
おすすめ情報