Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Интересное поведение функции 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.064 c
15-1163685032
Андрей Сенченко
2006-11-16 16:50
2006.12.03
Работа с XML на Delphi. Начинающему :)


4-1153810612
DmitrySukach
2006-07-25 10:56
2006.12.03
Получение сертификата пользователя через Active Directory


15-1163389346
Slider007
2006-11-13 06:42
2006.12.03
С днем рождения ! 11 октября


2-1163473730
Wood
2006-11-14 06:08
2006.12.03
Continue, вложенный цикл.


15-1163416440
s567
2006-11-13 14:14
2006.12.03
Хэши crc32, md5