Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Тема. Решение задач на строковый тип.

Читайте также:
  1. Antrag auf Erteilung einer Aufenthaltserlaubnis - Анкета для лиц, желающих получить разрешение на пребывание (визу)
  2. I. 1.1. Пример разработки модели задачи технического контроля.
  3. I. 3.1. Двойственная задача линейного программирования.
  4. I.2. Структура оптимизационных задач
  5. I.5.3. Подготовка данных для задачи линейного программирования.
  6. I.5.4. Решение задачи линейного программирования.
  7. I.5.5. Просмотр и анализ результатов решения задачи.

Занятие - 1.

Тема. Символьный и строковый типы.

1) Тип Char — стандартный символьный тип. Значение типа char - это непустой символ из алфавита ПК, заключенный в одинарные кавычки, например ‘а‘, ‘7‘ и т. д. - классическая форма записи символов.

Каждому символу приписывается целое число в диапазоне 0...255. Это число в служит кодом внутреннего представления символа, для кодировки используется код ASCII. Это 7- битный код, т.е. с его помощью можно закодировать лишь 128 символов от 0 до 127.

В 8-битном байте, отведенном для хранения символов с Т. Паскале, можно закодировать в два раза больше от 0 до 255.

Первая половина символов соответствует стандарту ASCII. Вторая половина может иметь различные значения для разных ПК.

Т.о. существует ещё две записи символьных величин: представление символа кодом ASCII и с помощью специального префикса #, например:

#97=chr(97)='a',

#32=chr(32)=' ';(пробел)

Рассмотреть таблицу кодов ASCII.

2) Строковый тип (string) - динамическая переменная, т.к. может иметь различные длины в пределах объявленных границ.

Например: st32: string[32];

st: string[255];

описание string без объявления длины, отводит место в 255 символов, это базовый строковый тип, он совместим со всеми производными строковыми типами.

При попытке записать переменную строку длинее, чем объявлено в описании "лишняя " часть будет отсечена.

Значением строки может быть любая последовательность символов заключенная в кавычки ‘фы78рп‘ и т.п..

В строку можно включать символы в записи по ASCII - коду, через префикс #.

Например:

#179'Номер п/п '#179'ФИО'#179'Должность'#179 (код 179 вертикальна черта).

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

Строки можно рассматривать как массив символов. Символ из строки можно изъять по его номеру, например:

st:='asdfg';

st[4]:='f';

 

3) Операции над символами.

Символы можно присваивать и сравнивать друг с другом. При сравнении символы считаются равными, если равны их ASCII коды, и один больше другого. Если имеет больший ASCII- код.

Например:

'R'< 'r';

'N'= 'N';

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

chr(x:byte): char - возвращает символ ASCII-кода x;

ord(c:char):byte - возвращает ASCII -код символа c;

pred(c:char):char - выдает предшествующий c символ;

succ(c:char):char - выдает последующий за c символ;

upcase(c:char):char - переводит символы 'a',...,'z' в верхний регистр 'A',...,'Z'.

 

4) Операции над строками.

Строки можно присваивать, сливать, сравнивать.

Слияние строк записывается в естественном виде, применяя знак "+". Если сумма получается длинее, чем описана длина левой части оператора присваивания, то излишек отсекается.

Пример:

st1:=‘F1-‘;

st2:=‘Help‘;

st3:=st1+st2; {F1- Help}.

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

Например:

'asdf '= 'asdf ';

'asdf '> 'asdF ';

' aBcg '< 'ab ';

' ' > ''.

 

5) Обобщить тему.

Решение задач.

1) Значениями литерных переменных c2,c1,c0 являются цифры. Присвоить целой переменной k число, составленное из этих цифр (например, если c2='8', c1='0', c0='5', то k=805);

Решение.

При решении задачи применить значения ASCII- кодов, функцию ord.

Ord('0')=32; ord('8')= 40; ord('5')=37;

 

Var

c0,c1,c2:char;

k,n0: integer;

begin

readln(c2,c1,c0);

