Работа со строками. МОУ СОШ 17 с углубленным изучением математики г. Тверь. Учитель Матвеева А.Г.
Типы строковых данных Строки могут быть представлены следующими типами: shortstring, Longstring и widestring. Различаются эти типы предельно допустимой длиной строки, способом выделения памяти для переменных и методом кодировки символов. Переменной типа shortstring память выделяется статически, т. е. до начала выполнения программы, и количество символов такой строки не может превышать 255. Переменным типа Longstring и widestring память выделяется динамически во время работы программы, поэтому длина таких строк практически не ограничена. Помимо перечисленных выше типов можно применять универсальный строковый тип String. Тип String эквивалентен типу Shortstring.
Операции над строками Строки можно присваивать, объединять, сравнивать. Объединение строк записывается в естественном виде, применяя знак "+". Если сумма получается длиннее, чем описана длина левой части оператора присваивания, то излишек отсекается. Пример: st1:=F1-; st2:=Help; st3:=st1+st2; {F1- Help}. Сравнение строк - Строки сравниваются посимвольно, начиная с первого символа. Если все символы сравниваемых строк одинаковые, то такие строки считаются равными. Если в одинаковых позициях строк находятся разные символы, большей считается та строка, у которой в этой позиции находится символ с большим кодом. Например: 'asdf '= 'asdf '; 'asdf '> 'asdF '; ' aBcg '< 'ab '; ' ' > ''.
Функция Length(s:string):byte - выдает текущую длину строки. Вместо неё можно пользоваться конструкцией ord(s[0]), что то же самое. Функция Concat - производит объединение строк. Вместо неё можно пользоваться операцией "+". Функция copy(s:string; start,len:integer):string - позволяет выделить из строки s последовательность из len символов начиная с символа start. Например: s:='asdfgj'; st:= copy(s,2,3); {st='sdf'} Процедура delete(s:string;start,len:integer) - видоизменяет строку s, стирая len символов, начиная с символа start. Например: s:='widows'; delete(s,3,2); {s:='wiws'} Процедура insert(st,s:string;start:integer) - вставляет подстроку st в строку s начиная с позиции start (процедура противоположная delete). Функция Pos(Subs, S: string):byte - возвращает номер символа в строке S, с которого начинается включение в S подстроки subs. Строковые процедуры и функции
Упражнения 1) Дана строка символов, в которой есть хотя бы одно вхождение 'abc'. Все вхождения 'abc' заменить на 'def. 2) В заданном тексте все встретившиеся буквы 'a' удалить, а буквы 'd' удвоить.
Решение program upr1; var i: byte; st, st1: string; begin readln(st); st1:='def'; for i:=1 to length(st) do if copy(st,i,3)='abc' then begin delete(st,i,3); insert(st1,st,i); end; writeln(st); end.
Program Upr_2 var st,st1:string; i:integer; begin write('st='); readln(st); i:=1; while i<= length(st) do if st[i]='a' then delete(st,i,1) else if st[i]='d' then begin insert('d',st,i+1); i:=i+2; end else i:=i+1; writeln(st); end. Решение
Функции преобразования. Решение задач на перевод чисел из одной системы счисления в другую. Str(ch:integer;,st:string;) - преобразование числового значения величины ch и помещение результата в строку st. После ch можно записывать формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины. Например: ch= 3500; str( ch:6,st); st=' 3500'; ch=45789; str(ch:3,st); st='45789'.
Val(st:string;,ch:integer;,code:integer;) - преобразует значение st и помещает результат в ch. Значение st не должно содержать незначащих пробелов в начале и в конце. Code - целочисленная переменная. Если в операции преобразования ошибки не обнаружено, значение code равно нулю, если ошибка обнаружена ( например, литерное значение переводится в цифровое ), code будет содержать номер позиции первого ошибочного символа, а значение ch не определенно. Например: st='6500'; Val(st,ch,code); ch= 6500; code=0; st='34,01'; val(st,ch,code); ch не определенно; code=3.
Перевод чисел из десятичной системы счисления в двоичную (фрагмент программы) readln(n); { ввод десятичного числа} p:=n; while p>=1 do begin k:= p mod 2; {остатки из которых будет формироваться число в 2 с/с} str (k,st); { перевод остатков в символы} st1:= st1 + st;{формирование строки из остатков} p:= p div 2; { уменьшения числа на разряд } end; str(p,st); {перевод последнего частного в символ} st1:=st1 + st; {строка из остатков и последнего частного} for i:= length(st1) downto 1 do { цикл для вывода числа в обратном порядке} begin st2:= copy(st1,i,1); st3:= st3 + st2; {строка в 2 с/с} end; val(st3,ch,errc); writeln('ch=',ch);
Перевод чисел из двоичной системы в десятичную Фрагмент программы: readln(n); str(n,st); dl:=length(st); dl:=dl-1; for i:=1 to length(st) do begin val(st[i],m,errc); p:= p+ m* exp(dl*ln(2)); dl:= dl-1; end; writeln('p=',p:6:0);
Дом.задание 1. Дан текст из строчных латинских букв, за которым следует точка. Напечатать в алфавитном порядке все буквы, которые входят в этот текст по одному разу. 2. Напечатать заданный текст, удалив из него лишние пробелы, т.е. из нескольких подряд идущих пробелов оставить только один. 3. В заданный непустой текст входят только цифры и буквы. Определить, удовлетворяет ли он следующему свойству: текст начинается с k букв (1<=k<=9), за котором следует только одна литера - цифра с числовым значением k
4 Дано натуральное n. Напечатать в троичной системе счисления целые числа от 0 до n. 5 Задано неотрицательное целое число, в восьмеричной системе счисления (за числом - пробел). Напечатать это число в пятеричной системе счисления.