8. символни низове



Дата22.07.2016
Размер76.28 Kb.

8. СИМВОЛНИ НИЗОВЕ


В глава 1 беше показано как се дефинират константи и променливи от тип символен низ в Турбо Паскал. В глава 2 пък беше показано как се въвеждат и извеждат данни от този тип.

Тук ще разгледаме други основни операции със символни низове.


8.1.Операция присвояване


На променливите от тип символен низ могат да се присвояват изрази от същия тип. Нека в описателната част на дадена програма са декларирани следните променливи от тип символен низ:

Var

Str1, Str2 : string[4];

StrA : string[10];

StrX : string;

И нека в изпълнимата част да присъстват следните оператори:

StrX := 'Русе’’93';

StrA := StrX;

Str1 := StrX;

След изпълнение на първия изпълним оператор, променливата StrX ще има стойност Русе'93. След изпълнение на втория и StrA ще има същата стойност. След изпълнение на третия обаче Str1 ще има стойност Русе, защото тя е декларирана с дължина 4 символа и не разполага с място за символите след четвъртия.

8.2.Достъп до отделни символи


Символен низ и масив от символен тип, дефинирани например като

StrY : string[20] и StrY : array[1..20] of char

са аналогични по отношение на достъпа до отделните символи. Поради това i-ия символ от символния низ, респективно i-тия елемент на масива от символен тип, имат съставно име StrY[i] и може да участва във всички операции, разрешени за типа char.

Q := StrX[2];

Writeln(StrX[3]); . . .


8.3.Сравняване на символни низове


За величини от тип символен низ са допустими всички шест операции за сравняване. Сравняването е посимволно - сравняват се първите символи на двата низа, след това вторите, третите и т.н. до срещане на несъвпадащи символи или до изчерпване на някой от низовете. Резултатът от сравняването е:

  • символните низове са равни (еднакви), ако двата низа са с еднаква дължина и всичките им символи съвпадат, например 'Иван' = 'Иван';

  • левият символен низ е по-малък от десния, когато сравняването е прекратено поради изчерпване на левия низ без да са срещнати нееднакви символи или когато се срещнат нееднакви символи и този от нееднаквите символи, който принадлежи на левия низ е с по-малък код (независимо от дължините на двата низа), например 'Иван' < 'Иванка' и 'Иванка' < 'Иванчо';

  • левият символен низ е по-голям от десния, когато сравняването е прекратено поради изчерпване на десния низ без да са срещнати нееднакви символи или когато се срещнат нееднакви символи и този от нееднаквите символи, който принадлежи на левия низ е с по-голям код (независимо от дължините на двата низа), например 'Иванка' > 'Иван' и 'Иванчо' > 'Иванка';

8.4.Процедури и функции за операции със символни низове


В Турбо Паскал са включени следните процедури и функции за работа със символни низове:

а) Функция за сливане на символни низове

Function Concat(S1, S2, . . ., Sn : string) : string;

Тя създава нов низ, който се получава при последователното слепване на низовете S1, S2, . . ., Sn. Например след изпълнение на оператора

NovNiz := Concat('Turbo',' Pascal');

NovNiz ще има стойност Turbo Pascal.

Същият резултат може да се получи и чрез операцията слепване, за която се използва символът +. Например

NovNiz := 'Turbo' + ' Pascal';



б) Процедура за включване на символен низ в друг символен низ

Procedure Insert(S1 : string; Var S2 : string; N : integer);

Тя вмъква символния низ S1 между N-1 - ия и N - ия символи на символния низ S2.

След изпълнение на операторите

S1 := 'ПП';

S2 := 'ABCDEF;

Insert(S1,S2,3);

символният низ S2 е със стойност АBППCDEF.

в) Процедура за изтриване на част от символен низ

Procedure Delete(Var S1 : string; N,Br : integer);

Тя изтрива Br броя символи от символния низ S1, като започва от N-тия символ.

