- •1 Модуль. Алгоритмдеу және программалауға кіріспе
- •1 Тақырып. Кіріспе
- •1 Лекция
- •1.1 „Автоматтандыру есептерін программалау" курсының мақсаттары мен міндеттері.
- •1.2 Есептеуіш техника құралдарын пайдаланып ақпаратты өндеу және басқару жүйелерін әзірлеу. Компьютерлік жүйелердің ақпаратты өндеу және басқару әдістері мен міндеттері
- •2 Тақырып.Дербес компьютерді (дк) программалауды автоматтандырудың программалық құралдары
- •2 Лекция
- •2.1 Дербес компьютердің программалық қамтамасыз етілуі туралы
- •2.2 Программалауды автоматтандыру әдістері. Алгоритмдік тілдер және оларға қойылатын талаптар.
- •2.3 Процедуралы–бағытталған тілдер және объектке–бағытталған программалау туралы түсінік.
- •3.1 Программаларды құру құралдары
- •3.2 Программалаудың біртұтас жүйелері.
- •3.3 Техникалық есептер
- •3 Тақырып. Есептерді алгоритмдеу негіздері.
- •4 Лекция
- •4.1 Алгоритм анықтамасы. Алгоритмдерді бейнелеу тәсілдері.
- •4.2 Алгоритмдердің блок-схемаларын безендіру ережелері.
- •4.3 Алгоритм құрылымдарының түрлері.
- •4 Тақырып Негізгі процедураға бағытталған алгоритмдеу тілінде программалау
- •5 Лекция
- •5.1 Оқылатын алгоритмдеу тілінің негізгі түсініктері
- •5.3 Тілдің негізгі объектілерін жазу ережелері
- •5.4 Деректердің типтері
- •5.5 Деректердің стандартты типтері
- •6 Лекция
- •6.2 Өрнектер. Арифметикалық және логикалық өрнектер
- •7 Лекция Құрылымды деректер (типтер)
- •7.1 Массивтер
- •7.2 Жиындар
- •7.3 Жазбалар
- •Модуль 2 Алгоритмдік тілдерде программалаудың арнайы мәселелері
- •5 Тақырып Программадағы басқару құрылымдар
- •8.1 Алгоритмдік тілдің операторлары.
- •8.3 Басқару операторлары. Құрама және бос операторлар
- •8.4 Деректерді енгізу-шығаруды ұйымдастыру
- •8.5 Программаның құрылымы. Алгоритмнің схемасынан программаға өту
- •9 Лекция
- •9.1 Сызықты құрылымды алгоритмдерді программалау
- •9.2 Тармақталған құрылымды алгоритмдерді программалау
- •9.3 Таңдау операторы (case)
- •10 Лекция
- •10.1 Циклдік құрылымды алгоритмдерді программалау. Кейінгі шартты цикл операторы (repeat)
- •10.2 Алдынғы шартты цикл операторлары (while)
- •10.3 Параметрлі цикл операторлары (for)
- •10.4 Ішкі циклдерді құрастыру (массивтерді өндеу, массив компоненттерін реттеу есептерінің мысалдары негізінде)
- •11 Лекция
- •11.1 Жолдық деректер
- •Var s: string;
- •Var s1: string[40];
- •11.2 Символдық және жазбалар түріндегі деректерді өндеу есептерін программалау
- •12 Лекция
- •12.1 Пайдаланушының ішкі программалары (процедуралар) классификациясы. Ішкі программаларды рәсімдеу тәсілдері және оларды программа құрамында пайдалану.
- •13 Лекция
- •13.1 Сыртқы сақтауыш құрылғыларын (файлдық шамаларды) және динамикалық жадыны пайдалану арқылы программалау
- •14 Лекция
- •14.1 Тілдің графикалық мүмкіндіктерін пайдалану
- •Initgraph(var gd:integer, var gm:integer, pt:string);
- •15 Лекция
- •15.1 Объектке-бағдарлы программалау (обп) негіздері
- •15.2 Объекттер және олардың негізгі қағидалары
- •15.3 Объекттерді құру және оларды пайдалану
- •15.4 Өткен материалға шолу
- •15.5 Алған білімдердің студенттің алдағы оқу барысында және болашақ инженерлік тіршілігіндегі тәжірибелік мағынасы. Программалау тілдері мен технологиялардың даму перспективалары.
- •Өрнектер – тұрақтылар. Паскаль өрнектер-тұрақтыларды пайдалануға мүмкіндік береді. Ол өрнекті программаны орындау қажеттіліксіз компилятор орындайды. Өрнектер-тұрақтылардың мысалдары:
- •Түсініктемелер (комментарий)
- •6 Лекция
- •6.1 Блоктар, локальділік және амал жасау облысы
- •6.5 Типтердің үйлесімділігі
- •7.1 Ординалды типтер
- •7.2 Құрама құрылымдар
- •10.4 Жалғау операторы (with)
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.