Главная страница
    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, если она равна пустой строке, это уже другой разговор, а вот когда она не пустая... получается описаная в вопросе ерунда...


 
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.049 c
1-1161708596
carmen
2006-10-24 20:49
2006.12.03
Создание dbgrideh на листе tabsheet компонента pagecontrol


2-1163785251
ProgRAMmer Dimonych
2006-11-17 20:40
2006.12.03
Опять торможу. Какая функция в Turbo Pascal отвечает...


15-1163145761
Juice
2006-11-10 11:02
2006.12.03
Проблемы с кодировкой


15-1163496527
data
2006-11-14 12:28
2006.12.03
Порекомендуйте надежных и хороших мастеров (взялась за ремонт)


8-1145877105
us
2006-04-24 15:11
2006.12.03
анализатор звука





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский