Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.174.76] |
|
Сообщ.
#1
,
|
|
|
Задача: Дана строка. Преобразовать все строчные|прописные латинские|русские буквы в прописные|строчные.
Строчные в прописные я преобразовал: uses crt; const DownCaseLatin = ['a'..'z']; UpCaseCirillyc = ['А'..'П','Р'..'Я']; var S : String; i,N : Integer; begin Clrscr; WriteLn('Input String:'); ReadLn(S); N := Length(S); for i := 1 to N do begin if (S[i] in DownCaseLatin) = True then S[i] := UpCase(S[i]); if (S[i] in UpCaseCirillyc) = True then S[i] := {а тут как ?} end; WriteLn('Result String: '); Write(S); Readkey; end. А как преобразовать прописные русские в строчные ? |
Сообщ.
#2
,
|
|
|
что-то вроде LoCase, LowerCase...
|
Сообщ.
#3
,
|
|
|
Цитата Coala @ что-то вроде LoCase, LowerCase... Попробовал, ошибку выдает (Unknown Identifier...) |
Сообщ.
#4
,
|
|
|
Нет, только вручную!
Сейчас поищу... было где-то в ФАКе. Добавлено Pascal (перекодировка текстового файла) |
Сообщ.
#5
,
|
|
|
kost48, посмотри хелп на UpCase, может быть, там будет ссылка...
|
Сообщ.
#6
,
|
|
|
Цитата Coala @ kost48, посмотри хелп на UpCase, может быть, там будет ссылка... Я в книжке прочитал что есть только преобразование в верхний регистр (UpCase) и то только для латинских букв, правильно Romtek говорит, вручную надо делать, ток я не знаю как... |
Сообщ.
#7
,
|
|
|
kost48, сопоставление таблицей... есть таблица букв верхнего регистра и нижнего, т.е. массив вида "АБВГДЕЁЖЗИЙКЛМН...Я" и массив "абвгде....я" если буква из верхнего русского регистра, ищем ее индекс в массиве, потом заменяем ее на букву массива из нижнего регистра с тем же индексом. Тупо, но эффективно.
|
Сообщ.
#8
,
|
|
|
Тип Char имеет размер 256 байт: 0..255
У каждой буквы есть свой индекс в таблице ASCII. Чтобы изменить регистр (прописная/заглавная), надо изменить индекс так, чтобы он соответствовал прописной/заглавной букве. 'A'..'Z' 'a'..'z' между ними разница в индексах: ord ('a') - ord ('A') 'А'..'П' 'а'..'п' между ними разница в индексах: ord ('а') - ord ('А') 'Р'..'Я' 'р'..'я' между ними разница в индексах: ord ('р') - ord ('Р') Теперь тебе нужно прибавить/отнять эту разницу к/от индексу(а) нужной буквы, чтобы сдвинуть её регистр: inc (ch, diff); или dec (ch, diff); diff - это разница индексов |
Сообщ.
#9
,
|
|
|
Romtek, спасибо!
Вот доделал: uses crt; const DownCaseLatin = ['a'..'z']; UpCaseCirillyc1 = ['А'..'П']; UpCaseCirillyc2 = ['Р'..'Я']; var S : String; i,N : Integer; begin Clrscr; WriteLn('Input String:'); ReadLn(S); N := Length(S); for i := 1 to N do begin if (S[i] in DownCaseLatin) = True then S[i] := UpCase(S[i]); if (S[i] in UpCaseCirillyc1) = True then S[i] := Chr(Ord(S[i]) + (Ord('а') - Ord('А'))); if (S[i] in UpCaseCirillyc2) = True then S[i] := Chr(Ord(S[i]) + (Ord('р') - Ord('Р'))); end; WriteLn('Result String: '); Write(S); Readkey; end. |
Сообщ.
#10
,
|
|
|
kost48, а вот так:
Function StrLower(s: String):String; Var i: Byte; Begin For i := 1 To Length(s) Do Case s[i] Of 'A' .. 'Z', 'А' .. 'П': s[i] := Chr(Ord(s[i])+$20); 'Р' .. 'Я': s[i] := Chr(Ord(s[i])+$50) End; StrLower := s End; Просто если ты больше нигде не используешь эти множества, зачем их вводить? Кстати, if (S[i] in DownCaseLatin) = True then if (S[i] in DownCaseLatin) then |
Сообщ.
#11
,
|
|
|
Цитата S[i] := Chr(Ord(S[i]) + (Ord('а') - Ord('А'))); ещё проще: inc ( S[i] , Ord ('а') - Ord ('А') ); |
Сообщ.
#12
,
|
|
|
volvo877, сенькс за альтернативное решение...
Только вопрос а что такое $20 и $50 ? |
Сообщ.
#13
,
|
|
|
Это и есть пресловутая разница, но в 16-ричном представлении числа.
|
Сообщ.
#14
,
|
|
|
(Ord('а') - Ord('А')) = 160 - 128 = 32 = $20
(Ord('р') - Ord('Р')) = 224 - 144 = 80 = $50 Хотя это и не играет особой роли, компилятор все равно заменит все Ord-ы на константы еще при компиляции, и на быстродействии это никак не отразится... |