Пятница, 26 Апреля 2024, 12:48

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Free Pascal: проеверка с 2-мя вариантами (Как реалтзовать?)
Free Pascal: проеверка с 2-мя вариантами
Andrey_MДата: Понедельник, 10 Декабря 2012, 20:41 | Сообщение # 1
старожил
Сейчас нет на сайте
Недавно начал пилить нубский текстовый редактор)))
Сначала юзер должен ввести команду: пока это Open и Create.
Потом прога проверяет (в случае, если строка не пустая), что введено, и в случае, если введено "Open", начинает блок операторов.
(Реализовано с помощью if, then, else).
После проверки и выполнения блока он при помощи until возвращает прогу к проверке.

Проблема в том, что я никак не могу сделать проверку переменной при сразу ДВУХ возможных вариантах.

То есть мне нужно, чтобы он проверял, не равна ли переменная команды Open, и если не равна, проверял бы Create.

Добавлено (10.12.2012, 18:10)
---------------------------------------------
Извините за нубство)))

Добавлено (10.12.2012, 20:41)
---------------------------------------------
Если я встраиваю проверку в блок операторов, то в первой проверке прога не воспринимает Create, а во второй - Open.


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Понедельник, 10 Декабря 2012, 21:29 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
попробуй сделать так
Code
readln(a);// здесь ты вводишь open, create или еще что нибудь  
case a of
'Open':   ...         ;//за место многоточия вводишь нужное тебе выражение
'Create': ...         ;//или можешь здесь поставить оператор перехода goto на нужный блок операторов
end;

для большего понимания о чем идет речь погугли "оператор выбора"

возникнут вопросы буду рад помочь smile
Andrey_MДата: Понедельник, 10 Декабря 2012, 21:40 | Сообщение # 3
старожил
Сейчас нет на сайте
Quote (Destroy)
за место многоточия вводишь нужное тебе выражение

А можно несколько? Сейчас проверю...

Добавлено (10.12.2012, 21:40)
---------------------------------------------

Quote (Destroy)
case a of

Проверка, как я понял, за счёт этого выражения происходит?ъ


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Понедельник, 10 Декабря 2012, 21:41 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Quote (Andrey_M)
А можно несколько

к сожалению только одно

Добавлено (10.12.2012, 21:41)
---------------------------------------------

Quote (Andrey_M)
Проверка, как я понял, за счёт этого выражения происходит?ъ

совершенно верно
Andrey_MДата: Понедельник, 10 Декабря 2012, 21:50 | Сообщение # 5
старожил
Сейчас нет на сайте
Quote (Destroy)
of

Пишет "Ordinal expression expected".

Добавлено (10.12.2012, 21:50)
---------------------------------------------

Quote (Destroy)
к сожалению только одно

Подожди...а
Code

{Начало проги}
begin
[Кусок кода]
end
{Конец проги}


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
NanotentacleДата: Вторник, 11 Декабря 2012, 11:21 | Сообщение # 6
был не раз
Сейчас нет на сайте
В данном случае case неприменим. Он не работает со String. "Ordinal expression expected" - если не вдаваясь в буквоедческий перевод, то он требует, чтобы переменная была исчислимого типа. Т.е., например, integer, каждый элемент которого можно последовательно посчитать (один, два, три и т.д.). В данном примере придется обойтись конструкцией if - then.
DestroyДата: Вторник, 11 Декабря 2012, 16:45 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
вот блин сори не учел.
прогу составлял так не тестируя ее.
-----------------------------------------------
но можно сделать так
сократить целые слова до 1 буквы
Code

program blablabla;
var a:char;
begin
    readln(a);
    case chr(ord(a)) of
    'O': ...//вместо слова оpen символ "О";
    'C':... // здесь аналогично
    end;

end.


однако здесь строго соблюдается шрифт ввода, "о" и "О" разные символы


Сообщение отредактировал Destroy - Вторник, 11 Декабря 2012, 16:54
uberchelДата: Вторник, 11 Декабря 2012, 18:36 | Сообщение # 8
частый гость
Сейчас нет на сайте
Code
var
    a: ansiString;
   ...
readln(a);
   if (a = 'open') then messagebox (0,'open','message', 48);
   if (a = 'create') then messagebox (0,'create','message', 48);
   if (a = 'save') then messagebox (0,'save','message', 48);
   if (a = 'save as') then messagebox (0,'save as','message', 48);


// скоро тут что нибудь появится )

