Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемwww.khsu.ru
1 1 1. Символы и строки
2 2 В Теме 3 рассматривались произвольные массивы. Перейдем теперь к изучению массивов специального вида - линейных массивов, состоящих только из символов, - строк.
3 3 Чем плох массив символов? var B: array[1..N] of char; Это массив символов: каждый символ – отдельный объект; массив имеет длину N, которая задана при объявлении Что нужно: обрабатывать последовательность символов как единое целое строка должна иметь переменную длину
4 4 В разделе var строки описываются следующим образом: Описание символьных строк Максимальная длина строки символов. Нумеруются ее компоненты начиная с 0, но этот нулевой байт хранит длину строки. Если не указана, то считается, что в строке 255 символов. Поэтому для экономии памяти следует по возможности точно указывать длину используемых строк. var : string[ ];
5 5 Привет!¤¤¤…¤¤¤ длина строки рабочая часть s[1] s[2] s[3] s[4] var s: string; var s: string[20]; 20 1 Длина строки: n := length ( s ); var n: integer; В Delphi это ограничение снято! ! Описание символьных строк
6 6 Необходимо отметить, что один символ и строка длиной в один символ Описание символьных строк совершенно не эквивалентны друг другу. Вне зависимости от своей реальной длины, строка относится к конструируемым структурированным типам данных, а не к базовым порядковым ( см. Тему 2 ). var c: char; s: string[1];
7 7 В тексте программы на языке Паскаль последовательность любых символов, заключенная в апострофы, воспринимается как символ или строка. Например: Символ-константа и строка-константа: неименованные константы c:='z';{c: char} s:='abc';{s: string} c:='z';{c: char} s:='abc';{s: string}
8 8 Константе автоматически присваивается "минимальный" тип данных, достаточный для ее представления: char или string[k]. Поэтому попытка написать Символ-константа и строка-константа: неименованные константы вызовет ошибку уже на этапе компиляции. c:='zzz'; {c: char} Кроме того, если константа длиннее той переменной-строки, куда ваша программа пытается ее записать, то в момент присваивания произойдет усечение ее до нужной длины. !
9 9 Пустая строка задается двумя последовательными апострофами: Символ-константа и строка-константа: неименованные константы st:='';{ пустая строка } Если же необходимо сделать так, чтобы среди символов строки содержался и сам апостроф, его нужно удвоить: Если теперь вывести на экран эту строку, то получится следующее: Don't worry about the apostrophe! s:='Don''t worry about the apostrophe!';
10 10 Все правила задания символов и строк как неименованных констант остаются в силе и при задании именованных нетипизированных констант в специальном разделе const. Например: Символ-константа и строка-константа: нетипизированные константы const c3 = ''''; {это один символ - апостроф!} s3 = 'Это строка'; const c3 = ''''; {это один символ - апостроф!} s3 = 'Это строка';
11 11 Типизированная константа, которая будет иметь тип char или string, задается в разделе const следующим образом: Символ-константа и строка-константа: типизированные константы const c4: char = ''''; {это один символ - апостроф!} s4: string[20] = 'Это строка'; const c4: char = ''''; {это один символ - апостроф!} s4: string[20] = 'Это строка';
12 12 Результатом унарной операции Действия с символами: операции является символ, номер которого в таблице ASCII соответствует заданному числу. Например, # #100 = 'd' #39 = '''' {апостроф} #232 = 'ш' #1000 = 'ш' {потому что (1000 mod 256)= 232} #100 = 'd' #39 = '''' {апостроф} #232 = 'ш' #1000 = 'ш' {потому что (1000 mod 256)= 232}
13 13 Кроме того, к символьным переменным, как и к значениям всех порядковых типов данных, применимы операции сравнения, >, =, результат которых также опирается на номера символов из таблицы ASCII. Действия с символами: операции
14 14 Функция chr(k:byte):char "превращает"; номер символа в символ. Действие этой функции аналогично действию операции #. Например: Действия с символами: стандартные функции c:= chr(48); { c: char } { c = '0' } c:= chr(48); { c: char } { c = '0' }
15 15 Обратной к функции chr() является уже изученная нами функция ord(). Таким образом, для любого числа k и для любого символа с Действия с символами: стандартные функции ord(chr(k)) = k; chr(ord(c)) = c; ord(chr(k)) = k; chr(ord(c)) = c;
16 16 Cтандартные процедуры и функции pred(), succ(), inc() и dec(), определенные для значений любого порядкового типа, применимы также и к символам (значениям порядкового типа данных char). Например: Действия с символами: стандартные функции pred('[') = 'Z' succ('z') = '{' inc('a') = 'b' inc('c', 2) = 'e' dec('z') = 'y' dec(#0, 4) = '' {#252} pred('[') = 'Z' succ('z') = '{' inc('a') = 'b' inc('c', 2) = 'e' dec('z') = 'y' dec(#0, 4) = '' {#252}
17 17 Стандартная функция upcase(c: char):char превращает строчную букву в прописную. Символы, не являющиеся строчными латинскими буквами, остаются без изменения (к сожалению, в их число попадают и все русские буквы). Действия с символами: стандартные функции
18 18 Строки могут быть элементами списка ввода–вывода, при этом записывается имя строки без индекса. Для ввода нескольких строковых данных следует пользоваться оператором Readln, так как оператор Read в этих случаях может вести себя непредсказуемо. При вводе строковых переменных количество вводимых символов может быть меньше, чем длина строки. В этом случае вводимые символы размещаются с начала строки, а оставшиеся байты заполняются пробелами. Если количество вводимых символов превышает длину строки, лишние символы отбрасываются. Ввод-вывод строковых переменных
19 19 Особенностью строковых переменных является то, что к ним можно обращаться как к скалярным переменным, так и к массивам. Во втором случае применяется конструкция "переменная с индексом", что обеспечивает доступ к отдельным символам строки. При этом нижняя граница индекса равна 1. Отдельный символ строки совместим с типом char. Например, Обращение к строковым переменным S:= St[20]; { обращение к 20 эл-ту строки St } Po:='Компьютер'; { инициализация строки } Fillchar (a, sizeof(a), '0'); { заполнение строки a символьными 0 } S:= St[20]; { обращение к 20 эл-ту строки St } Po:='Компьютер'; { инициализация строки } Fillchar (a, sizeof(a), '0'); { заполнение строки a символьными 0 }
20 20 Например, если в программе определены Var S: string; C: char; и задано S:='Москва', то S[1]='М', S[2]='о' и т. д. Обращение к строковым переменным
21 21 Элементы массива, составляющие строку можно переставлять местами и получать новые слова. Пример 1. Вывод исходного слова справа налево: "авксоМ" Обращение к строковым переменным for i:=1 to N div 2 do begin C:=S[i]; S[i]:=S[N-i+1]; S[N-i+1]:=C end; Writeln(S); for i:=1 to N div 2 do begin C:=S[i]; S[i]:=S[N-i+1]; S[N-i+1]:=C end; Writeln(S); Пример 2. Поиск и замена заданного символа в строке for i:=1 to N do if S[i]='_' then writeln('найден символ пробел'); for i:=1 to N do if S[i]='/' then S[i]:='\'; { замена символа "/" на "\" } for i:=1 to N do if S[i]='_' then writeln('найден символ пробел'); for i:=1 to N do if S[i]='/' then S[i]:='\'; { замена символа "/" на "\" }
22 22 2. Операции, стандартные функции и процедуры, выполняемые над строковыми переменными
23 23 Для строк определены операции: присваивания, слияния (конкатенации, объединения), сравнения. Операции, выполняемые над строками
24 24 Результатом выполнения операции конкатенации "+", является строка, в которой исходные строки-операнды соединены в порядке их следования в выражении. Например, Операция конкатенации X:='Пример'; Y:='сложения'; Z:='строк'; Writeln(X + Y + Z); Writeln(Y + ' ' + Z + ' ' + X); X:='Пример'; Y:='сложения'; Z:='строк'; Writeln(X + Y + Z); Writeln(Y + ' ' + Z + ' ' + X); На экран будут выведены строки: Примерсложениястрок сложения строк Пример 'Кро'+' 'код'+ 'ил' позволит получить новую строку 'Крокодил'
25 25 Тип String допускает и пустую строку – строку, не содержащую символов: EmptyStr := ''; {подряд идущие кавычки}. Она играет роль нуля (нейтрального элемента) операции конкатенации: EmptyStr + X = X + EmptyStr = X. Операция конкатенации
26 26 Строки - это единственный структурированный тип данных, для элементов которого определен порядок и, следовательно, возможны операции сравнения. Сравнение строк происходит посимвольно, начиная с первого символа. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны. Над строками определены также отношения (операции логического типа): =, ,, =. Операция сравнения
27 27 Таким образом, каждый из строковых типов упорядочен лексикографически. Это означает, что порядок на строках согласован с порядком, заданным на символьном типе (Char); сравнение двух строк осуществляется посимвольно, начиная с первых символов; если строка A есть начало строки B, то A < В; пустая строка – наименьший элемент типа. Итак, Операция сравнения 'abc' < 'xyz ' 'Иванов' < 'Иванова' '1200' < '45 ' 'Татьяна' < 'татьяна' 'abc' < 'xyz ' 'Иванов' < 'Иванова' '1200' < '45 ' 'Татьяна' < 'татьяна'
28 28 Формат: Функция Length Length(X :string ): byte; Возвращает длину строки - аргумента X. Причем, длина пустой строки Length(EmptyStr) = 0. Тип результата – Byte. Примеры: Исходные данные: S := крокодил; Оператор: j := length(S); Результат: j = 8 Исходные данные: T := Компьютерный класс; Оператор: j := length(T); Результат: j = 18
29 29 Задача: ввести строку с клавиатуры и заменить все буквы «а» на буквы «б». program qq; var s: string; i: integer; begin writeln('Введите строку'); readln(s); for i:=1 to Length(s) do if s[i] = 'а' then s[i] := 'б'; writeln(s); end. program qq; var s: string; i: integer; begin writeln('Введите строку'); readln(s); for i:=1 to Length(s) do if s[i] = 'а' then s[i] := 'б'; writeln(s); end. readln(s); writeln(s); Length(s) ввод строки длина строки вывод строки Функция Length
30 30 Формат: Функция Copy Copy(X :string; Index, Count :byte): string; Копирует (выделяет) подстроку строки X, начиная с позиции Index и содержащую следующие Count символов. Тип результата – String. Если Index больше длины строки, то результатом будет пустая строка. Если же Count больше, чем длина оставшейся части строки, то результатом будет только ее "хвост":
31 31 s := ' '; s1 := Copy ( s, 3, 6 ); s2 := Copy ( s1, 2, 3 ); s := ' '; s1 := Copy ( s, 3, 6 ); s2 := Copy ( s1, 2, 3 ); '345678' '456' с 3-его символа 6 штук Функция Copy Исходные данные: S := крокодил; Оператор: b:= cору(S, 2, 3); Результат: b = 'рок'. Исходные данные: T := Компьютерный класс; Оператор: c:= cору(T, 14, 53); Результат: c = 'класс'. copy('abc3de Xyz', 2, 4) = 'bc3d' copy('abc3de Xyz', 12, 4) = '' copy('abc3de Xyz', 8, 14) = 'Xyz'
32 32 Формат: Функция Concat Concat(X1, X2,.., Xk :string):string Объединение (конкатенация) строк или символов Х1, X2,.., Xk в указанном порядке. Другая форма записи: X1+X2+.. +Xk. Тип результата – String. Если длина итоговой строки больше 255-ти символов, то произойдет отсечение "хвоста". Кроме того, даже если результат конкатенации не был усечен, но программа пытается сохранить его в переменную заведомо меньшей длины, то усечение все равно состоится
33 33 Функция Concat Примеры: Исходные данные: a := 'код; b := 'ил; Оператор: S := concat('кро', a, b). Результат: S = 'крокодил'. concat('abc', '3de', ' ', 'X', 'yz') = 'abc3de Xyz'
34 34 Формат: Функция Pos Pos(Y, X :string ): byte; Отыскивает первое вхождение строки Y в строке X (считая слева направо) и возвращает номер начальной позиции вхождения. Если X не содержит Y, функция вернет 0 (Pos(Y, X) = 0). Тип результата – Byte. Примеры: Исходные данные: S := крокодил; Оператор: i := pos('око, S); Результат: i = 3. Оператор: i := pos('я', крокодил'); Результат: i = 0.
35 35 Поиск в строке Поиск в строке: s := 'Здесь был Вася.'; n := Pos ( 'е', s ); if n > 0 then writeln('Буква е – это s[', n, ']') else writeln('Не нашли'); n := Pos ( 'Вася', s ); s1 := Copy ( s, n, 4 ); s := 'Здесь был Вася.'; n := Pos ( 'е', s ); if n > 0 then writeln('Буква е – это s[', n, ']') else writeln('Не нашли'); n := Pos ( 'Вася', s ); s1 := Copy ( s, n, 4 ); s[3] 3 3 n = 11 Особенности: функция возвращает номер символа, с которого начинается образец в строке если слова нет, возвращается 0 поиск с начала (находится первое слово) var n: integer;
36 36 Формат: Процедура Delete Delete(X :string; Index, Count :byte); Delete(X :string; Index, Count :byte); Удаляет из строки X подстроку, начиная с позиции, заданной числом Index, длиной, заданной числом Count. Тип результата – String. Если число Index больше размера строки, то подстрока не удаляется. Если число Count больше имевшегося количества, то удаляются символы до конца строки. Тип результата – String.
37 37 s := ' '; Delete ( s, 3, 6 ); s := ' '; Delete ( s, 3, 6 ); с 3-его символа 6 штук строка меняется! строка меняется! ' ' '129' Процедура Delete Исходные данные: S := 'крокодил; Оператор: delete(S, 4, 3); Результат: S = 'кроил'. Оператор: delete(S, 1, 1); Результат: S = 'роил'. Исходные данные: s = 'abc3de Xyz' Оператор: delete(S, 8, 13); Результат: S = 'abc3de '.
38 38 Формат: Процедура Insert Insert(Y, X :string; Index :byte); Вставляет строку Y в строку X, начиная с позиции, заданной числом Index. Тип результата – String. Если Index выходит за конец строки, то подстрока Y припишется в конец строки X. Если результат длиннее, чем допускается для строки X, произойдет его усечение справа.
39 39 s := ' '; Insert ( 'ABC', s, 3 ); Insert ( 'Q', s, 5 ); s := ' '; Insert ( 'ABC', s, 3 ); Insert ( 'Q', s, 5 ); куда вставляем что вставляем начиная с 3-его символа '12ABC ' '12ABQC ' Процедура Insert Исходные данные: S := 'крокодил; Оператор: d := сору(S, 3, 3); Результат: d = 'око'. Оператор: insert('H', d, 3); Результат: d = 'окНо'.
40 40 Примеры s := 'Вася Петя Митя'; n := Pos ( 'Петя', s ); Delete ( s, n, 4 ); Insert ( 'Лена', s, n ); s := 'Вася Петя Митя'; n := Pos ( 'Петя', s ); Delete ( s, n, 4 ); Insert ( 'Лена', s, n ); 'Вася Лена Митя' s := 'Вася Петя Митя'; n := length ( s ); s1 := Copy ( s, 1, 4 ); s2 := Copy ( s, 11, 4 ); s3 := Copy ( s, 6, 4 ); s := s3 + s1 + s2; n := length ( s ); s := 'Вася Петя Митя'; n := length ( s ); s1 := Copy ( s, 1, 4 ); s2 := Copy ( s, 11, 4 ); s3 := Copy ( s, 6, 4 ); s := s3 + s1 + s2; n := length ( s ); 'Вася Митя' 14 'Вася' 'Митя' 'Петя' 'ПетяВасяМитя'
41 41 Формат: Процедура Val VAL(St :string; Ibr : ; Cod :byte ); Преобразует строку символов St в величину целочисленного или вещественного типа и помещает результат в Ibr. Ibr является внутренним представлением числа, записанного в символьном формате. Значение St не должно содержать незначащих пробелов в начале и в конце. Cod – целочисленная переменная, указывающая номер позиции первого неправильного символа, или равная 0 в случае успешного преобразования.
42 42 Преобразование из строки в число: s := '123'; Val ( s, N, r ); { N = 123 } { r = 0, если ошибки не было r – номер ошибочного символа} s := ' '; Val ( s, X, r ); { X = } s := '123'; Val ( s, N, r ); { N = 123 } { r = 0, если ошибки не было r – номер ошибочного символа} s := ' '; Val ( s, X, r ); { X = } var N: integer; X: real; s: string; var N: integer; X: real; s: string; Процедура Val Исходные данные: St := 1500; Оператор: Val(St, Ibr, Cod); Результат: Ibr = 1500Cod = 0 Исходные данные: St := 4.8A+03; Оператор: Val(St, Ibr, Cod); Результат: Ibr = ???Cod = 5
43 43 Формат: Процедура Str STR(Ibr [:M [:N] ], St:string ); Преобразует числовое значение величины Ibr в строковое и помещает результат в строку St. M задает общее количество символов, получаемых в строке, N - для вещественных чисел (типа real) задает количество цифр в дробной части. Тип результата – String. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины. Если число короче указанных величин, то спереди и/или сзади оно будет дополнено пробелами.
44 44 Преобразование из числа в строку: N := 123; Str ( N, s ); { '123' } X := ; Str ( X, s ); { ' E+002' } Str ( X:10:4, s ); { ' ' } N := 123; Str ( N, s ); { '123' } X := ; Str ( X, s ); { ' E+002' } Str ( X:10:4, s ); { ' ' } var N: integer; X: real; s: string; var N: integer; X: real; s: string; Процедура Str Исходные данные: Ibr := 1500; Оператор: str(Ibr:6, S); Результат: S = __1500. Исходные данные: Ibr := 4.8E+03; Оператор: str(Ibr:10, S); Результат: S = ______4800.
45 Процедура (функция)Описание Concat(s1[, s2, …,sn]:string):string Функция выполняет слияние строк-параметров, которых может быть произвольное количество Copy(str:string, index, count:integer):string Функция возвращает подстроку из строки str, длиной count символов, начиная с символа под номером index Delete(str:string, index, count:integer) Процедура производит удаление из строки- параметра str подстроки длиной count символов, начиная с символа под номером index Insert(substr:string, str:string, index:integer) Процедура предназначена для вставки substr в строку str, начиная с символа с номером index этой строки Length(str: string):integerОпределение длины строки str Pos(substr:string, str:string):integer Функция производит поиск в строке str подстроки substr. Результатом функции является номер позиции подстроки в исходной строке; если подстрока не найдена, возвращается ноль Str(x, str:string)Процедура преобразует число x любого вещественного или целого типов в строку символов str Val(str:string,x, code:integer)Процедура преобразует строку символов str во внутреннее представление целой или вещественной переменной x, которое определяется типом этой переменной; переменная code определяет позицию нечислового символа, если такой оказался в строке
46 46 3. Примеры обработки символьных данных
47 47 Пример 1. Проверить, является ли заданный символ S строчной гласной буквой русского алфавита. Решение. pos(S, 'аэоуыяеёюи') > 0 Пример 2. Выделить часть строки после первого пробела. Решение. copy(s, pos(' ', s)+1, Length(s)-pos(' ', s)) Пример 3. Удалить последний символ строки S. Решение. delete(S, Length(S), 1) Пример 4. Выделить из строки S подстроку между i-й и j-й позициями, включая эти позиции. Решение. copy(s, i, j-i+1)
48 48 Пример 5. Подсчитать, сколько раз в заданной строке встречается указанная буква. Решение 1. Обозначим заданную строку - s, а искомую букву - a. Тогда для решения задачи будем просматривать заданную строку посимвольно и каждый символ сравнивать с заданной буквой. Решение 2. Ищем положение указанной буквы в строке до тех пор, пока ее удастся найти. Затем отбрасываем ту часть строки, где была найдена указанная буква, и повторяем поиск. k:=0; { количество указанных букв в строке } for i:=1 to Length(s) do if copy(s, i, 1)=a then k:=k+1; k:=0; { количество указанных букв в строке } for i:=1 to Length(s) do if copy(s, i, 1)=a then k:=k+1; k:=0; j:=pos(a, s); { позиция 1-го вхождения а в строку s } while j0 do begin k:=k+1; s:=copy(s, j+1, Length(s)-j); j:=pos(a, s) end; k:=0; j:=pos(a, s); { позиция 1-го вхождения а в строку s } while j0 do begin k:=k+1; s:=copy(s, j+1, Length(s)-j); j:=pos(a, s) end;
49 49 Пример 6. Назовем словом любую последовательность букв и цифр. Строка состоит из слов, разделенных одним или несколькими пробелами. Удалить лишние пробелы, оставив между словами по одному пробелу. Решение. Лишними пробелами называются второй, третий и т.д., следующие за первым пробелом. Следовательно, чтобы найти лишний пробел, нужно искать два пробела, стоящие рядом, и удалять второй пробел в каждой найденной паре. j:=pos(' ', s); while j0 do begin delete(s, j, 1); j:=pos(' ', s) end; j:=pos(' ', s); while j0 do begin delete(s, j, 1); j:=pos(' ', s) end;
50 50 Пример решения задачи Задача: Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы». Пример: Введите имя, фамилию и отчество: Василий Алибабаевич Хрюндиков Результат: Хрюндиков В.А. Алгоритм: найти первый пробел и выделить имя удалить имя с пробелом из основной строки найти первый пробел и выделить отчество удалить отчество с пробелом из основной строки «сцепить» фамилию, первые буквы имени и фамилии, точки, пробелы…
51 51 Программа program qq; var s, name, otch: string; n: integer; begin writeln('Введите имя, отчество и фамилию'); readln(s); n := Pos(' ', s); name := Copy(s, 1, n-1); { вырезать имя } Delete(s, 1, n); n := Pos(' ', s); otch := Copy(s, 1, n-1); { вырезать отчество } Delete(s, 1, n); { осталась фамилия } s := s + ' ' + name[1] + '.' + otch[1] + '.'; writeln(s); end. program qq; var s, name, otch: string; n: integer; begin writeln('Введите имя, отчество и фамилию'); readln(s); n := Pos(' ', s); name := Copy(s, 1, n-1); { вырезать имя } Delete(s, 1, n); n := Pos(' ', s); otch := Copy(s, 1, n-1); { вырезать отчество } Delete(s, 1, n); { осталась фамилия } s := s + ' ' + name[1] + '.' + otch[1] + '.'; writeln(s); end.
52 52 Задания Ввести имя файла (возможно, без расширения) и изменить его расширение на «.exe ». Пример: Введите имя файла: Введите имя файла: qqq qqq.com Результат: Результат: qqq.exe qqq.exe Ввести полный путь к файлу и «разобрать» его, выводя каждую вложенную папку с новой строки Пример: Введите путь к файлу: C:\Мои документы\09ИТ-3\Вася\qq.exe Результат: C: Мои документы 09ИТ-1 Вася qq.exe
53 53 Посимвольный ввод Задача: с клавиатуры вводится число N, обозначающее количество футболистов команды «Шайба», а затем – N строк, в каждой из которых – информация об одном футболисте таком формате: Все данные разделяются одним пробелом. Нужно подсчитать, сколько футболистов, родившихся в период с 1988 по1990 год, не забили мячей вообще. Алгоритм: for i:=1 to N do begin { пропускаем фамилию и имя } { читаем год рождения Year и число голов Gol } if (1988
54 54 Посимвольный ввод Пропуск фамилии: repeat read(c); until c = ' '; { пока не встретим пробел } repeat read(c); until c = ' '; { пока не встретим пробел } var c: char; Пропуск имени: repeat read(c); until c = ' '; Ввод года рождения: read(Year); { из той же введенной строки } var Year: integer; Ввод числа голов и переход к следующей строке: readln(Gol); { читать все до конца строки } var Gol: integer;
55 55 Программа program qq; var c: char; i, N, count, Year, Gol: integer; begin writeln('Количество футболистов'); readln(N); count := 0; for i:=1 to N do begin repeat read(c); until c = ' '; read(Year); readln(Gol); if (1988
56 56 Посимвольный ввод Если фамилия нужна: fam := ''; { пустая строка } repeat read(c); { прочитать символ } fam := fam + c; { прицепить к фамилии } until c = ' '; fam := ''; { пустая строка } repeat read(c); { прочитать символ } fam := fam + c; { прицепить к фамилии } until c = ' '; Вместо read(Year) : s := ''; { пустая строка } repeat read(c); { прочитать символ } s := s + c; { прицепить к фамилии } until c = ' '; Val(s, Year, r); { строку – в число } s := ''; { пустая строка } repeat read(c); { прочитать символ } s := s + c; { прицепить к фамилии } until c = ' '; Val(s, Year, r); { строку – в число } var fam: string; var s: string;
57 57 Посимвольный ввод Если нужно хранить все фамилии: const MAX = 100; var fam: array[1..MAX] of string;... fam[i] := ''; { пустая строка } repeat read(c); { прочитать символ } fam[i] := fam[i] + c; until c = ' '; const MAX = 100; var fam: array[1..MAX] of string;... fam[i] := ''; { пустая строка } repeat read(c); { прочитать символ } fam[i] := fam[i] + c; until c = ' '; массив символьных строк
58 Приведем пример решения следующей задачи. Дана строка символов S. Подсчитать наибольшее число букв «а», идущих подряд в данной строке. program bukva; var s, str : string; i, k, m, n : integer; begin readln(s); k := length(s); {Вычисляем длину строки} str := ''; {Формируем дополнительную строку из букв 'a'} for i:=1 to k do str := str + 'a'; repeat m := pos(str, s); {Определяем не входит ли дополнительная строка в исходную? Если нет, то уменьшаем дополнительную строку на одну букву} if m=0 then delete(str,1,1); until m0; n := length(str); writeln(n); readln; end.
59 Задача. Вывести в одну строку ABBCCCDDDDD...ZZ...Z. Для решения задачи: формируем тело программы и описываем переменные; цикл FOR I := 'a' ТО 'z' DO определяет, какую букву выводим на печать; цикл FOR J := 1 ТО К DO определяет, сколько раз будет печататься буква; после вывода всех букв закрываем строку оператором WRITELN. program p28; var i : char; k, j : integer; begin k := 1; for i := 'a' to 'z' do begin for j := 1 to k do write(i); k := k + 1; end; writeln end.
60 Задача. Дана строка символов. Заменить в ней все восклицательные знаки на точки. Данная программа представляет собой примитивный транслятор, который транслирует все символы в строке как они есть, а восклицательные знаки транслирует в точки. Для решения задачи: формируем тело программы и описываем переменные; цикл FOR I := 1 ТО L DO осуществляет вывод строки с заменой '!' на '.' после вывода закрываем строку оператором WRITELN. program p30; var str : string; l, i : integer; begin writeln('Введите текст'); readln(str); l := length(str); writeln('Преобразованный текст'); for i := 1 to l do if (str[i] ='!') then write('.') else write(str[i]); writeln end.
61 Задача. Дана строка символов. Удалить из нее все символы, которые повторяются – из группы одинаковых символов оставить только один. Пример. Дано: АББВВВГГДЕЕЕЕЕ. Результат: АБВГДЕ. Для решения задачи: формируем тело программы и описываем переменные; в цикле сравниваем два соседних символа; до тех пор, пока они равны, первый из двух символов удаляется с помощью стандартной процедуры. program p34; var s : string; k : integer; begin writeln('Введите текст'); readln(s); k := 1; while k
62 Контрольные вопросы 1.Какова максимальная и минимальная длина строки? 2.Сколько байт памяти будет выделено под переменную var x:string ? 3.Что будет присвоено c:= ? 4.Можно ли описать строку следующим образом S: string[0] ? 5.Какой процедурой или функцией можно удалить часть строки? 6.Описаны две строки: var a: string[8]; b: string[2]; какие операции над строками допустимы в Паскале? a := b; b := a; a := a + b; b := 10; a
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.