Недавно начал пилить нубский текстовый редактор))) Сначала юзер должен ввести команду: пока это Open и Create. Потом прога проверяет (в случае, если строка не пустая), что введено, и в случае, если введено "Open", начинает блок операторов. (Реализовано с помощью if, then, else). После проверки и выполнения блока он при помощи until возвращает прогу к проверке.
Проблема в том, что я никак не могу сделать проверку переменной при сразу ДВУХ возможных вариантах.
То есть мне нужно, чтобы он проверял, не равна ли переменная команды Open, и если не равна, проверял бы Create.
Добавлено (10.12.2012, 18:10) --------------------------------------------- Извините за нубство)))
Добавлено (10.12.2012, 20:41) --------------------------------------------- Если я встраиваю проверку в блок операторов, то в первой проверке прога не воспринимает Create, а во второй - Open.
readln(a);// здесь ты вводишь open, create или еще что нибудь case a of 'Open': ... ;//за место многоточия вводишь нужное тебе выражение 'Create': ... ;//или можешь здесь поставить оператор перехода goto на нужный блок операторов end;
для большего понимания о чем идет речь погугли "оператор выбора"
В данном случае case неприменим. Он не работает со String. "Ordinal expression expected" - если не вдаваясь в буквоедческий перевод, то он требует, чтобы переменная была исчислимого типа. Т.е., например, integer, каждый элемент которого можно последовательно посчитать (один, два, три и т.д.). В данном примере придется обойтись конструкцией if - then.
вот блин сори не учел. прогу составлял так не тестируя ее. ----------------------------------------------- но можно сделать так сократить целые слова до 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
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
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? ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
Все что после then, просто для примера messagebox (0,'save as','message', 48); - это системное окно (0- это хендл окна, 48 - тип окна) // скоро тут что нибудь появится )
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
Какой 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) будет выглядеть более компактно, а все функции программы будут сидеть в своих уютных процедурах.
***
Quote (Andrey_M)
Надеюсь, во Free-версии это работает.ъ
Это должно работать в любом диалекте Паскаля, потому что тут только основные функции языка используются.
Хватит в конце каждого предложения писать твёрдый знак. Раздражает.
Сообщение отредактировал TimKruz - Понедельник, 17 Декабря 2012, 20:13
Хватит в конце каждого предложения писать твёрдый знак. Раздражает. angry
Это новый тренд.ъъъъЪЪЪ
Quote (TimKruz)
Какой object?
Object Pascal.
Добавлено (19.12.2012, 11:56) --------------------------------------------- Пишет "Fatal: ";" expected but "." found." Пишет, что ошибка в позиции 49;4, это точка в конце файла end. Я не понимаю, в чём пррблема? Количество end в файле равно количеству begin-ов.
begin HELPTEXT:=('Текстовый редактор by Andrey_Mironenko. Создан при помощи Free Pascal. Среда разработки - Free Pascal IDE.Введите OPEN для открытия файла, HELP - для справки, EXIT - для выхода из программы.'); repeat readln(r); for i:=1 to length(r) do r[i]:=upcase(r[i]);
if r='OPEN' then begin writeln('Введите адрес к файлу.'); Readln(N); if N<>'' then Assign(F, N); Writeln('Открытие файла...'); Reset(F); while not Eof(F) do begin Readln(F, N); Writeln(N); end; Close(F); end else
if r='CREATE' then begin assign(output,name+'.txt'); rewrite(output); close(output); end else
if r='HELP' then writeln(HELPTEXT) else
if r='EXIT' then exit else writeln('Неправильная команда!'); until false; end.