Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.047 c
2-1163506756
megasecure
2006-11-14 15:19
2006.12.03
Рисование с пом. Polyline


15-1163092237
*Стажер*
2006-11-09 20:10
2006.12.03
Хочю делать как Ketmar. :)


6-1152443749
Asail
2006-07-09 15:15
2006.12.03
Трабла с proxy через TIdHTTP (Indy 10)


2-1163756193
Дмитрий Белькевич
2006-11-17 12:36
2006.12.03
io error 32


2-1163580077
DelphiLexx
2006-11-15 11:41
2006.12.03
Обмирает OddRowColor в DBGridEh e





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский