190 likes | 329 Views
Строки в Паскале. (по учебному пособию С.И.Молчановой «Основы программирования Турбо-Паскаль 7.0»). Содержание. Введение Операции со строками Необходимые навыки при работе с текстом Стандартные процедуры и функции : Copy , delete , insert , pos Числа как набор символов
E N D
Строки в Паскале (по учебному пособию С.И.Молчановой «Основы программирования Турбо-Паскаль 7.0»)
Содержание • Введение • Операции со строками • Необходимые навыки при работе с текстом • Стандартные процедуры и функции: Copy, delete, insert, pos • Числа как набор символов • Процедуры Str, Val • Задача 1 • Задача 2 • Задача 3 • Задачи для самостоятельного решения • Задачи повышенной сложности
Введение При решении лексических и синтаксических задач, мы используем данные литерного и символьного типа. Тип char (символьный) не совсем удобен, т.к. позволяет в переменной хранить только один символ, хотя желательно иметь инструмент для задания целых последовательностей литер. Таким инструментом являются строки — STRING. Переменная, объявленная как переменная типа STRING содержит от 0 до N символов, но не может превышать 255.
Длину строки можно указывать в квадратных скобках рядом со служебным словом string. Пример: var st: string[25]; В том случае, если длина строки не указана, она принимается максимально возможной, т.е. N=255. Строки рассматриваются как цепочки символов. Тип string во многом похож на одномерный массив символов. Однако, в отличие от массива символов, количество символов в строке может меняться от 0 до N. К любому символу в строке можно обратиться точно так же, как к элементу массива, т.е. указав рядом с именем переменной типа string, в квадратных скобках индекс символа в строке: st[2], т.е. 2-ой символ в строке st; st[i] — i-тый символ в строке st; Самый первый байт в строке имеет индекс равный 0 и содержит текущую длину строки.
Операции со строками 1. Операцияобъединения строк (конкатенация). Обозначается эта операция знаком + (но это не сложение!) st:= 'abcd '; stl:='efk'; st2:=st+stl; значение st2 — 'abcdefk' Примечание: если длина результирующей строки превысит допустимую (255) длину, то "лишние" символы отбрасываются. 2. Операции сравнения =, >=, >, <>, <, <=, Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII кодами символов. Считается, что отсутствующие символы в более короткой строке имеют код, меньше кода любого действительного символа. Например, 'АВ' больше, чем 'А'.
Тип данных String используется при обработке текстов,а это означает, что нам необходимо уметь: • копировать часть строки; • удалить часть строки; • вставлять подстроку (т.е. часть строки) в данную строку; • осуществлять поиск подстроки (т.е. часть строки) в данной строке. Для реализации этих операций в Турбо-Паскале существуют стандартные процедуры и функции.
Стандартные процедуры и функции 1. Копирование части строки — функцияcopy (st, n, k), где st—исходная строка, n—начальная позиция, k — количество символов, которые мы будем копировать. Пример: var st:='abcdef; stl:=copy(st,2,3); Значение строки stl—'bcd'.
Стандартные процедуры и функции • Удаление части строки — процедураdelete(st,n,k), где st— исходная строка, n—начальная позиция (с какого символа начинаем удалять), k—количество удаляемых символов. Пример: var st:='abcdef' {st[0]=6;} delete(st,2,3); . .Значение строки st—'aef’. Внимание!При удалении части строки ее длина автоматически уменьшается, st[0]=3.
Стандартные процедуры и функции • Вставить подстроку в данную строку — процедураinsert(stl,st,n), где stl—подстрока, st—исходная строка, n—позиция символа, с которого начинается вставка. Пример: Пусть st—исходная строка, stl—подстрока. st:='?*-+/ab'; stl:='!%'; insert(stl,st,2); Значение строки st—"?!%*-+/ab". Можно не вводить имя переменной для подстроки, указав значение переменной явно, т.е.insert('!%',st,2);
Стандартные процедуры и функции • Поиск подстроки в строке (первое вхождение). Поиск подстроки в строке осуществляется с помощью функции pos, k:=pos(stl,st), где stl—подстрока, st—строка, k—позиция первого вхождения подстроки, либо 0, если подстрока отсутствует. Пример: Будем искать подстроку "г.Москва" в строке st, k:=pos('г.Mocквa',st); Ответ: k=18. Внимание! Повторим еще раз: 1. Значение функции pos—переменная целого типа. 2. Функция pos ищет первое вхождение подстроки в строку.
Строка типа string помимо буквенных и других символов может содержать и цифры. Пример: var var st, stl, st2: string; a, b: integer; st:='123';c: integer; stl:='254' Мы имеем набор символов, но не числа! Представление в памяти переменной st, объявленной как string, отличается от представления переменных а и b. Числовые переменные переводятся в двоичную систему счисления и, в зависимости от типа (целого или вещественного), хранятся в памяти ЭВМ (2, 4 или больше байт). В строке символов каждому символу соответствует свой код. Один символ занимает 1 байт. Сравните: а:=123; b:=254; с:=а+b;значение с=377; st2:=st+stl;значениеst2-'l23254'
Существует целый ряд задач, при решении которых необходимо уметь представить числовое данное в виде цепочки символов и, соответственно, выполнить обратное действие. В Турбо-Паскале существуют две процедуры, которые позволяют решить эти проблемы. • Процедура STR преобразует число любого вещественного или целого типов в строку символов. str(a,st); где: а — числовая переменная; st — строка символов. Пример: var a: integer; b: real; st, stl: string; …… a:=345; str(a,st); b:=l2.6789; str(b, stl); значение stl=1.2678900000E+01' str(b:2:2,stl); значение stl='12.67'
2. ПроцедураVAL преобразует строку, содержащую цифры в число, вещественное или целое. val(st,a,code);где: а — числовая переменная; st — строка; code — переменная целого типа, по значению которой можно определить, успешно или нет прошел перевод. Если перевод из строки символов в число прошел успешно, значение переменной code равно 0. var a: integer; b: real; code: integer; st: string; ……… st:='345'; val(st,a,code);значение переменной а равно 345. st:='12.6789'; val(st,b,code);значение переменной bравно 1.2678900000Е+01.
Задача 1.Строка содержит только цифры. Удалить все впереди стоящие нули. Исходная строка: 000102001089, результат: 102001089. • Program del; • Var st: string; i: byte; • begin • writeln('введите строку'); • readln(st); • i:=length(st); • while ((i>0)and(st[l]='0')) do • begin • delete(st,l,1); • i:=i-l • end; • writeln(st) • end. • Внимание! При выполнении таких программ необходимо помнить о том, что в экстремальных ситуациях, например, когда строка содержит только нули, возможно зацикливание (т.е. не произойдет выход из тела цикла), поэтому добавляется еще одно условие: i>0: предварительно в i запишем длину строки, а затем уже в цикле будем уменьшать значение переменной i на единицу. • В том случае, когда строка содержала только нули — выход из цикла произойдет при нарушении условия i>0, т.е. как только i примет значение 0. Строка после удаления всех нулей будет пустой.
Задача 2.Строка символов st содержит только цифры — это число в некоторой р-ной системе счисления. Выполнить перевод в десятичную систему счисления. 3267=3·72 +2·7' +6·7° =6·70+2·7' +3·72 Мы видим два базовых алгоритма:1) вычисление суммы; 2) вычисление аn. Пусть переменная S — используется для накопления суммы, переменная р — для вычисления 7n. Опишем алгоритм словесно. Переменной S присвоим нуль.Переменной р присвоим 1. Организуем цикл, количество повторений которого равно длине слова. Цифры числа будем рассматривать, начиная с последней. В цикле вычисляем 7i и суммируем полученные произведения. Фрагмент текста программы: ………… S:=0; р:=1; for i:=length(st) downto 1 do begin val(st[i],a,code); {перевод цифры из символа в число} р:=р*7; S:=S+p*a end;
Задача 3.Строка символов содержит слова, разделенные одним или несколькими пробелами. Подсчитать количество слов в строке. Номера позиций символов: Символы: Для того чтобы подсчитать количество слов в строке, необходимо каждое слово "вырезать". Для этого мы будем использовать функцию сору. Для начала ответим на следующие вопросы: 1) с какого символа мы начинаем вырезать? 2) сколько символов необходимо вырезать? Чтобы ответить на них, нам необходимо вычислить позиции левой и правой границы слова. Используем то обстоятельство, что слова разделены пробелами. Начальная позиция первого слова равна 4, позиция первого пробела за словом равна 10, если из позиции пробела равной 10 вычесть начальную позицию слова, равную 6, то мы получим длину слова. Делаем вывод, что наша задача следить за позицией пробела, просматривая все символы строки.
Задача 3 (продолжение). k:=0; {счетчик слов} r:=1;{правая граница слова} while r<= length(st) do begin while (st[r]=' ') and (r<=length(st)) do r:=r+1; {ищем левую границу слова, просматривая все пробелы до первого символа, не равного пробелу} L:=r;{L — левая граница слова} While (st[r]<>' ') and (r<=length(st)) do r:=r+1;{ищем первый правый пробел} {знаем левую границу — L, знаем позицию первогопробела за словом - r} stl:=copy(st,L,r-1); k:=k+l;{L - левая граница, r-L — длина слова} end;
Задачи для самостоятельного решения. • 1. Дана строка символов, содержащая слова, определить количество слов: 1) начинающихся с буквы а; 2) имеющих четную длину; 3) первый и последний символы которых совпадают; 4) последний и предпоследний символы которых совпадают. • 2. Строка символов содержит только цифры, вывести на экран номера позиций цифры 9. • 3. Определить количество трехзначных чисел в строке, содержащей группы цифр, разделенных пробелом.
Задачи повышенной сложности • 1. Найти минимальное число, которое представляется суммой четырех квадратов натуральных чисел не единственным образом. • 2. Задан числовой массив А(n). Найти длину самой длинной последовательности подряд идущих элементов массива, равных нулю. • 3. Напечатать в порядке возрастания все простые несократимые дроби, заключенные между 0 и 1, знаменатели которых не превышают 7. • 4. Задан массив натуральных чисел Р(n). Найти минимальное натуральное число, не представимое суммой никаких элементов массива Р. Сумма может состоять и из одного слагаемого, но каждый элемент массива может входить в нее только один раз. • 5. Задан числовой массив А(n). Найти отрезок массива максимальной длины, в котором первое число равно последнему, второе — предпоследнему и т.д. Напечатать длину этого отрезка. • 6. Задано натуральное число N. Найти и напечатать все его простые делители.