Главная Обратная связь Поможем написать вашу работу!

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Общие теоретические сведения. Тема: Работа со строковыми переменными



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

 

Тема: Работа со строковыми переменными

Цель:овладение навыками корректного построения алгоритмов обработки стоковых переменных и написания программного кода в соответствии с заданной задачей и овладение профессиональными компетенциями (ПК):

ПК 1.1. Выполнять разработку спецификаций отдельных компонент.

ПК 1.2. Осуществлять разработку кода программного продукта на основе готовых спецификаций на уровне модуля.

Оснащение:

- конспекты лекций по УД «Основы программирования»;

- методические указания по выполнению лабораторно-практический работ;

- персональный компьютер.

 

Общие теоретические сведения

Переменные типа String аналогичны массивам типа Char. Их отличием является то, что число символов (длина строки) может динамически меняться в интервале от единицы до заданного верхнего значения.

Тип String (строка) в Турбо Паскале широко используется для обработки текстов. Этот тип является стандартным и во многом похож на одномерный массив символов Array [0..N] of Char. Значение N соответствует количеству символов в строке и может меняться от 0 до 255. Символы, входящие в строку, занимают позиции с 1 до N. Начальный байт строки с индексом 0 содержит информацию о ее длине, т.е. это символ с кодом, равным длине строки.

Можно, также описывать переменные типа String[K], где K - целое число не больше 255. Так определяются строки с длиной не больше K. Этот тип уже не является стандартным. С символами строки можно работать как с элементами массива из символов, но в отличие от массивов, строки можно вводить целиком, сравнивать друг с другом и сцеплять операцией "+".

Сравнение строк выполняется посимвольно в соответствии с их кодами до первого несовпадения. Если одна из строк закончилась до первого несовпадения, то она считается меньшей. Пустая строка меньше любой строки. ПРИМЕР: Сравнение строк.

'abcd' > 'abcD' { 'd'>'D' }

'abcd' > 'abc' { 'd'>'' }

'abc' < 'axxc' { 'b'<'x' }



'abcd' = 'abcd'

Переменная строкового типа (String) может рассматриваться как массив элементов символьного типа (Char). Например, если в программе определены переменные S: string; C: char; и задано S:='Москва', то S[1]='М', S[2]='о' и т. д. и возможно присвоение, например: C:= S[1]; Таким образом строка может рассматриваться как линейный массив символов. Элементы массива, составляющие строку можно переставлять местами и получать новые слова, например:

for i:= 1 to N div 2 do

begin

C:= S[i];

S[i]:= S[N-i+1];

S[N-i+1]:= C

Writeln(S);

end; { исходное слово выведется справа налево: "авксоМ" }

Здесь N:= ord(S[0]); - число символов в переменной "S" хранится в переменной S[0]. Функция "ord" преобразует символьный тип в целый. N div 2 - количество перестановок для слова из "N" символов. В переменной "C" запоминается значение i-го элемента, который меняется с элементом, симметричным относительно середины строки.

Можно производить поиск и замену заданного символа в строке, например:

for i:=1 to N do if S[i]=' ' then writeln ('найден символ пробел');

for i:=1 to N do if S[i]='/' then S[i]:='\'; {замена символа "/" на "\"}

Заменяя или переставляя символы в строке по определенной схеме (закону) можно зашифровать строку. Для дешифровки используется, как правило, схема обратной перестановки или замены символов. Например:



for i:=1 to N do S[i]:= chr(ord(S[i])+2); {преобразование исходных символов в символы с кодом большим на две единицы}

Напомним, что все используемые в символы имеют ASCII коды от 0 до 255. Здесь удобно также использовать функции Pred(C); и Succ(C);

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

Функция Length(s) выдает длину строки s.

Функция Concat(s1,s2,..,sn) возращает строку s1+s2+..+sn.

Функция Copy(s,p,k) возвращает фрагмент строки s, который начинается в позиции p и имеет длину k.

Функция Pos(s1,s) ищет первое вхождение подстроки s1 в строку s и возвращает номер первого символа s1 в строке s или 0 если не нашли.

Процедура Delete(s,p,k) удаляет из строки s фрагмент, который начинается в позиции p и имеет длину k.

Процедура Insert(s,s1,p) вставляет в строку s1 подстроку s, начиная с заданной позиции p.

Турбо паскаль позволяет производить преобразования числовых значений в строковые и наоборот. Для этого используются процедуры Str(X:n:d,S) и Val(S,X,e). Первая получает их числа X строку S с изображением этого числа, в которой не менее n символов и из них d знаков после запятой. Параметры n и d необязательные. Вторая процедура получает из строки S число X. При успешном результате e=0.

ПРИМЕР: Работа со строками.

