Лекция11_Использование строковых переменных
DESCRIPTION
Тема 11 Использование строковых переменных 12/06/10 1 Возникло понимание того, что можно создать язык высокого уровня, позволяющий писать программы обработки и редактирования текстов, компиляторы для новых языков Строка-константа записывается в виде (’а…с’) 12/06/10 2 12/06/10 3 Для того, чтобы овладеть навыками работы со строковым типом необходимо знать ответы на следующие вопросы 12/06/10 4TRANSCRIPT
04/23/23 1
Тема 11 Использование строковых переменных
Зачем нужны строки Описание переменных строкового
типа Некоторые процедуры и функции
обработки строк Примеры алгоритмов обработки
строк
04/23/23 2
Зачем нужны строки
мы уже знаем, что строка – это последовательность символов
Строка-константа записывается в виде (’а…с’)
C широким распространением ПЭВМ появилась насущная потребность во всевозможных программах обработки текстов, таких как Word.
Возникло понимание того, что можно создать язык высокого уровня, позволяющий писать программы обработки и редактирования текстов, компиляторы для новых языков
04/23/23 3
Как решить проблему введения строк? Казалось бы просто: ввести возможность работы с
символами, что и было сделано. В языке Паскаль, а затем и в Си был введен тип char, с которым вы знакомы.
Массивы из символов a: array [1..N] of char; в принципе решают проблему обработки символьной
информации. Однако, массив оказался не очень удобной
конструкцией в основном из-за фиксированной структуры и сложности выполнения операций над ним
В результате творческих поисков в языках появился новый изящный тип переменных: строковый.
04/23/23 4
Для того, чтобы овладеть навыками работы со строковым типом необходимо знать ответы на
следующие вопросы
Как описываются переменные строкового типа?
Какие операции над переменными этого типа возможны?
Как решать задачи с использованием строковых переменных?
04/23/23 5
Описание переменных строкового типа
«короткие строки» В стандартном Паскале, вплоть до Delphi 1
используются только «короткие строки», длина которых ограничена 255 символами
В последующих версиях Delphi они описываются следующим образом:
var Sk:string[N]; N≤255 или: sk:shortstring;// новое название вместо просто string N=255
04/23/23 6
структура памяти коротких строк • На этапе трансляции под переменную sk будет отведено N+1
байтов. После выполнения :• sk:=’abc’;• в этих ячейках символы будут размещаться следующим образом:• 0 1 2 3 4
NSk:
• После выполнения• sk:=’d’;• в этих ячейках будет: 0 1 2 3 4
N
3 a b c не исп оль зов аны
1 d не - исп оль зов аны
04/23/23 7
Недостатки «коротких строк»
1) нерационально используют память
2) Ограничены N<=255
В эту строку не поместишь достаточно большой текст, что бывает неудобно
Их не рекомендуется использовать в Delphi, они оставлены для совместимости программ,
написанных в старых версиях
04/23/23 8
«Длинные строки»
В последних версиях Delphi введены так называемые «длинные строки».
Для них оставлено ключевое слово
string
Описание выглядит следующим образом
var sd1,sd: string; // N≤2Гбт
04/23/23 9
Выделение памяти под длинные строки На этапе трансляции под каждую переменную sd и
sd1 выделяется по одной ячейке из 4 байтов, в которые в последующем будет помещаться адрес первого байта строки (sd , sd1 – указатели)
На этапе выполнения, например: sd:=’abc’;
программа (не транслятор) а) определит длину цепочки символов – ns=3 б) выделит в куче по адресу Adr1 свободный
участок памяти 3+5=8 байт в) адрес этого участка поместит в sd: г) разместит в этих байтах abc + терминальный
нуль как признак конца строки + счетчик ссылок
Adr1
04/23/23 10
Длинные строки string
1 2 3 4 5 6 7 8
a b c #0 ss= 1Счетчик ссылок 4 байта ss
Adr1:
Оператор Sd1:=sd;
Приведет к пересылке только адреса Adr1 в ячейку sd1 и добавление 1 в счетчик ссылок:
Sd1:= ss:=ss+1 Adr1
sd:=’abc’;
04/23/23 11
Длинные строки string (продолжение)
1 2 3 4 5 6 7
1 ss= #0 v uСчетчик ссылок 4 байта ss
Adr2:
Будет найден новый адрес Adr2
Sd1:
Счетчик ссылок в Adr1 уменьшается ss:=ss-1
Заметим, что работа со всеми указателями организована подобным образом
Adr2
Теперь посмотрим что будет если
sd1:=’uv’;
04/23/23 12
«Широкие строки»
Они введены в связи с тем, что наряду с обычной кодировкой
1 символ ->1байт ANSI стандарт имеется кодировка 1 символ-> 2 байта (например, китайский и японский алфавит не умещаются в одном байте, там символов >256)
WideChar – символьный тип Unicod!!!
var sw1, sw: WideChar;
04/23/23 13
Основные операции над переменными строкового типа
Во-первых присвоить st:=‘abcdefg’;
Обращение к символу строки ch:char;
Ch:=st[i]: st[i]:=’a’; Сцепление строк St:=st1+’=’+st; St:=’abs’; St:=st+’(x)’; -> ’abs(x)’
Сравнение Операции = <> > < <= >= If ’abs’=’abs’ then <> ’ab’<’bc’ потому что ’a’<’b’ ’abcd’>’abc’ chr(0)=#0
04/23/23 14
Некоторые процедуры обработки строк
Delete(St:String; pz,n:integer);
- удаляет из строки n символов начиная с позиции pz, например:
St:=’ES-1840’; Delete(St,4,2); результат: St=’ES-40’
04/23/23 15
Некоторые процедуры обработки строк
Insert(St,St1:string;pz:integer); - вставляет строку St внутрь строки St1 начиная с
позиции pz, например:
St1:=’это символы’; Insert(’не те ’,St1,5); результат:
St1=’это не те символы’;
04/23/23 16
Некоторые процедуры обработки строк
Str(x[:ширина:десятичзн]; var St:String);
преобразует число х целого или действительного типа в строковое представление,
например: x:=25.410-1; k=86;Str(x:8:4,St); результат: St=’ 2.5400’Str(x,St); результат: St=’2.540000e+00’Str(k:3,St);// результат: St=’ 86’
04/23/23 17
Некоторые процедуры обработки строк
Val(St:string;var x:<действит.или целое>; var Kod:integer);
- преобразует строковое представление числа в числовое в соответствии с типом переменной х,
Kod – код ошибки Kod=0 – успешно, или Kod=номеру позиции в строке где обнаружен символ не соответствующий числовому представлению, например:
St1:=’2e-5’; St2:=’4.68’; St=’0..256’
Val(St1,X,kod);// результат: х=210-5 kod=0 Val(St2,K,kod);// результат: k=+4.86 kod=0 Val(St,X,kod);// результат: x не изменяется kod=3
04/23/23 18
Некоторые функции обработки строк
N:=Length(St); - определяет текущую длину строки
St:=Copy(St1,pz,n); - выделяет из строки St1 подстроку St из n
символов начиная с позиции pz, при этом St1 сохраняется, например:
St1:=’d:\pas\prog.pas’; St:=Copy(St1,8,4); результат St=’prog’
04/23/23 19
Некоторые функции обработки строк
pz:=pos(St,St1); - определяет номер позиции, начиная с которой
внутри строки St1 расположена строка St, если внутри St1 нет St тогда pz=0, если таких включений несколько, то первого,
например:
pz:=pos(’pas’,St1); для St1:=’d:\pas\prog.pas’;,
pz=4.
04/23/23 20
Некоторые функции обработки строк
• x:=strToFloat(St); - переводит строковое представление в действительное число (аналог процедуры Val).
• m:=strToInt(St); - переводит строковое представление в целое число.
• St:=FloatToStrF(x,fffixed,8,4); - переводит действительное число в строковое представление с форматом х:8:4, (аналог процедуры Str).
• St:=IntToStr(m); - переводит целое число в строковое представление, причем длина строки = количеству десятичных цифр с учетом знака – .
04/23/23 21
Рекомендация• Следующая конструкция зависит от установки операционной системы
• x:=strToFloat(Edit1.Text);
• Edit1.Text:= ’2,56’; (’2.56’)
• Более предпочтительно использовать• • Val(Edit1.Text,X,kod);• Edit1.Text:= ’2.56’;
04/23/23 22
Примеры алгоритмов обработки строк Задача 1. В строке st букву ‘и’ заменить на ‘i’
• Procedure zi(st:string);• var k: word:• begin• for k:=1 to length(st) do• if st[k]=’и’ then st[k]:=’i’;• end;
04/23/23 23
Задача 2. Имеется массив строк. Отсортировать по первым трем буквам
• Type Tmst=array[1..100] of string;• Procedure SortS(Var A:Tmst; n:byte);• Var i,j:byte; s:string;• begin• for i:=2 to n do• for j:=n down to i do• if Copy(A[j],1,3)> Copy(A[j-1],1,3) then• begin• s:=A[j-1];• A[j-1]:=A[j];• A[j]:=s;• end;• End;
04/23/23 24
Посчитать количество гласных
Function NGT(st:string): byte; var i,k:byte; const zf=['u','e','a','o','i']; begin for i:=1 to length(st) do if st[i] in zf then k:=k+1; result:=k; end;
04/23/23 25
Подсчитать количество различных символов в строке. • Function Krz(St:string):Word;• Var a:set of char;• ch:char;• n,i,m:Word;• begin• m:=0;• a:=[];• n:=Lenght(St);• for i:=1 to n do• begin• ch:=St[i];• if not(ch in a)then• begin• a:=a+[ch];• m:=m+1;• end;• end;• Result:=m• end;//Krz
Krz
St
m=0
a=[ ]
N:=lenght(St)
i=1,N
ch:=St[i]
cha
a=a+[ch]
m=m+1
04/23/23 26
Распечатать массив целых чисел в строку
• Имеется массив A[1..n]целых чисел• Var s:string;• . . . • s:=’’;• For i:=1 to n do begin• s:=s+’ ’+IntToStr(A[i]);• Edit1.Text:=s;//или Memo• . . .
04/23/23 27
Найти и распечатать содержимое подстроки, заключенное в квадратные скобки
• S:=’IBM[286]a.48’ (когда строка длинная)
• k1:=pos(’[’,s);• k2:=pos(’]’,s); • if (k1<>0) and (k2<>0) and (k2>k1)• then s1:=copy(s,k1+1,k2-k1-1)• else s1:=’’; •
04/23/23 28
Конец темы 11
04/23/23 29
Организация двумерного динамического массива
• Type• TMas = array[1..1] of extended;• PMas = ^TMas;• TMas2 = array[1..1] of PMas;• PMas2 = ^TMas2;• Var A : PMas2;• N,M,i,j : integer;• begin M:=…; N:=…;• GetMem(A,4*M); //выделение массива указателей• for i:=1 to M do• GetMem(A[i],N*sizeof(extended));• …• // Работа с массивом A[i,j], 1≤i≤M, 1≤j≤N• …• for i:=M dounto 1 do• FreeMem(A[i],N*sizeof(extended));• FreeMem(A,4*M);
04/23/23 30
Распределение памяти под двумерный динамический массив M=5 N=2
A (4байта)
A 51A5
A4
A3
A2
A1
A 52
A 41 A 42
A 31 A 32
A 21 A 22
A 11 A 12
4байта 10байт
куча
программа