Функции и команды обработки строк

Лабораторная работа №3

Процедуры и Функции. Обработка строк.

 

Процедуры

Для использования подпрограммы-процедуры необходимо сначала описать процедуру, а затем обращаться к ней (обращение к процедуре – отдельный оператор). Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, имени процедуры и, заключенного в скобки, списка формальных параметров с указанием типа. Название «формальные» эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут поставлены конкретные значения. Тело процедуры – блок, по структуре аналогичный программе.

При создании программ, использующих процедуры, следует учитывать, что все объекты, которые описываются после заголовка в теле процедуры, называются локальными объектами и доступны только в пределах этой процедуры.

Все объекты, описанные в вызывающей программе, называются глобальными и являются доступными внутри процедур, вызываемых этой программой.

Общий вид описания процедуры:

Procedure <имя> (список формальных параметров, блок описания);

Const …; ù

… ý блок описания

Var ….; û

begin

<операторы>

end;

Пример: Вывести по четырем углам экрана свое имя цветными буквами, можно с эффектом мерцания.

Program names;

Uses crt;

Procedure name(x, y, c: byte, );

Begin

Gotoxy (x, y);

Textcolor(c); {textcolor (c+16);}

Write(‘Имя’);

end;

Begin

Clrscr; {очистка экрана}

name (2,2, 14);

name (2, 22, 8);

name (75,2, 3);

name (75, 22, 5);

End.

Пример: Найти наибольшее из четырех чисел, используя подпрограмму нахождения наибольшего из двух чисел.

Program max;

Uses crt;

Var a, b, c, d, m, p, q:real;

Procedure Bd(x,y:real, var z: real);

Begin

If x>y then z:=x

else z:=y;

end;

Begin

Clrscr; {очистка экрана}

Write(‘Введите числа’);

Readln(a,b,c,d);

Bd (a, b, p);

Bd (c, d, q);

Bd (p, q, m);

Writeln(‘наибольший элемент’, m:8:3);

End.

 

Функции

Функция - оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу.

Функция оформляется в следующем виде:

 

Function <имя функции>(формальные параметры: тип): тип значения функции;

Var

. . .

Begin

. . .

End ;

 

Вызывается функция по её имени с указанием фактических параметров.

Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.

Пример. Пусть требуется найти (x!-y!)*d!.

Напомним, что х! представляет собой произведение n чисел натурального ряда : х! = 1*2*3*......*х

 

Function fac(n:integer): integer;

Var

p,i: integer;

Begin

p:=1;

for i:=2 to n do

p:=p*i;

fac:=p;

End;

 

Вызвать можно так: f:=(fac(x)-fac(y))*fac(d).

Внимание! В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой - ее значение. Иначе, значение не будет определено.

 

Пример:Найти значение следующего выражения: F(t) – F(c), где F(x)=Öx +2x2 +3x

Program m;

Uses crt;

Var t, c, r : real;

Function F(x: real) : real;

Begin

F:= sqrt(x)+ 2*sqr(x) + 3*x;

End;

Begin

Clrscr;

Write(‘Введите числа’);

Readln (t, c);

r:= F(t) – F(c);

write(‘результат =’, r:8:3);

end.

Пример: Найти наибольшее из четырех чисел, используя подпрограмму нахождения наибольшего из двух чисел.

Program max;

Uses crt;

Var a, b, c, d, m, p, q:real;

Function Bid(x, y: real) : real;

Begin

If x>y then bid:=x

else bid:=y;

End;

Begin

Clrscr;

Write(‘Введите числа’);

Readln (a, b, c, d);

p:=bid(a, b);

q:= bid(c, d);

m:=bid(p, q);

write(‘наибольший элемент’, m:8:3);

end.

 

Практическая часть

Задание 1

1. Найти сумму цифр числа.

2. Найти первую цифру числа.

3. Найти количество делителей числа.

4. Найти числа из промежутка от А до В, у которых больше всего делителей.

5. Найти сумму всех делителей числа.

6. Определить, является ли число совершенным, то есть равно ли оно сумме своих делителей, кроме самого себя.

7. Определить, является ли число простым.

8. Среди чисел из интервала от А до В найти все простые.

9. Составьте программу, проверяющую, является ли число палиндромом (например, число 12421 - палиндром).

10. Определить, является ли число автоморфным, то есть квадрат этого числа заканчивается этим же числом, например, числа 6 и 25, т.к. их квадратами являются числа 36 и 625.

11. Написать функцию, которая вычисляет объем цилиндра. Параметрами функции должны быть радиус и высота цилиндра.

12. Написать функцию, которая возвращает максимальное из двух целых чисел, полученных в качестве аргумента.

13. Написать функцию, которая сравнивает два целых числа и возвращает результат сравнения в виде одного из знаков: >, < или =.

14. Написать функцию, которая вычисляет сопротивление цепи, состоящей из двух резисторов. Параметрами функции являются величины сопротивлений и тип соединения (последовательное или параллельное). Функция должна проверять корректность параметров: если неверно указан тип соединения, то функция должна возвращать -1.

 

Задание 2

1. Написать функцию Procent, которая возвращает процент от числа, полученного в качестве аргумента.

2. Написать функцию Dohod, которая вычисляет доход по вкладу. Исходными данными для функции являются: величина вклада, процентная ставка (годовых) и срок вклада (количество дней).

3. Написать функцию Giasn, которая возвращает значение True, если символ, полученный

4. Написать функцию вычисления факториала (факториалом целого числа п называется число, равное произведению целых чисел от 1 до n).

5. Даны отрезки a, b, c и d. Для каждой тройки этих отрезков, из которых можно построить треугольник, напечатать площадь данного треугольника. (Определить процедуру print_square (x, y, z), печатающую площадь треугольника со сторонами x, y, z, если такой треугольник существует.)

6. Даны длины a, b и c сторон некоторого треугольника. Найти медианы треугольника, сторонами которого являются медианы исходного треугольника. (Замечание: длина медианы, проведенной к стороне а, равна 0.5 * sqrt (2* b^2 + 2*c^2 - a^2))

7. Даны две квадратные вещественные матрицы 10-го порядка. Напечатать квадрат той из них, в которой наименьший след (сумма диагональных элементов), считая, что такая матрица одна.

8. Даны координаты вершин двух треугольников. Определить, какой из них имеет большую площадь.

9. Даны два числа. Поменять местами их значения. Написать процедуру, меняющую местами значения двух чисел через промежуточную переменную.

10. Составить программу, которая будет находить an, то есть n-ю степень числа a, где a и n – это целые числа и n > 0, вводимые с клавиатуры.

11. Составить программу, вычисляющую значение выражения

y = a1x4 + a2x3 + a3x2 + a4x + a5,

где коэффициент, a1, a2, a3, a4, a5 и x – это числа, вводимые с клавиатуры.

12. Составить программу, упорядочивающую значения трех переменных a, b, и c в порядке их возрастания.

13. Дано натуральное число, Найти все его делители. Подсчитать их число.

14. Даны координаты трех вершин треугольника. Найти длины всех его значений.

 

Обработка строк

 

В Pascal имеется два типа данных для работы с текстами:

1. сhar — литерный или символьный тип;

2. string — строковый тип или просто строка.

 

Символьный тип

Значением переменных символьного типа char является один символ. Каждому символу соответствует код символа ¾ целое число в диапазоне от 0 до 255. Из этого следует, что символьный тип является порядковым.

Над данными символьного типа определены следующие операции отношения: =, <>, <, >, <=, >=, вырабатывающие результат логического типа.

Для данных символьного типа определены следующие стандартные функции:

chr(x) — возвращает значение символа по его коду;

ord(ch) — возвращает код заданного символа ch;

pred(ch) — возвращает предыдущий символ;

succ(ch) — возвращает следующий символ;

upcase(ch) — преобразует строчную букву в заглавную. Обрабатывает буквы только латинского алфавита.

Пример:

ord('А')=65

chr(128)='Б'

pred('Б')='А'

succ('Г')='Д'

upcase('n')='N'

 

Строковый тип

Строка - это последовательность символов. Максимальное количество символов в строке (длина строки) может изменяться от 1 до 255. Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе объявления переменных.

 

Пример: Вывод строки в перевернутом виде и по отдельным словам

var s:string;

i:integer;

Begin

write('Введите строку');readln(s);

for i:=length(s) downto 1 do write(s[i]);

writeln;

for i:=1 to length(s)-1 do

if (s[i])=' ') and (s[i+1]<>' ') then writeln

else write(s[i]);

readln;

end.

Функции и команды обработки строк

Процедуры

Delete(Var S:String; N, М:Integer) Удаляет М символов из строки S, начиная с позиции N.

Insert(SubS: String; Var S:String; N:Integer) Вставляет подстроку SubS в строку S, начиная с позиции N.

Str(X:Integer; Var S:String) Возвращает представление числа Х в его символьной форме S.

Val(S:String; Var Х, Code: Integer) Возвращает представление символов строки S в ее числовой форме Х. Параметр Code содержит признак ошибки преобразования (если Code = (), ошибки нет).

 

Функции

Chr(X:Byte):Char Возвращает символ с заданным порядковым номером Х.

Concat(S1[, S2, ..., SN]) :String Выполняет сцепку (конкатенацию) последовательности строк.

Copy(S:String; N, М:Integer):String Возвращает подстроку из строки S, начиная с позиции N и длиной М символов.

Length(S: String):Byte Возвращает количество символов в строке S.

Ord(X:Char):LongInt Возвращает порядковый номер символа Х в таблице кодов символов.

Pos(SubS, S: String):Byte Возвращает номер позиции, начиная с которой в строке S располагается подстрока SubS (если значение функции равно нулю, то S не содержит SubS).

 

Пример. Определить, сколько раз в данной строке встречается символ «а».

Решение. Опишем функцию, которой будем передавать строку. Результат выполнения — целое число.

Function Q Ch (st: String): Byte;

Var i, k: Byte;

Begin

k:=0; (просматриваем все символы строки, их число равно длине строки, если очередной символ равен 'а', увеличиваем счетчик)

For i:=1 To Length(st) Do If st[i]='а' Then Inc(k);

Q_Ch:=k;

End;

 

Пример. Если длина строки нечетное число, то удалить среднюю букву.

Решение. Пусть k — это длина строки, если оно нечетное, то надо удалить средний символ, а его номер равен k Div 2+1.

Procedure Del (Var st: String);

Var k: Byte;

Begin

k:=Length(вц р

If k mod 2=1 then Delete (st, k Div 2+1, 1);

End;

 

Пример. Заменить все вхождения подстроки 'del' на 'Insert'.

Решение. Пока такая подстрока встречается, необходимо находить номер первого символа первой встречи, удалять в этом месте ' del ' и сюда вставлять ' Insert '.

Procedure Ins (Var st: String);

Var k: Byte;

Begin

While Pos('del',st)<>0 Do

Begin

k: =Pos { ' de 1 ', st);

Delete (st, k, Length ( 'del ' ) );

Insert ( ' Insert ', st, )с) у

End;

End;

 

Пример. Дана строка, состоящая из нескольких слов, между словами стоит один пробел, в конце предложения — точка. Подсчитать число слов и вывести на экран только те из них, которые начинаются с буквы «а» (слов не больше 30).

Решение. Разобьем предложение на отдельные слова и каждое будем хранить как элемент массива.

 

Program Example ;

Const n=30;

Туре Myarray Str=Array[1..n] Of String;

Var А: Myarray Str;

str: String[255];

k: Byte;

Procedure Init (Var b: Myarray Str);

Var i: Integer;

Begin

k:=1; {пока не встретится пробел, формируем очередное слово k, прибавляя по одной букве)

For i:=1 То Length(str)-1 Do

If str[i]<>’ ‘ then b[k]:=b[k]+str[i]

Else

{если это не последний символ, то увеличиваем счетчик слов и начинаем формировать соответствующий элемент массива}

If i<>Length(str)-1 Then