Например след изпълнение на операторите

S1 := 'ABCDEF';

Delete(S1,3,2);

новата стойност на S1 ще бъде ABEF.



г) Функция за копиране на част от символен низ

Function Copy(S1 : string; N, Br : integer) : string;

Тя връща като резултат нов низ, който включва Br броя последователни символи от низа S1, започвайки от N-тия символ.

Например след изпълнение на операторите

EGN := '8105245366';

Copy(S1,3,2);

където EGN е единен граждански номер на дадено лице, функцията Copy ще върне символния низ ‘05’.



д) Функция за проверка за присъствие на символен низ в друг символен низ

Function Pos(S1,S2 : string) : integer;

Тя проверява дали низа S1 присъства в низа S2 и връща:



  • когато S1 присъства в S2 - цяло число, което показва номера на символа в S2, от който започва присъствието;

  • когато S1 не присъства в S2 - нула.

Например след изпълнение на операторите-обръщения

Pos(’524’, EGN) и Pos(’123’ ,EGN),

функцията Pos ще върне съответно 4 и 0, ако EGN има стойност '8105245366';

е) Функция за определяне дължината (броя на символите) на символен низ

Function Length(S : string) : integer;

Тя връща като целочислена стойност дължината на символния низ S. Например след изпълнение на оператора-обръщение



Length(EGN),

функцията Length ще върне числото 10.



ж) Процедура за преобразуване на символен низ в числена стойност

Procedure Val(S : string; Var X : числов тип; Var K : integer);

Тя превръща символния низ S в числена стойност и я присвоява на променливата Х, а на К присвоява стойност нула при следните условия:



  • когато Х е от целочислен тип и S съдържа само цифри, евентуално предшествани от знак + или -;

  • когато X е от реален тип и S съдържа символите, допустими при изписване на реална константа, например когато S е '1.234', '1234', '1234Е2' или '1.234Е4'.

Ако тези условия са нарушени, на К се присвоява номера на първия елемент от низа, който ги нарушава.

В следващите две таблици са дадени примери за превръщане символен низ съответно в цяло число и реално число.



Оператор-обръщение

Стойност на M след обръщението

k

Val (‘125’,M,k)

125

0

Val (‘-125’,M,k)

-125

0

Val (‘12.5’,M,k)

Неопределена

3




Оператор-обръщение


Стойност на R след обръщението

k

Val(‘1.234’,R,k)

1.2345

0

Val(‘-1.234’,R,k)

-1.234

0

Val(‘1234’,R,k)

1234.0

0

Val(‘1234E-2’,R,k)

12.34

0

Val(‘-1.234E+4’,R,k)

-12340.0

0

Val(‘123,4E-2’,R,k)

Неопределена

4

Например, ako i и k са целочислени, то след изпълнение на оператора Val(‘125’,i,k), i и k ще имат съответно стойности 125 и 0, а след изпълнение на оператора Val(‘12.5’,i,k), i ще има неопределена стойност, а стойността на k ще е 3, защото третият символ в низа е недопустим за целочислен тип.

Аko Р е от реален тип, а k от целочислен, то след изпълнение на оператора Val(‘12.5’,Р,k), i и k ще имат съответно стойности 12.5 и 0, а след изпълнение на оператора Val(‘12,5’,Р,k), i ще има неопределена стойност, а стойността на k ще е 3, защото третият символ в низа е недопустим за реален тип.

з) Процедура за преобразуване на число в символен низ

Procedure Str(X : числов тип; Var S : string);

Тя преобразува стойността на Х в символен низ при следните условия (аналогично на операторите Write и Writeln):



  • ако Х е от целочислен тип, цифрите му се разполагат в първите позиции на низа, но ако е указана дължина на полето, например Str(X:8,S), цифрите се разполагат в дясната част на участъка от първите 8 позиции от низа.

  • ако Х е от реален тип, числото се представя с плаваща десетична точка и така се разполага в символния низ. Може да се укаже общата дължина на полето, т.е. Str(X:8,S) и тогава от нея се определя дължината на мантисата на числото. Мoже да се укаже обща дължина на полето и участъка от него за дробната част, т.е. Str(X:8:3,S) и тогава символният низ съдържа числото изписано с фиксирана десетична точка.

Няколко примера се съдържат в следната таблица:

Оператор-обръщение

Символeн низ S след обръщението

Str(150,S)

‘150’

Str(150:8,S)

‘ 150’

Str(-150:8,S)

‘ -150’

Str(12.5,S)

‘ 1.2500000000Е+1’

Str(12.5:10,S)

‘ 1.2500Е+1’

Str(12.5:8:3,S)

‘ 12.500’

Str(-12.5:8:3,S)

‘ -12.500’

Str(-12.56Е-2:8:3,S)

‘ -0.126’

Програма 8.1. Програма с подпрограма за търсене на подниз в даден низ и заместване на подниза с друг низ.

Var

Str, StrTrs,StrZam:string;



Procedure TrsZamStr(Var S:string;S1,S2:string);

{ S -низ, в който се търси;

S1-низ, който се търси като подниз в S;

S2-низ, който замества намерения подниз}



Var

i,n:byte;



Begin

n:=Length(S1);



Repeat

i:=Pos(S1,S);



If i>0

then begin

Delete(S,i,n);

Insert(S2,S,i)

end

until i=0

End;

Begin

Repeat

Write('Въведете низ или Enter за край: ');Readln(Str);



If Str<>''

then begin

Write('Въведете търсен низ: ');Readln(StrTrs);

Write('Въведете заместващ низ: ');Readln(StrZam);

Writeln('Зададен низ: ', Str);

TrsZamStr(Str,StrTrs,StrZam);

Writeln('Коригиран низ: ',Str);



end;

Writeln


until Str='';

End.

Програма 8.2. Програма с подпрограма за анализ дали даден низ може да е име на обект от програма.

Var

Str:string;



Function ImeObekt(S:string):boolean;

Var

i,L:byte;

Ime:boolean;

Begin

L:=Length(S);

i:=1;

Ime:=(S[i]>='A') and (S[i]<='Z') or (S[i]>='a') and (S[i]<='z');



While (iand Ime do

begin

i:=i+1;


Ime:=(S[i]>='A') and (S[i]<='Z') or (S[i]>='a') and (S[i]<='z') or

(S[i]>='0') and (S[i]<='9')



end;

ImeObekt:=Ime



End;

Begin

Repeat

Write('Въведете низ или Enter за край: ');Readln(Str);



If Str<>''

then if ImeObekt(Str)

then Writeln('Низът е име на обект')

else Writeln('Низът не е име на обект');

Writeln


until Str='';

End.

Програма 8.3. Програма с подпрограма за анализ дали даден низ е цяло число.

Var

Str:string;

{Подпрограма за анализ дали даден низ е цяло число}

Function Cialo(S:string):boolean;

Var

i,L:byte; Cl:boolean;



Begin

L:=Length(S); i:=0;



Repeat {Пропускане на празните символи в началото на низа }

i:=i+1


until (S[i]<>' ') or (i=L);

If S[i] = ' '

then Cialo:=false

else begin

If(S[i]='+') or (S[i]='-') then i:=i+1;

If i > L

then Cialo:=false

else begin

Repeat

Cl:=(S[i]>='0') and (S[i]<='9');

i:=i+1

until not Cl or (i>L);

Cialo:=Cl



end

end

End;

Begin

Repeat

Write('Въведете низ или Enter за край: ');Readln(Str);



If Str<>''

then if Cialo(Str)



then Writeln('Низът е цяло число')

else Writeln('Низът не е цяло число');

Writeln


until Str='';

End.





База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница