На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила ЧаВО (FAQ) разделов Паскаля
В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.

Стоит почитать Структуры данных
Модераторы: volvo877, Romtek
  
> Символы и Строки (Char & Strings)
    - Символы и Строки -

    Теория:

    Язык Турбо Паскаль поддерживает стандартный символьный тип Сhar и, кроме того, строки, описываемые типом String или String[n].

    Значение типа Char - это символ из алфавита ЭВМ, заключенный в одинарные кавычки, например, 'A', '7'. Кроме этой классичекой записи существуют еще две. Одна из низ - представление символа его кодом ASCII с помощью префикса #:

    #97 = Chr(97) = 'a' (символ 'a')
    #0 = Chr(0) (нулевой символ)
    #32 = Chr(32) = ' ' (пробел)

    Символы, имеющие коды от 1 до 31 (управляющие), могут быть представлены их "клавиатурными" обозначениями - значком "^" и буквой алфавита (для диапазона кодов 1..26) или управляющим символом (для диапазона 27..31):

    ^A = #1 = Chr(1) - код 1
    ^B = #2 = Chr(2) - код 2
    ...
    ^Z = #26 = Chr(26) - код 26
    ^[ = #27 = Chr(27) - код 27
    ...
    ^_ = #33 = Chr(33) - код 33

    Рассмотрим более подробно строковый тип. Максимальный длина строки составляет 255 символов. Строки называются динамическими, поскольку могут иметь различные длины в пределах объявленных границ. Например, введя переменные
    ExpandedWrap disabled
      Var
       S32  : String[32];
       S255 : String[255];

    мы может в S32 строчные значения, длиной не более 32 символов, а в S255 - не более 255. Описание String без указания длины отводит место, как и описание String[255].
    При попытке записать в переменную строку длиннее, чем было объявлено в описании, "лишняя" часть будет отсечена. Можно присваивать и пустые строки. Их обозначение '' (две одинарных кавычки подряд).

    Значением строки может быть любая последовательность символов, заключенных в одинарные кавычки:
    'abcde'
    '123332'
    ' '
    ''
    ''''
    Последняя конструкция есть строка из одной одинарной кавычки.

    Можно, вообще говоря, рассматривать строки как массивы символов. Любой символ из строки можно изъять по его номеру:
    ExpandedWrap disabled
      Var
       I : Byte      ;
       S : String[20];
      Begin
       S := 'Это Массив символов';
       For I := 1 to 20 do
        WriteLn(S[I]);
      End.


    Следует заметить, что в нулевом элементе строки содержится байт, содержащий длину строки. Можно получить длину строки следующим образом:
    ExpandedWrap disabled
      Var
       L : Byte  ;
       S : String;
      Begin
       S := '12345';
       L := Byte(S[0]); { В L теперь содержится длина строки, в данном случае - 5 }
      End.


    Отдельные символы совместимы с типом char, и над ними можно производить те же действия:
    ExpandedWrap disabled
      Var
       S  : String;
       Ch : Char  ;
      Begin
       S := 'Hello, World!'
       Ch := S[1]; { сейчас Ch = 'H' }
       S[2] := UpCase(S[2]); { S теперь равна 'HEllo, World!' }
      End.


    Заполнение строки одинаковым символом:
    ExpandedWrap disabled
      Var
       S : String;
      Begin
       FillChar(S[1], 80, 'P'); { Пишем в строку 80 букв P }
       S[0] := Char(80); { Устанавливаем длину строки в 80 символов }
      End.
    Сообщение отредактировано: Romtek -
      Продолженние строк. Наконец-то :)

      Операции над строками

      Получение длины строки:

      ExpandedWrap disabled
        Function Length(S : String) : Integer;

      Возвращает длину строки S. Тоже самое можно получить, как было сказано выше, прочитав нулевой байт строки.
      Пример:
      ExpandedWrap disabled
        Var
         I : Integer;
         S : String ;
        Begin
         S := '12345';
         I := Length(S);         { I теперь содержит 5 }
         I := byte(S[0]);         { И все равно 5 :) }
         {V. S[0] имеет тип char, и нужно явное преобразование до байта.}
        End.


      Конкатенация (слияние) строк

      Чтобы "склеить"две строки достаточно просто применить к ним оператор "+".
      Например:
      ExpandedWrap disabled
        Var
         S1, S2, S3 : String;
        Begin
         S1 := 'Мама ';
         S2 := 'мыла ';
         S3 := S1 + S2;
         S3 := S3 + 'раму';
         WriteLn(S3);  { Выведет на экран "Мама мыла раму" }
        End.


      На самом деле, оператор "+" - эквивалент функции Concat:
      ExpandedWrap disabled
        Function Concat(s1, [s2... sn] : String) : String;

      Несложно догадаться, как она работает:
      ExpandedWrap disabled
        Var
         S1, S2, S3 : String;
        Begin
         S1 := 'Мама ';
         S2 := 'мыла ';
         S3 := 'раму';
         WriteLn(Concat(S1, S2, S3)); { Выведет на экран все ту же бессмертную фразу }
        End.


      Получение части строки

      ExpandedWrap disabled
        Function Copy(S : String; Index : Integer; Count : Integer) : String;

      Возвращает строку, длиною Count символов, вырезанную из строки S, начиная с символа с номером Index.
      Если Index больше длины строки S, эта функция вернет пустую строку.
      Если Count больше, чем символов "осталось" в строке, то Copy вернет только "остаток" строки (начиная с Index символа).
      Пример:
      ExpandedWrap disabled
        Var
         S, S2 : String;
        Begin
         S := 'Форум на Исходниках.РУ';
         S2 := Copy(S, 10, 13); { S2 теперь содержит "Исходниках.РУ" }
        End.


      Удаление подстроки

      ExpandedWrap disabled
        Procedure Delete(Var S : String; Index : Integer; Count : Integer);

      Эта процедура удаляет из строки S Count байт, начиная с позиции Index.
      Если Index больше, чем длина строки, эта процедура ничего не делает.
      Если Count больше, чем осталось символов в строке, Delete удаляет все символы до конца строки.
      Использование:
      ExpandedWrap disabled
        Var
         S : String;
        Begin
         S := 'Мама не мыла раму';
         Delete(S, 5, 3); { Удалить из строки S три символа, начиная с пятого. Теперь S равна "Мама мыла раму" }
        End.


      Вставка подстроки

      ExpandedWrap disabled
        Procedure Insert(Source : String;  Var S : String; Index : Integer);

      Это процедура вставляет в строку S подстроку Source. Вставка производится с символа с номером Index.
      ExpandedWrap disabled
        Var
         S : String;
        Begin
         S := 'Мама раму';
         Insert('мыла ', S, 5); { ну думаю, совсем несложно догадаться... }
        End.


      Примечание. При использовании Turbo Vision нужно часто использовать префикс System, так как многие объекты имеют метод с именем Insert. Например
      ExpandedWrap disabled
        System.Insert(params)

      Поиск подстроки

      ExpandedWrap disabled
        Function Pos(Substr : String; S : String) : Byte;


      Ищет подстроку Substr в строке S и возвращает позицию в строке, где найдено первое вхождение.
      Если подстрока не найдена, возвращает 0.
      Пример:
      ExpandedWrap disabled
        Var
         S : String;
        Begin
         S := 'abacacb';
         WriteLn(Pos('ba', S)); { На экран будет выведено 2 }
        End.
        Лекция по теме "Строки" с примерами (Word document, 53 кб)

        Материал прислал e-moe, за что ему спасибо.
        Прикреплённый файлПрикреплённый файлstrings.zip (52.62 Кбайт, скачиваний: 1115)
          Функции модуля Stringz.pas
          ExpandedWrap disabled
            Function LowCase (C:Char): Char;  { 'StRIng' -> 'string' }
            Function RUpCase (Ch: Char): Char;  { 'я' -> 'Я' }
            Function RLowCase (Ch:Char): Char;  { 'Я' -> 'я' }
            Function RLowStr (S:String): String;  { 'Russian Язык' -> 'русский язык' }
            Function RUpperStr (s:string): String;  { 'Russian Язык' -> 'RUSSIAN ЯЗЫК' }
            Function UpStr (S:string): String;  { 'Pascal' -> 'PASCAL' }
            Function LowStr (s:string): String;  { 'Turbo' -> 'turbo' }
            Function ReplaceChar (S:String; OldChar,NewChar:char): String;  { Замена в строке S всех символов OldChar на NewChar }
            Function ReplaceAll (S:string;const Search,Repl:string): String;  { Замена в строке S всех вхождений Search на Repl }


          Цитата
          А вы знаете что в DOS есть функции преобразования строки в верхний и нижний регистры,
          и если в CONFIG.SYS стоит COUNTRY=007, они корректно работают с русскими буквами.

          ExpandedWrap disabled
            Function Upcase (C:Char): Char; assembler;
            asm
               mov AX,6520H
               mov DL,C
               int 21H
               mov AL,DL
            end;

          Цитата
          А можно за один вызов перевести в верхний регистр целую строку
          String или PChar. Это подфункции 21H и 22H той же функции 65H
          Вариант для String приведу, а для PChar пишите сами - он проще.
          ExpandedWrap disabled
            Procedure UpString (var S: String); assembler;
            asm
             Push DS
             LDS BX,S
             XOR CX,CX
             MOV CL,[BX] {;Длина строки в CX}
             INC BX
             MOV DX,BX {; DS:DX- указатель на первый символ}
             MOV AX,6521H
             INT 21H
             POP DS
            end;
          Цитата
          Для подфункции 22H указатель на ASCIIZ строку передается в тех же DS:DX
          Сообщение отредактировано: Romtek -

          Прикреплённый файлПрикреплённый файлSTRINGZ.zip (0.94 Кбайт, скачиваний: 633)
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0340 ]   [ 16 queries used ]   [ Generated: 23.04.24, 23:37 GMT ]