Красавин Компютерныы практикум в среде МатЛаб 2015
.pdflength(strvar) ans =
13
strtrim(strvar) ans =
xx yy
length(ans) ans =
6
9.6. Изменение регистра
MatLab имеет две функции, конвертирующие регистры строки: upper и lower.
mystring = 'AbCDEfgh';
lower(mystring) ans =
abcdefgh
upper(ans) ans =
ABCDEFGH
9.7. Сравнение строк
Существует несколько функций, предназначенных для сравнения строк, которые возвращают логическую единицу в случае, если строки эквивалентны, и логический нуль в противном случае. Функция stcmp сравнивает строки посимвольно. Она возвращает логическую единицу, когда строки являются абсолютно идентичными (что предполагает, что они должны быть одной длины), или логический нуль, если строки различны.
111
Следует обратить внимание на то, что в случае сравнения строк применение оператора сравнения == некорректно. Например,
word1 = 'cat'; word2 = 'car';
word3 = ' cathedral'; word4 = 'CAR';
strcmp(word1,word3) ans =
0
strcmp(word1,word1) ans =
1
strcmp(word2,word4) ans =
0
Функция strncmp сравнивает только первые символов в каждой строке и игнорирует остальные. Первые два аргумента данной функции являются сравниваемыми строками, третий же аргумент является числом сравниваемых символов:
strncmp(word1,word3,3) ans =
1
Также существуют функции strсmpi и strncmpi, соответсвующие функциям strcmp и strncmp, но игнорирующие различия регистров символов:
strcmpi(word2,word4) ans =
1
strncmpi(word3,word4,2) ans =
1
112
9.8. Поиск, замена и разделение строк
Функция strfind получает в качестве аргументов две строки: строку и подстроку. Функция находит все появления подстроки в строке и возвращает индексы строки, с которых начинается подстрока. Подстрока может состоять как из одного символа, так и из нескольких. Если существует несколько вхождений подстроки в строку, то возвращается вектор индексов. Следует обратить внимание, что возвращаются только индексы начала появления подстроки:
strfind('abcde', 'd') ans =
4 strfind('abcde', 'bc') ans =
2 strfind('abcdeabcdedd', 'd') ans =
4 9 11 12
Если подстрока не появляется в строке, то возвращается пустой вектор:
strfind('abcdeabcde','ef') ans =
[]
В примере 9.2 рассмотрена программа, считающая количество пробелов внутри фраз. Сначала создается вектор строк, состоящий из фраз, затем при помощи цикла for подсчитывается количество пробелов в каждой строке, исключая начальные и завершающие пробелы.
113
Пример 9.2.
phraseblanks.m
%Программа phraseblanks создает вектор строк и с помощью цикличного
%вызова функции countblanks подсчитывает и выводит количество
%пробелов в каждой строке
phrasemat = char('Hello and how are you?','Hi there everyone!',...
'How is it going?', 'Whazzup?')
[r c] = size(phrasemat);
for i = 1:r
howmany = countblanks(phrasemat(i,:)); fprintf('Phrase %d has %d blanks\n',i,howmany)
end
countblanks.m
function num = countblanks(phrase)
%Функция возвращает количество пробелов в строке
%без учета начальных и завершающих пробелов
num = length(strfind(strtrim(phrase), ' '));
end
В результате работы программы на экран будет выведено следующее:
phraseblanks phrasemat =
Hello and how are you? Hi there everyone!
How is it going? Whazzup?
Phrase 1 has 4 blanks Phrase 2 has 2 blanks Phrase 3 has 3 blanks Phrase 4 has 0 blanks
Функция strrep находит все появления подстроки в строке и заменяет их на новую подстроку. Формат функции:
114
strrep(строка, |
старая |
подстрока, |
новая |
подстрока). Например, |
|
|
|
strrep('abcdeabcde','e','x') ans =
abcdxabcdx
Все строки могут быть различной длины, таким образом, новая подстрока не обязательно должна быть той же длины, что и исходная.
Помимо функций, которые находят и заменяют подстроки в строке, существуют функции, разделяющие строку на две подстроки. Функция strtok разделяет строку на две составляющие. Существует несколько способов вызова данной функции. Функция принимает в качестве первого аргумента строку, затем ищется первый разделитель, который может быть отдельным символом или набором символов. По умолчанию разделителем является пробел. Формат функции:
[token, rest] = strtok(строка)
Функция возвращает в качестве переменной token начало строки до первого разделителя, а в качестве переменной rest – остаток строки, включая первый разделитель. Например,
sentence1 = 'Hello there'; [word, rest] = strtok(sentence1) word =
Hello rest = there
length(word) ans =
5
length(rest) ans =
6 % пробел впереди включается
115
В качестве разделителя можно задать любой набор символов. Формат функции в этом случае:
[token, rest] = strtok(string, delimeter)
Например, если в примере выше в качестве разделителя задать символ 'l', то результат будет таким:
[word, rest] = strtok(sentence1,'l') word =
He rest =
llo there
Символы, соответствующие разделителю, стоящие в начале строки, игнорируются:
[firstpart, lastpart] = strtok(' materials science’) firstpart =
materials % начальный пробел игнорируется lastpart =
science
9.9. Интерпретирование строки. Функция eval
Функция eval применяется для интерпретирования строки. Если строка содержит вызов функции, то функция будет вызвана. Например, строка 'plot(x)' содержит вызов функции plot:
x = [2 6 8 3]; eval('plot(x)')
Функция eval часто используется при вводе команд с клавиатуры. Например, пользователь выбирает, какой тип графика нужно использовать для вывода результатов теста. Строка, которую вводит пользователь (в данном случае 'bar'), соединяется со строкой '(x)', вследствии чего создается строка
116
'bar(x)', которая интерпретируется функцией eval для построения гистограммы:
x = [9 7 10 9];
whatplot = input('What type of plot?: ', 's'); What type of plot?: bar % ввод с клавиатуры eval([whatplot '(x)'])
9.10. Функции определения строк
Функция isletter возвращает логическую единицу для каждого символа в строке, если он является символом из алфавита, и логический нуль, если нет. Функция isspace возвращает логическую единицу для каждого символа в строке, если он является пробелом:
isletter('EK127') |
|
|
||
ans = |
1 |
0 |
0 |
0 |
1 |
||||
isspace('a b') |
|
|
|
|
ans = |
1 |
0 |
|
|
0 |
|
|
Функция ischar возвращает логическую единицу, если ее
аргумент является вектором символов, и логический нуль, если нет:
vec = 'EK127'; ischar(vec) ans =
1
vec = 3:5; ischar(vec) ans =
0
117
9.11. Преобразование между строками и типами чисел
Для преобразования чисел в строки применяются функции: int2str – для целочисленных значений и num2str – для чисел с плавающей запятой (эта функция работает и с целочисленными значениями). Например,
num = 38;
s1 = int2str(num)
s1 =
38
length(num) % num - число ans =
1
>> length(s1) % s1 - строка ans =
2 %
Функция num2str, предназначенная для преобразования чисел с плавающей запятой в строки, может быть вызвана несколькими способами. Если передать в функцию num2str только число, то будет создана строка, отображающая четыре знака после запятой, что является стандартной формой отображения чисел с плавающей запятой в MatLab. Количество знаков можно задать в виде целочисленного аргумента, а количество знаков после запятой – в виде формата строки:
str2 = num2str(3.456789) str2 = 3.4568
>>length(str2)
ans =
6
>>str3 = num2str(3.456789,3) str3 =
3.46
>>str = num2str(3.456789,'%6.2f')
str =
3.46
118
Функция str2num преобразует строку в число, которое сохраняется в формате числа с плавающей запятой (double):
num = str2num('123.456') num =
123.4560
Если строка содержит несколько чисел, разделенных пробелами, то функция str2num возвращает вектор чисел (по умолчанию в формате double). Например,
mystr = '66 2 111';
>> numvec = str2num(mystr)
numvec = |
2 |
111 |
66 |
>> sum(numvec) ans =
179
Функция str2double аналогична функции str2num и предпочтительней в использовании. Однако ее можно использовать только в случае, если требуется преобразовать скаляр, она не будет работать с переменной mystr.
Задания
9.1. Написать функцию, которая получает на вход две строковые переменные: имя файла filename и его расширение ext, и формирует из них название файла filename.ext.
9.2. Написать функцию, которая генерирует два случайных числа в диапазоне от 10 до 99 включительно. Затем функция должна соединить эти два числа в строковую переменную, например, если сгенерированы числа 17 и 43, результатом работы функции будет строка 1743.
119
9.3. Написать функцию nchars, которая генерирует строку из символов без использования циклов и операторов ветвления:
nchars('&',7) ans =
&&&&&&&
Написать функцию, которая получает на вход список слов, разделенных символом '/'. Функция должна возвратить те же слова, разделенные пробелом. Задачу нужно решить без использования циклов.
9.4. Написать функцию wordscr, которая принимает на вход какое-либо слово и затем переставляет буквы этого слова в случайном порядке, например:
wordscr('аргумент') ans =
аргентум
wordscr('аргумент') ans =
гутерман
wordscr('аргумент') ans =
греатумн
120