Форум: "Начинающим";
Текущий архив: 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, если она равна пустой строке, это уже другой разговор, а вот когда она не пустая... получается описаная в вопросе ерунда...
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.055 c