はじめまして、よろしくお願いします。整数を入力してカウントダウンするプログラムを作っているのですが、カウントダウンすることはできたのですが、例えば5と入力すると、縦に543210と表示されてしまい、自分のやりたいことと少し違ってしまいます。
自分がやりたいのはデジタル時計の秒みたいにその場でカウントダウンさせたいのですが、初心者なためわかりません。どなたか、やりかたをご存知なかたがおりましたら、ご教授くださいませ。
#include<iostream>
using namespace std;
int main()
{
int num;
cout <<"距離を入力 \n";
cout <<"距離=";
cin >>num;
for(int i=num; i>=0; i--)
{
cout <<i<<endl;
}
return 0;
}
ソースを載せておきます。
どこが不明でしょうか?
同じ位置に文字を出したいということでしょうか?
それともある程度間隔をおいて文字を出力したいのでしょうか?
前者の場合
エスケープシーケンス文字の \r を使って見せかけることは可能です。
ただし、桁数が違う場合出力方法を工夫する必要があります。
後者の場合、WindowsAPIを使わない場合、
time系の関数でループして待つような感じにするのかな。
一応「1桁の数値の入力」のときに1秒ごとカウントダウンするコード
~~~~~~~~~
#include <iostream>
#include <ctime>
using namespace std;
// MSDN clock 関数より引用
void sleep( clock_t wait )
{
clock_t goal;
goal = wait + clock();
while( goal > clock() )
;
}
// 引用終り
int main()
{
int num;
cout <<"距離を入力 \n";
cout <<"距離=";
cin >>num;
for(int i=num; i>=0; i--)
{
sleep( (clock_t)1 * CLOCKS_PER_SEC );
cout <<"\r" << i;
}
cout << endl;
return 0;
}
> ただし、桁数が違う場合出力方法を工夫する必要があります。
後ろに空白文字列を入れるだけでもよさそうですね。
while ( num >= 0 )
{
cout << num << " \r";
sleep( (clock_t)1 * CLOCKS_PER_SEC );
num--;
};
コンソールプログラムでそういう事をしたいのであれば、
Blueさんが書かれているエスケープシーケンス文字を調べた方がいいです。
Windowsのコンソールで何処までできるのか確認していませんが、
確か色々できたのではないかと思います。
お二方、ありがとうございます、”エスケープシーケンス文字”初めてききました(恥)。勉強してみます。
”エスケープシーケンス文字”
というのは間違っていました。
"エスケープシーケンス"
か
"エスケープ文字"
が正しいようです。
>お二方、ありがとうございます、”エスケープシーケンス文字”初めてききました(恥)。勉強してみます。
C言語ではよく、 \n(改行) や \t(タブ) といったものを使います。
これらはエスケープシーケンスです。
以前はこの記事でお世話になり、ありがとうございました。お二人のアドバイスのおかげで自分の考えていたものができました。組んでいて一つ疑問が浮かんだので、こちらに書かせていただきます。このプログラム内で回しているカウントダウンは、例えば新たにキーボードから入力した値を変数に格納しその値を使ってカウントダウンのスピードを早めたり、遅くしたりというこは、できるのでしょうか?もし、できるのでありました申し訳ありませんが、少しご教授いただけませんでしょうか?お願いします。
Blueさんの示してくれたプログラム中の sleep() に与える引数が待ち時間を表しています。
なのでこの値を増減させることで待ち時間を長く/短くできます。
sleep( (clock_t)1 * CLOCKS_PER_SEC );
内の引数を変えることで、待ち時間を増幅させることはできたのですか、短くする方法がわかりませんでした。というものBlueさんの回答で待ち時間が”1”だったので、それ以下の値に変えるとカウントダウンせずに一瞬でプログラムが終了してしまいます。どうしたらよいか、なにとぞお力をお貸しください、よろしくお願いします。
MSDN で clock を調べてみましたか?
sleep関数が何をやっているのか理解できていないからこのような質問が
でてくると思うのですが。
(私のコードでは削ってしまいましたが、MSDNにはモロにsleepがどんな関数なのかを説明したコメント文が載っています。)
>それ以下の値に変えると
とは、もしかして
sleep( (clock_t)0.5 * CLOCKS_PER_SEC );
ってことでしょうか?
何ですぐ終わるのかは、キャストが理解できていればわかるはずです。
0.5がclock_tでキャストされていないということですか?
>0.5がclock_tでキャストされていないということですか?
試してみては?
cout << (clock_t).05;
というか、まだこの発言をされるということは、MSDNを呼んでいないのでしょうか?
それともMSDN自体を知らない?
[MSDN]clock(CRT)
http://msdn2.microsoft.com/ja-jp/library/4e2ess30(VS.80).aspx
Blueさん、上記のURL拝見させていただきました。少し内容が難しく自分には理解できませんでした。他にもいろいろと手を尽くして調べてみましたが、分かりませんでした。申し訳ありませんが、カウントを早める方法を教えてください。無知ですいません。
>// Pauses for a specified number of milliseconds.
>void sleep( clock_t wait )
Pauses for a specified number of milliseconds.
↓和訳
指定されたミリ秒間だけ待機する
>タイマ刻みの単位は、約 1/CLOCKS_PER_SEC 秒
より
>sleep( (clock_t)1 * CLOCKS_PER_SEC );
は
「(clock_t)1 * CLOCKS_PER_SEC 」ミリ秒待機する
↓
「(clock_t)1」秒待機する
ココまで理解できますか?(中学生レベルの数学の知識)
ちなみに、わからないときは「どこが」「どのように」わからないか明記してください。
もう一度
>少し内容が難しく自分には理解できませんでした。
のような発言をするようならば、回答する気はないです。
>他にもいろいろと手を尽くして調べてみましたが、分かりませんでした。
なにを調べたのか、そこらへんも教えてもらいたいです。
ツイート | ![]() |