n0:= ord('0');

k:= 100*(ord(c2) - n0) + 10*(ord(c1) - n0) + (ord(c0) - n0);

writeln('k=',k);

end.

 

2) Присвоить литерным переменным с2, с1, с0 соответственно левую, среднюю и правую цифры трехзначного числа k.

Решение.

При решении использовать ASCII- коды, функцию chr, ord.

Var

c0,c1,c2:char;

k,n0,d:integer;

begin

readln(k);

n0:=ord('0');

d:=k div 100; c2:=chr(n0+d);

d:=k mod 100 div 10; c1:= chr(n0 +d);

d:= k mod 10; c0:= chr(n0 + d);

write(c2,' ',c1,' ',c0);

end.

Задание на дом:

1) Вычислить s- сумму порядковых номеров всех букв, входящих в слово SUM.

2) Определить, является ли заданный текст состоящий из 16 символов правильной записью целого числа (возможно, со знаком).

3) Текст состоит из 8 цифр. Проверить является ли этот текст арифметической прогрессией.

 

Фрагменты решений.

1) begin

s:= ord('s') + ord('u')+ ord('m');

write(s);

end.

2) begin

readln(st);

flag:=true;

if (ord(st[1])=43) or (ord(st[1]=45) or ((ord(st[1])>=49) and ord(st[1]<=57))

then

begin

for i:= 2 to 16 do

if (ord(st[i])<48) or (ord(st[i]>57) then

begin

writeln('не является правильной записью целого числа');

exit;

flag:=false;

end;

end

else write('no');

if flag then writeln('yes');

end.

 

3) begin

readln(st);

n0:= ord('0');

d:=(ord(st[2] - n0] - (ord(st[1]) - n0);

for i:= 2 to 7 do

begin

k:=(ord(st[i+1] - n0) - (ord(st[i])- n0);

if d<> k then

begin

write('no');

exit;

end;

end;

writeln('арифм. Прогрессия');

end.

 

Занятие - 2.

Тема. Строковые процедуры и функции.

Разбор домашнего задания.

Основной теоретический материал.

1. Функция Length(s:string):byte - выдает текущую длину строки. Вместо неё можно пользоваться конструкцией ord(s[0]), что то же самое.

2. Функция Concat - производит слияние строк. Вместо неё можно пользоваться операцией "+".

3. Функция copy(s:string; start,len:integer):string - позволяет выделить из строки s последовательность из len символов начиная с символа start.

Например:

s:='asdfgj';

st:= copy(s,2,3); {st='sdf'}

4. Процедура delete(s:string;start,len:integer) - видоизменяет строку s, стирая len символов, начиная с символа start.

Например:

s:='widows';

delete(s,3,2); {s:='wiws'}

4. Процедура insert(st,s:string;start:integer) - вставляет подстроку st в строку s начиная с позиции start (процедура противоположная delete).

5. Функция Pos(Subs, S: string):byte - возврвщает номер символа в строке S, с которого начинается включение в S подстроки subs.

 

Подробно разобрать несколько упражнений.

1) Дана строка символов, в которой есть хотя бы одно вхождение 'abc'. Все вхождения 'abc' заменить на 'def''.

2) Дан текст между словами которого стоят запятые в конце текста точка. Подсчитать количество слов оканчивающихся на букву 'q'.

Решение.

1. program upr1;

var

k,i: byte;

st, st1: string;

begin

readln(st);

k:=1;

st1:='def';

for i:=1 to length(st) - 3 do

begin

if copy(st,k,3)='abc' then

begin

delete(st,k,3);

insert(st1,st,k);

end;

k:=k+1;

end;

writeln(st);

end.

 

 

2. readln(st);

for i:=1 to ord(st[0]) do

begin

x:=copy(st,i,1);

if x=',' or x= '. ' Then

if copy(st,i-1,1)='q' then k:=k+1;

end;

writeln('k=',k);

Следующие задачи решить самостоятельно.

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

2. В заданном тексте все встретившиеся буквы 'a' удалить, а буквы 'd' удвоить.

3. В заданный непустой текст входят только цифры и буквы. Определить, удовлетворяет ли он следующему свойству: текст начинается с k букв (1<=k<=9), за котором следует только одна литера - цифра с числовым значением k.

 

Решения.

1. readln(st);

s:=st[1];

for i:=2 to ord(st[0]) do

begin

x:=copy(st,i,1);

if (x=',') or (x='.') then

if st[i-1]=s then k:=k+1;

if (x:=',') or (x:='.') then s:=st[i+1];

end;

writeln(k);

 

2. readln(st);

i:=1;

while i <= length(st) do

begin

if st[i]='a' then delete(st,i,1);

if st[i]='d' then

begin

insert('d',st,i+1)

k:=k+2;

end

else k:=k+1;

end;

writeln(st);

 

3. var

st:string;

i,j,k,l:integer;

begin

readln(st);

l:=length(st);

if l-1=ord(st[l])- ord('0') then writeln('y')

else writeln('n');

end.

 

 

Занятие - 4.

 

Практическая работа №1.

 

II. Задания практической работы

1.Дан текст из строчных латинских букв, за которым следует точка. Напечатать в алфавитном порядке все буквы, которые входят в этот текст по одному разу.

2. Напечатать заданный текст, удалив из него лишние пробелы, т.е. из нескольких подряд идущих пробелов оставить только один.

3. Заданный текст распечатать по строкам, понимая под строкой либо очередные 6о литер, если среди них нет запятой, либо часть текста до запятой включительно.

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

 

Фрагменты решения задач.

 

1. var

st:string;

i,j,k,l:integer;

ch:char;

begin

readln(st);

for ch:='a' to 'z' do

for j:=1 to length(st) do

if ch=st[j] then

begin

write(st[j],' ');

break;

end;

end.

 

2. var

st:string;

i,j,k,l:integer;

begin

readln(st);

i:=1;

while i<=length(st) do

begin

if (st[i]=' ') and (st[i+1]=' ') then delete(st,i+1,1)

else i:=i+1;

end;

writeln(st);

end.

 

3. var

st:string;

i:integer;

begin

readln(st);

for i:=1 to length(st) do

begin

if (st[i]<>',') or (i<=6) then write(st[i])

else writeln;

end;

end.

4. var

st:string;

i,s:integer;

begin

readln(st);

for i:=1 to length(st) do

begin

if (ord(st[i])>48) and(ord(st[i]<57) then

if (ord(st[i+1]=43) then s:=s+(ord(st[i]) - ord(st['0']))

else s:=s-(ord(st[i]-ord(st['0']));

end;

writeln('s=',s);

end.

 

 

Занятие - 5.

 

Тема. Функции преобразования. Решение задач на перевод чисел из одной системы счисления в другую.

 

I. Функции преобразования.

Str(ch,st) - преобразование числового значения величины ch и помещение результата в строку st. После ch можно записывать формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины.

Например:

ch= 3500; str(ch:6,st); st=' 3500';

ch=45789; str(ch:3,st); st='45789'.

 

Val(st,ch,code) - преобразует значение st и помещает результат в ch. Значение st не должно содержать незначащих пробелов в начале и в конце. Code - целочисленная переменная. Если во операции преобразования ошибки не обнаружено, значение code равно нулю, если ошибка обнаружена (например, литерное значение переводится в цифровое), code будет содержать номер позиции первого ошибочного символа, а значение ch не определенно.

Например:

st='6500'; Val(st,ch,code); ch= 6500; code=0;

st='34,01'; val(st,ch,code); ch не определенно; code=5.

 

II. Перевод чисел из одной системы счисления в другую.

1. Повторить алгоритм перевода чисел из десятичной системы счисления в двоичную.

2. Фрагмент программы:

readln(n); { ввод десятичного числа }

p:=n;

while p>=1 do

begin

k:= p mod 2; {о статки из которых будет формироваться число в 2 с/ с}

str (k,st); { перевод остатков в символы}

st1:= st1 + st; { формирование строки из остатков}

p:= p div 2; { уменьшения числа на разряд }

end;

str(p,st); { перевод последнего частного в символ}

st1:=st1 + st; { строка из остатков и последнего частного}

for i:= length(st1) downto 1 do { цикл для вывода числа в обратном

begin порядке}

st2:= copy(st1,i,1);

st3:= st3 + st2; { строка в 2 с/с}

end;

val(st3,ch,errc);

writeln('ch=',ch);

 

3. Повторить алгоритм перевода чисел из двоичной системы в десятичную.

4. Фрагмент программы:

readln(n);

str(n,st);

dl:=length(st);

dl:=dl-1;

for i:=1 to length(st) do

begin

val(st[i],m,errc);

p:= p+ m* exp(dl*ln(2));

dl:= dl-1;

end;

writeln('p=',p:6:0);

 

Самостоятельная работа.

 

1. Дано натуральное n. Напечатать в троичной системе счисления целые числа от 0 до n.

2. Задано неотрицательное целое число, в восьмеричной системе счисления (за числом - пробел). Напечатать это число в пятеричной системе счисления.

 

 

Занятие - 6.

 

Тема. Решение задач на строковый тип.

 

I. Создание массива слов из строки.

 

I. При создании массива слов из строки необходимо учесть признак разделителя слов (запятая, пробел). Ввести переменную для формирования слова (wrd1), массив слов (wrd[i]).

Программа может иметь следующий вид:

program wrdmas;

const n=30;

var

st:string;

wrd1:string[10];

wrd:array[1..n] of string;

i,j,dl:integer;

 

begin

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

readln(st);

dl:=length(st);

j:=1; wrd1:=' ';

for i:=1 to dl do

begin

if (st[i]=',') or (st[i]='.') then

begin

wrd[j]:=wrd1;

j:=j+1;

wrd1:=' ';

end

else wrd1:=wrd1 + st[i];

end;

j:=j-1;

writeln(' количество слов =',j);

for i:=1 to j do

writeln(wrd[i]);

end.

 

II. Решение упражнений:

1. Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами запятая, за последним словом - точка. Напечатать:

a) эту же последовательность слов, удалив из неё повторные вхождения слов;

b) все различные слова, указав для каждого из них число вхождений в последовательность;

c) все слова в алфавитном порядке;

d) симметричные слова;

