Во введенной строке удалить все символы, стоящие на нечетных местах
Используется представление строки как массива символов. Вначале рассчитывается количество удаляемых символов n.
Пусть введенная строка имеет вид ‘1234567890’, Тогда n=10.
После удаления первого символа: ‘234567890’ и в полученной строке надо удалить второй символ. Результат: ‘24567890’.
В полученной строке надо удалить третий символ.
Таким образом, на каждом шаге цикла необходимо удалять элемент, индекс которого равен значению счетчика. Текст программы:
program ex04_05;
{ Во введённой строке удалить все символы, стоящие на нечётных местах }
var
s: string;
i,n: integer;
begin
write('Введите строку:'); readln(s);
writeln('введенная строка:',s);
n:=length(s);
if (n mod 2)=0 then n:=n div 2 else n:=(n div 2)+1;
for i:=1 to n do
delete(s,i,1);
writeln('результат:',s);
readln;
end.
Пример: вывести символы между первым и вторым многоточиями
Задание можно решить разными способами: 1) с использованием встроенных функций обработки строк; 2) просматривая строку как массив символов. Ниже приводится вариант решения с использованием встроенных функций.
Для надежности сохраним исходную строку и скопируем содержимое исходной строки в новую строку s2. Вначале определяется позиция первого двоеточия pos1 (функция Pos). Если pos1=0, то в строке нет двоеточий и работа программы прекращается. Далее удаляем из строки pos1 символов и снова ищем позицию двоеточия (pos2). Если pos2=0, то в строке только одно двоеточие и работа программы прекращается. Если второе двоеточие есть, то в результат записываем (pos2-1) символов, начиная с pos1+1.
program ex04_06;
{ вывести символы между первым и вторым многоточиями }
{ вариант 1 - с использованием встроенных функций }
var
str1, str2: string;
pos1, pos2: integer;
len, i: integer;
begin
writeln('введите строку:'); readln(str1);
pos1:=pos(':',str1);
str2:=str1;
delete(str2,1,pos1);
pos2:=pos(':',str2);
if pos1=0 then writeln('строка не содержит двоеточий!')
else
if pos2=0 then writeln('строка содержит только одно многоточие')
else str2:=copy(str1,pos1+1,pos2-1);
writeln(str2);
readln;
end.
Результат работы программы:
введите строку:
root:314159:/bin/bash
Замена первого вхождения подстроки другой подстрокой
Пусть необходимо заменить первое вхождение подстроки ‘друг’ на подстроку ‘враг’. В приведенном ниже примере замена оформлена функцией Replace. Обратите внимание, что изменяемая строка передается по ссылке (с ключевым словом var), а не по значению.
program ex04_07;
{Замена первого вхождения подстроки другой подстрокой}
{Replace(Строка, Подстрока, На что заменить):integer}
function Replace(var str:string;substr1,substr2:string): integer;
var p,ls1: integer;
begin
p:=Pos(substr1, str);
if p = 0 then Replace:=0
else begin
ls1:=Length(substr1);
Delete(str, p,ls1);
Insert(substr2, str, p);
Replace:=p;
end;
end;
var s:string; n: integer;
begin {головная программа}
s:='друг познается в беде';
n:=Replace(s,'друг','враг');
writeln(s);
readln;
end.
Записать строку в обратном порядке
В приведенном ниже примере использовано представление строки как массива символов. В этом случае изменяемую строку не потребовалось передавать по ссылке.
program ex04_08;
{ записать строку в обратном порядке }
Function Revert(S: string):string;
{Функция переворачивания строки}
var
i: byte;
Begin
Revert:='';
For i:=length(S) downto 1 do
Revert:=Revert+S[i];
End;
var str,revstr: string;
begin
readln(str);
revstr:=Revert(str);
writeln(Revstr);
readln;
end.
Изменение строки: пример использования стандартных функций
Пусть необходимо строку с фамилией, именем и отчеством вида «Перов Иван Васильевич» преобразовать в строку вида «Петров И.В.». Для наглядности предположим, что имя и отчество разделяются только одним пробелом.
Вначале находим позицию первого пробела k (1). В строку s1 копируем k+1 символов (т.е. фамилию и первую букву имени, 2). Находим длину строки s1 (3) и в позиции L+1 добавляем в эту строку точку (4). Далее из исходной строки удаляем k символов (т.е. фамилию и первый пробел) и снова ищем пробел (5,6). Затем копируем (k+1)-ый символ в строку s1 и добавляем точку (7,8,9).
program ex04_09;
{ преобразовать строку Фамилия Имя Отчество }
{ в строку Фамилия И.О. }
Var s, s1: shortString;
k, L :Integer;
Begin
//readln(s);
s := 'Дубик Николай Андреевич';
k := Pos(' ',s); // 1 k=6
s1:=Copy(s,1,k+1); // 2 'Дубик Н'
L := Length(s1); // 3
Insert('.' , s1 , L+1); // 4 'Дубик Н.'
Delete (s,1,k); // 5 'Николай Андреевич'
k := Pos(' ',s); // 6 k=8
L := Length(s1); // 7
Insert(s[k+1] , s1 , L+1); // 8 'Дубик Н.А.'
s1:=s1+'.'; // 9
WriteLn(s1);
End.
Работа с файлами
Простейший пример работы с текстовым файлом
В приведенном ниже примере создается текстовый файл с именем «test.txt», в который записываются введенные с клавиатуры строки. Программа заканчивает работу после ввода пустой строки.
program ex05_01;
{ пример работы с текстовым файлом }
var
a: string;
f: text;
begin
Assign(f,'test.txt');
Rewrite(f);
repeat
readln(a);
writeln(f,a);
until length(a)=0;
Close(f);
end.
Так как создавался текстовый файл, то его содержимое можно просмотреть в любом редакторе типа «Блокнот».
Пример работы с типизированным файлом
В приведенном ниже примере вначале производится запись целых чисел в файл test2.dat, а затем для контроля выполняется чтение из этого файла.
program ex05_02;
{ пример работы с файлом чисел integer }
var
i, a: integer;
f: file of integer;
begin
Assign(f,'test2.dat');
{ запись данных в файл }
Rewrite(f);
for i:=1 to 10 do begin
readln(a);
write(f,a);
end;
Close(f);
{ чтение из файла }
Reset(f);
while not eof(f) do begin
read(f,a);
write(a:7);
end;
writeln;
Close(f);
end.
Рекомендуемая литература
До сих пор подавляющее большинство учебников описывают язык программирования Turbo Pascal, хотя среда Turbo Pascal не работает на современных 64-разрядных операционных системах. Однако создатели Free Pascal сознательно создавали интерфейс максимально походим на интерфейс Turbo Pascal, а в опциях программы возможно задать совместимость с Turbo Pascal.
Поэтому практически все учебники по языку Pascal пригодны и для изучения Free Pascal. Приведенные ниже два учебника позволяют ознакомиться с возможностями Free Pascal, отсутствующими в Turbo Pascal.
1. Кетков, Ю. Л. Свободное программное обеспечение. FREE PASCAL для студентов и школьников/ Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM
2. Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus. - Донецк.: ДонНТУ, Технопарк ДонНТУ УНИТЕХ, 2011. - 503 с.
Значительное количество примеров и заданий для самостоятельной работы содержится в книгах:
3. Культин Н. Turbo Pascal в задачах и примерах. – СПб.: БXB-Петep6ypr, 2006. – 256 c.
4. Павловская Т.А. Паскаль. Программирование на языке высокого уровня: Учебник для вузов. – СПб.: Питер, 2007. – 339 с.