"Паскалевские" операторы (Часть 1 - "Работа со строками")
Автор:
WEC (бывший волшебник)
Оригинал: http://www.noil.pri.ee
Часть первая
«Работа со строками»
Я часто видел, что те кто сразу начинал программировать с Дельфи, а не с Паскаля, долгое время не знают о многих хороших функциях и процедурах, которые знают, те кто начал изучать именно с Паскаля… А там есть хорошие функции нужные для программирования для Дельфийцев).
В этой части я расскажу о функциях и процедурах для работы со строками…
Я не буду здесь рассказывать, что такое строки и какие допускаются операции над переменными такого типа… Сразу перейдём к делу(скобки [...] означают необязательные параметры):
*********************************************************************************************
Length (str) – функция определения длины строки str; Где str – это переменная строкового типа.
Например:
Var
str: string;
DL: integer;
begin
str:= 'Салют!!!';
DL:= Length(str);
{Теперь в DL будет храниться число 8, так как слово «Салют!!!» состоит из 8 символов}
end;
*********************************************************************************************
Delete (str, index, count) – процедура удаления count символов из строки str, начиная с символа с номером index.
Например, строка St='Она не пробовала' после процедуры Delete (St, 4, 3) преобразуется в строку St='Она пробовала';
Например:
Var
St: string;
Begin
St:= 'Она не пробовала';
Delete (St, 4, 3);
{Теперь в переменной St храниться строка «Она пробовала»}
End;
*********************************************************************************************
Insert (substr, str, index) – процедура вставляет подстроку substr в строку str, начиная с символа с номером index.
Например, строка St='один три' после процедуры Insert(' два', St, 5) преобразуется в строку St='один два три';
Например:
Var
St: string;
Begin
St:= 'один три ';
Insert(' два', St, 5);
{Теперь в переменной St храниться строка «один два три»}
End;
*********************************************************************************************
Concat (s1[, s2,.., sn]) – функция сцепления строк s1, s2,.., sn;
Например:
Var
S1,S2,S3,St: string;
Begin
S1:= 'один ';
S2:= 'два ';
S3:= 'три';
St:= Concat(S1, S2);
{Теперь в переменной St храниться строка «один два три»}
End;
*********************************************************************************************
Copy (str, index, count) – функция копирования из строки str, count символов, начиная с символа с номером index.
Например, из строки S='один два три' после выполнения оператора “St:=Copy(S,6,3);” копируется строка St='два';
Например:
Var
S,St: string;
Begin
S:= 'один два три';
St:= Copy(S, 6, 3);
{Теперь в переменной St храниться строка «два»}
End;
*********************************************************************************************
Pos (substr, str) – функция возвращает номер позиции в строке str, с которой начинается первое вхождение подстроки substr, если подстрока не найдена, то возвращается ноль.
Например, если St1='один два три', а St2='два', то после выполнения оператора “K:=Pos(St2, St1);” получим значение K=6.
Например:
Var
St1,St2: string;
K: Integer;
Begin
St1:= 'один два три';
St2:= 'два';
K:= Pos(St2, St1);
{Теперь в переменной K храниться число 6}
End;
*********************************************************************************************
PosEx (substr, str, x) – функция возвращает номер позиции в строке str, с которой начинается первое вхождение подстроки substr, но поиск идет, начиная с символа, под номером x в str. Если подстрока не найдена, то возвращается ноль.
Например, если St1='один два один два три', а St2='два', то после выполнения оператора “K:=PosEx(St2,St1,9);” получим значение K=15.
Например:
Var
St1,St2: string;
K1,K2: Integer;
Begin
St1:= 'один два один два три';
St2:= 'два';
K1:= PosEx(St2, St1, 1);
K2:= PosEx(St2, St1, 7);
{Теперь в переменной K1 храниться число 6, а в K2 храниться число 15}
End;
*********************************************************************************************
Существуют такие функции как StrToFloat и FloatToStr . Первая функция преобразует строку в которой записаны числа в настояшие числа. Вторая функция делает противоположное преобразование.
Но однажды я столкнулся с интересной вещью… При тестировании одной из моих программ на разных компьютерах с разными операционными системами Windows, я обнаружил на некоторых ошибку связанную с функцией StrToFloat . Например, на одном компе с Windows 2000 нет этой ошибки, а на другом с этой же операционкой есть… Ошибка заключалась в том, что эта функция на разных компах воспринимала разный знак разделения числа на целое и дробное, или «.» , или «,» . Но ведь такая ошибка не допустима если Вы делаете программу на продажу… Это будет означать, что у кого-то Ваша прога будет работать, а у кого-то нет. Для решения этой проблемы, как один из вариантов, я могу предложить отказаться от этих двух функций и использовать их следующие аналоги:
*********************************************************************************************
(аналог функции StrToFloat):
Val (str, x, code) – процедура преобразования строки str в целое или вещественное число, сохраняющееся в переменной x, целочисленный параметр code равен нулю, если преобразование прошло успешно, в противном случае в code запишется номер позиции в строке str, где обнаружен ошибочный (нечисловой) символ; для этой процедуры знак разделения числа всегда знак «.»;
Например:
Var
S: string;
X: Extended;
code: integer;
Begin
S:= '2.5';
Val(S, X, code);
{Теперь в переменной X храниться число 2.5}
End;
*********************************************************************************************
(аналог функции FloatToStr):
Str (x [: width[: decimals]], stroka) – процедура преобразования числа x вещественного или целого типа в строку символов stroka, параметры width и decimals задают формат преобразования.
Например, если x – число вещественного типа, то процедура Str(x:6:4,Strx) преобразует его в строку, скажем, Strx='8.5671'. Если число n=-34 – целого типа, то Str(n:6, Sn) даст строку длинной в шесть символов Sn=' -34' ;
Например:
Var
S: string;
X: integer;
Begin
X:= 2005;
Str(X, S);
{Теперь в переменной S храниться строка «2005»}
End;
*********************************************************************************************
Следующие функции работают с типом CHAR и отдельными символами строки:
*********************************************************************************************
UpCase (ch) – функция перевода строчного латинского символа ch в соответствующую ему заглавную букву, любой другой символ возвращается без преобразования;
*********************************************************************************************
Chr (b) – функция преобразования величины b типа BYTE в символ. Например, в соответствии с кодом ASCII, оператор “ch1:=Chr(97);” (ch1 – переменная символьного типа CHAR) вернет латинский символ "a".
*********************************************************************************************
Ord (x) – функция обратного преобразования, которая применима ко всем порядковым типам. При применении к символам она возвращает их ASCII-код. Так, оператор “k:=Ord('b');” возвращает значение k=98.
*********************************************************************************************
В следующем фрагменте программы показаны способы определения количества символов в вводимой строке S:
Var
DL1, DL2: Byte;
S: String;
Begin
S:= ‘Дельфи';
DL1:=Length(S);
DL2:= Ord(S[0]);
{Теперь в переменной DL1 и DL2 хранится число равное длинне строки S(кол-ву символов), а то есть число 6}
{Замете, операции, проделанные над переменными DL1 и DL2, аналогичны ! Это тоже самое}
End;
Управляющие коды и символы можно вводить с помощью префикса #. Так, строку 'abba' можно записать как #97#98#98#97. Допускается вставка в строку символов управляющих кодов, например, 'Bottom'#10#13'Top'#7.
Для тех, кто хочет укрепить свои знания в области работы над строками, могу предложить ряд задач из одной методички Российского ВУЗа. Эти задачи даются на первом курсе:
Задания на работу со строками
Дана строка длиной n символов, содержащая слова, т.е. группы символов, разделенные пробелами и другими разделителями и не содержащие пробелов внутри себя:
- Вывести все слова строки в алфавитном порядке.
- Вывести все слова, отличные от последнего слова, предварительно преобразовав их по следующему правилу: удалить из каждого слова все последующие вхождения первой его буквы.
- Вывести те слова строки, которые отличны от последнего слова и совпадают с начальным отрезком латинского алфавита (a, ab, abc и т. д.). В каждом слове от 1 до 8 литер.
- Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию, что в слове нет повторяющихся букв.
- Выделить в строке отдельные слова и вывести их «в столбик» по одному слову.
- Дан текст, в словах которого могут встречаться цифры и знаки "+", "-", "*", "/". Если с обоих сторон от знака расположены буквы, то каждый знак "+", заменить цифрой "1", знак "-" заменить цифрой "2", знак "*" заменить цифрой "3", а знак "/" - цифрой "4". Иначе оставить текст без изменений.
- Найти число слов, которые оканчиваются той же буквой, что и последнее слово. Вывести их на экран.
- Дана последовательность английских слов. В словах, которые оканчиваются сочетанием букв “ing”, заменить это окончание на “ed”.
- Вывести все слова, отличные от последнего слова, предварительно удалив из слов нечетной длины его среднюю букву.
- Дано натуральное число n (-1000 Ј n Ј 1000). Написать программу вывода такого числа в словесной форме («два», «семнадцать», «минус сорок пять», «сто двадцать два» и т.д.).
- Для каждого слова указать, сколько раз оно встречается среди всех слов данного текста.
- Заменить все малые буквы в русских словах одноименными большими.
- Известно, что в начале строки находится группа не более чем из 40 латинских букв, за которой следуют пробелы. Вывести эту строку, предварительно удалив все вхождения сочетания “th” (после удаления текст сомкнуть).
- Найти длину самого короткого слова.
- Найти и вывести все слова, начинающееся на букву "а".
- Найти слова, первый и последний символы которых совпадают, и вывести эти слова и их количество.
- Подсчитать количество букв "а" в каждом четном слове.
- Строка символов содержит, кроме букв и знаков, действительные числа (например, 'аЧв+0,973-1,1'). Получить строку, в которой в числах после запятой оставлены только две значащие цифры (т.е. 'аЧв+0,97-1,10')
- Строка содержит два действительных числа. Получить сумму этих чисел и записать в другую строковую переменную в виде выражения (например, 27,8 + 17,3 = 45,1).
- Удалить все символы в строке, не являющиеся буквами, а также заменить множественные пробелы на один.
===============================================================================
==============================================================
===================================
=================
=====
С уважением, WEC (бывший волшебник)
|