Скачиваний:
47
Добавлен:
10.02.2014
Размер:
87.55 Кб
Скачать

11

Министерство образования Российской Федерации

Саратовский государственный технический университет

Обработка строковых массивов

на языке TURBO PASCAL

Методическое указание

к выполнению лабораторной работы

по курсу «Программирование и основы алгоритмизации»

для студентов специальности 2101

Одобрено

Редакционно-издательским советом

Саратовского государственного

технического университета

Балаково 2005

ОСНОВНЫЕ ПОНЯТИЯ

Для хранения и обработки символов используются переменные типа Char. Значением переменной символьного типа может быть любой отображаемый символ:

-буква русского или латинского алфавитов;

-цифра;

-знак препинания;

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

Имя переменной: char;

Примеры:

otv: char;

ch: char;

Как и любая переменная программы, переменная типа char может получить значение в результате выполнения инструкции присваивания. Если переменная типа char получает значение в результате выполнения операции присваивания, то справа от знака := должно стоять выражение типа char, например, переменная типа char или символьная константа — символ, заключенный в кавычки.

В результате выполнения инструкций c1 := '*';

с2 := c1;

переменная c1 получает значение присваиванием значения константы, а переменная с2 — присваиванием значения переменной cl (предполагается, что переменные c1 и с2 являются переменными символьного типа).

Переменную типа char можно сравнить с другой переменной типа char или с символьной константой. Сравнение основано на том, что каждому символу поставлено в соответствие число (см. приложение 2), причем символу 'о' соответствует число меньшее, чем символу У, символу 'А' — меньшее, чем 'в', символу V — меньшее, чем а. Таким образом, можно записать:

'0'<'1'<..<'9'<..<'A'<'B'<..<'Z'<'a'<'b'<..<'z'

Символам русского алфавита соответствуют числа большие, чем символам латинского алфавита, при этом справедливо следующее:

'А'<'Б'<'В'<..<'Ю'<'Я'<'а'<'б'<'в'<...<'э'<'ю'<'я'

Пример : Ввести символ с клавиатуры, проверить, является ли он буквой «а».

program Bukva;

var a : char;

begin

WriteLn('Введите символ');

ReadLn(a);

if a='a' then Writeln('Это буква а')

else Writeln('Это не буква а');

end.

Работа со строками

Тип STRING (строка) в Турбо Паскале широко используется для обработки текстов. Он во многом похож на одномерный массив символов

ARRAY[O..N] OF CHAR,

Однако, в отличие от последнего, количество символов в строке-переменной может меняться от 0 до N, где N - максимальное количество символов в строке. Значение N определяется объявлением типа STRING [N] и может быть любой константой порядкового типа, но не больше 255 . Турбо Паскаль разрешает не указывать N, в этом случае длина строки принимается максимально возможной, а именно N=255 .

Строка в Турбо Паскале трактуется как цепочка символов. К любому символу в строке можно обратиться точно так же, как к элементу одномерного массива

Например:

var 

st : String; 

begin

.....

if st[5] = 'A' then... 

end.

Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки, первый значащий символ строки занимает второй байт и имеет индекс 1. Над длиной троки можно осуществлять необходимые действия и таким способом изменять длину. Например, удалить из строки все ведомые пробелы можно следующим образом:

var

st : String; 

i : Byte;

begin