e) слова, в которых нет повторяющихся букв.

Разобрать подробно алгоритм решения задач.

Программы составить дома.

 

Фрагменты решения некоторых задач:

 

Все задачи начинаются с создания массива слов из текста.

 

a) uses crt;

var

i,j,l,k,n,dl,r,s,q:integer;

a:array[1..30] of string;

st:string[60];

t:string[8];

begin

clrscr;

read(st);

dl:=length(st);

j:=1;

t:='';

for i:=1 to dl do

begin

if (st[i]=',') or (st[i]='.') then

begin

a[j]:=t;

j:=j+1;

t:='';

end

else

t:=t+st[i];

end;

j:=j-1;

for i:=1 to j-s do

begin

k:=i+1;

while k<= j-s do

begin

if a[i]=a[k] then

begin

l:=k;

for q:=l to j-s do

a[q]:=a[q+1];

s:=s+1;

end

else k:=k+1;

end;

end;

for i:=1 to j-s+1 do

write(a[i],' ');

end.

 

 

b) readln(st);

Создать массив слов;

for i:=1 to j do

begin

n:=0;

flag:=true;

for k:=1 to j do

begin

if wrd[i]=wrd[k] then

begin

if i>k then

flag:=false

else n:=n+1;

end;

end;

if flag then writeln(wrd[i], '=', n);

