IPB
ЛогинПароль:

> Внимание! Действует предмодерация

Подраздел FAQ (ЧАВО, ЧАстые ВОпросы) предназначен для размещения готовых рабочих программ, реализаций алгоритмов. Это нечто вроде справочника, он наполнялся в течение 2000х годов. Ваши вопросы, особенно просьбы решить задачу, не пройдут предмодерацию. Те, кто наполнял раздел, уже не заходят на форум, а с теми, кто на форуме сейчас, лучше начинать общение в других разделах. В частности, решение задач — здесь.

> Строки
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Строки. Краткая теория.

В Паскале определены два типа строк:
  • Тип String
  • тип PChar
I. String

Стандартная строка (string) в Паскале, представляет из себя массив, первый элемент которого содержит длину строки, а начиная со второго элемента начинается полезная информация. Поскольку нумерация начинается с 0, то первый элемент строки, содержащий длину строки, имеет индекс 0.

Если Вы попытаетесь осуществить следующее присвоение:
var
s:string;
I:byte;
begin
readln(s);
i:=s[0];
end.

то компилятор выдаст сообщение об ошибке (несовместимость типов), потому что
все элементы строки - символы (Char)

Для определения длины строки можно использовать или стандартную процедуру Length(stroka) или так:
var
dlinna_stroki:byte
s:string;
begin
readln(s); {вводим строку}
dlinna_stroki:=Ord(s[0]);
end.


Второй способ менее нагляден, но полезен если Вы забыли стандартные процедуры.

К каждому элементу строки можно обратиться, как к элементу массива. Длина строк ограниченна 255 символами. Поскольку первый элемент строки кодируется одним байтом, он может закодировать максимум 255 элементов.

II. PChar
Для обеспечения поддержки строк, длиннее 255 символов, в TP7 был введен новый тип - PChar. Он имеет следующую структуру:
Type
PChar = ^Char;


Т.е. представляет собой указатель, но в отличие от обычных указателей, он трактуется необычным образом: считается, что он указывает на цепочку символов, заканчивающуюся символом с кодом #0.

Тип PChar совместим с одномерным символьным массивом с нулевой левой границей (array[0..max]).

Переменные типа PChar индексируются, т.е. к элементам длинной строки можно обратиться по их индексу, как к элементам обычной строки.

СТРОКИ. ЧаВо.
  • После посимвольного ввода строки, не получается вывести ее на экран. В чем дело?
    При посимвольном вводе строки, Вы забыли указать длину получившейся строки
    s[0]:=chr(dlinna)

    Или иначе, при вводе:
    {...}
    {ввод очередного символа}
    {...}
    Inc(S[0]);
  • Почему не получается индексировать длинную строку?
    Включите расширенный синтаксис директивой {$X+} или в настройках компилятора
  • Есть какие-нибудь процедуры для работы с длинными строками?
    Да, есть. В модуле strings
  • Как вывести длинную строку на экран?
    Процедурой Writeln, при включенно расширенном синтаксисе.
  • Сколько занимает в памяти строка?
    Для обычных строк, если не указана длина строки, то 256 байт.
    Если, при описании переменной, указана длина строки явно (string[8]), то столько, сколько указано +1 байт на нулевой элемент (хранение длинны строки).
    Для PChar размер в памяти равен количеству элементов до символа #0 +1 байт.
  • Как перевернуть строку?
    (с использованием второй строки):
    var
    s,f: string;
    i,j: byte;
    begin
    readln(s); j:=1;
    for i:=length(s) downto 1 do begin
    f[j]:=s[i]; inc(j);
    end;
    f[0]:=chr(j);
    writeln(f);
    end.


    (from APAL с использованием одной строки и одной переменной типа Char):
    var
    s:string;
    f:Char
    i:byte;
    begin
    readln(s);
    for i:=1 to Length(s) div 2 do begin
    f:=s[i];
    s[i]:=s[Length(s)-i+1];
    s[Length(s)-i+1]:=f;
    end;
    writeln(s);
    end.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Имитация стандартных функций Паскаля для работы со строками

Функция POS

function _Pos(const subS, s: String): Integer;
var
i, j, LenS, LenSb: Integer;
find: Boolean;
begin

i := 1;

find := false;

LenS := Length(s);
LenSb := Length(subS);

while (i <= LenS) and not(find) do begin

while (i <= LenS) and (s[i] <> subS[1]) do
inc(i);

if (i <= LenS) and ( i + LenSb - 1 <= LenS) then begin

j := 0;

while (j < LenSb) and (s[i + j] = subS[j + 1]) do
inc(j);

find := (j > LenSb - 1);

end;

if not(find) then inc(i);

end;

if find then _Pos := i else _Pos := 0;

end;


Функция COPY

function _Copy(const s: String; start, len: Word): String;
var
result: String;
LenS, i: Word;
begin


if (start <= 0) or (len <= 0) then result := '' else begin

result := '';

LenS := Length(s);

if start + len - 1 > LenS then
len := LenS - start + 1;

for i := start to start + len - 1 do
result := result + s[i];

end;

_Copy := result;
end;


Функция INSERT

procedure _Insert(var s: String; const subS: String; start: Word);
var
result: String;
i: Integer;
begin

if (start <= 0) or (start >= 255) then result := s else begin

result := '';

for i := 1 to start - 1 do
result := result + s[i];

result := result + subS;

for i := start to Length(s) do
result := result + s[i];

end;

s := result;
end;


Функция DELETE

procedure _Delete(var s: String; start, len: Word);
var
i: Integer;
begin

if (start <= 0) or (start >= 255) or (len <= 0) then exit;

if start + len - 1 > Length(s) then
len := Length(s) - start + 1;

for i := start to Length(s) - len do
s[i] := s[i + len];

dec(s[0], len);

end;




--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.04.2024 8:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name