Реферат Курсовая Конспект
Открытые строки - раздел Транспорт, От автора Открытыми Строками, Или Длинными Стро...
|
Открытыми строками, или длинными строками, или C-строками, называются символьные последовательности длиной до 65535 символов, ограниченные справа нуль-символом #0. Именно таким образом организован строковый тип в языке C, отсюда и одно из названий этой структуры данных. Тип String в Паскале очень удобен и прост в использовании, но не допускает значений длиной более 255 символов, открытые строки позволяют преодолеть это ограничение. Средства для обработки открытых строк содержатся в модуле Strings. Открытую строку в программе можно описать или как Array[0..L] Of Char, и тогда она будет храниться в сегменте данных, или как ^Char для хранения в хипе (второй вариант предпочтительнее). Тип ^Char имеет в Паскале стандартное имя PChar. Модуль Strings включает следующие подпрограммы:
1. Function StrNew(Str: PChar): PChar; - размещает в хипе копию строки Str и возвращает указатель на нее.
2. Function StrDispose(Str: PChar); - освобождает место в хипе, отведенное под строку Str .
3. Function StrLen(Str: PChar): Word; - возвращает количество символов в строке Str (не считая нуль-символа).
4. Function StrEnd(Str: PChar): Pchar; - возвращает указатель на нуль-символ, ограничивающий строку Str .
5. Function StrMove(Dest, Source: PChar; Count: Word): PChar; - копирует ровно Count символов из Source в Dest и возвращает Dest, не записывает #0, если он не входит в Count символов.
6. Function StrCopy(Dest, Source: PChar): PChar; - копирует строку Source в Dest, возвращает Dest .
7. Function StrLCopy(Dest, Source: PChar; MaxLen: Word): PChar; - копирует не более MaxLen символов строки Source в строку Dest, возвращает Dest .
8.Function StrECopy(Dest, Source: Pchar): PChar; - копирует строку Source в строку Dest и возвращает указатель на конец Dest .
9. Function StrPCopy(Dest: PChar; Source: String): PChar; - конвертирует Паскаль-строку Source в открытую строку Dest и возвращает Dest .
10. Function StrPas(Str: PChar):String; - конвертирует открытую строку в Паскаль-строку.
11. Function StrComp(Str1, Str2: PChar): Integer; - возвращает результат сравнения двух строк: отрицательное число, если Str1<Str2, положительное число, если Str1>Str2, и ноль, если строки равны.
12. Function StrIComp(Str1, Str2:PChar): Integer; - возвращает результат сравнения двух строк, игнорируя регистр, то есть большая и маленькая латинские буквы считаются равными.
13. Function StrLComp(Str1, Str2: PChar; MaxLen: Word): Integer; - возвращает результат сравнения двух строк, учитывая не более MaxLen символов.
14. Function StrLIComp(Str1, Str2: PChar;MaxLen: Word): Integer; - возвращает результат сравнения двух строк, учитывая не более MaxLen символов и игнорируя регистр.
15. Function StrLower(Str: PChar):PChar; - переводит символы строки Str в нижний регистр и возвращает Str .
16. Function StrUpper(Str: PChar):PChar; - переводит символы строки Str в верхний регистр и возвращает Str .
17. Function StrCat(Dest, Source: PChar): PChar; - дописывает строку Source в конец строки Dest и возвращает Dest.
18. Function StrLCat(Dest, Source: PChar; MaxLen: Word): Pchar;-дописывает не более MaxLen-StrLen(Dest) символов строки Source в конец строки Dest и возвращает Dest.
19. Function StrPos(Str1, Str2: PChar): PChar; - возвращает указатель на первое вхождение строки Str2 в строку Str1 или Nil .
20. Function StrScan(Str: PChar; Chr: Char): PChar; - возвращает указатель на первое вхождение символа Chr в строку Str или Nil .
21. Function StrRScan(Str: PChar; Chr: Char): PChar; - возвращает указатель на последнее вхождение символа Chr в строку Str или Nil .
Все эти подпрограммы являются функциями, но их можно вызывать и как процедуры, так как большинство из них возвращает результат своей работы и через указатель функции, и через список параметров. Паскаль допускает такой вызов функций (не только из модуля Strings, но и любых других стандартных и пользовательских функций), если программа откомпилирована в режиме расширенного синтаксиса. Режим расширенного синтаксиса включается опцией компилятора {$X+}. Например, в любой программе очень удобно использовать для ожидания нажатия клавиши функцию ReadKey, но это не процедура, поэтому в программе, откомпилированной в режиме {$X-}, нельзя просто записать оператор ReadKey; - это будет синтаксической ошибкой. Придется описать переменную типа Char и вызвать ReadKey как функцию: переменная:= ReadKey;, хотя код нажатой клавиши нам и не нужен.
Открытую строку, описанную как массив, можно вводить процедурой Read[Ln] и выводить процедурой Write[Ln], а строку, описанную как PChar, можно только выводить.
Решим, пользуясь открытыми строками, такую задачу: в текстовом файле записан некоторый русский текст. Упорядочить слова текста в алфавитном порядке и записать их в другой текстовый файл.
Uses Strings;
Const
Source_File_Name ='text.txt';
Target_File_Name ='words.txt';
Letters = ['а'..'п','р'..'я','А'..'Я'];
Type
P_Stack = ^T_Stack;
{будем хранить слова текста в списке, элементами которого будут открытые строки}
T_Stack = Record
p: PChar;
Next: P_Stack;
End;
Var
f : Text;
ch : Char;
Top,p,pp : P_Stack;
Bufer : Array[0..100] Of Char;
{открытая строка для чтения слова из файла, надеемся, что слов длиной более 100 букв не встретится}
pc : PChar;
n : Word;
Begin
Assign(f,Source_File_Name);
{$I-}
Reset(f);
If IOResult<>0 Then Begin
WriteLn('Не найден файл ',Source_File_Name);
Halt(1);
End;
{$I+}
Top:=Nil;
While Not Eof(f) Do Begin
Read(f,ch);
If ch In Letters Then Begin
{прочли русскую букву, собираем слово в Bufer}
n:=0;
While (ch In Letters)And Not Eof(f) Do Begin
Bufer[n]:=ch;
Inc(n);
Read(f,ch);
End;
Bufer[n]:=#0;
{слово собрано, проверим, достаточно ли места в хипе, чтобы поместить туда слово и два указателя}
If MaxAvail<=StrLen(Bufer) +SizeOf(PChar)
+SizeOf(P_Stack) Then Begin
WriteLn('Не хватает места в хипе');
Halt(2);
End;
{создаем новый элемент списка}
New(p);
p^.p:=StrNew(Bufer);
p^.Next:=Top;
Top:=p;
End;
End;
{файл прочитан}
Close(f);
{проверим, были ли в файле русские слова}
If Top=Nil Then Begin
WriteLn('Текст пуст');
Halt(3);
End;
{упорядочим слова в алфавитном порядке}
p:=Top;
While p^.Next<>Nil Do Begin
pp:=p^.Next;
While pp<>Nil Do Begin
If StrComp(p^.p,pp^.p)>0 Then Begin
pc:=p^.p;
p^.p:=pp^.p;
pp^.p:=pc;
End;
pp:=pp^.Next;
End;
p:=p^.Next;
End;
{запишем упорядоченные слова в текстовый файл, будем записывать не более 72 символов в каждую строку файла, разделяя слова одним пробелом}
Assign(f,Target_File_Name);
Rewrite(f);
p:=Top;
n:=0;
While p<>Nil Do Begin
If n+StrLen(p^.p)>72 Then Begin
WriteLn(f);
n:=0;
End;
Write(f,p^.p,' ');
Inc(n,StrLen(p^.p)+1);
p:=p^.Next;
End;
Close(f);
WriteLn('слова текста записаны в файл ',Target_File_Name);
End.
– Конец работы –
Эта тема принадлежит разделу:
B r... Теперь мы можем присвоить переменным их значения...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Открытые строки
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов