Хелпикс

Главная

Контакты

Случайная статья





§ 7. Работа со строками



Основным типом данных в MatLab является массив, вспомните, что даже числа представляются массивами размера один на один. Элементы массива не обязательно должны быть числами. Если элементы массива являются символами, то такой массив называется массивом символов, или строкой. Переменные, содержащие строки, будем называть строковыми переменными. Для ограничения строки используются апострофы, например, оператор присваивания

» str='Hello, World! '

приводит к образованию строковой переменной

str =

Hello, World!

Убедитесь, что строковая переменная str действительно является массивом, обратившись к ее элементам: str(8), str(1: 5). Команда whos позволяет получить подробную информацию о str, в частности, str хранится в виде

вектор-строки, ее длина равна 13. Поскольку строковые переменные являются массивами, то к ним применимы некоторые функции и операции, рассмотренные нами ранее. Длина строковой переменной, т. е. число символов в ней, находится при помощи функции length. Допустимо сцепление строк как вектор-строк с использованием квадратных скобок. Создайте еще одну строковую переменную str1, содержащую текст ' My name is Igor. ', и осуществите сцепление:

» strnew=[str str1]

strnew =

Hello, World! My name is Igor.

Обратите внимание, что для разделения сцепляемых строк в квадратных скобках следует использовать пробел (или запятую). Применение точки с запятой приведет к ошибке, поскольку точка с запятой служит для образования вектор-столбцов или отделения строк матриц. Но в матрице все строки должны быть одинаковой длины, а переменные str и str1 состоят из различного числа символов. Далее рассмотрим, как создавать двумерные массивы символов (массивы строк), а пока обратимся к наиболее важным функциям MatLab, предназначенным для обработки строк.

Сцепление строк может быть проведено как с использованием квадратных скобок, так и при помощи функции strcat. Входными аргументами strcat являются сцепляемые строки, их число неограничено, а результат возвращается в выходном аргументе. Функция strcat игнорирует пробелы в конце каждой строки. Для строк: s1='abc ' и s2='def' сцепления s=[s1 s2] и s=strcat(s1, s2) приведут к разным результатам.

Поиск позиций вхождения подстроки в строку производится при помощи функции findstr. Ее входными аргументами являются строка и подстрока, а выходным — вектор позиций, начиная с которых подстрока входит в строку, например:

» s='abcbcddefbcc';

» s1='bc';

» p=findstr(s, s1)

p =

2 4 10

Порядок входных аргументов не важен, подстрокой всегда считается аргумент меньшего размера.

Функция strcmp предназначена для сравнения двух строк, которые указываются во входных аргументах: strcmp(s1, s2). Результатом является логическая единица или ноль. Функция strncmp сравнивает только часть строк от первого символа до символа, номер которого указан в третьем входном аргументе: strncmp(s1, s2, 8). Данные функции имеют аналоги: strcmpi и strncmpi, которые проводят сравнение без учета регистра, т. е., например, символы 'A' и 'a' считаются одинаковыми.

Для замены в строке одной подстроки на другую служит функция strrep. Пусть, например, требуется заменить в строке str подстроку s1 на s2 и записать обновленную строку в strnew. Тогда вызов функции strrep должен выглядеть так: strnew=strrep(str, s1, s2). Здесь важен порядок аргументов.

Преобразование всех букв строки в строчные (прописные) производит функция lower (upper), например: lower('MatLab') приводит к 'matlab', а upper('MatLab') — к 'MATLAB'.

То, что строки являются массивами символов, позволяет легко писать собственные файл-функции обработки строк. Предположим, что требуется переставить символы в строке в обратном порядке. Файл-функция, приведенная на листинге 7. 1, решает поставленную задачу.

Листинг 7. 1. Файл-функция для перестановки символов в строке

function sout=strinv(s)

L=length(s);

for k=1: L

sout(L-k+1)=s(k);

end

Перейдем теперь к изучению массивов строк. Можно считать, что массив строк является вектор-столбцом, каждый элемент которого есть строка, причем длины всех строк одинаковы. В результате получается прямоугольная матрица, состоящая из символов. Например, для переменных s1='March', s2='April', s3='May', операция S=[s1; s2] является допустимой, и приводит к массиву строк:

S =

March

April

