Помощь - Поиск - Пользователи - Календарь
Полная версия: Отслеживание вводимых данных
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Account
Есть переменная типа byte. Ее вводит пользователь вручную. Вопрос следующий, есть ли возможность отследить введеное значение пользователем (проверить на cоответствие типу), не прибегая к дополнительным переменным и подпрограммам). (вопрос относиться к Pascal и C)
Lapp
Цитата(Account @ 12.11.2008 9:13) *
есть ли возможность отследить введеное значение пользователем (проверить на cоответствие типу)
Возможность, безусловно, есть. Но вот это:
Цитата(Account @ 12.11.2008 9:13) *
не прибегая к дополнительным переменным и подпрограммам
- повергает меня в некоторое недоумение.. А что оно значит? blink.gif Что считать "дополнительным"?
Account
НУ тогда опустите данное высказывание
Цитата
не прибегая к дополнительным переменным и подпрограммам

И какие варианты можете предложить?
volvo
"Защиту от дурака" делаешь? Обычно вводят строку, ее конвертируют в число, и проверяют все возможные ошибки, которые при этом могли произойти:
function get_byte(var b: byte): boolean;
var
s: string;
n, err: integer;
ok: boolean;
begin
b := 0;
{$I-} readln(s); {$I+}
{
Проверяем, была ли при вводе строки ошибка.
Если была, то Ok будет False
}
ok := (ioresult = 0);

{
Преобразуем введенную строку S в число N,
если была ошибка, то номер ошибочного символа вернется в переменную err,
если ошибки при преобразовании не было, то err = 0
}
val(s, n, err);

{
А вот тут - связываем воедино все возможные проверки:
}
ok :=
ok and { Если не было ошибки при вводе строки ... }
(err = 0) and { ... и не было ошибки при преобразовании в число ... }
(length(s) < 4) and { ... и длина введенной строки не больше 3 ... }
((n >= 0) and (n <= 255)); { ... и полученное число в интервале 0 .. 255 }

if ok then b := n; { Если ошибки не было, возвращаем число }
get_byte := ok; { Результат функции }
end;

var
b: byte;
begin
if get_byte(b) then writeln('b = ', b)
else writeln('error');
end.
Попробуй обойти smile.gif
Account
volvo , результат принимаю, НО теперь обратимся к моему первому посту
Цитата
не прибегая к дополнительным переменным и подпрограммам


function get_byte(var b: byte): boolean; попадает под него.
Какие еще есть варианты.

Также хотелосьбы пояснение к следующему

ok := (ioresult = 0); не понял это типа сравнивание с нулем и присвоение ok?
ok := ok and
(err = 0) and (length(s) < 4) and ((n > 0) and (n <= 255)); что за перечесления без оператора условия как такового?

volvo
Цитата
Какие еще есть варианты.
Есть еще варианты пользоваться более современными средствами разработки: FPC, скажем, позволяет:

var b: byte;
begin
try
readln(b);
except
writeln('error');
end;
end.


P.S. Комментарии выше добавлены...
Account
По поводу более ссовременных средств понятно)
Цитата
{
Проверяем, была ли при вводе строки ошибка.
Если была, то Ok будет False
}
ok := (ioresult = 0);

а сравнивание результата функции ioresult с нулем производиться автоматом чтоли без оператора условия, это заложено в компиляторе или интерпритаторе посредством директивы {$I-} ........ {$I+} или просто заложено?
и вот
Цитата


ok and
(err = 0) and (length(s) < 4) and ((n > 0) and (n <= 255));

таже история что и спредыдущим выражением?

А так я понимаю если без выше упомянутых вариантов, возможно только если менять срутктуру самой процедуры readln языка.


volvo
Цитата
а сравнивание результата функции ioresult с нулем производиться автоматом чтоли без оператора условия, это заложено в компиляторе
blink.gif

ok := (ioresult = 0) cовершенно аналогично:
if (ioresult = 0) then ok := true
else ok := false;
: происходит сравнение ioresult с нулем, и результат сравнения (истина или ложь) заносится в переменную Ok.

Цитата
если без выше упомянутых вариантов, возможно только если менять срутктуру самой процедуры readln языка.
Каким образом ты собрался ее менять? Если б ты уточнил задачу, зачем тебе это понадобилось, возможно получил бы еще варианты, а то ничего не сказав хочешь получить ответ, а мне лень придумывать все возможные способы реализации и применения этой мути, да еще с такими ограничениями, как "не прибегая к дополнительным переменным и подпрограммам".
Account
volvo
Цитата
Каким образом ты собрался ее менять?


Я не собрался, а предположил.

Не сердись и спасибо за ответы.
Lapp
Цитата(Account @ 12.11.2008 13:23) *
Я не собрался, а предположил.

