Программирование на языке Паскаль Символьные строки
Чем плох массив символов? 2 var B: array[1..N] of char; Это массив символов: каждый символ – отдельный объект; массив имеет длину N, которая задана при объявлении Что нужно: обрабатывать последовательность символов как единое целое строка должна иметь переменную длину
3 В разделе var строки описываются следующим образом: Описание символьных строк Максимальная длина строки символов. Нумеруются ее компоненты начиная с 0, но этот нулевой байт хранит длину строки. Если не указана, то считается, что в строке 255 символов. Поэтому для экономии памяти следует по возможности точно указывать длину используемых строк. var : string[ ];
Символьные строки 4 Привет!¤¤¤…¤¤¤ длина строки рабочая часть s[1] s[2] s[3] s[4] var s: string; var s: string[20]; 20 1 Длина строки: n := length ( s ); var n: integer; В Delphi это ограничение снято! !
5 В тексте программы на языке Паскаль последовательность любых символов, заключенная в апострофы, воспринимается как символ или строка. Например: Символ-константа и строка-константа: неименованные константы c:='z';{c: char} s:='abc';{s: string} c:='z';{c: char} s:='abc';{s: string}
6 Константе автоматически присваивается "минимальный" тип данных, достаточный для ее представления: char или string[k]. Поэтому попытка написать Символ-константа и строка-константа: неименованные константы вызовет ошибку уже на этапе компиляции. c:='zzz'; {c: char} Кроме того, если константа длиннее той переменной-строки, куда ваша программа пытается ее записать, то в момент присваивания произойдет усечение ее до нужной длины. !
7 Пустая строка задается двумя последовательными апострофами: Символ-константа и строка-константа: неименованные константы st:='';{ пустая строка } Если же необходимо сделать так, чтобы среди символов строки содержался и сам апостроф, его нужно удвоить: Если теперь вывести на экран эту строку, то получится следующее: Don't worry about the apostrophe! s:='Don''t worry about the apostrophe!';
Символьные строки 8 Задача: ввести строку с клавиатуры и заменить все буквы «а» на буквы «б». 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) ввод строки длина строки вывод строки
Задания 9 «3»: Ввести символьную строку и заменить все буквы «а» на буквы «б», как заглавные, так и строчные. Пример: Введите строку: ааббссААББСС Результат: ббббссББББСС «4»: Ввести символьную строку и заменить все буквы «а» на буквы «б» и наоборот, как заглавные, так и строчные. Пример: Введите строку: ааббссААББСС Результат: ббаассББААСС
Задания 10 «5»: Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях). Пример: Пример: Введите строку: Введите строку: АБВГДЕ КАЗАК Результат: Результат: Не палиндром. Палиндром.
11 Результатом выполнения операции конкатенации "+", является строка, в которой исходные строки- операнды соединены в порядке их следования в выражении. Например, Операция конкатенации X:='Пример'; Y:='сложения'; Z:='строк'; Writeln(X + Y + Z); Writeln(Y + ' ' + Z + ' ' + X); X:='Пример'; Y:='сложения'; Z:='строк'; Writeln(X + Y + Z); Writeln(Y + ' ' + Z + ' ' + X); На экран будут выведены строки: Примерсложениястрок сложения строк Пример 'Кро'+' 'код'+ 'ил' позволит получить новую строку 'Крокодил'
Операции со строками 12 Объединение: добавить одну строку в конец другой. Запись нового значения: var s, s1, s2: string; s := 'Вася'; s1 := 'Привет'; s2 := 'Вася'; s := s1 + ', ' + s2 + '!'; s1 := 'Привет'; s2 := 'Вася'; s := s1 + ', ' + s2 + '!'; 'Привет, Вася!' Подстрока: выделить часть строки в другую строку. 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 штук
Удаление и вставка 13 Удаление части строки: Вставка в строку: s := ' '; Delete ( s, 3, 6 ); s := ' '; Delete ( s, 3, 6 ); с 3-его символа 6 штук строка меняется! строка меняется! ' ' '129' s := ' '; Insert ( 'ABC', s, 3 ); Insert ( 'Q', s, 5 ); s := ' '; Insert ( 'ABC', s, 3 ); Insert ( 'Q', s, 5 ); куда вставляем что вставляем начиная с 3-его символа '12ABC ' '12ABQC '
Поиск в строке 14 Поиск в строке: 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;
Примеры 15 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 'Вася' 'Митя' 'Петя' 'ПетяВасяМитя'
Пример решения задачи 16 Задача: Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы». Пример: Введите имя, фамилию и отчество: Василий Алибабаевич Хрюндиков Результат: Хрюндиков В.А. Алгоритм: найти первый пробел и выделить имя удалить имя с пробелом из основной строки найти первый пробел и выделить отчество удалить отчество с пробелом из основной строки «сцепить» фамилию, первые буквы имени и фамилии, точки, пробелы…
Программа 17 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.
Задания 18 «3»: Ввести в одну строку фамилию, имя и отчество, разделив их пробелом. Вывести инициалы и фамилию. Пример: Введите фамилию, имя и отчество: Иванов Петр Семёнович Результат: П.С. Иванов «4»: Ввести имя файла (возможно, без расширения) и изменить его расширение на «.exe ». Пример: Введите имя файла: Введите имя файла: qqq qqq.com Результат: Результат: qqq.exe qqq.exe
Задания 19 «5»: Ввести путь к файлу и «разобрать» его, выводя каждую вложенную папку с новой строки Пример: Введите путь к файлу: C:\Мои документы\10-Б\Вася\qq.exe Результат: C: Мои документы 10-Б Вася qq.exe
Задачи на обработку строк 20 Задача: с клавиатуры вводится символьная строка, представляющая собой сумму двух целых чисел, например: Вычислить эту сумму: 12+35=47 Алгоритм: 1)найти знак «+» 2)выделить числа слева и справа в отдельные строки 3)перевести строки в числа 4)сложить 5)вывести результат
Преобразования «строка»-«число» 21 Из строки в число: 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 = } Из числа в строку: N := 123; Str ( N, s ); { '123' } X := ; Str ( X, s ); { ' E+002' } Str ( X:10:3, s ); { ' ' } N := 123; Str ( N, s ); { '123' } X := ; Str ( X, s ); { ' E+002' } Str ( X:10:3, s ); { ' ' } var N, r: integer; X: real; s: string; var N, r: integer; X: real; s: string;
Программа 22 program qq; var s, s1, s2: string; r, n, n1, n2, sum: integer; begin writeln('Введите выражение (сумму чисел):'); readln(s); n:= Pos('+', s); s1:= Copy(s, 1, n-1); s2:= Copy(s, n+1, Length(s)-n); Val(s1, n1, r); Val(s2, n2, r); sum:= n1 + n2; writeln(n1, '+', n2, '=', sum); end. program qq; var s, s1, s2: string; r, n, n1, n2, sum: integer; begin writeln('Введите выражение (сумму чисел):'); readln(s); n:= Pos('+', s); s1:= Copy(s, 1, n-1); s2:= Copy(s, n+1, Length(s)-n); Val(s1, n1, r); Val(s2, n2, r); sum:= n1 + n2; writeln(n1, '+', n2, '=', sum); end. слагаемые-строки слагаемые-числа сумма слагаемые-строки слагаемые-числа
Задания 23 «3»: Ввести арифметическое выражение: разность двух чисел. Вычислить эту разность. Пример: Ответ: 13 «4»: Ввести арифметическое выражение: сумму трёх чисел. Вычислить эту сумму. Пример: Ответ: 71
Задания 24 «5»: Ввести арифметическое выражение c тремя числами, в котором можно использовать сложение и вычитание. Вычислить это выражение. Пример: Пример: Ответ: 71 Ответ: 3 Пример: Ответ: 47 Ответ: -21
Задания 25 «6»: Ввести арифметическое выражение c тремя числами, в котором можно использовать сложение, вычитание и умножение. Вычислить это выражение. Пример: Пример: 25+12*3 25*2-34 Ответ: 61 Ответ: 16 Пример: *2*3 Ответ: 47 Ответ: 150
Посимвольный ввод 26 Задача: с клавиатуры вводится число N, обозначающее количество футболистов команды «Шайба», а затем – N строк, в каждой из которых – информация об одном футболисте таком формате: Все данные разделяются одним пробелом. Нужно подсчитать, сколько футболистов, родившихся в период с 1988 по1990 год, не забили мячей вообще. Алгоритм: for i:=1 to N do begin { пропускаем фамилию и имя } { читаем год рождения Year и число голов Gol } if (1988
Посимвольный ввод 27 Пропуск фамилии: 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;
Программа 28 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
Посимвольный ввод 29 Если фамилия нужна: 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;
Посимвольный ввод 30 Если нужно хранить все фамилии: 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 = ' '; массив символьных строк
Задания 31 «3»: Вывести фамилии и имена всех футболистов, которые забили больше двух голов. Пример: Иванов Василий Семёнов Кузьма «4»: Вывести фамилию и имя футболиста, забившего наибольшее число голов, и количество забитых им голов. Пример: Иванов Василий 25 Информация о футболистах вводится так же, как и для приведенной задачи (сначала N, потом N строк с данными).
Задания 32 «5»: Вывести в алфавитном порядке фамилии и имена всех футболистов, которые забили хотя бы один гол. В списке не более 100 футболистов. Пример: Васильев Иван Иванов Василий Кутузов Михаил Пупкин Василий