Аналогичное объединение трех строк S=[s1; s2; s3] вызовет вывод сообщения об ошибке. Можно, конечно, дополнить при помощи сцепления, каждую строку пробелами справа до длины наибольшей из строк и затем производить формирование массива. Функция char как раз и решает эту задачу, создавая из строк разной длины массив строк:

» S=char(s1, s2, s3)

S =

March

April

May 

Проверьте при помощи команды whos, что S является массивом размера 3 на 5. Для определения размеров массива строк, так же, как и любых массивов, используется size.

Обращение к элементам массива строк производится аналогично обращению к элементам числового массива — при помощи индексирования числами или двоеточием, например: S(3, 2), S(2,: ), S(2: 3, 1: 4). При выделении строки из массива строк в конце могут остаться пробелы. Если они не нужны, то их следует удалить, воспользовавшись функцией deblank. Сравните, к чему приводят S(3,: ) и deblank(S(3,: )).  

Поиск подстроки в массиве строк выполняется функцией strmatch. Входными аргументами strmatch являются подстрока и массив строк, а выходным — вектор с номерами строк, содержащих подстроку:

» p=strmatch('Ma', S)

p =

1

3

Если требуется искать номера строк, точно совпадающих с подстрокой, то следует задать третий дополнительный входной аргумент 'exact'.

Некоторые функций обработки строк могут работать и с массивами строк. Например, при сцеплении массивов с одинаковым числом строк при помощи strcat, сцепление применяется к соответствующим строкам массивов, образуя новый массив строк. Среди входных аргументов strcat может быть и строка. В этом случае она добавляется ко всем строкам массива.

Среди символов строки могут быть цифры и точка, т. е. строка может содержать числа. Важно понимать, что оператор присваивания b=10 приводит к образованию числовой переменной b, а оператор s='10' — строковой. Преобразование целого числа в строку производится при помощи функции int2str, входным аргументом которой является число, а выходным — строка, например:

» str=['May, ' int2str(10)]

str =

May, 10

Заметьте, что нецелые числа перед преобразованием округляются. Для перевода нецелых чисел в строки служит функция num2str:

» str=num2str(pi)

str =

3. 1416

Дополнительный второй входной аргумент num2str предназначен для указания количества цифр в строке с результатом: str=num2str(pi, 11). Возможно более гибкое управление преобразованием при помощи строки специального вида, определяющей формат (экспоненциальный или с плавающей точкой) и количество позиций, отводимых под число. Строка с форматом задается в качестве второго входного аргумента num2str, начинается со знака процента и имеет вид '%A. ax', где:

§ A — количество позиций, отводимое под все число;

§ a — количество цифр после десятичной точки;

§ x — формат вывода, который может принимать одно из следующих значений: f (с плавающей точкой), e (экспоненциальный) или g (автоматический подбор наилучшего представления).  

Сравните результаты следующих преобразований числа в строку:

num2str(198. 23981, '%12. 5f')

num2str(198. 23981, '%12. 5e')

num2str(198. 23981, '%12. 5g')

Если входным аргументом функций int2str и num2str является матрица, то результатом будет массив строк.

Обратная задача, а именно, преобразование строковой переменной, содержащей число, в числовую переменную решается при помощи функции str2num. Входным аргументом str2num может быть строка, содержащая представление целого, вещественного или комплексного числа в соответствии с правилами MatLab, например: str2num('2. 9e-3'), str2num('0. 1'), str2num('4. 6+4i').

Задания для самостоятельной работы

Написать файл-функцию для решения поставленной задачи.

Варианты

1. Подсчитать число вхождений подстроки в строку.

2. Найти количество пробелов в строке.

3. Определить количество цифр в строке.

4. Удалить идущие подряд одинаковые символы в строке.

5. Заменить идущие подряд одинаковые символы в строке на один.

6. Строка является предложением, в котором слова разделены пробелами. Переставить первое и последнее слово.

7. Образовать строку, состоящую из первых букв строк, входящих в массив строк.

8. Вывести номера одинаковых строк в массиве строк.

9. Определить количество символов в каждой строке массива строк без учета пробелов.

10. По заданному массиву строк образовать новый, исключив повторяющиеся строки.

11. Заменить в строке цифры числительными (вместо 1, 2, … — один, два, три, …).

12. Задана строка, содержащая текст и числа, выделить числа в числовой массив.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.