Лекция11_Использование строковых переменных

30
04/27/22 1 Тема 11 Использование строковых переменных Зачем нужны строки Описание переменных строкового типа Некоторые процедуры и функции обработки строк Примеры алгоритмов обработки строк

Upload: andrew-schein

Post on 10-Mar-2016

233 views

Category:

Documents


2 download

DESCRIPTION

Тема 11 Использование строковых переменных 12/06/10 1  Возникло понимание того, что можно создать язык высокого уровня, позволяющий писать программы обработки и редактирования текстов, компиляторы для новых языков  Строка-константа записывается в виде (’а…с’) 12/06/10 2 12/06/10 3 Для того, чтобы овладеть навыками работы со строковым типом необходимо знать ответы на следующие вопросы 12/06/10 4

TRANSCRIPT

Page 1: Лекция11_Использование  строковых переменных

04/23/23 1

Тема 11 Использование строковых переменных

Зачем нужны строки Описание переменных строкового

типа Некоторые процедуры и функции

обработки строк Примеры алгоритмов обработки

строк

Page 2: Лекция11_Использование  строковых переменных

04/23/23 2

Зачем нужны строки

мы уже знаем, что строка – это последовательность символов

Строка-константа записывается в виде (’а…с’)

C широким распространением ПЭВМ появилась насущная потребность во всевозможных программах обработки текстов, таких как Word.

Возникло понимание того, что можно создать язык высокого уровня, позволяющий писать программы обработки и редактирования текстов, компиляторы для новых языков

Page 3: Лекция11_Использование  строковых переменных

04/23/23 3

Как решить проблему введения строк? Казалось бы просто: ввести возможность работы с

символами, что и было сделано. В языке Паскаль, а затем и в Си был введен тип char, с которым вы знакомы.

Массивы из символов a: array [1..N] of char; в принципе решают проблему обработки символьной

информации. Однако, массив оказался не очень удобной

конструкцией в основном из-за фиксированной структуры и сложности выполнения операций над ним

В результате творческих поисков в языках появился новый изящный тип переменных: строковый.

Page 4: Лекция11_Использование  строковых переменных

04/23/23 4

Для того, чтобы овладеть навыками работы со строковым типом необходимо знать ответы на

следующие вопросы

Как описываются переменные строкового типа?

Какие операции над переменными этого типа возможны?

Как решать задачи с использованием строковых переменных?

Page 5: Лекция11_Использование  строковых переменных

04/23/23 5

Описание переменных строкового типа

«короткие строки» В стандартном Паскале, вплоть до Delphi 1

используются только «короткие строки», длина которых ограничена 255 символами

В последующих версиях Delphi они описываются следующим образом:

var Sk:string[N]; N≤255 или: sk:shortstring;// новое название вместо просто string N=255

Page 6: Лекция11_Использование  строковых переменных

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 не - исп оль зов аны

Page 7: Лекция11_Использование  строковых переменных

04/23/23 7

Недостатки «коротких строк»

1) нерационально используют память

2) Ограничены N<=255

В эту строку не поместишь достаточно большой текст, что бывает неудобно

Их не рекомендуется использовать в Delphi, они оставлены для совместимости программ,

написанных в старых версиях

Page 8: Лекция11_Использование  строковых переменных

04/23/23 8

«Длинные строки»

В последних версиях Delphi введены так называемые «длинные строки».

Для них оставлено ключевое слово

string

Описание выглядит следующим образом

var sd1,sd: string; // N≤2Гбт

Page 9: Лекция11_Использование  строковых переменных

04/23/23 9

Выделение памяти под длинные строки На этапе трансляции под каждую переменную sd и

sd1 выделяется по одной ячейке из 4 байтов, в которые в последующем будет помещаться адрес первого байта строки (sd , sd1 – указатели)

На этапе выполнения, например: sd:=’abc’;

программа (не транслятор) а) определит длину цепочки символов – ns=3 б) выделит в куче по адресу Adr1 свободный

участок памяти 3+5=8 байт в) адрес этого участка поместит в sd: г) разместит в этих байтах abc + терминальный

нуль как признак конца строки + счетчик ссылок

Adr1

Page 10: Лекция11_Использование  строковых переменных

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’;

Page 11: Лекция11_Использование  строковых переменных

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’;

Page 12: Лекция11_Использование  строковых переменных

04/23/23 12

«Широкие строки»

Они введены в связи с тем, что наряду с обычной кодировкой

1 символ ->1байт ANSI стандарт имеется кодировка 1 символ-> 2 байта (например, китайский и японский алфавит не умещаются в одном байте, там символов >256)

WideChar – символьный тип Unicod!!!

var sw1, sw: WideChar;

Page 13: Лекция11_Использование  строковых переменных

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

Page 14: Лекция11_Использование  строковых переменных

04/23/23 14

Некоторые процедуры обработки строк

Delete(St:String; pz,n:integer);

- удаляет из строки n символов начиная с позиции pz, например:

St:=’ES-1840’; Delete(St,4,2); результат: St=’ES-40’

Page 15: Лекция11_Использование  строковых переменных

04/23/23 15

Некоторые процедуры обработки строк

Insert(St,St1:string;pz:integer); - вставляет строку St внутрь строки St1 начиная с

позиции pz, например:

St1:=’это символы’; Insert(’не те ’,St1,5); результат:

St1=’это не те символы’;

Page 16: Лекция11_Использование  строковых переменных

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’

Page 17: Лекция11_Использование  строковых переменных

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

Page 18: Лекция11_Использование  строковых переменных

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’

Page 19: Лекция11_Использование  строковых переменных

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.

Page 20: Лекция11_Использование  строковых переменных

04/23/23 20

Некоторые функции обработки строк

• x:=strToFloat(St); - переводит строковое представление в действительное число (аналог процедуры Val).

• m:=strToInt(St); - переводит строковое представление в целое число.

• St:=FloatToStrF(x,fffixed,8,4); - переводит действительное число в строковое представление с форматом х:8:4, (аналог процедуры Str).

• St:=IntToStr(m); - переводит целое число в строковое представление, причем длина строки = количеству десятичных цифр с учетом знака – .

Page 21: Лекция11_Использование  строковых переменных

04/23/23 21

Рекомендация• Следующая конструкция зависит от установки операционной системы

• x:=strToFloat(Edit1.Text);

• Edit1.Text:= ’2,56’; (’2.56’)

• Более предпочтительно использовать• • Val(Edit1.Text,X,kod);• Edit1.Text:= ’2.56’;

Page 22: Лекция11_Использование  строковых переменных

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;

Page 23: Лекция11_Использование  строковых переменных

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;

Page 24: Лекция11_Использование  строковых переменных

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;

Page 25: Лекция11_Использование  строковых переменных

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

Page 26: Лекция11_Использование  строковых переменных

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• . . .

Page 27: Лекция11_Использование  строковых переменных

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:=’’; •

Page 28: Лекция11_Использование  строковых переменных

04/23/23 28

Конец темы 11

Page 29: Лекция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);

Page 30: Лекция11_Использование  строковых переменных

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байт

куча

программа