merged document (820599), страница 2
Текст из файла (страница 2)
Кроме того строки могут объявляться как константы,обыкновенные и типизированные.ConstSc=’неизменяемая строка’;Sc1:string=’изменяемая строка’;К любому символу строки можно получить доступ так же, как и к любому элементуодномерного массива , т.е.If st[5]=’f’ Then . . .;Для определения длины строки (количества символов в строке) используют специальнуюфункцию length(st) типа Integer.Операции со строками. Для данных строкового типа определена операция конкатенации(сцепления)St:=’строка’;St1:=’символов’;St:=st+’ ‘+st1;В результате этой операции значением переменной St будет ‘строка символов’.Если же переменная St была описана как string[8], то в St будет содержаться‘строка с’.
При этом аварийного завершения программы не произойдет. Длина строкиизменяется автоматически, в данном случае увеличивается, не превышая предельной,указанной при описании.Таким образом, в отличие от обычных символьных массивов строки могут динамическиизменять свою текущую длину.Переменные строкового типа могут сцепляться с символьными переменными, более того– им можно присваивать значения символьных переменных.Var st:string;Ch:char;BeginSt:=’строка’; ch:=’?’;St:= st+ch;St:=ch;Кроме операции сцепления для строк определены операции отношения (=,<>,<,>,<=,>=).За отношение между двумя строками принимается отношение между первыми двумянесовпадающими символами.St:=’строка символов’;St1:=’строки’;St1 будет больше St.Кроме функции length()Паскаль содержит еще много полезных процедур и функцийдля работы со строками:1.
Concat(s1[,s2,s3,…,sn])-функция типа string, возвращает строку,представляющую собой сцепление строк-параметров;2. Copy(s,index,n)- функция типа string, копирует n символов, начинаясимвола под номером index;3. Delete(s,index,n)- процедура удаляет из строки n символов, начинаясимвола под номером index;4. Insert(st,s,index)- процедура вставляет подстроку st в строку s, начинаяс позиции под номером index;5. Pos(st,s)-функция типа Integer отыскивает в строке s первое вхождениеподстроки st и возвращает номер позиции, с которой она начинается. Еслиподстрока не найдена, то возвращается 0.6.
Str(x:m[:n],s)-процедура, преобразующая выражение x числового типа встроку s; m – число знаков в числе (длина строки); n - количество цифр в дробнойчасти (если х – вещественного типа);7. Val(s,x,code)- процедура, преобразующая строку sс символьной записьючисла в целое или вещественное число x; code - код ошибки, представляющийсобой номер позиции, в которой записан неверный символ;Пример.program project62;{Строка произвольной длины состоит из слов, отделенных друг отдруга пробелом.Записать эти слова в массив строк так, чтобы каждое словоявлялось элементоммассива. Упорядочить элементы полученного массива по алфавиту.}TypeAr = Array [1..20] of string;Procedure StrToAr ( s : String; var a:Ar;var n:Integer);Varrab : string;i : Integer;BeginIf s[Length(s)] <> ' ' Then s := s + ' ';n := 0;rab := '';For i := 1 To Length(s) DoIf s[i] <> ' ' Thenrab := rab + s[i]Elsebeginn := n + 1;a[n] := rab;rab := '';end;end;Procedure Output(const a:Ar;n:Integer);Vari : Integer;beginFor i:=1 to n doWriteln(a[i]);end;Procedure Sortstring (var a:Ar;n:Integer);var i,j : Integer;rab : string;beginFor i := 1 To n - 1 DoFor j := i+1 To n DoIf a[j] < a[i] Thenbeginrab := a[j];a[j] := a[i];a[i] := rab;end;end;Vars : String; a:Ar; n:Integer;beginWriteln ('Введите строку');Readln (s);StrToAr(s,a,n);Writeln('Полученный массив');Output(a,n);Sortstring (a,n);Writeln('Отсортированный массив');Output(a,n);Readln;end.Множественный тип.Под множеством понимают неупорядоченную совокупность неповторяющихся значенийодного типа.
Количество элементов множества не может превышать 256 и их размер неможет превышать байта. Определение множественного типа выполняется следующимобразомType <имя>=Set of <базовый тип>;Учитывая сказанное, базовыми типами для множеств могут быть Byte,ShortInt,Charи типы диапазоны на их основе, а также данные перечисляемого типа. НапримерSetchar=Set of char;SetSymb=Set of ‘a’..’z’;Setnumb=Set of 1..200;Color=(red,yellow,blue,green);Setcol=Set of Color;Var sc:SetChar;Ss:Setsymb;Sn,s1,s2,s3:Setnumb;Присваивание значений переменным множественного типа осуществляется с помощьюспециальной конструкции, называемой конструктором множестваSc:=[‘a’..’z’,’0’..’9’];Ss:=[‘A’..’Z’];Sn:=[1,3,5,7,10..100];Следует выделить пустое множество [], совместимое с любым множественным типом.Можно объявлять константы множественного типаConstSetc=[2,4,6,8];Setv:setnumb=[2,4,6,8];Процедурой Writeln() множества не обрабатываются, т.е.
на экран монитора невыводятся.Операции над множествами. Выполняются над однотипными множествами.S1:=[1..10]; s2:=[5..15];1.Объединение множеств. Объединением двух множеств является множество, элементыкоторого принадлежат к первому и ко второму множеству.S3:=s1+s2; -> [1..15]2.Дополнение. Дополнением двух множеств является множество, элементы которогопринадлежат к первому и не принадлежат ко второму множеству.S3:=s1-s2; -> [1..4]S3:=s2-s1; -> [11..15]3.Пересечение. Пересечением двух множеств является множество, элементы которогопринадлежат и к первому и ко второму множеству.S3:=s1*s2; -> [5..10]Пересечением двух непересекающихся множеств является пустое множество.4.Операции «отношения»Проверка на подмножествоS3<=s1 вернет True, если элементы S3 принадлежат s1 и False в противном случаеПроверка на надмножествоS1>=s3 вернет True, если элементы S3 принадлежат s1 и False в противном случаеПроверка на равенство и неравенствоS1=s3 S1<>s3Проверка на принадлежность к множествуk in s3 вернет True, если элементы k принадлежит s3 и False в противном случаеnot(k in s3)Примеры.program project61;{Определить букву латинского алфавита, котораячаще всего встречается в строке произвольной длины.}Procedure SymbMax(s:String; var chmax:Char;var kmax:Integer);Var{Если массив является вспомогательным и будет использоватьсятолько в процедуре, то он может описываться без предварительногоопределения типа}count : Array ['a'..'z'] of Byte;ch : Char;i : Integer;BeginFor ch := 'a' To 'z' Docount[ch] := 0;For i := 1 To Length (s) DoIf s[i] in ['a'..'z'] Thencount[s[i]] := count[s[i]] + 1;kmax := count['a']; chmax := 'a';For ch := 'b' To 'z' DoIf count[ch] > kmax Thenbeginkmax := count[ch];chmax := ch;end;End;Vars:String; ch:Char;kmax:Integer;beginWriteln ('Введите строку ');Readln (s);SymbMax(s,ch,kmax);Writeln ('Буква ',ch,' встречается ',kmax,' раз');readln;end.program project63;{Преобразовать строку произвольной длины, удалив в ней всеповторениястрочных букв латинского алфавита (с использованием множеств).}Procedure DelLat( Var s : String);Varsetlat : Set of 'a'..'z';ch,chmax : Char;i,kmax : Byte;Beginsetlat := [];i := 1;While i <= Length (s) DoIf (s[i] in setlat) ThenDelete (s,i,1)ElsebeginIf (s[i] in ['a'..'z']) Thensetlat := setlat + [s[i]];i := i + 1;end;End;var s : String;beginWriteln ('Введите строку ');Readln (s);DelLat( s);Writeln ('Преобразованная строка');Writeln (s);Readln;end.Задание:1.
Определить количество гласных и количество согласных латинских букв в строкепроизвольной длины. Преобразовать ее, удалив все имеющиеся в ней знакипрепинания (с использованием множеств).2. В виде массива строк задан текст, состоящий из нескольких предложений.Предложения начинаются с заглавной буквы и заканчиваются точкой. Записать вмассив первые слова предложений. Учесть, что в тексте могут встречаться именасобственные.Текстовые файлыТекстовые файлы представляют собой совокупность строк переменной длины. В концекаждой строки проставляется признак конца строки.
Доступ к каждой строке строгопоследовательный, т.е. чтобы получить доступ к k-той строке, необходимо вначалесчитать предыдущие (k-1) строки. В конце файла имеется уже известный нам признакконца файла. Еще одним отличием от типизированных файлов является невозможностьдля одного открытого файла производить одновременно операции чтения и записи.Последовательность предварительных действий, которые должны быть выполнены дляработы с текстовым файлом, аналогична той, что производилась для типизированныхфайлов, а именно:1.
описываем файловую переменную Var f: Textfile;2. связываем файловую переменную с конкретным файлом вызовом процедурыAssignFile(<ф.п.>,<имя файла>);3. указываем направление потока информации, т.е. открываем файл для считывания илидля записи данных. Для этого используются следующие процедуры:Reset(<ф.п.>);- если планируется считать данные из файла;Rewrite(<ф.п.>); или Append(<ф.п.>); - для последующей записи данных вфайл. Если после выполнения процедуры Rewrite(<ф.п.>) файловый указательустановлен в начало файла (в существующем файле все данные удаляются), то послевыполнения Append(<ф.п.>) указатель находится в конце файла, т.е.
имеющаяся в неминформация сохраняется и можно дополнительно записать данные. После окончанияработы файлы закрываются с использование процедуры CloseFile(<ф.п.>);Для считывания данных из текстового файла используются процедурыRead(<ф.п.>,<список ввода>) и Readln(<ф.п.>,<список ввода>), а длязаписи Write(<ф.п.>,<список вывода>) и Writeln(<ф.п.>,<списоквывода>).При выполнении операции чтения из файла могут использоваться функции логическоготипа EOF(<ф.п.>)и EOLN(<ф.п.>), а также аналогичные им SeekEOF(<ф.п.>),SeekEOLN(<ф.п.>).
Считается, что последние функции работают более корректно,например, если в конце строки или файла имеются пробелы или символы табуляции, тоони их не обрабатывают, выходя на соответствующие признаки.Кроме названных процедур и функций при решении задач с использованием текстовыхфайлов могут быть использованы и процедуры, предназначенные для работы с файламилюбого вида, а именно: Erase(<ф.п.>)- удаление предварительно закрытого файла.Rename(<ф.п.>,<новоеимяфайла>)переименованиефайла.FileExists(<имя файла>):Boolean - функция логического типа возвращает вкачестве результата True, если файл с указанным именем существует (программа нашлаего), и False в противном случае.Теперь рассмотрим считывание данных из текстового файла.
Немного истории.Изначально в Паскале с текстовыми файлами не работали, в языке определены былитолько типизированные. Точнее имелись два стандартных текстовых файла. С одним быласвязана файловая переменная Input. а с другим – Output. Первым файлом считаласьклавиатура, а вторым – экран или печатающее устройство.