Читайте также:
|
|
Занятие - 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 |