Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AEP_LEKTsII.doc
Скачиваний:
90
Добавлен:
28.03.2015
Размер:
1.27 Mб
Скачать

11.2 Символдық және жазбалар түріндегі деректерді өндеу есептерін программалау

Жеке символдармен жұмыс жасау үшін char типті айнымалылар сипатталады:

var ch:char;

{ ... }

ch:='y';

char типтегі бір айнымалы ASCII-символдың бір коды туралы ақпаратты сақтайды. Мұны мысалы, тұтынушының клавиштерді басу әрекеттерін бақылау үшін пайдалануға болады. Мұндай программаның вариантарының біреуіне мысал келтірейік:

var ch:char;

begin

repeat

writeln;

write ('Жалғастыру? (Y/N)');

readln (ch);

if (ch='Y') or (ch='y') then begin

{Бұл жерде қажетті есептеу үрдісі программаланады}

end

else if (ch='N') or (ch='n') then halt

{Программаның аяқталуы}

else writeln ('Y немесе N басыңыз');

until false;

end.

Символдардың кодтарымен жұмыс жасау үшін негізгі 2 функция бар:

function ord(x):char; х символдың ASCII-кодын қайтарады

function chr(x : byte):char; х ASCII-коды көрсетілген символды қайтарады .

Паскальда пайдаланылатын DOS кодировкасының символдар кестесін шығару үшін соңғы функцияны қолданайық:

var i,j:integer;

begin

writeln;

write ('ASCII-кодтар [32..255]');

for i:=2 to 15 do begin

writeln;

write (i*16:3,' ');

for j:=0 to 16 do write(chr(i*16+j),' ');

end;

writeln;

write ('ENTER шығу үшін...');

readln;

end.

Бұл жерде кодтары 32 ден 255 дейін болатын символдар ғана шығарылады, себебі кодтары 0 ден 31 дейін болатын алғашқы 32 символдар – баспаға шығарылмайды (мысалы, табуляциялау, жолды қайтару).

Символдың коды мәндердің кейбір аралығына түсетіндігін анықтау үшін in операторын қолданған ыңғайлы, мысалы келесі программаның фрагментінде:

write ('Символ енгізіңіз: '); readln (ch);

if ch in ['A'..'Z'] then

write ('Үлкен латын;')

else if ch in ['a'..'z'] then

write ('Кіші латын;')

else if (ch in ['А'..'Я']) then

write ('Үлкен орыс;')

else if (ch in ['а'..'п']) or

(ch in ['р'..'я']) then

write ('Кіші орыс;')

else if ch in ['0'..'9'] then

write ('Цифр;')

else write

('Бұл алфавитті-цифрлы символ емес;');

write (' Сіздің символыңыздың коды= ',ord(ch));

Алфавиттік символдармен жұмыс жасағанда, кіші және бас әріптерді енгізуді жеке ескеруге мәжбұр боламыз. Алдымен барлық символдарды upcase функция арқылы бас символдарға түрлендіріп алған ыңғайлы:

var ch:char; i:integer;

begin

repeat

for i:=1 to random(72) do write ('*');

writeln;

write ('Жалғастыру? (Y/N)');

readln (ch);

until upcase(ch)='N';

end.

Өкінішке орай, бұл функцияның орыс немесе басқа ұлттық символдарымен жұмыс жасағанда пайдасы жоқ, оның орнына өзіміздің ішкі upcase_ru атаулы программамызды жазып тексерейік:

procedure upcase_ru (var s:string);

var i,l,c:integer;

begin

l:=length(s);

for i:=1 to l do begin

c:=ord(s[i]);

if (c>=ord('а')) and (c<=ord('п'))

then c:=c-32

else if (c>=ord('р')) and (c<=ord('я'))

then c:=c-80;

s[i]:=Upcase(chr(c));

end;

end;

var s:string;

begin

