Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2015, 07:37   #1
НовичокЗоя
Новичок
Джуниор
 
Регистрация: 05.07.2015
Сообщений: 4
По умолчанию Задача со строковыми величинами (Pascal)

Написать функцию, которая получает на входе две строковые величины и проверяет вхождение одной в другую. На выходе выдает результат ложь или номер позиции вхождения. Никак не могу взять в толк, как переменной присвоить тип boolean и integer одновременно?
НовичокЗоя вне форума Ответить с цитированием
Старый 05.07.2015, 10:33   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Дык поставьте развилку - нашли - все прекрасно, иначе вывели ложь
Poma][a вне форума Ответить с цитированием
Старый 05.07.2015, 10:47   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

НовичокЗоя выложите какие-нибудь наработки.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 05.07.2015, 11:11   #4
НовичокЗоя
Новичок
Джуниор
 
Регистрация: 05.07.2015
Сообщений: 4
По умолчанию

function rez (S1, S2: String): ?;
begin
rez:=pos(S1,S2)
end;

Насколько я понимаю формулировку задачи, в случае, когда rez=0, необходимо работать с переменной типа boolean, в остальных случаях - с integer.

Если написать простую развилку при помощи if, то возможно выведение на экран информации о значении rez. Но в формулировке задачи написано, что надо организовать при помощи функции, то, вероятно, в программе происходит обращение к результату этой функции. Вот я и не могу понять: то ли я чего-то не понимаю и не знаю, то ли задача сформулирована некорректно.
НовичокЗоя вне форума Ответить с цитированием
Старый 05.07.2015, 11:32   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
На выходе выдает результат ложь или номер позиции вхождения. Никак не могу взять в толк, как переменной присвоить тип boolean и integer одновременно
Вы правильно мучаетесь вопросом.
Паскаль строго типизированный язык. Переменная НЕ МОЖЕТ принимать значения разного типа (ну, если не брать искусственно введённый в Delphi тип VARIANT)

поэтому, у Вас два выхода.
выход первый - функция возвращает только целочисленное значение. В случае ошибки возвращается значение, которого заведомо нет и не может быть.
например, Pos возвращает ноль, если ничего не нашлось. Некоторые функции возвращают -1, если значение не найдено в списке и т.д.

вариант второй.
функция делается логического типа и возвращает true (нашлось) или false (не найдено) и при этом функция вовращает значение через переменную параметер:
Код:
function findPos(const S1, S2 : string; var PosS1InS2 : integer) : boolean;
begin
   PosS1InS2 := Pos(S1, S2);
   findPos := (PosS1InS2 > 0);
end;
безусловно, можно написать функцию, которая возвращает тип Variant, но это будет работать далеко не в каждом Pascal и подобное требует какое-то логическое обоснование - для чего это нужно.

надеюсь, что немного помог Вам разобраться в данном вопросе.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2015, 11:34   #6
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

НовичокЗоя
Цитата:
Никак не могу взять в толк, как переменной присвоить тип boolean и integer одновременно?
По моему, вы слишком мудрите, пытаясь найти в задаче "скрытый" смысл.
Как решать такую задачу, во-первый зависит от темы, к которой она относится, посмотрите в названии лабы.

Пусть рез-т ф-и - тип integer - после выполнения функции - анализируете её результат.
Код:
если rez (s1,s2) = 0, то выводим - ложь иначе выводим - номер позиции.
ну или можно по извращаться так (если у вас ТР, т.е. строка до 255 символов)
Код:
function rez (s1,s2): byte;
begin
rez:=pos(S1,S2);
end;
........

if rez(s1,s2)>0 then writeln (boolean (rez(s1,s2)) else writeln (rez(s1,s2));
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.

Последний раз редактировалось Niro; 05.07.2015 в 11:45.
Niro вне форума Ответить с цитированием
Старый 05.07.2015, 12:17   #7
НовичокЗоя
Новичок
Джуниор
 
Регистрация: 05.07.2015
Сообщений: 4
По умолчанию

function findPos(const S1, S2 : string; var PosS1InS2 : integer) : boolean;
Как в этом случае обратиться к такой функции в теле основной программы? Можно ли использовать значение PosS1InS2 для каких-либо операций?
НовичокЗоя вне форума Ответить с цитированием
Старый 05.07.2015, 12:18   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Предлагаю текст этого вопроса считать эталонным и добавить в ПРАВИЛА пункт "как правильно задавать вопросы" со ссылкой на этот топик!

Кто ЗА?

Автору - респект.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.07.2015, 12:31   #9
НовичокЗоя
Новичок
Джуниор
 
Регистрация: 05.07.2015
Сообщений: 4
Хорошо

Спасибо всем огромное! Получилось!
НовичокЗоя вне форума Ответить с цитированием
Старый 05.07.2015, 12:36   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Формулировка задачи написана для с/с++, там то, что = 0 и есть false.
Автору вопроса: тут на паскале можно, конечно, принять false за 0, что логично и правильно. Но препод-долбодятел-буквоед может домотаться, как голодный гаишник. если это произойдёт, подсунь ему вот такой вариант:
Код:
type
  TPosResult = record case byte of
    0: (Position: Integer);
    1: (Success: Boolean);
  end;


function MyPos(const SubStr, S: string; const Offset: Integer = 1): TPosResult;
begin
  Result.Position:= Pos(SubStr, S, Offset);
end;
Ахтунг! Аттеншн! Внимание! Увага!!! SHIT-CODE detected!!! Не отлаживал, писал на заборе!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками и строковыми массивами(Pascal) MPQWERTY Помощь студентам 1 06.12.2014 17:19
Задача turbo pascal на тему: файлы с произвольным доступом в Pascal ExCiTeC Паскаль, Turbo Pascal, PascalABC.NET 0 28.01.2013 20:36
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
задача со строковыми данными, файловым вводом выводом Босикоша Паскаль, Turbo Pascal, PascalABC.NET 3 20.09.2012 20:32
Работа со строковыми переменными на языке PASCAL бургер Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2010 08:44