end;

c) Задача сводится к простой сортировке массива слов.

Фрагмент задачи.

Сформировать массив слов.

K:=j-1;

For i:=1 to k-1 do

for j:= i to k do

if wrd[i]>wrd[j] then

begin

wrd1:=wrd[i];

wrd[i]:=wrd[j];

wrd[j]:=wrd1;

end;

for i:=1 to k do

writeln(wrd[i]);

 

d) for k:= 1 to j do

begin

flag:=true;

dl:=length(wrd[k]);

dl1:=trunc(dl/2);

for i:=1 to dl1 do

begin

wrd1:=copy(wrd[k], i,1);

wrd2:=copy(wrd[k],dl,1);

dl:=dl-1;

if wrd1<>wrd2 then flag:= false;

end;

if flag then writeln('Слово ',wrd[k],'- симметрично')

else writeln(' слово ', wrd[k],' -не симметрично');

end;

 

c). For k:=1 to j do

begin

flag:=false;

dl:=lenght(wrd[k]);

for i:=1 to dl-1 do

begin

wrd1:=copy(wrd[k],i,1);

for n:=i+1 to dl do

begin

wrd2:=copy(wrd[k],n,1);

if wrd1=wrd2 then flag:=false;

end;

end;

if flag then witeln('в слове ',wrd[k],'нет повторяющихся букв')

