カウントプログラムについて

解決


初心者M  2006-11-15 04:38:22  No: 63592

はじめまして、よろしくお願いします。整数を入力してカウントダウンするプログラムを作っているのですが、カウントダウンすることはできたのですが、例えば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;
}
ソースを載せておきます。


Blue  2006-11-15 05:57:54  No: 63593

どこが不明でしょうか?
同じ位置に文字を出したいということでしょうか?
それともある程度間隔をおいて文字を出力したいのでしょうか?

前者の場合
エスケープシーケンス文字の \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;
}


Blue  2006-11-15 09:27:44  No: 63594

> ただし、桁数が違う場合出力方法を工夫する必要があります。
後ろに空白文字列を入れるだけでもよさそうですね。

    while ( num >= 0 )
    {
        cout << num << "       \r";
        sleep( (clock_t)1 * CLOCKS_PER_SEC );
        
        num--;
    };


PATIO  2006-11-15 18:59:14  No: 63595

コンソールプログラムでそういう事をしたいのであれば、
Blueさんが書かれているエスケープシーケンス文字を調べた方がいいです。
Windowsのコンソールで何処までできるのか確認していませんが、
確か色々できたのではないかと思います。


初心者M  2006-11-15 20:09:38  No: 63596

お二方、ありがとうございます、”エスケープシーケンス文字”初めてききました(恥)。勉強してみます。


Blue  2006-11-15 20:14:19  No: 63597

”エスケープシーケンス文字”

というのは間違っていました。

"エスケープシーケンス"

"エスケープ文字"

が正しいようです。

>お二方、ありがとうございます、”エスケープシーケンス文字”初めてききました(恥)。勉強してみます。
C言語ではよく、 \n(改行) や \t(タブ) といったものを使います。
これらはエスケープシーケンスです。


初心者M  2006-11-20 08:55:33  No: 63598

以前はこの記事でお世話になり、ありがとうございました。お二人のアドバイスのおかげで自分の考えていたものができました。組んでいて一つ疑問が浮かんだので、こちらに書かせていただきます。このプログラム内で回しているカウントダウンは、例えば新たにキーボードから入力した値を変数に格納しその値を使ってカウントダウンのスピードを早めたり、遅くしたりというこは、できるのでしょうか?もし、できるのでありました申し訳ありませんが、少しご教授いただけませんでしょうか?お願いします。


επιστημη  2006-11-20 14:40:59  No: 63599

Blueさんの示してくれたプログラム中の sleep() に与える引数が待ち時間を表しています。
なのでこの値を増減させることで待ち時間を長く/短くできます。


初心者M  2006-11-22 19:11:13  No: 63600

sleep( (clock_t)1 * CLOCKS_PER_SEC );
内の引数を変えることで、待ち時間を増幅させることはできたのですか、短くする方法がわかりませんでした。というものBlueさんの回答で待ち時間が”1”だったので、それ以下の値に変えるとカウントダウンせずに一瞬でプログラムが終了してしまいます。どうしたらよいか、なにとぞお力をお貸しください、よろしくお願いします。


Blue  2006-11-22 19:33:25  No: 63601

MSDN で clock を調べてみましたか?
sleep関数が何をやっているのか理解できていないからこのような質問が
でてくると思うのですが。
(私のコードでは削ってしまいましたが、MSDNにはモロにsleepがどんな関数なのかを説明したコメント文が載っています。)

>それ以下の値に変えると
とは、もしかして

sleep( (clock_t)0.5 * CLOCKS_PER_SEC );

ってことでしょうか?
何ですぐ終わるのかは、キャストが理解できていればわかるはずです。


初心者M  2006-11-23 07:36:20  No: 63602

0.5がclock_tでキャストされていないということですか?


Blue  2006-11-23 08:10:48  No: 63603

>0.5がclock_tでキャストされていないということですか?
試してみては?

cout << (clock_t).05;

というか、まだこの発言をされるということは、MSDNを呼んでいないのでしょうか?
それともMSDN自体を知らない?
[MSDN]clock(CRT)
http://msdn2.microsoft.com/ja-jp/library/4e2ess30(VS.80).aspx


初心者M  2006-11-26 03:30:34  No: 63604

Blueさん、上記のURL拝見させていただきました。少し内容が難しく自分には理解できませんでした。他にもいろいろと手を尽くして調べてみましたが、分かりませんでした。申し訳ありませんが、カウントを早める方法を教えてください。無知ですいません。


Blue  2006-11-26 06:04:11  No: 63605

>// 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」秒待機する

ココまで理解できますか?(中学生レベルの数学の知識)


Blue  2006-11-26 06:12:01  No: 63606

ちなみに、わからないときは「どこが」「どのように」わからないか明記してください。
もう一度
>少し内容が難しく自分には理解できませんでした。
のような発言をするようならば、回答する気はないです。

>他にもいろいろと手を尽くして調べてみましたが、分かりませんでした。
なにを調べたのか、そこらへんも教えてもらいたいです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加