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

キーボードで文字列を入力し、その文字列を右から左に、テロップのように表示するプログラムが作成できません!どなたかお願いします!m(_ _)m

ただし、以下の条件があります
●時間稼ぎ用の処理(計算など)を使う
●復帰の\rを使う
●\r出力後、fflush(stdout);を使うこと。

A 回答 (1件)

> ●復帰の\rを使う


> ●\r出力後、fflush(stdout);を使うこと。

\n で改行するのはよく使っているかと思います

printf("aaa\nbbb\n");

aaa
bbb

\r は、改行せずに表示位置が行頭へ戻ります。

printf("aaa\rbbb\n");

aaa(ここで行頭に戻って)bbb

画面上では 「aaa」が上書きされ「bbb」だけが見える

出力→待ち→出力とすると、画面が変化したように見えます。

printf("123") ; /*ここで\nで改行しない */
待ち
printf("\r23 ") ; /* 最後に消すための空白文字あり */

とすると 「123」が「23」に「動いた」ように見えます。



ファイルや画面の出力は「バッファリング」というものが行なわれていることがあります。
これは、出力内容を一旦バッファに溜めておいて、ある条件になったら(バッファが一杯になった、改行があった等)実際に書きこむというものです。
これにより、まとめて読み書きすることで、処理の効率をよくしています。

ですが、これのために、上記のようなことをしようとすると、実際には
 "123"をバッファへ
 待ち
 "\r23 " をバッファへ
 バッファを出力
と動作し、外から見た目には
 待ち
 "123\r23" を出力→一瞬なので、"23"が出力されたようにしか見えない
となります。

対策の一つは「バッファに溜ったものを強制的に出力させる」です。
 "123"をバッファへ
 バッファを出力
 待ち
 "\r23 " をバッファへ
 バッファを出力
これに使うのが fflush関数です。
/* 他に、バッファリング自体を行なわないようにする、という対策もあります */


> ●時間稼ぎ用の処理(計算など)を使う

例えば
int i,dummy1,dummy2=1234,dummy3=5678 ;
for(i=0;i<10000;i++) { dummy1 = dummy2*dummy3; }
とすれば、10000回かけ算(と、i++)をするので、その分の時間がかかります。
... と単純にいけばいいのですが。
○昨今のコンピュータでは、10000くらいなら一瞬です。
「動いている」ように見せるには、もっと多く繰り返す必要があるでしょう。

○C言語には「最適化」という機能があります。
コンパイル時の設定で様々な最適化を行います。

最適化の中には、ループを最適化、というものもあります。
ループ内容を解析して、同じ効果のある別な命令へ変えてしまう、というものです。
例えば
 for(i=0;i<10000;i++) { dummy1 = dummy2*dummy3; }
だったら、ループ回数、ループ内の処理が固定なので、
 i=10000; /* ループ終了後の値 */
 dummy1=7006652; /* 1234*5678 */
でも「結果」は同じだ、と判断して、実行ファイルに上記内容で書き出します。
これでは、いくらループを増やしても実行時間は変わりません。

・ 待ちの最初に時刻を取得→規定時間過ぎたら待ち終了
・用意されている「一定時間待つ」関数を使う
  (sleep関数だと1秒単位だが、環境によってはより細かいものが用意されている)
等が確実な方法です。
    • good
    • 1

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