整数を読み込んで、その値を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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for文の中にswitch文はいれられ...
-
構文エラー";"が型の前にあり...
-
while文を使った問題なのですが...
-
初心者です。for文、if文を使っ...
-
while文について、c言語...
-
c言語のwhile文を使った計算で...
-
#if 1 #elseの意味について
-
C言語で電卓を作成する。
-
C言語です
-
C言語で、2007年度が残り何日か...
-
教えてください
-
C言語プログラムが理解できなくて…
-
C言語基本 2次元配列(for文...
-
SIGALRMでプロセス終了
-
xのy乗を求める問題で…(ただし...
-
???ダメなんです(分からないん...
-
C言語で分からないことがあり...
-
計算結果がlong型以上になる場...
-
配列を関数に渡す方法
-
C言語で質問です。1~20までの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
#if 1 #elseの意味について
-
プログラミングで二番目に大き...
-
getcの改行判定
-
C言語プログラムが理解できなくて…
-
C言語 数字以外を入力させない...
-
配列を使って魔方陣
-
配列を関数に渡す方法
-
初心者です。for文、if文を使っ...
-
c言語for文
-
c言語で平均をだす
-
while文について、c言語...
-
scanf関数を用いての加減乗除%...
-
行列をべき乗させるプログラム
-
c言語プログラミングで1から100...
-
scanfが実行されません
-
C言語階乗の総和を求める
-
C言語の二分法のプログラムにつ...
-
階乗のプログラム!!
おすすめ情報