Сообщение отредактировал uberchel - Вторник, 11 Декабря 2012, 18:36
Andrey_MДата: Среда, 12 Декабря 2012, 23:25 | Сообщение # 9
старожил
Сейчас нет на сайте
Quote (Destroy)
однако здесь строго соблюдается шрифт ввода, "о" и "О" разные символы

СПАСИБО ЗА ОТВЕТ!

Реализую с помощью цифр. 1 - чтение, 2 - запись, 3 - выход.

Добавлено (12.12.2012, 22:16)
---------------------------------------------

Quote (Destroy)
но можно сделать так
сократить целые слова до 1 буквы

А можно поставить в оператор
Code
'O':

строчку начала операторного блока begin?
Просто я физически не могу реализовать открытие файла и цикл чтения-записи одним оператором... biggrin

Добавлено (12.12.2012, 23:25)
---------------------------------------------

Quote (uberchel)
i
Code
f (a = 'open') then messagebox (0,'open','message', 48);
    if (a = 'create') then messagebox (0,'create','message', 48);
    if (a = 'save') then messagebox (0,'save','message', 48);
    if (a = 'save as') then messagebox (0,'save as','message', 48);


А что такое 0 и 48?


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
uberchelДата: Суббота, 15 Декабря 2012, 13:36 | Сообщение # 10
частый гость
Сейчас нет на сайте
Quote (Andrey_M)
А что такое 0 и 48?

Все что после then, просто для примера messagebox (0,'save as','message', 48); - это системное окно (0- это хендл окна, 48 - тип окна)


// скоро тут что нибудь появится )
Andrey_MДата: Воскресенье, 16 Декабря 2012, 13:32 | Сообщение # 11
старожил
Сейчас нет на сайте
Quote (uberchel)
Все что после then, просто для примера messagebox (0,'save as','message', 48); - это системное окно (0- это хендл окна, 48 - тип окна)

Мне не нужно системное окно... а то, он открывает окно открытия фалйа?

Добавлено (16.12.2012, 13:32)
---------------------------------------------
И да, где можно узнать, какие ещё типы окон можно открыть таким образом?


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
TimKruzДата: Понедельник, 17 Декабря 2012, 19:28 | Сообщение # 12
старожил
Сейчас нет на сайте
Andrey_M, блин, что ты мучаешься?! Делай так:
Code
var i:byte; request:string;
...
repeat
   readln(request); //считываем строку
   for i:=1 to length(request) do request[i]:=upcase(request[i]); //переводим все буквы в верхний регистр,
   //т.е. open=OpEn=opEN=...и так далее...=OPEN
   if request='OPEN' then ... else //если запрос "открыть" - открываем файл
   if request='CREATE' then ... else //если... то...
   if request='RENAME' then ... else
   if request='DELETE' then ... else
   //далее необходимое число блоков if request=<запрос> then <инструкции> else...
   if request='HELP' then writeln('blablabla') else //вывод справки, ага?
   if request='EXIT' then exit else //выходим из цикла
   writeln('Incorrect request!'); //сообщаем, что запрос неверный
until false;
...
end.

uberchel, у него, похоже, полностью консольное приложение.
Quote (Andrey_M)
а то, он открывает окно открытия фалйа?

Нет. MessageBox (это из WinAPI) отображает простое окно-сообщение с заголовком, картинкой, текстом и группой кнопок. Используются для вывода информации, предупреждений, сообщений об ошибках, сообщения-вопросы с возможностью выбора и так далее. Есть разные модификации, в некоторых используется просто тип (номер) окна (исходя из которого устанавливается картинка и кнопки), в некоторых вручную устанавливается каждый параметр.
Quote (Andrey_M)
И да, где можно узнать, какие ещё типы окон можно открыть таким образом?

Можно покопаться в исходниках стандартных модулей для подключения библиотек WinAPI, там должен быть набор констант. Ну или в интернете таблицу значений найти...
Quote (Andrey_M)
строчку начала операторного блока begin?

Конечно. Блок begin..end используется везде, где возможно использовать только один оператор. Т.е. блок begin..end объединяет список операторов и представляет их в виде одного оператора. Например, if <условие> then <оператор> else <оператор2>; обрабатывает только одну инструкцию после then и одну после else, а используя begin..end можно использовать бесконечное число инструкций...
Quote (Andrey_M)
Просто я физически не могу реализовать открытие файла и цикл чтения-записи одним оператором...

Разве? Ведь можно описать процедуру или функцию типа openfile, createfile и тому подобное...