Но все равно странное предположение - менять компилятор под свою задачу.. blink.gif Бывает, люди делают свои предпроцессоры, если у них обширный круг специфических задач. Но сам компилятор - извини, непонятно..
Заинтриговал smile.gif. Может, все же скажешь - зачем?
Account
Lapp
Цитата
Бывает, люди делают свои предпроцессоры

У меня не такие знания в этом, не потяну blink.gif
Цитата
Заинтриговал . Может, все же скажешь - зачем?

Как таковой причины нет, делая одно задание где вчастности нужно было ограничить пользователю диапозон вводимого значения, тогда этим и заинтересовался, и подумал как бы было не плохо, чтоб таже самая процедура readln проверяла поступающие в нее данные, соответсвие вводимого типу указанной переменной, помоему былобы просто великолепно.

P.S. Случайно дублировл пост, не нашел как убрать дубликат, поэтому просто убрал текст(
Lapp
Цитата(Account @ 12.11.2008 14:26) *
как бы было не плохо, чтоб таже самая процедура readln проверяла поступающие в нее данные, соответсвие вводимого типу указанной переменной, помоему былобы просто великолепно.

Это палка о двух концах. Языки более высокого уровня могут предоставлять подобные средства - но при этом неизбежно уменьшаются свободы программиста. Паскаль уровнем выше ассемблера, но ниже, скажем, PHP или MatLab. Соответвенно, возможности его несколько уже, чем у ассемблера, но значительно шире, чем на PHP - хотя последний предоставляет очень удобный во многих случаях интерфейс. Иными словами - все за счет чего-то.

Цитата(Account @ 12.11.2008 14:26) *
P.S. Случайно дублировл пост, не нашел как убрать дубликат, поэтому просто убрал текст(

Ничего страшного, бывает. Я удалил.
Account
Цитата(Lapp @ 12.11.2008 15:02) *

Это палка о двух концах.

Согласен. Вообще былоб не плохо иметь возможность править внутренние процедуры и функции языкаblink.gif

На этом думаю тема исчерпана и можно ее удалить, чтоб не засоряла форум (Но это конечно на Ваше усмотрениеsmile.gif )

P.S. Спасибо за ответы и дискуссию)
Lapp
Цитата(Account @ 12.11.2008 16:13) *
Согласен. Вообще былоб не плохо иметь возможность править внутренние процедуры и функции языка
Хоть ты и пишешь, что соглосен, но видно, что ты не понял.. Эта возможность, если бы и была, была бы не на пустом месте - скорее всего, за счет эффективности (и цены). Я не говорю про переносимость - и так ясно..

Цитата(Account @ 12.11.2008 16:13) *
На этом думаю тема исчерпана и можно ее удалить, чтоб не засоряла форум
Все темы являются собственностью Форума (а не авторов) и удалению не подлежат (за исключением вредоносных). Это не "мусор", а богатство Форума. Прошу учитывать это в дальнейшем. Просьбы об удалении (и только отдельных сообщений!) рассматриваются исключительно в самых крайних случаях.
Account
Lapp
Цитата
Все темы являются собственностью Форума (а не авторов) и удалению не подлежат (за исключением вредоносных). Это не "мусор", а богатство Форума. Прошу учитывать это в дальнейшем. Просьбы об удалении (и только отдельных сообщений!) рассматриваются исключительно в самых крайних случаях.

Я и не настаивал, а просто предложил. Так что если, не так выразился, звиняй)

А вообще раньше когда выполнял задания, и надо было вводить какието данные, например опятьже
размерность массива например, я не особо парился над темой проверки, а вот тут в последние вермя меня это прсто что то зацепило, ведь обязательно найдеться тот кто захочет попробовать ввести не то что от него требуеться, и стало это тут вот у меня занозой)))
volvo
Цитата
в последние вермя меня это прсто что то зацепило, ведь обязательно найдеться тот кто захочет попробовать ввести не то что от него требуеться, и стало это тут вот у меня занозой)))
Из этого совершенно не следует, что должна быть необходимость менять библиотечные подпрограммы языка. Как делать защиту "от дурака" тебе было показано. НЕиспользование дополнительных процедур/функций/переменных это никому не нужные усложнения. Ты что, в программе тоже не используешь никакие процедуры/функции/переменные? Используешь наверняка. Тогда почему надо обязательно ставить для проверки эти ограничения? Ну, мозолит тебе глаза эта дополнительная функция - вынеси ее в отдельный модуль, в конце концов, и используй когда тебе надо с той же легкостью, с которой ты используешь какой-нибудь ClrScr из библиотеки CRT. Можешь даже назвать свою новую функцию ReadLn (Да, да... Этого никто и никогда не запрещал, это просто обычный идентификатор, с ним можешь делать все, что угодно), и ты вообще не увидишь разницы в использовании. Не надо искусственно ограничивать возможности языка. Это уже получается не программирование, а извращение.
Account
volvo , спасибо. Учту все твои советы.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.