На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Преобразование букв , прописные в строчные
    Задача: Дана строка. Преобразовать все строчные|прописные латинские|русские буквы в прописные|строчные.
    Строчные в прописные я преобразовал:
    ExpandedWrap disabled
      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.

    А как преобразовать прописные русские в строчные ?
      что-то вроде LoCase, LowerCase...
        Цитата Coala @
        что-то вроде LoCase, LowerCase...

        Попробовал, ошибку выдает (Unknown Identifier...)
          Нет, только вручную!
          Сейчас поищу... было где-то в ФАКе.

          Добавлено
          Pascal (перекодировка текстового файла)
            kost48, посмотри хелп на UpCase, может быть, там будет ссылка...
              Цитата Coala @
              kost48, посмотри хелп на UpCase, может быть, там будет ссылка...

              Я в книжке прочитал что есть только преобразование в верхний регистр (UpCase) и то только для латинских букв, правильно Romtek говорит, вручную надо делать, ток я не знаю как... :wall:
                kost48, сопоставление таблицей... есть таблица букв верхнего регистра и нижнего, т.е. массив вида "АБВГДЕЁЖЗИЙКЛМН...Я" и массив "абвгде....я" если буква из верхнего русского регистра, ищем ее индекс в массиве, потом заменяем ее на букву массива из нижнего регистра с тем же индексом. Тупо, но эффективно.
                  Тип Char имеет размер 256 байт: 0..255
                  У каждой буквы есть свой индекс в таблице ASCII. Чтобы изменить регистр (прописная/заглавная), надо изменить индекс так, чтобы он соответствовал прописной/заглавной букве.
                  'A'..'Z'
                  'a'..'z'
                  между ними разница в индексах: ord ('a') - ord ('A')

                  'А'..'П'
                  'а'..'п'
                  между ними разница в индексах: ord ('а') - ord ('А')

                  'Р'..'Я'
                  'р'..'я'
                  между ними разница в индексах: ord ('р') - ord ('Р')

                  Теперь тебе нужно прибавить/отнять эту разницу к/от индексу(а) нужной буквы, чтобы сдвинуть её регистр:
                  inc (ch, diff);
                  или
                  dec (ch, diff);
                  diff - это разница индексов
                    Romtek, спасибо!
                    Вот доделал:
                    ExpandedWrap disabled
                      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.
                      kost48, а вот так:
                      ExpandedWrap disabled
                        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;
                      ;)
                      Просто если ты больше нигде не используешь эти множества, зачем их вводить? Кстати,
                      ExpandedWrap disabled
                        if (S[i] in DownCaseLatin) = True then
                      вообще не стОит делать, достаточно
                      ExpandedWrap disabled
                        if (S[i] in DownCaseLatin) then
                      равенство True подразумевается само собой...
                        Цитата
                        ExpandedWrap disabled
                          S[i] := Chr(Ord(S[i]) + (Ord('а') - Ord('А')));

                        ещё проще:
                        ExpandedWrap disabled
                           inc ( S[i] , Ord ('а') - Ord ('А') );
                          volvo877, сенькс за альтернативное решение... :)
                          Только вопрос а что такое $20 и $50 ?
                            Это и есть пресловутая разница, но в 16-ричном представлении числа.
                            Сообщение отредактировано: Romtek -
                              (Ord('а') - Ord('А')) = 160 - 128 = 32 = $20
                              (Ord('р') - Ord('Р')) = 224 - 144 = 80 = $50
                              Хотя это и не играет особой роли, компилятор все равно заменит все Ord-ы на константы еще при компиляции, и на быстродействии это никак не отразится...
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0530 ]   [ 15 queries used ]   [ Generated: 26.04.24, 02:37 GMT ]