0

こんにちは、私はcが初めてで、次の乱数アプリを作成しました:

#import "stdio.h"
#import "stdlib.h"
#import "time.h"
int main (int argc, char *argv[]){
    unsigned int iseed = (unsigned int)time(NULL);
    srand (iseed);
    int Ran;
    int N;
    int max;
    int min;
    int dec;
    int dec1;
    printf("Enter Max Value: \n");
    scanf ("%i",&max);
    printf("Enter Min Value: \n");
    scanf ("%i",&min);
    Ran=rand ();
    N=(Ran % (max+1-min))+min;
    //this is a decoration
    for(i=1;i<1000;i++){
        dec=rand ();
        dec1=(dec % (max+1-min))+min;
        printf("Random Number is %d\r",dec1);
        sleep(10)
     }
    printf ("Random Number is %d",N);
    getchar();

最大値と最小値を入力するように求められ、「乱数は %% です」と表示され、%% の部分が 10 ミリ秒ごとに変化します。\rのせいで「乱数は」も毎回書き換えられるのが難点。人々がそれを見るには速すぎるかもしれませんが、私はまだそこにあることを知っており、好きではありません. どうすればこの問題を解決できますか?

4

2 に答える 2

3

ほとんどの端末では、 ANSI 制御シーケンスを使用して画面上の任意の場所にカーソルを移動できます。

数字の部分だけを書き換えるために必要なことは、次のループで数字の部分だけを上書きするようにカーソルを十分に戻すことです。

たとえば、上記のドキュメントから、カーソルを COUNT 文字後方に移動する ANSI コードは次のとおりです。

カーソル後方:<ESC>[{COUNT}D

カーソルを COUNT 列分後方に移動します。デフォルトのカウントは 1 です。

したがって、次のようにします。

// Pseudocode..
printf("The random number is: ");
for (...) {
   printf("%5d", dec1); // Print a 5 field wide number
   printf("\e[5D");     // Move cursor back 5 steps
   ...
}

ただし、毎回行を再印刷することについて本当に心配する必要はありません。番号のみを再表示するメカニズムは、コードを不必要に複雑にするだけです。報酬と複雑さと労力を比較する必要があります。最新のコンピューターは、心配する必要がないほど速くテキストを印刷します。

また、番号のみを出力すると、プログラムの実行中にユーザーが端末に入力すると、シーケンス全体がめちゃくちゃになり、画面上で奇妙に見え始めます。次のループですべてを再生成するだけなので、行全体を再印刷することにより、ユーザー (または潜在的に別の場所) からの誤ったガベージ文字によって出力が台無しになることはありません。

そうです、あなたは数字だけでそれを行うことができますが、それは面倒です.私の意見では、この場合、それは価値がありません. 私は実際には行全体を再印刷することを好みます。

ただし、画面とカーソルを細かく制御する必要がある、より複雑なものを構築している場合は、curses プログラミング ライブラリのようなものを調べることができます。これにより、カーソルと出力の「フル スクリーン」制御が可能になります。

于 2012-06-23T04:16:02.330 に答える
0

問題が「Random number is」を何度も出力する場合は、単に printf("%d\r",dec1); を実行してみませんか?

これにより、最後の番号の後に新しい番号がそれぞれ出力されます。もちろん、何か特別なことをしない限り、すでに書いた端末出力を上書きすることはできません。

于 2012-06-23T03:30:22.720 に答える