i := ord(st [0] ) ; {i - текущая длина строки

while (i <> 0) and (st[i] = ' ') do 

begin 

i:=i-1;

st[0] := chr(i) 

end;

.....

end.

Значение ORD(st[0]) , т.е. текущую длину строки, можно получить и с помощью функции LENGTH(st)

Например:

while (Length(st)<>0) and (st[Length(st)]=' ') do 

st[0] := chr(Length(st)-1)

К строкам можно применять операцию «+» - сцепление, например:

st := 'а1 + 'b'; 

st := st + 'с'; {st содержит "abc"}

Если длина сцепленной строки превысит максимально допустимую длину N, то «лишние» символы отбрасываются. Следующая программа, например, напечатает символ 1:

program Dlina;

var st: String [1] ; 

begin

St:='123'; 

WriteLn(st) 

end.

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

стандартных процедур и функций

CONCAT(S1 [,S2, ... , SN] ) - функция типа STRING; возвращает строку, представляющую собой сцепление строк-параметров SI, S2, ..., SN.

COPY(ST, INDEX, COUNT) - функция типа STRING; копирует из строки ST COUNT символов, начиная с символа с номером INDEX.

DELETE (ST, INDEX, COUNT) - процедура; удаляет СОUNT символов из строки ST, начиная с символа с номером INDEX.

INSERT (SUBST, ST, INDEX) - процедура; вставляет подстроку SUBST в строку ST, начиная с символа с номером INDEX.

LENGTH (ST) - функция типа INTEGER; возвращает длину строки ST.

POS (SUBST, ST) - функция типа INTEGER; отыскивает в строке STпервое вхождение подстроки SUBST и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращается ноль.

STR(X [; WIDTH [: DECIMALS] ], ST) - процедура; преобразует число X любого вещественного или целого типов в строку символов ST так, как это делает процедура WRITELN перед выводом; параметры WIDTH и DECIMALS, если они присутствуют, задают формат преобразования: WIDTH определяет общую ширину поля, выделенного под соответствующее символьное представление вещественного или целого числа X, a DECIMALS - количество символов в дробной части (этот параметр имеет смысл только в том случае, когда Х- вещественное число).

VAL(ST, X, CODE) - процедура; преобразует строку символов ST во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной; параметр CODE содержит ноль, если преобразование прошло успешно, и тогда в X помещается результат преобразований, в противном случае он содержит номер позиции в строке ST, где обнаружен ошибочный символ, и в этом случае содержимое Х не меняется; в строке ST могут быть ведущие пробелы, однако ведомые пробелы недопустимы; например, обращение val (' 123',k,i) пройдет успешно: k получит значений 123, в i будет помещен 0, в то время как обращение val (' 123 ' , k, i) будет ошибочным: значение k не изменится, a i будет содержать 4.

UPCASE (СН) - функция типа CHAR; возвращает для символьного выражения СН, которое должно представлять собой строчную латинскую букву, соответствующую заглавную букву; если значением СН является любой другой символ (в том числе строчная буква русского алфавита), функция возвращает его без преобразования.

Var х : Real;  у : Integer; 

st,st1: String; 

begin

st := concat('12','345'); {строка st содержит 12345} 

st1 := copy(st,3,Length(st)-2); {st1 содержит 345}

insert('-',st1,2); {строка st1 содержит 3-45} 

delete(st,pos('2',st),3); {строка st содержит 15} 

str(pi:6:2,st); {строка st содержит 3.14} 

val('3,1415' ,x,y) ; {у содержит 2, х остался без изменения}

end.

Операции отношения =, о, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением СНR(0) .

Следующие операции отношения дадут значение TRUE:

'''' < ' . '

'А' > '1'

'Turbo' <' Turbo Pascal'

'Паскаль' >'Turbo Pascal'

Примеры решения задач

Пример 1. Заменить в строке все буквы «о» на пробелы:

program lab9;

var str : string;

i : integer;

begin

WriteLn('Введите строку');

ReadLn(str);

for i:=1 to length(str) do if str[i]='o' then str[i]:=' ';

WriteLn(str);

end.

Пример 2. Удалить все цифры из строки и вывести результат на экран:

program BezZifr;

var str1, str2 : string;

i : integer;

begin

Read(str1); //вводим строку

str2 := '';

for i:=length(str1) downto 1 do //перебираем символы с последнего к первому

if (ord(str1[i])>=48) and (ord(str1[i])<=57) then //если i-й символцифра

begin

str2 := str1[i] + str2; //записываем в новую строку

Delete(str1,i,1); //удаляем из старой

end;

WriteLn(str1); //выводим на экран обе строки

WriteLn(str2);

end.

Пример 3. Посчитать и вывести на экран сколько каких слов в строке:

program slova;

label m1,m2;

var str,slovo : string;

i,p,kol : integer;

function kolslov(stroka : string; slovo : string) : integer; //функция, определяет сколько/раз строка slovo встречается в строке stroka

label n;

var i,j,kolich : integer;

begin

kolich := 0; //обнуляем счетчик

for i:=1 to length(stroka) do begin //перебираем все символы в строке

проверяем на совпадение первого символа и хватит уместится ли в строке

if (stroka[i]=slovo[1]) and ((length(stroka)-i+1)>=length(slovo)) then begin //проверяем остальные симолы на совпадение

for j:=i to i+length(slovo)-1 do

if stroka[j]<>slovo[j-i+1] then goto n;

if i<>1 then if stroka[i-1]<>' ' then goto n;

if (i+length(slovo)-1)<>length(stroka) then if stroka[i+length(slovo)]<>' ' then goto n; //если все буквы совпали, увеличиваем счетчик

kolich:=kolich+1;

end;

//к этой метке переходим, если не совпали все буквы

n:

end;

kolslov:=kolich; //возвращается значение счетчика

end;

begin

WriteLn('Bведите строку');

Read(str);

p:=1; //переменная, в которой будет храниться номер символа

m1:

for i:=p to length(str) do //исключаем пробелы и ищем слово

if str[i]<>' ' then Break;

p:=i;

slovo := ''; //обнуляем слово

for i:=p to length(str) do

begin

if str[i]<>' ' then slovo := slovo + str[i] //записываем слово в переменную

else Break;

end;

p:=i;

if kolslov(Copy(str,1,p),slovo)=1 then //проверяем, не встречали ли это слово раньше

begin

kol:=1+kolslov(Copy(str,p,length(str)-p+1),slovo); //считаем количество таких слов

WriteLn(slovo+' - ',kol:4); //выводим на экран

end;

if p<>length(str) then goto m1; //если строка не кончилась, повторяем все с метки m1

m2:

end.

ВАРИАНТЫ ЗАДАНИЙ

  1. Посчитать в строке количество букв «а».

  2. Вывести на экран все четные символы строки.

  3. Поменять в строке местами первый и последний символы.

  4. Посчитать количество заглавных букв в строке.

  5. Вывести на экран порядковые номера всех цифр в строке.

  6. Вставить в строку после каждого символа пробел. Вывести на экран результат

  7. Посчитать количество гласных в строке

  8. Удалить все пробелы из строки и вывести результат на экран

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

  10. Разбить строку на три: состоящую из русских букв, состоящую из английских букв и состоящую из остальных символов данной строки.

  11. Посчитать количество слов в строке и вывести длину каждого слова.

  12. Заменить все символы в каждом третьем слове строки на зглавные.

  13. Посчитать сумму всех цифр в строке

  14. Посчитать и вывести на экран сколько каких букв в строке.

  15. Упорядочить символы в строке по их номеру по возрастанию.

  16. Найти в строке слова, являющиеся перевертышами, то есть те которые читаются слева направо и справа налево одинаково. Например «комок».

  17. Даны две строки. Удалить из второй строки все символы, которые встречаются в первой и поместить их в третью строку. Вывести на экран обе получившихся строки.

  18. Найти количество слов в строке, сравнить их между собой и вывести на экран по возрастанию

  19. Вводятся два слова. Проверить, являются ли они анаграммой, то есть можно ли из всех букв первого слова, составить второе слово.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТ

Порядковый номер студента по списку группы соответствует номеру варианта. По проведенному заданию требуется:

  1. Определить порядок реализации вычислений.

  2. Составить графическую схему алгоритма.

  3. Записать программу на языке Turbo Pascal.

  4. Выполнить расчеты на ЭВМ.

  5. Написать отчет по лабораторной работе.

СОДЕРЖАНИЕ И ОФОРМЛЕНИЕ ОТЧЕТА

ПО ЛАБОРАТОРНОЙ РАБОТЕ

Отчет оформляется в текстовом редакторе Word и должен содержать:

  1. Название лабораторной работы.

  2. Формулировку цели работы.

  3. Задание.

  4. Графическую схему алгоритма с учетом требований ГОСТ 19.002 – 80 и ГОСТ 19.003 – 80.

  5. Программу на языке Turbo Pascal.

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

ЛитЕратура

  1. Алексеев В.Е. и др. Вычислительная техника и программирование. Практикум по программированию: Практ. пособие/Под ред. А. В. Петрова.-М:Высш. шк., 1991.

  2. Зуев Е.А. Язык программирования Turbo Pascal 6.0, 7.0.- М.: Веста, Радио и Связь, 1993.

  3. Бородич Ю.С., А.Н. Вальвачев, А. И. Кузьмич. Паскаль для персональных компьютеров: Справ. Пособие/– Мн. : Высш. шк. : БФ РИТМП “НИКА”, 1991.

ВРЕМЯ., ОТВЕДЕННОЕ НА ЛАБОРАТОРНУЮ РАБОТУ

Подготовка к работе - 1 академ. ч.

Выполнение работы - 1 академ. ч.

Расчеты на ЭВМ - 1 академ. ч.

Оформление работы - 1 академ. ч.

Обработка строковых массивов

на языке TURBO PASCAL

Методические указания

к выполнению лабораторной работы

по курсу “Программирование и основы алгоритмизации”

для студентов специальности 210100.

Составила: Стельмах И.В.

Рецензент:

Редактор:

Соседние файлы в папке методические указания для лабораторных работ