Begin Inc(k); b[k]:='' End;

End;

Begin

Writeln('Введите предложение');

Readln{str);

Init (А) р

Writeln('Всего слов: ',k); {просматриваем все слова,если первый символ очередного слова есть 'а', то выводим его}

For i:=1 То k Do If A[i] [1]='а' Then Write (A[i], ' ');

Readln;

End.

 

Практическая часть

Задание 1Составьте программу для обработки строки текста, введенной с клавиатуры. Все слова в строке разделены пробелами. Полученные результаты выведите на экран.

1. Выполните вывод строки текста, последовательно сокращая ее каждый раз на один символ, до тех пор, пока в строке не останется последний.

2. В заданной строке текста удалите первое и последнее слово. Учтите, что в начале и конце строки могут быть пробелы.

3. В заданной строке текста выведите самое короткое (длинное) слово. Учтите, что таких слов может быть несколько. Удалите (удвойте) эти слова.

4. В заданной строке текста удалите первое слово, начинающееся на заданную букву. Буква задается при помощи оператора ввода.

5. В заданной строке текста необходимо выбрать все цифры и записать их в массив. Подсчитайте количество цифр.

6. В заданной строке текста определите наибольшее количество цифр, идущих в ней подряд.

7. В заданной строке текста определите число групп символов и число групп цифр.

8. В заданной строке текста определите слова, которые начинаются и заканчиваются на одну и ту же букву.

9. В заданной строке текста определите число различных букв.

10. Дана произвольная строка текста. Выясните, является ли она палиндромом, т. е. читается ли строка слева направо так же, как и справа налево, например: ПОТОП, НАГАН.

11. Дана произвольная строка текста. Выполните сортировку ее символов в порядке возрастания их номеров в таблице ASCII. Например, если введено: 'CBA', в результате должно быть получено 'ABC'.

12. Заданы фамилия, имя и отчество человека, разделенные пробелами. Напечатайте его фамилию и инициалы, заканчивающиеся точками.

13. Для каждого слова текста укажите долю согласных. Определите слово, в котором эта величина минимальна.

14. Составьте программу, записывает прописью данное число, не превосходящее 1000.

Задание 2

1. Даны два слова. Составьте программу, определяющую можно или нет из букв слова А составить слово В.

2. Составьте программу шифрования текстового сообщения. Можно использовать простейший способ шифрования, при котором шифровальщик задает ключ шифровки — целое число, определяющее величину смещения букв русского алфавита. Например, при значении ключа равном 3, в тексте буква а меняется на г и т.д. Составьте программу дешифрования текстового сообщения, зашифрованного вашей программой.

3. Из строки удалить среднюю букву, если длина строки нечетная, если четная удалить две средние буквы. Заменить все вхождения в текст некоторой буквы на другую букву (их значения вводить с клавиатуры).

4. Заменить все вхождения подстроки Str l на подстроку Str2 (подстроки вводятся с клавиатуры).

5. Даны две строки. Если они начинаются с одинаковых символов, то напечатать «ДА», в противном случае — «НЕТ».

6. Дана последовательность слов. Напечатать все слова, отличные от слова «hello».

7. Дана последовательность слов. Напечатать все слова в алфавитном порядке.

8. Дана последовательность слов. Напечатать все слова последовательности, которые встречаются в ней по одному разу.

9. Дано предложение. Напечатать все различные слова.

10. Дана последовательность слов. Напечатать все слова, предварительно преобразовав каждое из них по следующему правилу:

a) удалить из слова все предыдущие вхождения последней буквы;

b) оставить в слове только первые вхождения каждой буквы.

11. Дана последовательность слов. Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству:

a) в слове нет повторяющихся букв',

b) буквы слова упорядочены по алфавиту;

c) слово совпадает с начальным отрезком латинского алфавита (а, ab, abc, abed, ...);

d) слово симметрично.

12. Составить программу вывода самой большой цифры в записи заданного числа.

13. Найти сумму всех чисел строки.

14. Подсчитать, сколько раз в данной строке встречается некоторая буква, вводимая с клавиатуры.