2012-06-23 2 views
0

привет Я новичок в C, и я сделал случайное число приложение, которое следующим образом:текст переписывается за 1000 раз?

#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 миллисекунд. Проблема в том, что «Random Number is» также переписывается каждый раз из-за \ r. хотя для людей это может быть слишком быстро, я все еще знаю его там, и мне это не нравится. как я могу исправить эту проблему?

+0

1) Вы должны попробовать форматировать свой код более читаемым образом. 2) Я не понимаю, в чем проблема. – hugomg

+0

[Вы использовали оба вкладки * и * пробелы?] (Http://www.emacswiki.org/pics/static/TabsSpacesBoth.png) (здесь здесь разрывается форматирование) – Pubby

+0

См. [Этот вопрос SO] (http://stackoverflow.com/questions/1337529/how-to-update-a-printed-message-in-terminal-without-reprinting-linux) для аналогичной проблемы. –

ответ

3

На большинстве терминалов вы можете перемещать курсор в любое место на экране с помощью ANSI control sequences.

Что нужно сделать, чтобы переписать номер, чтобы переместить курсор назад достаточно далеко, чтобы он перезаписывал только номер числа в следующем цикле.

Например, из вышеуказанного документа код ANSI, чтобы переместить курсор назад символы COUNT является:

Курсор назад: <ESC>[{COUNT}D

перемещает курсор назад по количеству столбцов; Количество по умолчанию 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 programming library, что позволит контролировать «полный экран» курсора и вашего вывода ,

0

Если проблема заключается в распечатке «Случайное число» снова и снова, почему бы просто не сделать printf («% d \ r», dec1);

Это будет печатать каждое новое число после последнего. Конечно, вы не сможете перезаписать вывод терминала, который вы уже записали, если вы не делаете что-то действительно фантастическое.

Смежные вопросы