var s,x,y,z : string;

begin

x := 'turbo';

y := 'pascal';

z := x+' '+y; { z='turbo pascal' }

s := ''; { пустая строка }

for c:='a' to 'z' do s:=s+c; { s='abcd..xyz' }

writeln(s);

end.

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

1) разработать словесный алгоритм задачи;

2) написать программу решения задачи на языке Pascal.

Пример1. Дан текст, слова в котором, могут разделяться пробелами, запятыми, точками и т.д. Требуется напечатать все слова с удвоенной буквой "н".



Этапы решения задачи:

Словесный алгоритм решения задачи

1. Формирование тела программы, объявление переменных;

2. Ввод текста;

3. Очистка текста от "ненужных" символов до первого слова;

4. Вычисление длины первого слова;

5. Поиск в слове буквы "н";

6. Подсчет стоящих рядом букв "н";

7. Печать найденного слова;

8. Удаление первого слова;

9. Если текст не закончился возвращение к пункту (в).

Реализуем данный алгоритм на Pascal

1) program example1;

var st, st1:string;

i,j,k,n:integer;

flag:boolean;

const

znak=[' ','.',',',':',';','!','?'];

begin

end.

Назначение переменных:

t- содержит введенный текст

st1 - хранит первое слово текста

i,j,k,n - вспомогательные переменные

flag - указывает, что данное слово искомое

2) writeln('Введите текст');

readln(st);

3) repeat

while st[1] in znak do delete(st,1,1);

4) i:=1 while (not (st[i] in znak)) and (i<=length(st)) do inc(i);

st1:=copy(st,1,i-1);

flag:= false;

5) while (pos('н',st1)>0) and (not flag) do begin

6) j:=pos('н',st1); n:=j; k:=0;

while st1[n]='н' do begin inc(n); inc(k); end;

if k=2 then flag:= true;

delete(st1,j,k)

end;

7) if flag then writeln(copy(st,1,i-1));

8) delete(st,1,i);

9) until st='';

Приведем программу целиком:

program example1;

var st, st1:string;

i,j,k,n:integer;

flag:boolean;

const

znak=[' ','.',',',':',';','!','?'];

begin

writeln('Введите текст');

readln(st);

repeat

while st[1] in znak do delete(st,1,1);

i:=1;

while (not (st[i] in znak)) and (i<=length(st)) do inc(i);

st1:=copy(st,1,i-1);

flag:= false;

while (pos('н',st1)>0) and (not flag) do begin

j:=pos('н',st1); n:=j; k:=0;

while st1[n]='н' do begin inc(n); inc(k); end;

if k=2 then flag:= true;

delete(st1,j,k)

end;

if flag then writeln(copy(st,1,i-1));

delete(st,1,i);

until st='';

readln;

end.

Ход работы:

Решить задачу на ПК.

1. Дана строка-предложение на русском языке. Подсчитать количество содержащихся в строке знаков препинания.

2. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые a) начинаются и заканчиваются одной и той же буквой б) содержат хотя бы одну букву "А".

3. Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1.

4. Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2.

5. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого короткого и длинного слова.

Контрольные вопросы:

1. Как описываются строковые переменные?

2. Какая максимальная длина строки допустима в Pascal?

3. Какие операции допустимы над строковыми данными?

4. В чем отличие строковой переменной от массива символов?

5. Какие стандартные процедуры и функции для работы со строками вы знаете?

6. Что выведет функция Copy (x,Pos(' ',x)+1,18), если x='Сила есть - ума не надо'?

7. Чему равно значение x[0] после присваивания x:='вопрос'?

Результат деятельности:защита лабораторной работы и ответы на контрольные вопросы.

Критерии оценки:

- оценка «5» ставиться за корректно построенный алгоритм 2 задач и за правильные ответы контрольных вопросов.

- оценка «4» ставиться за корректно построенный алгоритм 1 задачи и за правильные ответы контрольных вопросов, или за корректно построенный алгоритм 2 задач с небольшими недочетами и за правильные ответы контрольных вопросов, или за корректно построенный алгоритм 2 задач с не полными ответами на контрольные вопросы.

- оценка «3» ставиться за корректно построенный алгоритм 1 задачи и за правильные ответы контрольных вопросов, или за корректно построенный алгоритм 1-2 задач с недочетами и за правильные ответы контрольных вопросов, или за корректно построенный алгоритм 1-2 задач с не полными ответами на контрольные вопросы.

- оценка «2» ставиться за не корректно построенные алгоритмы и за не правильные ответы на контрольные вопросы.


Просмотров 442

Эта страница нарушает авторские права




allrefrs.ru - 2021 год. Все права принадлежат их авторам!