Бабалова Алгоритмизация задач и структурирование программ 2013
.pdfСлияние строк → Function Concat(s1, s2, ..,sn):String; s3: = Concat(s1, s2);
s1=‘ my’, s2=’ home’, s3=’my home’.
Рассмотрим наиболее часто используемые функции для обработки строк. Задана строка S=’ abcdefgh’
Функция |
Пример |
K:=Length(s) |
Длина строки k будет равна 9 |
Delete(s,4,1) |
Строка s будет равна |
|
‘ abdefgh’ |
Insert(s,’a’,3) |
Строка s будет равна |
|
‘ aabcdefgh’ |
Trim(s) |
Строка s будет равна ‘abcdefgh’ |
K:=Pos(‘d’,s) |
Позиция символа d в исходной строке |
|
равна 5 |
S1:=Copy(s,5,2) |
Новая строка s1 будет равна’de’ |
Пример 2.1. Дана строка из произвольного количества символов. Переставить символы строки в обратном порядке.
Решение этой задачи возможно с помощью предлагаемого алгоритма инверсии строки. Алгоритм решения задачи приводится на рис. 15.
Рис. 15. Структура программы и алгоритм инверсии строки
31
Графическая иллюстрация способа преобразования строки показана на рис. 16.
Рис. 16 Результат перестановки символов строки
Решение задачи в визуальной среде Delphi: unit Unit1_revers_string;
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm) Edit1: TEdit;
Edit2: TEdit; Button1: TButton; Button2: TButton; Button3: TButton;
procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
s=string[60];
var
Form1: TForm1; s1:s;
implementation {$R *.dfm}
Procedure Revers(var ss:s;n:integer);
32
var t:char; begin
if n>length(ss) div 2 then begin
t:=ss[n]; ss[n]:=ss[length(ss)-n+1] ; ss[length(ss)-n+1]:=t; Revers(ss,n-1);
end;
end;// Метод инверсии строки
procedure TForm1.Button1Click(Sender: TObject); begin
s1:=edit1.text;
end; // Ввод строки из окна
procedure TForm1.Button2Click(Sender: TObject); var t:char;
r:integer; begin
r:=length(s1);
revers(s1,r); Edit2.Text :=s1;
end; // Событие, обеспечивающее вызов метода // преобразования строки
procedure TForm1.Button3Click(Sender: TObject); begin
close; end; end.
Рис. 17. Пример решения задачи
33
Пример 2.2. Дана строка, в которой слова разделены произвольным количеством пробелов. Удалить все лишние пробелы, кроме одного. Вывести исходную строку и результат ее обработки.
Алгоритм удаления пробелов в строке показан на рис. 18. Логическая переменная b введена в алгоритм для того, чтобы избежать лишних просмотров символов строки. Решение задачи приведено в консольном приложении. Результат решения задачи дан на рис. 19.
Рис. 18. Алгоритм удаления пробелов в строке
program Number_2; {$APPTYPE CONSOLE} uses
SysUtils;
var s:string[80]; i,n:integer; ch:char; b:boolean;
begin
writeln('Работает программа - пример на обработку строк'); repeat
writeln('Введите исходную строку'); readln(s);
34
writeln('Исходная строка = ',s); n:=length(s);{Определяем длину введенной строки} i:=1;
while (i<=n-1) do begin
if s[i]=' ' then begin
repeat
if s[i+1]=' ' then begin delete(s,i,1); n:=n-1; b:=false; end
else b:=true; until b;
end;
i:=i+1;
end;
writeln('Результат преобразования = ',s); writeln('Будете еще преобразовывать строки? ');
readln(ch); until ch='n';
end.
Рис. 19. Результаты удаления пробелов в строках
35
Задачи для самостоятельной работы
2.1. Дана строка, состоящая из 0 и 1. Длина строки любая. Определить количество подряд стоящих единиц Li и номера позиций Ki, занимаемых первыми единицами каждой группы.
2.2.Дана строка из слов, разделенных пробелами. В каждом слове поменять порядок букв на обратный.
2.3.Дана строка из английских слов. Расположить слова в строке по возрастанию количества гласных в слове.
2.4.Строка представляет английское предложение. Выделить все гласные и согласные буквы в этом предложении и расположить их в алфавитном порядке.
2.5.Дана строка из произвольных слов. Найти все одинаковые слова и удалить все повторения слов.
2.6.Вводится строка. В строке записана последовательность слов, разделенных хотя бы одним пробелом. Расположить в строке слова по возрастанию их длины.
2.7.Дана строка, длиной не более 80 символов. Подсчитать количество повторений каждой встречающейся в строке буквы. Напечатать результат обработки в форме:
<буква > < количество повторений > < исходная строка>
2.8.Дана строка символов. Удалить из строки все повторяющиеся символы, вывести исходную строку и результат обработки.
2.9.Дана английская фраза из слов, разделенных хотя бы одним пробелом. Расположить слова по одному в каждой строке и упорядочить слова по алфавиту. Вывести исходную строку и результат обработки строки.
2.10.Дана последовательность слов в виде некоторого текста. К каждому слогу в словах текста добавить по новому слогу ”NO”. Слова в исходном тексте разделяются, по крайней мере, одним пробелом. Вывести исходный текст и результат обработки текста.
2.11.Дана строка из неизвестного заранее количества букв. Упорядочить все символы в строке по алфавиту. Вывести исходную строку и результат обработки строки.
2.12.Дана строка из N букв. Разбить строку на слова по m букв
вкаждом слове. Вывести исходную строку и результат обработки строки.
36
2.13.Дана строка из неизвестного количества символов. Исключить из последовательности K-й элемент, сжать строку. Вставить за M-ым элементом новый элемент. Количество удалений и вставок – любое. Вывести исходную строку и все результаты преобразований.
2.14.“Это я знаю и помню прекрасно пи многие знаки мне лишни напрасны”. Ввести фразу и напечатать полученное значение
числа π. Проверить работоспособность программы на произвольном тексте. Вывести исходный текст и результат вычислений.
2.15. Заданная строка символов должна быть преобразована вычеркиванием всех символов, стоящих до первой точки в строке и после последней точки с запятой. Вывести исходную строку и результат обработки строки.
2.17.Дана строка из N букв. Разбить строку на K слов, в каждом из которых не более m букв. Вывести исходную строку и результат обработки строки.
2.18.Дан текст из некоторого количества предложений. Предложения разделяются знаком точка с запятой. Разделить текст на отдельные предложения. Вывести исходный текст, результат обработки текста и длину каждого полученного предложения.
2.19.Вводится произвольное количество строк. Определить сколько раз в каждой строке повторяются одинаковые буквы. Вывести исходные строки и результат обработки строк.
2.20.Вводится произвольный текст из неизвестного количества строк. Разделить текст на строки и упорядочить по 1-й букве строки. Конец каждой строки может быть любым из символов “. , ;”. Вывести исходный текст и результат обработки.
2.21.Дан текст из слов, разделенных пробелами. Выделить из текста слова, состоящие из 4, 5, 6 букв и оставшиеся слова. Напечатать исходный текст и результат его обработки.
2.22.Задан текст из латинских букв. Вывести в алфавитном порядке все буквы, встречающиеся в тексте только один раз. Вывод исходного текста обязателен.
2.23.Дана строка из K символов. Преобразовать строку, заменив все не одиночные пробелы одним пробелом, все точки – точкой с запятой, все многоточия – одной точкой. Вывести исходную строку
ирезультат ее обработки.
37
2.24.Вводится последовательность строк. Определить для каждой строки количество слов разной длины. Например, в i-й строке 5 слов длины 4 буквы, 3 слова длины 8 букв и т.д. Вывести на экран исходный текст и результат его обработки.
2.25.Вводится текст, разбитый на две строки знаком “;”. Удалить из этой пары строк все повторяющиеся символы. Вывести на экран исходный текст и результат его преобразования.
2.26.Вводится произвольное количество строк. Определить максимальное число подряд расположенных символов, совпадающих с первым символом или последним символом в каждой строке. Вывести исходный текст и результат его обработки.
2.27.Вводится произвольный текст из некоторого количества строк. Обеспечить выравнивание текста по количеству символов в строке за счет размещения дополнительных пробелов в строках. Количество символов в строке перед каждой операцией выравнивания задается с клавиатуры. Вывести исходный текст и результат его обработки.
2.28.Каждая строка текста содержит цифры десятичной системы счисления и символы – знаки “+” или “–“. Строка заканчивается знаком “=“, пробелы в строке должны игнорироваться. Получить числовое значение вводимого выражения. Пример: 9+5–3=11. Вывести исходный текст и результат его обработки.
2.29.Вводится некоторая последовательность строк. В каждой строке слова переставить в обратном порядке. Пример: строка fdc, ads, 2.5cx, hjkl преобразуется в hjkl, 2.5cx, ads,fdc. Вывести исходный текст и результат его обработки.
2.30.Вводится произвольный текст, разбитый на строки знаком
”; “. Слова в строке разделены, по крайней мере, одним пробелом. Выделить в каждой строке слова, в которых: а) первые буквы слов совпадают; б) длина слова – наибольшая в строке. Вывести исходный текст и результат его обработки.
2.31.Дана строка из английских слов. Выделить из строки подстроки из согласных букв, у которых и справа и слева стоят гласные буквы. Вывести исходную строку и результат ее обработки.
2.32.Дана строка длиной не более 80 символов. Строка представляет запись некоторой математической формулы. Проверить правильность записи формулы по открывающим “(” и закрывающим “)” скобкам.
38
2.33.Дана строка из некоторого количества слов. Слова разделены в строке знаками “, ”, “ пробел”. Вставить произвольное новое слово в строку за i-м словом. Вывести исходную строку и результат
еепреобразования.
2.34.Вводится строка произвольной длины. Определить количество одинаковых подряд стоящих символов. Вывести исходную строку и результат обработки строки.
2.35.Задана строка из некоторого количества слов. Слова записаны в строке через запятую. Найти в строке слова – палиндромы (перевертыши), например, шалаш или оно.
2.36.Дана строка из произвольного количества символов. Выделить из строки подстроки из букв, цифр и прочих символов. Вывести исходную строку и результат обработки.
2.37.Строка является записью математической формулы с многократно вложенными круглыми скобками для определения порядка вычисления этого выражения. Заменить в записи выражения все круглые скобки, кроме первого уровня, соответственно на квадратные и фигурные скобки. Пример:
S=a0+(a1+x* ( a2+x* (a3+x*a4))) →
S=a0+{a1+x* [ a2+x* (a3+x*a4)]}
2.38.Дана строка из букв и цифр. Найти самую длинную последовательность цифр в записи строки. Вывести исходную строку и результат ее обработки.
2.39.Дана строка из произвольного количества слов. Слова записаны через запятую. Закодировать все слова в строке, поменяв местами первую и последнюю буквы каждого слова. Вывести исходную строку и результат ее преобразования. Обеспечить декодирование слов.
2.40.Дана строка символов s. Найти все вхождения подстроки ss
висходную строку s. Выделенные подстроки надо инвертировать и поставить на свои места в исходную строку. Например:
s=asddfgasdddsf,
ss=asd.
Результат: dsadfgdsaddsf.
39
Тема 3. СТРУКТУРИРОВАНИЕ ПРОГРАММ. ФУНКЦИИ И ПРОЦЕДУРЫ
Структурное проектирование программ позволяет создавать программы из отдельных хорошо структурированных компонент – подпрограмм (ПП). ПП имеют в языке программирования два варианта записи структур – функции и процедуры.
Назначение процедур и функций – структурирование программ в соответствии с теми действиями, которые используются для решения задачи. Многократно повторяющиеся действия описываются один раз с помощью ПП, а затем исполняются с разными аргументами любое число раз.
Различаются процедуры и функции форматом заголовка, числом получаемых результатов; а также тем, что в теле функции обязательно должен быть оператор присваивания, который имени функции присваивает результат решения.
Синтаксис процедур и функций в языке. Заголовок: procedure Swap( var x,y : integer);
function Min( N: integer; var a: massiv ): real;
Взаголовке указывается уникальное имя структуры. В круглых скобках перечисляются формальные параметры, которые должны быть переданы в соответствующую структуру для решения задачи
иопределяющие результат решения, который возвращается в основную программу.
Взаголовке функции обязательно указывается тип получаемого результата. Тип – это простой или ранее определенный в основной программе тип данных разработчика программы (запись, элемент списка, файловая переменная).
Всписке формальных параметров процедуры или функции спецификатор Var определяет тип параметра-переменной. Без спецификатора Var – все формальные параметры являются значениями. Различие в описании переменных связано с разными способами передачи данных из основной программы в процедуры и функции. Передача параметров без спецификатора Var означает, что все значения из той области памяти, в которой они находились, будут переданы в область действия процедуры или функции. Передача же параметров в процедуру или функцию со спецификатором Var означает передачу только начального адреса того массива значений, с
40