Что такое строковая операция
Строковые операции
— пересылка элементов строк (в память, из памяти, память-память);
— сравнение двух строк;
— просмотр строки с целью поиска элемента, равного заданному.
Каждая из этих операций выполняется только над одним элементом строки, однако, одновременно происходит автоматическая настройка на следующий или предыдущий элемент строки. Имеются специальные команды повторения (REP и др.), которые заставляют следующую за ними строковую команду многократно повторяться (до 2 16 раз), в связи с чем, такая пара команд позволяет обработать всю строку, причем намного быстрее, чем запрограммированный цикл.
Начальная установка всех этих регистров, а также флага DF должна быть выполнена до начала операции над строкой. Если сегментный регистр DS уже имеет нужное значение, тогда загрузить регистр SI можно с помощью команды LEA SI, Если же надо загрузить сразу оба регистра DS и SI, тогда можно воспользоваться командой
которая действует аналогично команде LDS.
Перечислим вкратце строковые команды ассемблера.
Команда загрузки элемента строки в аккумулятор (LODSB или LODSW) пересылает в регистр AL или AX очередной элемент строки, на который указывает пара DS:SI, после чего увеличивает (при DF=0) или уменьшает (при DF=1) регистр SI на 1 или 2.
Команда записи аккумулятора в строку (STOSB или STOSW) заносит содержимое регистра AL или AX в тот элемент строки, на который указывает пара ES:DI, после чего изменяет регистр DI на 1 или 2. Команда пересылки строк (MOVSB или MOVSW) считывает элемент первой строки, определяемый парой DS:SI, в элемент второй строки, определяемый парой ES:DI, после чего одновременно меняет регистры SI и DI. Команда сравнения строк (CMPSB или CMPSW) сравнивает очередные элементы строк, указываемые парами DS:SI и ES:DI, и результат сравнения (равно, меньше и т.п.) фиксирует в флагах, после чего меняет регистры SI и DI.
Команда сканирования строки (SCASB или SCASW) сравнивает элемент строки, адрес которого задается парой ES:DI, со значением регистра AL или AX и результат сравнения фиксирует в флагах, после чего меняет содержимое регистра DI.
Пример. Пусть надо переписать 10000 байтов начиная с адреса A в другое место памяти начиная с адреса B. Если оба этих имени относятся к сегменту данных, на начало которого указывает регистр DS, тогда эту пересылку можно сделать так:
Pascal-Паскаль
Программирование. Строки и символы Pascal-Паскаль
Программирование. Строки и символы Pascal-Паскаль
Строки Pascal-Паскаль
Строка представляет собой особую форму одномерного массива символов, которая имеет существенное отличие. Массив символов имеет фиксированную длину (количество элементов), которая определяется при описании. Строка имеет две разновидности длины:
Строка в Паскале – упорядоченная последовательность символов. Количество символов в строке называется ее длиной. Длина строки в Паскале может лежать в диапазоне от 0 до 255. Каждый символ строковой величины занимает 1 байт памяти и имеет числовой код в соответствии с таблицей кодов ASCII.
Код ASCII (American Code for Information Interchange – Американский стандартный код для обмена информацией) имеет основной стандарт и его расширение. Основной стандарт использует шестнадцатеричные коды 00-7F, расширение стандарта – 80-FF. Основной стандарт является международным и используется для кодирования управляющих символов, цифр и букв латинского алфавита; в расширении стандарта используются символы псевдографики и буквы национальных алфавитов.
Строковая константа Паскаля – последовательность символов, заключенная в апострофы. Например, ‘строковая константа’, ‘243’. Два следующих друг за другом апострофа (») обозначают пустую строку, т.е. строку с нулевой длиной.
Описание строковой переменной Паскаля
Для описания строковых переменных в Паскале существует предопределенный тип string.
В общем виде описание строковой переменной будет выглядеть следующим образом:
Пример описания строковой переменной в Паскале:
В приведенном выше описании строковая переменная s1 может содержать не более 10 символов, переменная s2 – не более 20 символов. Если же при описании строки ее максимальная длина не указывается, то по умолчанию принимается максимально допустимая длина, равная 255 символам (переменная smax)..
Символы в строке упорядочены, каждый из них имеет порядковый номер, начиная с первого. Имеется возможность обратиться к любому элементу строки, указав его номер, так же как это делается в одномерных массивах. Например, s1[2] позволяет обратиться ко второму символу в строке s1, при этом мы можем поменять это значение, выполнив оператор присваивания s1[2]:= ‘r’, можем вывести на экран это значение или присвоить его другой переменной.
Действия со строками в Паскале
Операция слияния (сцепления, конкатенации) применяется для соединения нескольких строк в одну, обозначается знаком «+». Операция слияния применима для любых строковых выражений, как констант, так и переменных.
Операции отношения позволяют сравнивать строки на отношение равенства (=), неравенства (<>), больше (>), меньше ( =), меньше или равно ( Пример действий со строками в Паскале:
‘строка’<>‘строки’ (верно, т.к. не совпадают последние символы);
‘Abc’ ‘век’ (отношение верно, т.к. буква ‘г’ в алфавите стоит после буквы ‘в’, а, следовательно, имеет больший код).
Стандартные функции для работы со строками в Паскале
Copy (S, poz, n) выделяет из строки S, начиная с позиции poz, подстроку из n символов. Здесь S – любое строковое выражение, poz, n – целочисленные выражения.
Значение S | Выражение | Результат |
‘строка символов’ | Copy(S,3,3) | рок |
Concat (s1, s2. sn) выполняет слияние строк s1, s2. sn в одну строку.
Выражение | Результат |
Concat(‘язык’, », ‘Pascal’) | ‘язык Pascal’ |
Length(S) определяет текущую длину строкового выражения S. Результат – значение целого типа.
Значение S | Выражение | Результат |
‘(а+в)*с’ | Length(s) | 7 |
Pos(subS, S) определяет позицию первого вхождения подстроки subS в строку S. Результат – целое число, равное номеру позиции, где находится первый символ искомой подстроки. Если вхождение подстроки не обнаружено, то результат функции будет равен 0.
Значение S | Выражение | Результат |
‘предложение’ | Pos(‘е’, S) | 3 |
‘предложение’ | Pos(‘a’, S) | 0 |
Стандартные процедуры для работы со строками в Паскале
Delete (S, poz, n) удаляет из строки S, начиная с позиции poz, подстроку из n символов. Здесь S – строковая переменная (в данном случае нельзя записать никакое другое строковое выражение, кроме имени строковой переменной, т.к. только с именем переменной связана область памяти, куда будет помещен результат выполнения процедуры); poz, n – любые целочисленные выражения.
Исходное значение S | Оператор процедуры | Конечное зн-е S |
‘abcdefg’ | Delete(s, 2, 3) | ‘aefg’ |
Insert(subS, S, poz) вставляет в строку S, начиная с позиции poz, подстроку subS. Здесь subS – любое строковое выражение, S – строковая переменная (именно ей будет присвоен результат выполнения процедуры), poz – целочисленное выражение.
Исходное значение S | Оператор процедуры | Конечное зн-е S |
‘рис. 2’ | Insert(‘№’, S, 6) | ‘рис. №2’ |
Процедуры преобразования типов в Паскале
Str(x, S) преобразует число x в строковый формат. Здесь x – любое числовое выражение, S – строковая переменная. В процедуре есть возможность задавать формат числа x. Например, str(x: 8: 3, S), где 8 – общее число знаков в числе x, а 3 – число знаков после запятой.
Оператор процедуры | Значение S |
Str (sin(1):6:4, S) | ‘0.0175’ |
Str (3456, S) | ‘3456’ |
Val(S, x, kod) преобразует строку символов S в число x. Здесь S – строковое выражение, x – числовая переменная (именно туда будет помещен результат), kod – целочисленная переменная (типа integer), которая равна номеру позиции в строке S, начиная с которой произошла ошибка преобразования, если преобразование прошло без ошибок, то переменная kod равна 0.
Тип X | Оператор процедуры | Значение X | Значение kod |
Real | Val(‘12.34’, x, kod) | 12.34 | 0 |
Integer | Val(‘12.34’, x, kod) | 12 | 3 |
Программирование
Исходники Pascal (127)
Справочник
Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту
Строковые функции и их использование
С помощью строковой функции в Access можно создавать выражения, которые могут работать с текстом различными способами. Например, может потребоваться отобразить в форме только часть серийного номера. Также может потребоваться объединить несколько строк, например фамилию и имя. Если вы еще не раз разбирались в выражениях, см. статью «Построение выражений».
Ниже перечислены некоторые из наиболее распространенных строковых операций в Access и функции, которые используются для их выполнения:
Возврат знаков с начала строки
Если [СерийныйНомер] = «CD234», результат — «CD»
Возврат знаков с конца строки
Если [СерийныйНомер] = «CD234», результат — «234»
Поиск позиции знака в строке
Если [Имя] = «Алексей», результат — 4
Возврат знаков из середины строки
Если [СерийныйНомер] = «CD234», результат — «D2»
Удаление начальных и конечных пробелов из строки.
Если [Имя] = » Алексей «, результатом будет: «Алексей».
Объединение двух строк
Оператор «знак плюс» (+)*
Если [Имя] = «Алексей», а [Фамилия] = «Орехов», результат — «АлексейОрехов»
Объединение двух строк с пробелом между ними
Оператор «знак плюс» (+)*
Если [Имя] = «Алексей», а [Фамилия] = «Орехов», результат — «Алексей Орехов»
Изменения регистра строки на верхний или нижний
Если [Имя] = «Алексей», результат — «АЛЕКСЕЙ»
Определение длины строки
Если [Имя] = «Алексей», результат — 7
* Это не функция, а оператор. Однако это самый быстрый способ объединить строки. В базе данных рабочего стола для одновременного использования также можно использовать оператор амперанда (&). В приложении Access необходимо использовать знак «плюс» (+).
В Access имеется множество других функций, связанных с текстом. Чтобы узнать больше о них, откройте построитель выражений и просмотрите списки функций. Построитель выражений доступен практически везде, где нужно создать выражение. Обычно есть небольшая кнопка «Построить», которая выглядит так:
Чтобы познакомиться с построителем выражений, давайте откроем его из свойства Данные формы или представления. В зависимости от того, используете ли вы базу данных рабочего стола или веб-приложение Access, воспользуйтесь одной из процедур ниже.
Запуск построителя выражений в базе данных на компьютере
Откройте базу данных на компьютере (ACCDB-файл).
Если область навигации еще не открыта, откройте ее с помощью клавиши F11.
Если у вас уже есть какая-нибудь форма, щелкните ее в области навигации правой кнопкой мыши и выберите пункт Режим макета. Если форм у вас пока нет, на вкладке Создание нажмите Форма.
Щелкните правой кнопкой мыши текстовое поле в форме и выберите пункт Свойства.
На странице свойств нажмите Все > Данные, а затем — кнопку Построение в правой части поля свойства Данные.
В разделе Элементы выражений разверните узел Функции и выберите пункт Встроенные функции.
В разделе Категории выражений выберите пункт Текстовые.
В разделе Значения выражений выберите интересующие вас функции и прочитайте их краткое описание в нижней части построителя выражений.
Примечание: Не каждая из этих функций доступна в любом контексте. Access автоматически фильтрует список в зависимости от контекста.
Отображение построитель выражений в веб-приложении Access
Откройте веб-приложение в Access. Если вы просматриваете его в браузере, нажмите Настройки > Настроить в Access.
Щелкните таблицу в левом столбце, а затем в правой части списка таблиц выберите представление.
Нажмите Изменить, щелкните текстовое поле, а затем нажмите кнопку Данные, которая появится около этого поля.
Нажмите кнопку Построение справа от раскрывающегося списка Данные.
В разделе Элементы выражений разверните узел Функции и выберите пункт Встроенные функции.
В разделе Категории выражений выберите пункт Текстовые.
В разделе Значения выражений выберите интересующие вас функции и прочитайте их краткое описание в нижней части построителя выражений.
Комбинирование текстовых функций для большей гибкости
Иногда при каждом вызове строковой функции приходится заново вычислять ее числовые аргументы. Например, функция Left принимает строку и число, как здесь: =Left([СерийныйНомер], 2). Хорошо, если вам всегда требуются именно два первых знака строки, но иногда нужное число знаков для разных элементов различно. Вместо того чтобы однозначно задавать число знаков, его можно вычислять с помощью другой функции.
Вот пример серийных номеров, в каждом из которых есть дефис в строке. Но положение дефила различается:
Предположим, вы хотите получить левую часть номеров (до дефиса), и тогда каждый раз нужно вычислять, где он расположен. Вот один из способов:
Вместо того чтобы вводить число в качестве второго аргумента функции Left, мы подключили функцию InStr,которая возвращает позицию дефила в числовом номере. Вычитаем из этого значения 1 и получаем число знаков, которые должна вернуть функция Left. Сначала это кажется немного сложным, но после небольшой практики вы сможете комбинировать несколько выражений для получения нужного результата.
Дополнительные сведения об использовании строковых функций см. в статье Использование строковых функций в SQL-запросах в Access.
В Информатика, в районе формальная теория языка, часто используются различные строковые функции; однако используемые обозначения отличаются от используемых для компьютерное программирование, а некоторые часто используемые функции в теоретической сфере редко используются при программировании. В этой статье дается определение некоторых из этих основных терминов.
Содержание
Строки и языки
Алфавит строки
Подстановка строк
для строки s ∈ L и характер а ∈ Σ. Подстановки строк могут быть распространены на целые языки как [1]
Обычные языки закрываются при подстановке строк. То есть, если каждый символ в алфавите обычного языка заменяется другим обычным языком, результатом все равно будет обычный язык. [2] По аналогии, контекстно-свободные языки закрываются при подстановке строк. [3] [примечание 1]
персонаж | сопоставлен с языком | замечание |
---|---|---|
Икс | жuc(Икс) | |
‹а› | < ‹А› > | сопоставить символ нижнего регистра с соответствующим символом верхнего регистра |
‹А› | < ‹А› > | сопоставить заглавные буквы себе |
‹SS› | < ‹SS› > | заглавные буквы отсутствуют, преобразовать в строку из двух символов |
‹0› | сопоставить цифру с пустой строкой | |
‹!› | запретить пунктуацию, отобразить пустой язык | |
. | аналогично для других символов |
Для продления жuc к строкам у нас есть, например,
Для продления жuc к языкам у нас есть, например,
Гомоморфизм струн
Класс регулярных языков замкнут относительно гомоморфизмов и обратных гомоморфизмов. [5] Точно так же контекстно-свободные языки замкнуты относительно гомоморфизмов [заметка 3] и обратные гомоморфизмы. [6]
Для последнего языка граммuc(граммuc −1 (<‹A›, ‹bb›>)) = граммuc(<‹A›>) = <‹A›>≠ <‹A›, ‹bb›>. Гомоморфизм граммuc не является ε-свободным, поскольку отображает, например, ‹0› в ε.
Проекция струны
Проекция строки может быть повышена до проекция языка. Учитывая формальный язык L, его проекция равна
Правое частное
Можно взять частное от пустой строки:
Аналогичным образом можно определить левое частное, при этом операции выполняются слева от строки. [ нужна цитата ]
Хопкрофт и Ульман (1979) определяют фактор L1/L2 языков L1 и L2 по тому же алфавиту, что и L1/L2 = < s | ∃т∈L2. ул∈L1 >. [7] Это не является обобщением приведенного выше определения, поскольку для строки s и отличные персонажи а, б, Из определения Хопкрофта и Ульмана следует <са> / <б> давая <>, а не <ε>.
Левое частное (при определении аналогично Хопкрофту и Ульману 1979) одноэлементного языка L1 и произвольный язык L2 известен как Производная Бжозовского; если L2 представлен регулярное выражение, поэтому может быть левое частное. [8]
Синтаксическое отношение
Очевидно, что отношение имеет конечный индекс (имеет конечное число классов эквивалентности) тогда и только тогда, когда правые частные семейства конечны; то есть, если
конечно. В случае, если M моноид слов над некоторым алфавитом, S тогда обычный язык, то есть язык, который может быть распознан конечный автомат. Подробнее об этом рассказывается в статье о синтаксические моноиды. [ нужна цитата ]
Правильная отмена
Пустая строка всегда может быть отменена:
Понятно, что правильная гашение и проекция ездить:
Префиксы
В префиксы строки это набор всех префиксы к строке относительно данного языка:
В префиксное закрытие языка является
Оператор закрытия префикса идемпотент:
TURBO PASCAL
Строковые операции
До сих пор мы с вами рассматривали программы, реализующие алгоритмы обработки числовых данных. Однако хоть ЭВМ изначально и были созданы только для этой цели, по мере развития аппаратной части появилась возможность оцифровывать данные других типов, хранить их в памяти машины, перерабатывать, выводить во внешний по отношению к компьютеру мир. Проще всего можно было так поступить с текстовой информацией. Если не ставить перед машиной задачу «понимания» смысла текста, то задача оцифровки сводится к установлению правил замены символов (литер) при вводе в компьютер на их коды и обратной замены при выводе информации на экран или принтер. Такие правила, конечно же, были составлены. Как водится, сначала их было множество (вспомните разнообразие таблиц кодировки), затем весь мир остановился на ASCII.
Для чего это нужно?
Дело в том, что при компиляции для каждой переменной отводится свой участок памяти. Если мы будем выделять для всех переменных типа String по 256 байт, то это приведет к тому, что при использовании достаточно большого их количества, памяти может и не хватить? Но если в переменной мы собираемся хранить, например, фамилию пользователя, то тридцати символов (тридцати байт) для этого вполне достаточно. Таким образом, экономится память и увеличивается быстродействие программ.
Также, новым для вас явится то, что при использовании строковой переменной, к каждому ее символу можно обратиться отдельно. Необходимо только знать номер нужного символа от начала строки. Его достаточно поставить после имени переменной типа String в квадратных скобках.
С отдельным символом строки можно производить все действия, которые можно производить с любой символьной переменной (ввод, присвоение, вывод на экран, участие в выражениях и т.д.).
Обратите внимание на то, что нумерация символов в строке начинается с единицы. Внутри квадратных скобок вместо числа может находиться выражение, результатом которого является целое число. Главное чтобы символ с таким номером в строке существовал. Но как же узнать, сколько символов в данный момент находится в строковой переменной? Для этого существует специальная функция, которая возвращает длину строковой переменной в символах. Это функция Length. Ее формат: Length(S)
Приведенная далее программа выводит на экран длину введенной пользователем строковой величины.
- Program Str1;
Var
S : String;
Begin
- Writeln(‘Введите последовательность символов’);
Readln(S);
Writeln(‘Вы ввели строку из ‘,Length(S), ‘ символов’)
End.
Другой пример:
Решим задачу: «Введенную строку вывести на экран по одному символу в строке экрана».
Какие же еще действия можно выполнять с переменными строкового типа?
Две строковые величины можно состыковывать. Эта операция называется конкатенацией и обозначается знаком «+».
Например, результатом выполнения следующих команд:
R:= ‘kadabra’;
H:= ‘abra’;
S:=H+R;
в переменной S будет значение ‘abrakadabra’.
Для конкатенации результат зависит от порядка операндов (в отличие от операции сложения). Следует помнить о том, какой максимальной длины может быть результирующая переменная, так как в случае превышения значением выражения числа, указанного после String в описании переменной, «лишние» символы в переменную не попадут.
Строковые величины можно сравнивать между собой. Это относится также и к строковым переменным. Но как же компьютер определяет, какая строка больше:
та, которая длиннее? | |
та, которая содержит больше заглавных букв? |
На самом деле такая проверка проходит довольно сложно: компьютер сравнивает сначала первые символы строк. Большим из двух считается тот, код которого больше (вспомните, что такое код символа). Если равны первые символы, то так же анализируется следующая пара до тех пор, пока не будет найдено различие. Если начало строк совпадает, а одна из них кончается раньше, то вторая автоматически называется большей.
Код символа в Паскале можно определить при помощи функции Ord.
Следующая маленькая программа выводит на экран кодовую таблицу:
Цикл в программе начинается с 32 потому, что символы с кодами от 0 до 31 являются управляющими и не имеют соответствующего графического представления.
Число, записанное в строковую переменную, естественно числом не является, но очень часто требуется его все же использовать в качестве числа. Для этого нужно произвести преобразование типа. Перевод строкового представления числа в числовое выполняет в Паскале оператор Val.
В переменную S попадает строковое представление числа X. Это нужно, например, при необходимости выводить на экран числа в графическом режиме (будет изучено позже), так как стандартные процедуры вывода на экран там работают только со строковыми величинами.
Для иллюстрации рассмотрим такую задачу: «Найти сумму цифр введенного натурального числа». Используя только числовые переменные, решить ее можно, но предлагаемое здесь решение, по-моему, проще.
Теперь рассмотрим еще несколько действий над строками:
оператор DELETE(S,I,C) из строковой переменной S удаляет C символов, начиная с I-того; | |
оператор INSERT(SN,S,I) вставляет подстроку SN в строковую переменную S перед символом с номером I; | |
функция COPY(S,I,C) возвращает подстроку строки S из C символов, начиная с символа с номером I; | |
функция Pos(SN,S) возвращает номер символа, с которого в строке S начинается подстрока SN (позицию первого вхождения подстроки в строку). Если такой подстроки нет, то возвращается ноль. |
Пример их использования:
«Во введенной строке заменить все вхождения подстроки ‘ABC’ на подстроки ‘KLMNO'».
- Program Str6;
Var
- S : String;
A : Byte;
Begin
- Writeln(‘Введите строку’);
Readln(S);
While Pos(‘ABC’,S)<>0 Do
Begin
- A:= Pos(‘ABC’,S);
Delete(S,A,3);
Insert(‘KLMNO’,S,A)
End;
Writeln(S)
End.