else writeln('в слове ', wrd[k],' есть повторяющиеся буквы');

end;

 

Занятие - 8.

 

1) Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами запятая, за последним словом - точка. Вывести:

a) слова, в которых гласные чередуются с согласными;

b) первая буква входит в него, хотя бы ещё раз;

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

 

Фрагменты решения задач.

a) alf:='aeoiu';

for i:=1 to n do {}

begin

flag:=true;

for j:=1 to length(wrd[i]-1) do

begin

wrd1:=copy(wrd[i],j,1);

wrd2:=copy(wrd[i],j+1,1);

k1:=pos(wrd1,alf);

k2:=pos(wrd2,alf);

if ((k1=0) and (k2=0)) or ((k1<>0) and (k2<>0)) then flag:=false;

end;

if flag then writeln(wrd[i]);

end;

 

c) for i:=1 to j do

begin

flag:=true;

for k:=1 to length(wrd[i]-1) do

begin

wrd1:=copy(wrd[i],k,1);

for n:=k+1 to length(wrd[i]) do

begin

if copy (wrd[i],n,1)<wrd1 then

begin

flag:=false;

break;

end;

end

end;

if flag then writeln('в слове ',wrd[i],' буквы упорядочены по афавиту');

end;

 

b) for k:=1 to j do

begin

flag:=true;

dl:=ord(wrd[0]);

n:=2; { следующая выделенная буква}

for i:=1 to dl do

begin

wrd1:=copy(wrd[k],1,1);

wrd2:=copy(wrd[k],n,1);

n;=n+1;

if wrd1=wrd2 then flag:=false;

end;

if flag then writeln(' в слове ',wrd[k],' первая буква не повторяется')

else writeln('в слове ',wrd[k],' первая буква повторяется');

end;

 

 

Занятие - 9.

 

Зачет по теме:" Строки".

 

I. Задания к зачетной работе.

1) Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами запятая, за последним словом - точка. Вывести:

a) эту же последовательность слов, но в обратном порядке;

b) все слова, которые встречаются в последовательности по одному разу;

c) слово совпадает с конечным отрезком латинского алфавита (z, yz, xyz и т.д.);

d) длина слова максимальна;

e) те слова, перед которыми в последовательности находятся только меньшие (по алфавиту) слова, за ними - только большие.

2) Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от2 до 10 латинских букв; между соседними словами — не менее одного пробела, за последним — точка. Напечатать все слова предварительно преобразовав каждое слово по следующему правилу:

a) перенести первую букву в конец слова;

b) удалить из слова последнюю букву;

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

d) если слово нечетной длины, то удалить его среднюю букву;

e) удалить все слова с нечетными порядковыми номерами и перевернуть все слова с четными номерами.

 

 


Дата добавления: 2015-10-29; просмотров: 163 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Встроенный тип STRING| String length or scale length

mybiblioteka.su - 2015-2024 год. (0.082 сек.)