Сообщение отредактировал TimKruz - Понедельник, 17 Декабря 2012, 19:32
Andrey_MДата: Понедельник, 17 Декабря 2012, 20:05 | Сообщение # 13
старожил
Сейчас нет на сайте
TimKruz, СПАСИБО! Помог очень!

Quote (TimKruz)
Разве? Ведь можно описать процедуру или функцию типа openfile, createfile и тому подобное...

Разве? Я думал, это только в Object можно...

Quote (TimKruz)
uberchel, у него, похоже, полностью консольное приложение.

Да, именно так.ъ

Добавлено (17.12.2012, 20:05)
---------------------------------------------

Quote (Andrey_M)
Andrey_M, блин, что ты мучаешься?! Делай так:

Надеюсь, во Free-версии это работает.ъ


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
TimKruzДата: Понедельник, 17 Декабря 2012, 20:10 | Сообщение # 14
старожил
Сейчас нет на сайте
Quote (Andrey_M)
Разве? Я думал, это только в Object можно...

Какой object? Я говорю про простую процедуру. Вот, например:
Code
program cool_text_editor;
var s:string;
procedure createfile(name:string);
begin
   assign(output,name+'.txt');
   rewrite(output);
   close(output);
end;
begin
   repeat
     read(s);
     if s='create' then createfile('test') else exit;
   until false;
end.

Кстати. Ты наверняка задашься вопросом, как реализовать обработку аргументов в строке. Примерный алгоритм:
1. Считать строку request.
2. С помощью find (или чего-то там, не помню) найти символы-пробелы, которые являются разделителями аргументов (простейший вариант).
3. Разрезать строку request на строку command (команда) и массив argument.
4. Поднять все буквы строки command в верхний регистр.
5. Пройтись по конструкциям if.
6. После входа в определённую конструкцию if, используются нужные аргументы, например:
Code
...
if (command='CREATEFILE') or (command='CREATE') then createfile(argument[0]) else
...

Здесь после получения команды создать файл первый (нулевой, если считать с нуля) аргумент (имя создаваемого файла) передаётся в соответствующую функцию, остальные аргументы игнорируются.

P.S. Советую использовать именно процедуры вместо простых блоков begin..end, потому что тогда основной код программы (цикл repeat..until) будет выглядеть более компактно, а все функции программы будут сидеть в своих уютных процедурах. smile

***
Quote (Andrey_M)
Надеюсь, во Free-версии это работает.ъ

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

Хватит в конце каждого предложения писать твёрдый знак. Раздражает. angry




Сообщение отредактировал TimKruz - Понедельник, 17 Декабря 2012, 20:13
Andrey_MДата: Среда, 19 Декабря 2012, 11:56 | Сообщение # 15
старожил
Сейчас нет на сайте
Quote (TimKruz)
Хватит в конце каждого предложения писать твёрдый знак. Раздражает. angry

Это новый тренд.ъъъъЪЪЪ

Quote (TimKruz)
Какой object?

Object Pascal.

Добавлено (19.12.2012, 11:56)
---------------------------------------------
Пишет "Fatal: ";" expected but "." found."
Пишет, что ошибка в позиции 49;4, это точка в конце файла end.
Я не понимаю, в чём пррблема? Количество end в файле равно количеству begin-ов. cry


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Среда, 19 Декабря 2012, 12:05 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
значит еще 1 end должен быть, так тяжело понять где именно лучше скинь код
Andrey_MДата: Среда, 19 Декабря 2012, 12:07 | Сообщение # 17
старожил
Сейчас нет на сайте
Попробую понатыкать end-ы в разные места.

ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Среда, 19 Декабря 2012, 12:08 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Quote (Andrey_M)
Попробую понатыкать end-ы в разные места.

в основом попробуй в конце рядом с точкой потыкать
Andrey_MДата: Среда, 19 Декабря 2012, 16:17 | Сообщение # 19
старожил
Сейчас нет на сайте
ОК.

Добавлено (19.12.2012, 16:17)
---------------------------------------------

Quote (Destroy)
значит еще 1 end должен быть, так тяжело понять где именно лучше скинь код



ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Среда, 19 Декабря 2012, 16:22 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
Quote (Andrey_M)
end.

этот end это конец процедуры, а не программы
Quote (Andrey_M)
until false;
end;
end.

должно быть так
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Free Pascal: проеверка с 2-мя вариантами (Как реалтзовать?)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг