Преобразования число-строка

Содержание

Слайд 2

В практических задачах часто нужно преобразовать число, записанное в виде цепочки

В практических задачах часто нужно преобразовать число, записанное в виде цепочки

символов, в числовое значение, и наоборот.
В языках программирования есть стандартные функции:
переводит строку в целое число;
переводит строку в вещественное число;
переводит целое число в строку;
переводит вещественное число в строку.
Строку не всегда можно преобразовать в число (например, если в ней содержатся буквы). 
Слайд 3

В языке Паскаль строка преобразуется в число (целое или вещественное) с

В языке Паскаль строка преобразуется в число (целое или вещественное) с

помощью процедуры Val:

Третий параметр r служит для того, чтобы зафиксировать ошибку: если после вызова процедуры Val он равен нулю, то ошибки не было, иначе в переменную r записывается номер первого ошибочного символа.

Слайд 4

Преобразование числа в строку выполняет процедура Str: По умолчанию вещественные числа

Преобразование числа в строку выполняет процедура Str:

По умолчанию вещественные числа представлены

в научном (экспоненциальном) формате ('1.234560Е+002' означает 1,23456-102). В последней строке примера используется форматный вывод: запись Х:10:3 означает «вывести число в 10 позициях с 3 знаками в дробной части».
Слайд 5

Строки в процедурах и функциях

Строки в процедурах и функциях

Слайд 6

Строки можно передавать в процедуры и функции как аргументы (значения параметров),

Строки можно передавать в процедуры и функции как аргументы (значения параметров),

а также возвращать как результат функций. Построим процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew (здесь wOld и wNew — это имена переменных, а выражение «слово wOld» означает «слово, записанное в переменную wOld»).
Слайд 7

Сначала разработаем алгоритм решения задачи. На первый взгляд кажется, что можно

Сначала разработаем алгоритм решения задачи. На первый взгляд кажется, что можно

написать такой алгоритм на псевдокоде:

Однако такой алгоритм работает неверно, если слово wOld входит в состав wNew, например, нужно заменить '12' на 'А12В'.

пока { слово wOld есть в строке s }
{ удалить слово wOld из строки }
{ вставить на это место слово wNew }

wOld: '12'
wNew: 'A12B'

зацикливание

Слайд 8

Однако такой алгоритм работает неверно, если слово wOld входит в состав

Однако такой алгоритм работает неверно, если слово wOld входит в состав

wNew, например, нужно заменить '12' на 'А12В' (покажите самостоятельно, что это приведет к зацикливанию).
Чтобы избежать подобных проблем, попробуем накапливать результат в другой символьной строке res, удаляя из строки s уже обработанную часть. Предположим, что на некотором шаге в оставшейся части строки s обнаружено слово wOld.
Слайд 9

Теперь нужно выполнить следующие действия: 1) ту часть строки s, которая

Теперь нужно выполнить следующие действия: 1) ту часть строки s, которая стоит

слева от образца, «прицепить» в конец строки res (б); 2) «прицепить» в конец строки res слово-замену wNew (в); 3) удалить из строки s начальную часть, включая найденное слово-образец (г).
Далее все эти операции (начиная с поиска слова wOld в строке s) выполняются заново до тех пор, пока строка s не станет пустой. Если очередное слово-образец найти не удалось, вся оставшаяся строка s приписывается в конец строки-результата, и цикл заканчивается.

Замена всех экземпляров подстроки

Слайд 10

В начале работы алгоритма в строку res записывается пустая строка '

В начале работы алгоритма в строку res записывается пустая строка '

', не содержащая ни одного символа. В таблице приведён протокол работы алгоритма замены для строки '12.12.12', в которой нужно заменить слово '12' на 'А12В'.
Слайд 11

Теперь можно написать процедуру на школьном алгоритмическом языке. Так как она

Теперь можно написать процедуру на школьном алгоритмическом языке. Так как она

должна менять строку s, эта строка должна быть одновременно аргументом и результатом (в школьном алгоритмическом языке — аргрез), а старое и новое слова — это просто аргументы (арг).

Переменная р — это номер первого символа первого найденного слова-образца wOld, а в переменной lеn записана длина этого слова. 

Слайд 12

Переменная р — это номер первого символа первого найденного слова-образца wOld,

Переменная р — это номер первого символа первого найденного слова-образца wOld,

а в переменной lеn записана длина этого слова. Если после поиска слова значение р меньше нуля (образец не найден), происходит выход из цикла:
Если р > 1, то слева от образца есть какие-то символы, и их нужно «прицепить» к строке res:
Условие р+lеn>длин (s) означает, что образец стоит в самом конце слова, при этом остаток строки s — пустая строка.
В конце программы результат записывается на место исходной строки s.
Слайд 13

Приведём пример использования процедуры: Построенную выше процедуру можно легко превратить в

Приведём пример использования процедуры:

Построенную выше процедуру можно легко превратить в функцию.

Для этого нужно:
в заголовке функции указать, что она возвращает строку (добавить ключевое слово лит);
все параметры должны быть аргументами (нужно убрать аргрез и арг);
поскольку в школьном алгоритмическом языке нельзя менять аргументы внутри процедуры, назовём первый параметр (исходную строку) s0, и введём дополнительную переменную s для работы со строкой в процедуре;
в конце нужно записать результат во встроенную переменную знач, а не в s.
Слайд 14

Ниже показаны все изменённые части подпрограммы: Вызывать функцию можно таким образом:

Ниже показаны все изменённые части подпрограммы:
Вызывать функцию можно таким образом:

Слайд 15

program Replace; var s: string; ... { здесь будет процедура }

program Replace;
var s: string;
... { здесь будет процедура }
begin
s:= '12.12.12';

replaceAll(s, '12', 'A12B');
writeln(s)
end;
Слайд 16

procedure replaceAll(var s: string; wOld, wNew: string); var res: string; p,

procedure replaceAll(var s: string; wOld, wNew: string);
var res: string;
p, len:

integer;
begin
len:= Length(wOld);
res:= '';
while Length(s) > 0 do begin
p:= Pos(wOld, s);
if p = 0 then begin res:= res + s; break; end;
if p > 1 then res:= res + Copy(s,1,p-1);
res:= res + wNew;
if p+len > Length(s) then
s:= ''
else s:= Copy(s,p+len,Length(s));
end;
s:= res
end;
Слайд 17

program Replace; var s: string; begin s:= '12.12.12'; s:= replaceAll(s, '12',

program Replace;
var s: string;
begin
s:= '12.12.12';
s:= replaceAll(s, '12', 'A12B');
writeln(s)
end;

function

replaceAll(s,
wOld, wNew: string): string;
...
begin
... { тело процедуры }
replaceAll:= res
end;
Слайд 18

Задание 1. Соедините процедуру с программой и запустите ее

Задание 1.

Соедините процедуру с программой и запустите ее

Слайд 19

Задание 2. Напишите функцию, которая возвращает первое слово переданной ей символьной

Задание 2.

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


Пример:
Введите строку: Однажды в студёную зимнюю пору...
Первое слово: Однажды

Слайд 20

Задание 3. Напишите функцию, которая заменяет расширение файла на заданное новое

Задание 3.

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


Пример:
Введите имя файла: qq
Введите новое расширение: tmp
Результат: qq.tmp
Пример:
Введите имя файла: qq.exe
Введите новое расширение: tmp
Результат: qq.tmp