Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Начинающему нужна помощь (http://www.tehnari.ru/f43/t39619/)

Vladimir_S 05.09.2010 18:15

Прервана, потому что после оператора Goto v1 не поставлен разделитель. Правильная версия:
Код:

LABEL v1;
VAR a :Integer;
BEGIN
 writeln ('Ќ*ЁиЁ зЁб«® ¬®¦Ґв вл ўл©Ја*Ґи!!!');
v1: ReadLn (a);
if a=73  then writeln ('’л Ї®Ї*«!!!ЏаЁ§ вў®©')
        else writeln ('’л *Ґ Ї®Ї*«!!! Џ®Їа®Ўг© Ґйс г вҐЎп ®Ўп§*⥫м*® Ї®«гзЁбп!');
GOTO v1;
END.

Здесь кое-что исправлено:
1. Изменен тип переменной а - незачем ей быть вещественной, если речь идет о числе монет, которое может быть только целым неотрицательным.
2. Убран ReadLn в конце - он не нужен, поскольку программа и без того зациклена на оператор ввода.

Ну а теперь - самое главное. Я НАСТОЯТЕЛЬНО рекомендую, осваивая программирование, ЗАБЫТЬ об операторе GOTO и переходах по меткам. Работа с GOTO - сверхдурной стиль программирования. Это не мои измышления, это давно и прочно принятая у программистов концепция. Программы с GOTO презрительно называют "лапшой".

Посмотрите, если интересно, моё решение Вашей задачи. Внесены следующие изменения:
1. Убран GOTO.
2. Предусмотрен выход из бесконечного цикла.
3. Надписи, во избежание проблем с кодировкой, сделаны на английском языке.
Код:

VAR
 a:Word;
 c:Char;
BEGIN
 c:='Y';
 Writeln('Try to guess the number of coins - maybe you will win!!!');
 Repeat
  Write('Number of coins = '); ReadLn(a);
  if a=73 then
  writeln('You won!!! The prize is yours!')
  else
  begin
    writeln('You missed!!! Try again and you will have the success!');
    Write('Next attempt (Y/N)? '); Readln(c);
  end;
 Until (a=73) or (c='n') or (c='N');
 if a=73 then readln;
END.


AlexZir 05.09.2010 18:17

в строке с goto точки с запятой нет.

Бродяга 05.09.2010 18:21

Vladimir_S спасибо! на счёт GOTO - я про циклы всё прочитал но так и не понял зачем они нужны и как их ставить, Repeat я просто не мог придумать куда поставить поэтому воспользовался способом который я больше всего понял - GOTO.

p/s/ я не собирался монетки я хотел сделать чтобы после сообщения о призе вылазило какое нить изображение, но для начала мне надо было заставить работать программу.

p/p/s/ Real поставил потому что без него программа (без цикла естественно) не хотела запускатся. Она запустилась и потом решил запихнуть цикл.

AlexZir 05.09.2010 19:38

Бродяга

По другому циклы называются командами повторения. В Pascal известно три основных вида циклов: с предусловием, с постусловием, с параметрами. Циклы нужны для реализации многократного повторения последовательности действий до наступления события.
К примеру, дан исполнитель, умеющий двигаться в указанном направлении. Чтобы он при движении не разбился о препятствие, для него предусмотрено логическое событие "в этом направлении свободно". При истинности можно продолжать движение, при ложности - нужно стоять на месте. Подобное событие называется условием, его можно использовать в качестве критерия для выхода из цикла. В теле цикла можно в данном случае прописать команду на движение.
Другой пример: вам нужно вычислить факториал числа N. Факториал - произведение всех целых чисел от 1 до N включительно. Чтобы последовательно перемножать все числа, можно пойти двумя путями - первый: написать длинную формулу, содержащую все числа; второй - задать цикл с параметрами, в котором счетчик цикла будет изменяться от 1 до N с шагом 1, в теле цикла прописать короткую команду произведение:=произведение*счетчик_цикла. Первый путь может быть реализован, если заранее известно значение N и это число достаточно маленькое, в противном случае слишком длинная строка с формулой вызовет ошибку переполнения. Второй путь будет более грамотным и потребует меньших усилий, к тому же возможно вычисление факториала достаточно больших чисел.

Бродяга 05.09.2010 20:03

Вложений: 1
AlexZir спасибо. в учебнике всё написано на примерах и не всегда понятно что написано, да ещё спросить не у кого.
вот ещё ошибочка: решил усложнить прошлую программу - сделать так чтобы после сообщения о призе вылазила картинка подарка. подарок нарисовал (в тетради и потом перенёс координатами по расчётам) но почему то не запускается. и лог вылета мне не понятен (на скрине).

p/s/ проблема исправлена. скажите для того чтобы впихнуть рисунок надо ставить подраздел?

Vladimir_S 05.09.2010 20:09

Похоже, в слове Device букву "с" вляпали в русском регистре. Во всяком случае, именно на нее он ругается. Перенабейте это слово.

kreol 05.09.2010 20:11

в этой программе readln не нужен... у тебя тут бесконечный цикл..(не успел отписаться..) как удалить свое сообщение?

Бродяга 05.09.2010 20:14

Vladimir_S я тоже подумал, но сначала принял за глупость. потом решил перестраховатся и исправил. но всё равно спасибо!
kreol я уже приучился везде ставить - если выдали бы ошибку тогда убрал но паскаль молчит. это главное

AlexZir 05.09.2010 20:23

Тогда уж ставьте readln после закрытия графического режима, а не до closegraph. При использовании readln в графическом режиме автоматически происходит переключение в текстовый режим и последующие команды модуля graph могут вызвать ошибки. Также попробуйте переменной device присвоить значение detect. Это позволит в автоматическом режиме определить тип видеодрайвера.

Бродяга 05.09.2010 20:33

readln был в образце поэтому я его перед closegraph ставлю.
получилось вставить изображение после слова о призе.

з.ы. Vladimir_S у меня англицкие буквы не распознаёт и просьба о числах появилась на англицком.


Часовой пояс GMT +4, время: 12:16.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.