Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Красавин Компютерныы практикум в среде МатЛаб 2015

.pdf
Скачиваний:
121
Добавлен:
12.11.2022
Размер:
9.22 Mб
Скачать

length(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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]