Помогите в Паскале

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Rast1k, 6 Sep 2007.

  1. Rast1k

    Rast1k Banned

    Joined:
    9 Aug 2007
    Messages:
    39
    Likes Received:
    30
    Reputations:
    -75
    Итак у меня началась школа))

    вот сегодня была информатика нам дали ДЗ сделать кое что...

    Я представлю вам код паскаля...

    Тема: Движение по кривой

    Суть в том, что смайлик бегает по синусоиде и вырисовывает надпись antichat.

    Посколько дома нету возможности проверить код проверьте плиз правильность.

    Code:
    program antichat;
    uses crt;
    var i,x,y: integer;
               a: real;
    begin
    textbackground(9);
    clrscr;
    for i:= 1 to 360 do
    begin
    a:= i*pi/180;
    x:=round(i/4.5);
    y:=round(25+24*sin(a));
    gotoxy(x,y);
    write('=)');
    delay(1500);
    gotoxy(x,y);
    write('antichat');
    end;
    end.
    кстати если можете выложите код с одной переменной, а то что-то не доходит)
     
    #1 Rast1k, 6 Sep 2007
    Last edited: 6 Sep 2007
  2. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    никогда не понимал, зачем нужно учиться писать такие проги?
     
    3 people like this.
  3. Rast1k

    Rast1k Banned

    Joined:
    9 Aug 2007
    Messages:
    39
    Likes Received:
    30
    Reputations:
    -75
    Вот вот. Начали мы просто с картинок с координатами типа икс 1 икс 2 игрек 1 игрек 2

    Я тоже не понимаю, но если учитель сказал - значит учитель сказал)

    Просто тренировка.
     
  4. Cawabunga

    Cawabunga Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    359
    Likes Received:
    165
    Reputations:
    -22
    гыыы я в 9* классе у нас только вчера учили как комп включать ) стоят 3 пни +98 винда на всех компы залил crazy mouse было прикольно :))
     
  5. Rast1k

    Rast1k Banned

    Joined:
    9 Aug 2007
    Messages:
    39
    Likes Received:
    30
    Reputations:
    -75
    Вообще-то, меня интересует, как написать код с одной переменной...

    Просто там должны быть проще, но чуть сложнее выражения...
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    var
    i,x,y: integer;
    a: real;

    тупо но:
    TProgValue = record
    i,x,y: integer;
    a: real;
    end;

    var
    x : TProgValue;

    >>Вообще-то, меня интересует, как написать код с одной переменной...
    вот и ответ на твой вопрос... достаточно тривиальный =/
     
  7. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    потом юзать
    x.x или x.a и тд . так?
     
  8. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Запустил прогу, не вижу синусоиды!!!! Выглядит примерно так
    =)antichat=)antichat=)antichat=)antichat=)antichat=)antichat и т.д.
    Так и надо?
    По поводу одной переменной. Тут идея должна быть такая:
    движение по синусоиде это y=sin(x). из этого видно что нам достаточно переменной х (одной), а вместо y можно подставлять выражение sin(x).
    Но это только теория, на паскале нужно еще будет округлять и адаптировать к координатам экрана. Но это уже дело техники, ядро програмки будет все таки y=sin(x). Если не додумаешь код самостоятельно, пиши.
     
    #8 Red_Red1, 6 Sep 2007
    Last edited: 6 Sep 2007
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Piflit - да так...

    я не понял... Red_Red1 вы о чем?
    >>Если не додумаешь код самостоятельно, пиши.
    вы задавали вопрос или нет?
     
  10. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    А что тут понимать? Автор в первом посте писал
    Вот я и дал идею, может ему поможет и ДОЙДЕТ, а если нет то можно помоч.
    Я с синусоидами в паскале в свое время ОЧЕНЬ много кода написал, вот и пытался помоч. Или я в чем то не прав?
     
  11. Rast1k

    Rast1k Banned

    Joined:
    9 Aug 2007
    Messages:
    39
    Likes Received:
    30
    Reputations:
    -75
    Не тут синусойда есть вроде в коде:
    Code:
    a:= i*pi/180;
    x:=round(i/4.5);
    y:=round(25+24*sin(a));
     
  12. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Так я и знал не поверил.
    Rast1k, ты пробовал запускать свою программу? Не думаю, иначе ты бы не спорил. Еще раз повторю ТВОЙ код не выводит синусоиду.
    Объясню почему.
    В программе допущено несколько ошибок, которые влияют на вывод изображения в текстовом режиме.
    Первая в строке
    Code:
    x:=round(i/4.5);
    Ошибка логическая, суть ее в том что в процедуру gotoxy () нельзя подставлять числа которые меньше или равны нулю и больше 81 и 25 для "x" и "y" соответственно. Если это сделать то процедура просто не выполнится и курсор останется НА МЕСТЕ!!!
    Проанализируем значения "х" в начале работы цикла. При i=1 округленное значение данного выражения равно 0 (что не допустимо для передачи в процедуру gotoxy ()), так происходит пока "i" не становится равно 3, тогда х=1. Казалось бы тут должно заработать но…
    Вторая ошибка в строке
    Code:
    y:=round(25+24*sin(a));
    При i=2 y=26!!! Вот тут и есть ошибка, выражение 24*sin(a) в этот момент дает 0,83, прибавляем 25 и округляем, в итоге получаем 26. Что опять же не допустимо для передачи в процедуру gotoxy (). Эту ошибку можно исправить поставив минус вместо плюса
    Code:
    y:=round(25-24*sin(a));
    Правда в при этом коде это решит проблему только до того момента пока синус не даст отрицательные числа!!!! Потом снова лажа....
    Исправить первую можно вот такой строкой
    Code:
    gotoxy(x+1,y);
    Т.е. не дать "х" быть нулем никогда. Но в любом случае это не решает второй проблемы....
    Итак, как же должно быть? (мое решение):
    Сначала нужно понять что рисовать на экране (особенно в текстовом режиме), график функции область значения которой от -1 до 1 используя ЧИСТУЮ формулу (в нашем случае y=sin(x) ) не получиться, т.к. график получиться некрасивым. Опять же нужно всегда использовать округление т.к. координаты позиции курсора это ЦЕЛЫЕ ЧИСЛА БОЛЬШЕ НУЛЯ! Итак нужно немного изменить формулу функции. Экспериментально я нашел такой вариант y=7*sin(0.1*x)+12. Число 7 увеличивает амплитуду волны, а 0,1 делает ее шире, 12, я добавляю чтобы синусоида выводилась в центре экрана.
    Результат:
    Будем брать значения "X" от 1 до 80 т.к. в текстовом режиме максимальный "Х"=80
    "Y" вычисляем по формуле
    Code:
    y= round(7*sin(0.1*x)+12)
    У автора в программке был перевод из градусов в радианы т.к. в Паскале в синус идут радианы. В данном случае это нафиг не надо.
    Еще был вопрос как это все сделать имея одну переменную. Решение очевидно, вычисления нужно проводить в gotoxy (), т.е. основой программки будет строчка
    Code:
    gotoxy(x,round(7*sin(0.1*x))+12);
    Все, дальше уже дело техники и конечный результат выглядит так
    Code:
    uses crt;
    var x: integer;
    begin
    clrscr;
    for x:=1 to 80 do
                    begin
                      gotoxy(x,round(7*sin(0.1*x))+12);
                      write('=)antichat');
                      delay (1500);
                    end;
    readln;
    end.
    
    readln; добавил для того чтобы увидеть результат работы. Нажимаем энтер и выходим из программы.

    Я для чего так много писал... Вот человек задал вопрос, попросил помощи, но даже не стал проверять то что ему рассказали, не поверил. Нафига тогда задавать вопросы? Задачка сама по себе пустяковая, но чтобы ее решить нужно все равно ПОДУМАТЬ. А чтобы найти ошибки нужно уметь анализировать код. А в такой простой программе это сделать легко, но такое чувство что автор просто не хотел. Вроде как раздел посвящен кодерам, так давайте думать над кодом, а не делать быстрые выводы...

    З.Ы. Может я снова перестарался с описанием ситуации? :)
     
    #12 Red_Red1, 8 Sep 2007
    Last edited: 11 Sep 2007
    2 people like this.
  13. Rast1k

    Rast1k Banned

    Joined:
    9 Aug 2007
    Messages:
    39
    Likes Received:
    30
    Reputations:
    -75
    delay(1500) - слишком много для синусойды=)

    особенно для 1 to 80 do.

    Минимальное значение: delay(500);

    Но это не главное.

    Главная ошибка.

    Надо, что бы вырисовывалось Смайликом(ctrl+b)...

    Должна им выписываться надпись "antichat".

    То есть должно быть так(100%):
    Code:
    gotoxy(x,y);
    write('=))))');
    delay(500);
    gotoxy(x,y);
    write('antichat');
    end;
    end.
    С одной переменной синосойда получается только как сказал W!Z@rD.

    У тебя получается что-то странное.

    Ты наверное перепутал синусоиду с параболой.

    Потому что
    Code:
    1 to [b]80[/b] do
    более характерно для параболы, тем более с одной переменной.

    Еще синосойда может не поулучаться изза монитора.

    Попрбуй взять код
    Code:
    y:=round([B]25[U]-[/U]24[/B]*sin(a));
    А также меняй
    Code:
    for i:= 1 to 90 do
    begin
    [B]a=i*[U]pi/90;[/U][/B]
     
    #13 Rast1k, 8 Sep 2007
    Last edited: 8 Sep 2007
    2 people like this.
  14. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Чушь полная. Причем тут много для синусоиды от 1 до 80. Область определения функции от минус до плюс бесконечность.
    Как смайликом можно вырисовать АНТИЧАТ и при этом сюда же приделать движение по синусоиде? О_О Тот код который ты привел ОДНОЗНАЧНО этого не нарисует. Хотя есть одно но, может ты не верно формулируешь задание.
    Тебе нужно движение по синусоиде или нет. Если да,то что должно двигаться.
    Тут вообще дикость - иди учи матчасть.....