Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедуры и функции модуля Crt и Dos
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Вадим
Сделайте кто лабу.
Составить программу вывода на экран окна, которое условно "разбито" на вертикальные столбцы. Верхние части столбцов окрашены одним фоном, нижние - другим. Граница раздела фонов столбцов формирует синусоиду произвольной амплитуды с периодом, равным ширине окна. При нажатии клавиши "Ввод" начинают изменяться соотношения заполнения столбцов разными фонами, т.е. создается эффект "бегущей" слева направо волны.
xds
А волшебное слово?
Amro
А он скажет, если сделаешь :D
Altair
Цитата
Сделайте кто лабу.

Какая наглость! angry.gif angry.gif
IP я твой запомню ....
APAL
Oleg_Z, терпимей... ;)
BRS
Не - насамом деле такие посты убивают... Я плохо представляю: о чем задумывается человек постящий такие посты? Что здесь сидят маньяки-кодеры которым абсолютно не чего делать и они просто деруться изза возможности порешить какую нить задачу?
GoodWind
смотри а Анекдотах форму приказа lol.gif
GoodWind
Цитата
Что здесь сидят маньяки-кодеры которым абсолютно не чего делать и они просто деруться изза возможности порешить какую нить задачу?

сознаюсь, бывают у меня подобные состояния rolleyes.gif
Вадим
Чё вы все так сразу налетели?
Я же вас не заставляю, а прошу, пожалуйста, помочь написать лабу. blink.gif
Altair
Действительно, что все налетели?
Ну у меня наверное как всегда было гадкое настроение, но у вас то?
Так, Вадим, тут надо использовать функции:
gotoXY (перевод курсора)
и процелуры изменения цвета шрифта и фона...
volvo
Вадим

Это самый первый набросок. Его еще можно улучшать и улучшать... ;)


{$N+}
Uses Crt;

Const
 numBars = 80;
 TimeDelay = 12000; { Задержка перед перерисовкой очередного кадра }

Var
 bars: Array[1 .. numBars] of Word;

 currDegree: Double;
 T: Word;
 i, j: Integer;

Const
 Change: Boolean = False;

Begin
 ClrScr;
 For i := 1 To numBars Do
   Begin
     { Здесь я пытаюсь изобразить синусоиду }
     currDegree := Pred(i) * (360 / numBars);
     bars[i] := Trunc(13 + 12 * sin(currDegree / (180 / Pi)));
   End;


 While True Do
   Begin

     For j := 1 To numBars Do
       For i := 1 To 24 Do
         Begin
           If i > bars[j] Then TextColor(Red) Else TextColor(Yellow);
           GotoXY(j, i); Write(#176)
         End;

     If Change Then
       Begin
         { Если уже был нажат Enter }
         Delay(TimeDelay);

         T := bars[1];
         Move(bars[2], bars[1], Pred(numBars)*SizeOf(Word));
         bars[numBars] := T;

         { Для выхода из программы - Esc }
         If KeyPressed Then
           If ReadKey = #27 Then Break
       End
     Else
       Begin
         { Сразу после отрисовки статичной картинки - ждем нажатия на Enter }
         While not KeyPressed Do;
         Change := (ReadKey = #13)
       End;
   End;

 ClrScr;
End.



Исправлено
Amro
Прикольно, тока директиву сопроцес -ра надо включить {$N+}
volvo
Так я и не выключал lol.gif
BlackShadow
Цитата
Цитата Что здесь сидят маньяки-кодеры которым абсолютно не чего делать и они просто деруться изза возможности порешить какую нить задачу?

сознаюсь, бывают у меня подобные состояния

Та же беда...
Гость_Вадим
Volvo, после этой строчки выдаётся ошибка 116
currDegree := Pred(i) * (360 / numBars);
Объясни, пожалуйста, в чём проблема.
Спасибо.
volvo
Ну Amro уже написал:
первой строкой программы добавь


{$N+}

Bast
Помогите переделать, что бы волна шла в другую сторону. Я сделала, но у меня таогда кусок синусоиды отрубаеться
Michael_Rybak
Код в студию.
Bast
{$N+}
Uses Crt;

Const
numBars = 80;
TimeDelay = 12000; { Задержка перед перерисовкой очередного кадра }

Var
bars: Array[1 .. numBars] of Word;

currDegree: Double;
T: Word;
i, j: Integer;

Const
Change: Boolean = False;

Begin
ClrScr;
For i := 1 To numBars Do
Begin
{ Здесь я пытаюсь изобразить синусоиду }
currDegree := Pred(i) * (360 / numBars);
bars[i] := Trunc(13 + 12 * sin(currDegree / (180 / Pi)));
End;


While True Do
Begin

For j := 1 To numBars Do
For i := 1 To 24 Do
Begin
If i > bars[j] Then TextColor(Red) Else TextColor(Yellow);
GotoXY(j, i); Write(#176)
End;

If Change Then
Begin
{ Если уже был нажат Enter }
Delay(TimeDelay);

T := bars[1];
Move(bars[2], bars[1], Pred(numBars)*SizeOf(Word));
bars[numBars] := T;

{ Для выхода из программы - Esc }
If KeyPressed Then
If ReadKey = #27 Then Break
End
Else
Begin
{ Сразу после отрисовки статичной картинки - ждем нажатия на Enter }
While not KeyPressed Do;
Change := (ReadKey = #13)
End;
End;

ClrScr;
End.
volvo
Ну, неужели так сложно догадаться, что надо всего лишь "прокрутить" массив в другом направлении:

Заменить кусок:
        T := bars[1];
Move(bars[2], bars[1], Pred(numBars)*SizeOf(Word));
bars[numBars] := T;

вот на это:
        T := bars[numBars];
Move(bars[1], bars[2], Pred(numBars)*SizeOf(Word));
bars[1] := T;

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.