IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Отслеживание вводимых данных, Отслеживание соответсвию типа
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Есть переменная типа byte. Ее вводит пользователь вручную. Вопрос следующий, есть ли возможность отследить введеное значение пользователем (проверить на cоответствие типу), не прибегая к дополнительным переменным и подпрограммам). (вопрос относиться к Pascal и C)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Account @ 12.11.2008 9:13) *
есть ли возможность отследить введеное значение пользователем (проверить на cоответствие типу)
Возможность, безусловно, есть. Но вот это:
Цитата(Account @ 12.11.2008 9:13) *
не прибегая к дополнительным переменным и подпрограммам
- повергает меня в некоторое недоумение.. А что оно значит? blink.gif Что считать "дополнительным"?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


НУ тогда опустите данное высказывание
Цитата
не прибегая к дополнительным переменным и подпрограммам

И какие варианты можете предложить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






"Защиту от дурака" делаешь? Обычно вводят строку, ее конвертируют в число, и проверяют все возможные ошибки, которые при этом могли произойти:
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

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


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)); что за перечесления без оператора условия как такового?



Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

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


P.S. Комментарии выше добавлены...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


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

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


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

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

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


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

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

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


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


volvo
Цитата
Каким образом ты собрался ее менять?


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

Не сердись и спасибо за ответы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Lapp
Цитата
Бывает, люди делают свои предпроцессоры

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

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

P.S. Случайно дублировл пост, не нашел как убрать дубликат, поэтому просто убрал текст(

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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

Ничего страшного, бывает. Я удалил.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 12.11.2008 15:02) *

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

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

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

P.S. Спасибо за ответы и дискуссию)

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


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

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

А вообще раньше когда выполнял задания, и надо было вводить какието данные, например опятьже
размерность массива например, я не особо парился над темой проверки, а вот тут в последние вермя меня это прсто что то зацепило, ведь обязательно найдеться тот кто захочет попробовать ввести не то что от него требуеться, и стало это тут вот у меня занозой)))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






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


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


volvo , спасибо. Учту все твои советы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name