Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизИнтересное поведение функции Length() Найти похожие ветки
← →
pavel_guzhanov © (2006-11-15 12:01) [0]В программе для определения пола человека использую такую вещь:
i:=Length(MIDDL_NAME);
s:=copy(MIDDL_NAME, i-1, 1);
if uppercase(s)="А" then
SEX:="Жен"
else
SEX:="Муж";
где MIDDL_NAME - отчество. вроде все работает. Переменные i и s введены для контроля. Так вот, в какие-то дни этот код работает нормально, а в какие-то - s получается равным не последней букве MIDDL_NAME, а предпоследней. Тогда я меняю второй параметр функции copy с i-1 на i, и опять какое-то время все работает нормально. Но, в какой-то день s начинает принимать значение "". Опять меняю i на i-1, и опять все работает. И так бесконечно. Программка написана только для меня, поэтому как-то справляюсь, но есть опасение, что такое же может возникнуть и в других программах. Подскажите, отчего такое происходит, и как с этим бороться?
ps если использовать MIDDl_NAME[length(MIDDL_NAME)] - та же картина.
← →
ProgRAMmer Dimonych © (2006-11-15 12:02) [1]Гюк, наверное. Переставить пора...
Попробуй для разнообразия ANSIUpperCase и RightStr... Или это трубопаскакаль?
← →
Elen © (2006-11-15 12:05) [2]
> s:=copy(MIDDL_NAME, i-1, 1);
А чтоs:=MIDDL_NAME[length(MIDDL_NAME)]
уже не модно?
← →
Elen © (2006-11-15 12:07) [3]
> pavel_guzhanov
Может поможет сделать для строки IDDL_NAME фиксированный размер?
← →
Jeer © (2006-11-15 12:08) [4]Будь проще:
if Middle_Name[High(Middle_Name)] =..
else
..
← →
Anatoly Podgoretsky © (2006-11-15 12:09) [5]> pavel_guzhanov (15.11.2006 12:01:00) [0]
Странный алгоритм, по нему выходит, что тебе именно предпоследнея буква нужна, а пот почему ты иногда получаешь последнею не ясно, может когда длина равна 1
← →
KilkennyCat © (2006-11-15 12:10) [6]я бы делал проверкой in [A, a, A, a, Я, я]
← →
pavel_guzhanov © (2006-11-15 12:17) [7]
> Странный алгоритм, по нему выходит, что тебе именно предпоследнея
> буква нужна, а пот почему ты иногда получаешь последнею
> не ясно, может когда длина равна 1
это я скопировал из сегодняшнего кода, т.к. при втором параметре "i" я получал пустую строку, а при i-1 как раз последняя буква. Завтра, стопудово, будет нужно поставить i-1 ... Длина ВСЕГДА больше 1.
> А что s:=MIDDL_NAME[length(MIDDL_NAME)] уже не модно?
я написал в постскриптуме вопроса, что это ничего не дает...
← →
Игорь Шевченко © (2006-11-15 12:20) [8]Оригинальный способ определения пола. Может, проще спросить ?
← →
Jeer © (2006-11-15 12:21) [9]pavel_guzhanov © (15.11.06 12:17) [7]
F1: массивы
Индексация с 0 до length - 1, т.е. до high(arMy)
Нельзя arMy[length(arMy)]
← →
Jeer © (2006-11-15 12:21) [10]
> Игорь Шевченко © (15.11.06 12:20) [8]
У него Павел Глоба сойдет за "Ж":)
← →
pavel_guzhanov © (2006-11-15 12:22) [11]
> Оригинальный способ определения пола. Может, проще спросить
> ?
Часто достаточно бывает вообще взглянуть. Но, когда приходит файл xls и со списком примерно человек на 500, и из него надо извлечь информацию, в том числе и ту, которой там явно нет (например про пол человека), то приходится пытаться это автоматизировать....
← →
Percent (2006-11-15 12:24) [12]У него Павел Глоба сойдет за "Ж":)
Вряд ли. Анализируется отчество.
← →
Плохиш © (2006-11-15 12:25) [13]
> Jeer © (15.11.06 12:21) [9]
Вообще-то речь про строки идёт.
> pavel_guzhanov © (15.11.06 12:17) [7]
Про возможное наличие пробелов здесь уже говорили.
← →
Jeer © (2006-11-15 12:27) [14]
> Вообще-то речь про строки идёт.
>
Клинит к среде:)
Trim(s)
← →
pavel_guzhanov © (2006-11-15 12:28) [15]
> F1: массивы
>
> Индексация с 0 до length - 1, т.е. до high(arMy)
>
> Нельзя arMy[length(arMy)]
> У него Павел Глоба сойдет за "Ж":)
определяю по отчеству, а не по фамилии
> F1: массивы
>
> Индексация с 0 до length - 1, т.е. до high(arMy)
>
> Нельзя arMy[length(arMy)]
Понимаю и согласен. Но тогда почему вчера работало именно с i , а сегодня с i-1? А завтра будет опять работать с i.... Я с этой программкой работаю уже больше месяца, и постоянно такая фигня...
← →
Elen © (2006-11-15 12:29) [16]
> У него Павел Глоба сойдет за "Ж":)
Автор пишет :MIDDL_NAME. Думаю что это имя без фамилии
Интересно какой пол у него будет для имени Виктория.?
← →
Percent (2006-11-15 12:29) [17]Сделай так:
MIDDL_NAME := Trim(MIDDL_NAME);
i := Length(MIDDL_NAME);
if i > 0 then
begin
s := Copy(MIDDL_NAME, i, 1);
if UpperCase(s) = "А" then
SEX := "Жен"
else
SEX := "Муж"
end
else
SEX := "Н/д";
← →
Percent (2006-11-15 12:31) [18]Автор пишет :MIDDL_NAME. Думаю что это имя без фамилии
А я, все же, настаиваю, что это отчество.
← →
clickmaker © (2006-11-15 12:31) [19]
> SEX := "Н/д";
это кто?
← →
Anatoly Podgoretsky © (2006-11-15 12:32) [20]> Elen (15.11.2006 12:05:02) [2]
Но он то пытается по предпоследней букве и если отчетство не указано, то пол мужской.
← →
Percent (2006-11-15 12:33) [21]это кто?
"Нет данных".
← →
Anatoly Podgoretsky © (2006-11-15 12:34) [22]> pavel_guzhanov (15.11.2006 12:17:07) [7]
Слушай, а может у тебя не строки, поскольку в строке это все таки Length=High
Ты не говоришь нам всю правду. А может у тебя вообще Length не имеет отношения к последней букве строки.
Нельзя же быть таким молчаливым, хотя тебе можно.
← →
Anatoly Podgoretsky © (2006-11-15 12:35) [23]
> Индексация с 0 до length - 1, т.е. до high(arMy)
От тебе это по почте сообщил?
← →
Anatoly Podgoretsky © (2006-11-15 12:37) [24]> Percent (15.11.2006 12:24:12) [12]
Ли Иванович Иванов
Сражу говорю - это женщина.
← →
Anatoly Podgoretsky © (2006-11-15 12:38) [25]> pavel_guzhanov (15.11.2006 12:28:15) [15]
> Но тогда почему вчера работало именно с i , а сегодня с i-1?
Так звезды сложились. После завтра возможно потребуется i-2
← →
Андрей Сенченко © (2006-11-15 12:39) [26]Дай более общирный кусок кода или сам посмотри название процедуры, в которой Ты это делаешь.
У меня была похожая история, когда я "перекрыл" своей процедурой аналогичную VCL-ную, но в моей индексация параметра начиналась с "0", а в штатной - с "1". В итоге в теле программы работала моя процедура, а в юнитах - цеплялась дельфийская и я получал OutOfRange.
← →
KilkennyCat © (2006-11-15 12:40) [27]> [24] Anatoly Podgoretsky © (15.11.06 12:37)
негр?
← →
Percent (2006-11-15 12:42) [28]Ли Иванович Иванов
Сражу говорю - это женщина.
Трансвестит?
← →
Jeer © (2006-11-15 12:43) [29]
> Anatoly Podgoretsky © (15.11.06 12:35) [23]
От тебе это по почте сообщил?
Так звезды сложились.:)
← →
Anatoly Podgoretsky © (2006-11-15 12:56) [30]> KilkennyCat (15.11.2006 12:40:27) [27]
> негр?
Это сокращение?
← →
Anatoly Podgoretsky © (2006-11-15 12:56) [31]> Jeer (15.11.2006 12:43:29) [29]
Сплошная астрология.
Значит астрологи не врут.
← →
Elen © (2006-11-15 12:57) [32]
> Но он то пытается по предпоследней букве и если отчетство
> не указано, то пол мужской.
>
Разве? :
> где MIDDL_NAME - отчество. вроде все работает. Переменные
> i и s введены для контроля. Так вот, в какие-то дни этот
> код работает нормально, а в какие-то - s получается равным
> не последней букве MIDDL_NAME, а предпоследней.
По-моему ему как раз нужна последняя иначе по его логике Алина и Лика разнополые.
Автору совет - склепать список имен (хотя бы корней имен) и по ней проверять
← →
Anatoly Podgoretsky © (2006-11-15 13:02) [33]> Elen (15.11.2006 12:57:32) [32]
Если отчество не указано, то Сopy вернет строку и если предпоследний символ не А, то считается что это мужик, а какая предпоследнея буква у пустой строки?
← →
pavel_guzhanov © (2006-11-15 13:18) [34]
> По-моему ему как раз нужна последняя иначе по его логике
> Алина и Лика разнополые.
Я думаю, что отчество будет и у Алины и у Лики - ИвановнА, так что по моей логике они однополые.
посмотри название процедуры, в которой Ты это делаешь.
procedure TMainForm.BImportDataOPSClick(Sender: TObject);
> Слушай, а может у тебя не строки, поскольку в строке это
> все таки Length=High
> Ты не говоришь нам всю правду. А может у тебя вообще Length
> не имеет отношения к последней букве строки.
> Нельзя же быть таким молчаливым, хотя тебе можно.
В экселевском файле в первом столбце, например "Иванов", во втором "Иван", в третьем "Иванович"
Вторая строка: Первый столбец - "Иванова", второй столбец - "Елена", третий столбец - "Ивановна"
Переменной LAST_NAME присваивается значение из первого столбца, переменной First_Name - из второго столбца, а переменной Middl_name - из третьего. Все переменные типа String
← →
KilkennyCat © (2006-11-15 13:21) [35]Странно, как много обсуждения у простой задачи.
Все, что надо:
определить последнюю букву.
Сравнить ее с русскими А,а,Я,я и английскими А,а (учитываем способности пользователя, однако).
Можно добавить проверку на наличие точки и одной буквы ваще (если какой-то особенный пользователь ограничился инициалами).
← →
Elen © (2006-11-15 13:21) [36]
> Если отчество не указано
Думается мне что в MIDDL_NAME отчество не попадает. А проверку на пустоту конечно делать надо
← →
pavel_guzhanov © (2006-11-15 13:25) [37]
> Думается мне что в MIDDL_NAME отчество не попадает. А проверку
> на пустоту конечно делать надо
см [34]
> определить последнюю букву.
> Сравнить ее с русскими А,а,Я,я и английскими А,а
Что-то я никак не придумаю женское отчество, оканчивающее на "я"...
← →
Anatoly Podgoretsky © (2006-11-15 13:34) [38]> pavel_guzhanov (15.11.2006 13:18:34) [34]
Это все понятно и это надо было писать в вопросе.
Но поскольку это Эксель, то там может быть любая ерунда, включая отсутствие
← →
Anatoly Podgoretsky © (2006-11-15 13:35) [39]> KilkennyCat (15.11.2006 13:21:35) [35]
Ну это и не задача вовсе, тем более для человека который программирует более года.
← →
pavel_guzhanov © (2006-11-15 13:37) [40]
> Но поскольку это Эксель, то там может быть любая ерунда,
> включая отсутствие
Я смотрю значение переменной Middl_name, если она равна пустой строке, это уже другой разговор, а вот когда она не пустая... получается описаная в вопросе ерунда...
← →
Anatoly Podgoretsky © (2006-11-15 13:37) [41]> pavel_guzhanov (15.11.2006 13:25:37) [37]
А оканчивающее на пробел можешь представить?
← →
KilkennyCat © (2006-11-15 13:40) [42]> Что-то я никак не придумаю женское отчество, оканчивающее
> на "я"...
Как-то зашел я в магазин, тарелку купить (неудобно из банки кушать). Читаю ценники... "Яйцорезка". Забавно, думаю. И тут слышу диалог двух продавщиц, пишущих новый ценник:
- Ты неправильно написала, надо "крысаловка", а не "крысоловка".
- почему?
- Проверочное слово: "Крыса".
И пишущая верит и исправляет...
Вот так-то. Надо всегда предполагать, что пользователь всякий бывает, может и "я" написать...
← →
Anatoly Podgoretsky © (2006-11-15 13:41) [43]> pavel_guzhanov (15.11.2006 13:37:40) [40]
Ты смотришь?
Почему тогда утаиваешь эту важную часть кода?
Что еще ты утаиваешь?
Ну например мы от тебя не смогли добиться определения Middl_name, а без этого разговор бессмысленен.
← →
Игорь Шевченко © (2006-11-15 13:47) [44]Я почему говорю, что проще спросить - в файле может быть информация с ошибками ввода...
> > SEX := "Н/д";
>
> это кто?
Это недоступный
← →
KilkennyCat © (2006-11-15 13:51) [45]> [44] Игорь Шевченко © (15.11.06 13:47)
в смысле "не дает" ? :)))
← →
Jeer © (2006-11-15 14:14) [46]
> KilkennyCat © (15.11.06 13:40) [42]
Чтобы ты сказал о таких ценниках ?
"Блазгогупцы"
"Мужской дуфля"
"Гаструлка"
и тп.
← →
Игорь Шевченко © (2006-11-15 15:27) [47]KilkennyCat © (15.11.06 13:51) [45]
В смысле нет данных
← →
Amoeba © (2006-11-15 17:56) [48]
> Anatoly Podgoretsky © (15.11.06 13:37) [41]
> > pavel_guzhanov (15.11.2006 13:25:37) [37]
>
> А оканчивающее на пробел можешь представить?
А ведь такое запосто может быть... Так что, прежде чем анализировать строку, для начала надо ей Trim сделать. IMHO вещь в данном случае очевидная (может здесь одни из граблей и лежат?).
← →
RASkov (2006-11-15 18:24) [49]> MIDDL_NAME := Trim(MIDDL_NAME);
[17] Возможно пробел имеет место быть.
И еще UpperCase не работает с русскими символами, покрайней мере у меня так
ShowMessage(UpperCase("а")); показывает - а //символ "а" русский
у меня D7 WinXP SP2 Rus
← →
Андрей Сенченко © (2006-11-15 19:51) [50]RASkov
И еще UpperCase не работает с русскими символами,
С ними работает AnsiUpperCase
← →
RASkov (2006-11-15 19:53) [51]> [50] Андрей Сенченко © (15.11.06 19:51)
Это я знаю.
Но в примерах то здесь везде UpperCase
← →
Amoeba © (2006-11-16 11:41) [52]
> RASkov (15.11.06 19:53) [51]
> > [50] Андрей Сенченко © (15.11.06 19:51)
>
> Это я знаю.
> Но в примерах то здесь везде UpperCase
Если знаешь, то какого черта сам на заменил в коде UpperCase на AnsiUpperCase (религия не позволяет?!) и еще ноешь, что "И еще UpperCase не работает с русскими символами"?
← →
Mikhail V © (2006-11-16 11:48) [53]Автор, тебе библиотечку кинуть для подобного "рода" деятельности?
← →
RASkov (2006-11-16 14:20) [54]> [52] Amoeba © (16.11.06 11:41)
А нафик мне это было говорить?
:)
> и еще ноешь, что "И еще UpperCase не работает с русскими
> символами"?
Я не ною, а указал на факт.
← →
Amoeba © (2006-11-16 15:09) [55]
> RASkov (16.11.06 14:20) [54]
> > [52] Amoeba © (16.11.06 11:41)
>
> А нафик мне это было говорить?
> :)
> > и еще ноешь, что "И еще UpperCase не работает с русскими
>
> > символами"?
>
> Я не ною, а указал на факт.
LOL!
← →
RASkov (2006-11-16 15:14) [56]> Если знаешь, то какого черта сам на заменил в коде UpperCase
Я не понял, че вы ко мне привязались?:)))
В каком коде, я по Вашему должен был чего-то заменить?:)))
Это у меня LOL.
← →
RASkov (2006-11-16 15:20) [57]
> [48] Amoeba © (16.11.06 15:09)
> Так что, прежде чем анализировать строку, для начала надо
> ей Trim сделать.
Тоже самое и Вам скажу - Что же Вы сразу Trim то не сделали? А?
:)))
← →
Amoeba © (2006-11-16 15:39) [58]
> Я не понял, че вы ко мне привязались?:)))
Зачем нужно было демонстрировать в своем вопросе заведомо некорректный код, тем более, что Вы с самого начала знали (судя по Вашей реакции), в чем его некорректность (UpperCase а не AnsiUpperCase)?
Поэтому и LOL.
← →
Anatoly Podgoretsky © (2006-11-16 16:15) [59]> RASkov (16.11.2006 15:20:57) [57]
> Что же Вы сразу Trim то не сделали? А?
Никакого А, как только возникла подобная необходимость, а есть она или нет - автор то молчит, так сразу возник TRIM.
А как только возникла необходимость в преобразовании в Верхний регист, то надо было сразу указывать ANSI функцию, посколько про русский язык было известно сразу.
Так что не А, а О
← →
Anatoly Podgoretsky © (2006-11-16 16:15) [60]> Amoeba (16.11.2006 15:39:58) [58]
Не LOL, а провокация, потом очередное по счету оправдание за код.
← →
RASkov (2006-11-16 18:20) [61]> [58] Amoeba © (16.11.06 15:39)
Если, что - я вопросов здесь не задавал.
> [59] Anatoly Podgoretsky © (16.11.06 16:15)
Я согласен с Вами и я как бы подвел итог вопроса автора. И тут Amoeba....
Ладно, как бы то нибыло здесь отвечать, кроме автору, больше не буду.
← →
Amoeba © (2006-11-16 18:23) [62]
> RASkov (16.11.06 18:20) [61]
> > [58] Amoeba © (16.11.06 15:39)
>
> Если, что - я вопросов здесь не задавал.
Нда, действительно... Перепутал. В таком случае прими мои извинения за наезд не по адресу.
← →
RASkov (2006-11-16 18:40) [63]Ух.. неужто все кончилось:)
> [62] Amoeba © (16.11.06 18:23)
Бывает:) Непереживай.
← →
Leonid Troyanovsky © (2006-11-16 18:46) [64]
> RASkov (16.11.06 18:40) [63]
> Ух.. неужто все кончилось:)
Зря ты не регистрируешься.
Ну, ладно, ухожу-ухожу.
--
Regards, LVT.
← →
pavel_guzhanov © (2006-11-17 11:19) [65]Спасибо всем, кто пытался помочь! Помогла Trim (не учел я, что заполняющие файл в экселе могут после отчества еще и пробел воткнуть :0)), и, естественно, AnsiUpperCase.
Спасибо!
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.043 c