writeln ('Мәтіннің бір қатарын енгізіңіз:');

readln (s);

upcase_ru (s);

writeln ('Түрленген жол:');

writeln (s);

end.

Программада DOS кодировкасында кириллицаның символдары ретімен ілескен сандар арқылы кодталмағандығы ескерілген. Сонымен қатар, программада оған деректердің string (жол) типі сәйкес келетін символдар массиві пайдаланылады.

Жол - символдар, яғни char типтегі элементтер массиві. Жолдағы символдарды нөмірлеу әрдайым бірден басталады. Паскальда жолға деректердің string типі сәйкес. Жол келесі түрдегі оператор арқылы сипатталады:

var Жол_аталуы : string [ұзындық];

Егер оңтаңбалы бүтінсанды "ұзындық" шамасы көрсетілмесе, ұзындығы 255 символға дейін жол үшін жады бөлінеді. Жолдарды сипаттау мысалдарын келтірейік:

var s1:string;

s2:string[20];

s3:array [1..20] of string;

Мұндағы s1 – ұзындығы үнсіз бойынша жол, s2 - 20 символдан тұратын жол, s3 - әрқайсысы жадыдан 256 байтқа дейін орын алалатын 20 жолдан тұратын массив (қосымша байт жолдың ұзындығын сақтау үшін қажет).

Жолдарға меншіктеу операциясын қолдануға болады:

s1:='А.Т. Апсеметов'; s1 жолға жолдық тұрақтының мәні меншіктелген.

s1[3]:=’В’; жолдың жеке s1 символына символдық тұрақты меншіктелген.

s2:='2009'; s2 жолға бүтін санның жазылуы болып табылатын жол меншіктелген. Мұндай жолды кейін стандартты Val процедурасы арқылы санға түрлендіруге болады.

s3[1]:='Информатика';

s3[2]:=''; — s3 жолдық массив болып табылады. Оның бірінші элементіне жолдық тұрақты меншіктелген, екінші элементіне – бос жол.

Жолдарды клавиатурадан енгізу үшін readln операторын пайдалану керек, себебі жолды енгізу Enter клавишасын басумен аяқталуы тиіс:

writeln ('Тұтынушының есімін енгізіңіз:');

readln (s1);

Жолдарды экранға немесе принтерге шығару үшін write, және writeln операторын пайдалануға болады

s2:='SUMMA';

write (s2) ; — экранға "SUMMA" жолы шығарылады.

writeln ('Сумма':10); — "_____Сумма" жолы шығарылады (сөздің алдында 5 бос орын) және курсор экранның келесі жолына өткізіледі.

Қосу "+" операторы жолдар үшін оларды біріктіру (конкатенациялау) амалын жүзеге асыратындай етіліп қайта анықталған:

s1:='2010' + ' жыл'; s2:='б.ғ.';

s3[3]:=s1+' '+s2;

Бұл амалдардан кейін s1 жолдың мәні ''2010_жыл", ал s3[3] жолдың мәні - ''2010_жыл_б.ғ.".

Егер жолдарды қосу барысында нәтижелі жолдың ұзындығы максималды ұзындықтан асып кететін болса, онда артық символдар алынып тасталады. Сонымен қатар, жолдарды біріктіру үшін стандартты concat функциясын да пайдалануға болады

Қатынас "=" операциясы жолдарды символдары бойынша салыстыруға мүмкіндік береді. Бұл кезде келесі ережелер әрекет жасайды:

• тек символдардың жиынтықтары мен олардың ұзындықтары бірдей болғанда ғана жолдар бірдей болып саналады;

• әйтпесе символдардың элементтері кодтары бойынша салыстырылады. Бұл кезде ASCII-код кестесіне сәйкес жеке символдардың үлкенділігі келесідей: '0' < '1' < ... < '9' < 'A' < ... < 'Z' < 'a' < ... < 'z' < кириллица символдары.

Қалған қатынас операцияларын да жолдарға қолдануға болады.

Бір қатар типтік есептерді қарастырайық:

Сөйлемді сөздерге жіктеп әр сөзді экранның жаңа жолына шығару керек. Бұл программаның жұмыс жасау алгоритмі өте қарапайым - s сөйлемнің ағымдағы жолында кемінде бір бос орын бар болса, бос орындың алдындағы жолдың бөлігі (сөз) жолдық w айнымалыға көшіріледі. Егер бос орындар қалмаған болса (немесе басынан бастап жоқ болса), онда бүкіл жол – ол бір сөз болып табылады. Кезекті сөзді өндеп болғаннан кейін (біздің жағдайда оны writeln операторы арқылы экранның жаңа жолына шығару) жолдың өнделген бөлігі бос орында қоса s-тен алынып тасталады – циклдің келесі қадамы дәл сол сөзді қайтадап тауып алмауы үшін.

var s,w:string; {сөйлем және сөз}

p:integer; {бос орынның позициясы}

begin

writeln ('Мәтін енгізіңіз');

readln (s);

repeat

p:=pos (' ',s);

if p>0 then w:=copy (s,1,p-1)

else w:=s;

writeln (w);

delete (s,1,p);

until p=0;

end.

Келтірілген программада бір қатар кемшіліктер бар. Олардың ішінен ең айқын көрінетің кемшілік – сөздердің арасындағы қосымша бос орындар ескерілмеген, оларды программа артық "бос сөздер" ретінде түсінеді. Келесі мысал арқылы олардан құтылайық.

Сөздердің арасындағы артық бос орындарды жою. Бұл есеп шешімінің алгоритмі де қарапайым. Жолда қатар орналасқан екі бос орын болса олардың ішінен біреуін жою керек. Одан кейін жолдың басында және соңында бір-бір артық бос орындардың жоқ болғандығын тексеру керек. Программаның негізгі бөлімін ғана келтірейік:

repeat

p:=pos (' ',s);

if p>0 then delete (s,p,1);

until p=0;

if s[1]=' ' then delete (s,1,1);

if s[length(s)]=' ' then

delete (s, length(s),1);

writeln (s);

Бырақ келтірілген мысалдарда маңыздылау кемшілік бар – жол бойынша бірнеше рет өту қажеттілігі, ал сөйлемді сөздерге жіктеуді жолды сканирлеудің бір циклында жүзеге асыруға болады. Оны келесі программада жүзеге асырып көрейік:

Жолды сканирлеудің бір циклында сөйлемді сөздерге жіктеуді. Программаның толық мәтіні:

var s,word:string;

c,c0:char;

i,l,start:integer;

inword:boolean;

begin

writeln ('Enter string:');

reset (input); readln (s);

s:=' '+s+' ';

l:=Length (s);

inword:=false;

for i:=2 to l do begin

c0:=s[i-1];

c:=s[i];

if (c0=' ') and (c<>' ') then begin

inword:=true;

start:=i;

end;

if c=' ' then begin

if inword=true then begin

word:=copy (s,start,i-start);

writeln ('''',word,''' is word');

end;

inword:=false;

end;

end;

end.

Негізінде біздің программаның 2 қалып-күйі бар – сөздің ішінде және одан тыс. Қалып-күйлердің айырып-қосылуын inword жалауша басқарады. Кезекті сөз басталатын символдың нөмірі start айнымалыда сақталады. Программа тыныс белгілерін және сөздерді бос орыннан басқа символдар арқылы ажыратуға болатындықты ескермейді.

Жолдағы бос орындардың санын есептеу. Бұл мысал жолмен жұмыс жасауды символдар массивімен жұмыс жасау ретінде жүзеге асырады:

var s:string; k,i:integer;

begin

writeln ('text?');

readln (s);

k:=0;

for i:=1 to length (s) do

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

writeln ('k=',k);

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]