Кесте. Байланысу сипаттамалары



Байланыс түрі Байланым балы Көрнекілік, түсініктілігі ¤згерту мүмкіндігі Қолдау 
Функционалдық 10 Жақсы Жақсы Жақсы
Тізбектей 9 Жақсы Жақсы Жақсы
Ақпараттық 8 Орта Орта Орта
Процедуралық 5 Орта Орта Нашар
Уақытша 3 Орта Орта Нашар
Логикалық 1 Нашар Нашар Нашар
Кездейсоқ 0 Нашар Нашар Нашар

Осы кестені талдау барысында байланысудың алғашқы үш түрін ғана пайдаланған тиімді деген қорытынды аламыз.

 

Шектік автоматтар

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

Кез – келген идентификатор әріптен басталуы тиіс. Осы әріптен кейін орналасқан символдар цифрлардан немесе әріптерден тұрса, онда олар осы идентификатордың атауына кіреді. Бүтін сан – бұл цифрлардың тізбегі. Қызметші сөз, мысалы if – әріптердің тізбегі,мысалы i және f. Осыған ұқсас барлық жағдайларда лексемаларды оқып – тану үшін шектік автомат (ША) немесе қалыптар (жағдайлар) машинасы деп аталатын қарапайым модель қолданылады. Қай жағдайда екенімізді біле отырып, біз келесі енгізілетін символдың ізделінді лексема бөлігі болуы мүмкіндігін анықтай аламыз.

Келесі суретте бірлерінің саны тақ болатын екілік байламды оқып – тынитын қарапайым ША кескінделген.

 

 

           

 

Процесс А жағдайынан басталады (мұнда басқа жағдайдан шықпайтын ендіру доғасы орналасқан), сонан  соң келесі енгізілген символға байланысты автомат осы символмен белгіленген доға бойымен қозғала отырып А жағдайынан не В жағдайынан өтеді. В жағдайы енгізілген байламдағы бірлердің тақ санына сәкес келеді. Сондықтан, автомат В жағдайында тұрған кезде осы мезгілде енгізілген байлам қойылатын талаптарға сай келеді және осы автоматпен жіберуге рұқсат етіледі. Автомат А жағдайында тұрғанда мұндай байлам жіберілмейді.

ША – ң 100101 байламын енгізу әректтерінің тізбегі мынадай болады:

 

        Енгізу                          Ағымдық                                                   Байлам рұқсат                                                    жағдай                                                          етіле ме
                          null                                     A                                                                  жоқ            1                                         В                                                                   ия            10                                       В                                                                   ия            100                                     В                                                                   ия               1001                              А                                                                   жоқ               10010                                 А                                                                  жоқ               100101                               В                                                                    ия            

 

Көріп тұрғанымыздай, 1,10,100 және 100101 тізбектері енгізілгенде автомат В жағдайымен сай келеді, байламдағы бірлердің саны тақ және байлам рұқсат етіледі.

Жалпы, кез- келген ША үшін қандай да бір бастапқы жағдай, кемінде бір шектік (соңғы)жағдай және олардың арасындағы бірнеше «өткелдер» анықталған. Автоматты бастапқы жағдайынан соңғы жағдайынан бірнеше өткелдер арқылы ауыстыратын кез- келген енгізілген символдар байламы осы автомат арқылы рұқсат етіледі деп айтылады.

Келесі суретте таңбалы бүтін санды оқып-танитын ША бейнеленген

 

 

 

 

Егер кеңейтілген БНФ- нотацианы қолдансақ, онда мұндай сандарды былайша анықтауға болады: <таңбалы бүтін сан>: : =[+|-]<бүтін сан>{<бүтін сан>}*. Бұл мысал ША-дың тағы да бір аса маңызды қасиетін анықтайды: абстрактілі машиналар мен грамматикалардың арасында өзара сәйкестік орнатылған.

Детерминантты емес ША. Автоматтар жөнінде әңгіме қозғалғанда бұған дейін жағдайлар арасындағы өтулер ағымдық жағдай және келесі енгізілген символмен анықталатын. Яғни, ША-тың әрбір жағдайы және әрбір енгізілген символ үшін қандайда бір келесі жағдайға бір ғана мүмкін ауысу бар (ол алдынғысымен сәйкес келуі де, келмеуі де мүмкін. Осындай ША-ты детерминантты деп аталады. Егер автоматтың n жағдайы бар болса және ену алфавиті k символдан құралса, онда ауысулар саны - ға тең болады. Жоғарыдағы екінші суретте осындай детерминантты ША бейнеленген. Кейбір доғалардың (ауысулардың) жоқтығы ешқандай қиындық туғызбайды, себебі біз әрқашан қатенің қосымша жұтылушы шектік емес жағдайларына доғалар қоса аламыз. Детерминантты болмау қиындығы деп бір жағдайдан шығатын бірдей белгіленген доғаларды айтады. Осылайша, детерминантты автоматта түрліше ауысулар арасында таңдау мүмкіншілігі пайда болады.

Сонымен, детерминантты емес автоматта мыналар болады:

- жағдайлар жиыны (граф байламдары);

- бастапқы жағдай (байламдардың бірі);

- шектік жағдайлар жиыны (байламдардың ішкі жиыны);

- ену алфавиті (жағдайлар арасындағы ауысуларды анықтайтын доғаларды маркерлеуге (белгілеуге) арналған символдар);

- байламдарды байланыстырушы және жағдайлар арасындағы ауысуларды анықтаушы доғалардың елу алфавитінің белгіленген символдарының жиыны.

Мұндай детерминантты емес автоматта кез – келген байламнан бірнеше доға шыға алады (немесе бірде - бір доға шықпауы мүмкін), сондай –ақ бір белгіні бірнеше доға иемденуі мүмкін. Мұндай ауысулар детерминантты емес, себебі енгізілген бір символ үшін кейінгі жолдың бірнеше нұсқасы болуы мүмкін. Мұндай жағдайда егер бастапқы байламнан шектік байламдардың кез келгеніне ең болмағанда бір жол бар болса, онда тіпті осы байламға сәйкес келетін басқа жолдар шектік жағдайға келтірмесе де, шектік автомат қандайда бір байламның болуына рұқсат етеді. Детерминантты автомат әрқашан ендірілген символдарға тәуелді белгілі бір жағдайда тұрады.


21-лекция. Программалық интерфейс негізгі принциптері және ұйымдастыру құралдары.

 

Жоспар:

1. Ақпаратты интерактивті және пакетті (файлдық) енгізу.

2. Ақпаратты түсініктемелі және форматтап шығару.

3. Массивтер.

4. Көп өлшемді массивтер көрсеткішті массиві, динамикалық массивтер.

 

Файл. Режим

C++ тілінде байттар жиынтығы не дискіге жазылған түрлі құрылымдардан тұратын бір мәлімет файл деп аталады. Мысалы, файл:

1001 Мәдіходжаев Сұлтан 1985 қазақ

1002 Нұрланқызы Маржан 1987 казақ

1003 Нұрғалиқызы Мәлика 1988 қазақ

(Мұндай файл кез келген n жолдан тұруы да мүмкін). Тізімдік файлдың әp жолында (құрылымда) бір студент жөнінде мәлімет берілген, оны жазба не файл элементі деп атайды. Файл элементі сандық және символдық типті бес мәннен (өрістен) тұр.

Жалпы, Си, Си++ тілдерінде файлдар тек байттар ағыны ретінде қарастырылған, сондықтан элементтердің жазба түрінде құрылуы міндетті емес.

Файл дискіде 1-8 символдан тұруы мүмкін жеке атау бойынша сақталады, атаудың толықтырмасын .dat, .txt деп белгілеу не толықтырманы енгізбей кету де мүмкін.

Файлмен жүргізілуі мүмкін жұмыстар:

- дискіге тиеп, сақтау;

- экранға шығару не принтер арқылы қағазға басу;

- файлға жаңа элементтер қосу не бір, не бірнеше элементін алып тастау және т.б.

Файлмен тізбекті ену және еркін (тікелей, кездейсоқ) ену тәсілдері бойынша жұмыс істеу мүмкін.

C++ тілінде енгізу және шығару тәсілдері қиынырақ, олар символдар тасқыны (ағыны, поток) бойынша орындалады. Мысалы, double типті —5.27 санын файлға жазу, шығару үшін 8 байттық ұяшық пайдаланбай, бөлек байттардан тұратын -, 5, . , 2 және 7 символдары ағын бойынша ретімен өзгеріссіз енгізіліп, шығарылады (өзгеріссіз дегеніміз — ол үшін функцияларды өзгертудің қажеті жоқтығы).

Файлмен жұмыс істеу файл көрсеткіші арқылы орындалады. Ол файлдың атауын, тұрған орнын, ағынды пайдалану тәсілін де анықтайды. Файл көрсеткіші - стандартты stdio . h файлында анықталған құрылымдық FILE типіне нұсқама. Ол арқылы файлды дискіге тиеу (жүктеу), оны дискіден машинаның жадына енгізу әр элементтің басынан бастап ретімен жүргізіледі.

C++ - те рұқсат етілген файлдық объектілерді fout , fin арқылы белгілесек, файлмен жұмыс істеу программасында пайдаланатын функциялық операторлар мен командалар:

1. # include < fstream . h > // препроцессор нұсқауы

2. ofstream fout ; // жазу үшін файл объектісін  жариялау

3. ifstream fin ; // оқу үшін файл объектісін  жариялау

4. fout. open ( Файл аты , ios :: in) // Файл қ ұ ру

5. fin. open (Файл аты, ios :: out) // Файлды оқу

6. fout. close() // Құрылған файлды жабу

7. fin. close() // Оқылған файлды жабу

( Ескерту. fout, fin белгілеулерін кез келген басқа түрде алуға да болады, мысалы: fp, xx).

Мұндағы Файл аты — файлға берілетін атау; ios :: in, ios :: out — қол жеткізу мүмкін режімдер (4.1-кесте):

Қол жеткізу режімдері (4.1- кесте)

Режім Пайдалануы
ios :: out Жазу үшін файлды ашу.
ios :: in Оку үшін файлды ашу.
ios :: арр Элемент қосу үшін файлды ашу.
Ios :: binary Файлды екілік жүйеде ашу.
ios :: ate Файлды ашып, көрсеткішті соңына орналастыру.
ios :: trunc Файл ішіндегісін алып тастау.
ios :: nocreate Файл жоқ болса, ашу операциясын орындамау.

 

C++ тілінде ағындар мен буферлерді іске қосу қиынырақ, бірақ файл кодына iostream . h стандартты файлы қосылған кезде оларды басқаруға арналған кластар да іске қосылады: streambu ғ, ios _ base , ostream жэне fstream ( класс — анықталған тип).

streambuf - буферді бөлу, буферді толтыру әдістерін, буфер ішіндегісіне қол жеткізу түрлерін және буферді тазалауды орындау үшін жадты басқарады.

ios _ base — ағынның жалпы қасиеттерін (оқу үшін ашықтығын, мәліметтердің екілік не мәтіндік типті болуын) айқындайды да, көрсеткішті streambuf объектісіне қосады. Оған түрлі форматтау тұрақтылары да енгізілген.

ios класы ios _ base класына негізделген, ostream және fstream кластары - ios класының туыңдылары. Олар сәйкес шығару және енгізу кластарының мұрагерлері. Файлға жазу ostream класының << операциясы арқылы, файлдан о қ у fstream класының >> операциясы арқылы орындалады. Программаға iostream ( ios ) класының кітапханасы қосылған кезде автоматты түрде программада ағымдық объектілер құрылады. Олардың негізгілері: cin , cout , cerr , clog .

cerr , clog объектілері (айнымалылары) программада кеткен қатені айқындап, экранға шығарады.

Cin, cout операторлары

cout - iostream класындағы ауыстырып тиеу объектісі (информацияны экранға шығару операторы). Жазылу түрі: cout << inform ; Мұндағы << алдыңғы тарауларда пайдаланылған биттік операция емес, арнайы әрекетті орындайтын команда, мысалы, оның форматтау касиеттері жеткілікті. Оны кірістіру операторы деп атайды. Inform айнымалысы жад облысын көрсетеді, ол тұрақты, жол не өрнек болуы да мүмкін. Мысалы:

char ms[10]="on adam"; cout << ms; inform тұрақты болса, тырнақшаларға алынып жазылады. Ал, бірнеше тұрақтыдан тұрса, араларына бос орын не бірнеше символдық бос орын тастап кететін табуляция ( \t ) белгісін қойып кеткен дұрыс. Мысалы:

Cmd 1         cmd 2       cmd 3

2           3                 1

1           2                 3

2           1                 3

мәліметін форматтап шығарудың программасы:

 #include <iostream.h >

main()                                      (33)

{

cout << "cmdl\t cmd2\t cmd3\t \n;

cout <<"2\t 3\t l\t \n";

cout <<"l\t2\t3\t\n";

cout << "2\t l\t 3\t \n";

}

cin — байттар ағынын енгізу операторы (объектісі). Жазылу түрі: cin >> айнымалы ; (айнымалы мәні — мәлімет не сан). Ол пернетақ n адан пайдаланушының мәліметтерді д ұ рыс енгізуін талап етеді. Мысалы, мәлімет мәтін болса, тек бір с ө зден ғана тұруы тиіс, егер ол бірнеше сөзден тұрса, енгізуде get операторын пайдаланған жөн. Жалпы, cout және cin - форматталған шығару , енгізу операторлары , яғни олар форматтық %d, %s сияқты символдарды енгізуді қажет етпей , ө здері жоспарлайды. Яғни , олар printf, scanf операторларын пайдаланбай, программа жазуды оңайлатады .

 

Тізбекті ену файлы

Басынан бастап элементтері бойынша ретімен құрылған файлды тізбекті ену файлы деп атайды. C++ тілінде көлемі үлкен емес файлды бірден енгізуге болады.

Ескерту. Құрылатын файл атауын .dat не .txt кеңейтілуімен берген жөн, мысалы, tizim.dat (атауды кеңейтілусіз беруге де болады).

Мысал. C++ тілінде 4.2-тақырыпта берілген тізімді тізбекті ену файлы түрінде дискіге жазу керек.

Программаны мынадай түрде құруға болады:

#include <stdio.h>

#include <conio.h>

#include <iostream.h>                                     // енгізбеу де мүмкін

#include <fstream.h>

ofsream fout;

main()                                                              (34)

{char atau[8]; clrscr();

puts ("Файл аты-? "); gets (atau);

fout.open (atau, ios :: out);

fout << " 1001 Мәдіходжаев Сұлтан 1985 казақ \n";

fout << " 1002 Нұрланқызы Маржан 1987 қазақ \n";

fout << " 1003 Нұрғалиқызы Мәлика 1988 казақ \n";

fout. close(); getch(); return 0;

}

Мұндағы iostream.h, fstream.h файл құру мен оку файлдары. Файлды құруға арналған fout.open (atau, ios :: uut); операторы fout үшін буферден орын бөліп қояды, ал, << операциясы онан соң жазылған fout операторларының мазмұндарын берілген atau бойынша бірден дискіге көшіріп жазады.

Ескерту. 1. Файл құру кезінде енгізілген жаңа fout операторы cout операторын алмастырады, яғни файл құру үшін cout орнына fout операторы пайдаланылады. Ол файлды дискіге жазу мен қоса ағымдық каталогқа да енгізіп қояды. Осы сияқты, оқу кезінде сі n операторының орнына fin операторы қолданылады (оның >> операциясы құрылған файлды берілген атау бойынша буферге енгізеді).

2. Программа жаңа файл құруды сұраған кезде бұрыннан құрылған файл атын енгізуге болмайды, бұл кезде құрулы файл жойылып кетеді.

3. Жеке сандардан не жоғарыдағы сияқты, тұтас қарастырылған жолдардан файл құру ықшамды.

Тізбекті ену файлын оқып , экран ғ а шығару программасы :

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <fstream.h>

ifstream fin;

main()                                                  (35)

{

char atau[8]; char in_char; clrscr();

cout << "Файл аты-? " cin >> atau;

fin.open (atau, ios :: in);

while ( fin.get ( in_char ))

cout << in_char; /* символдарды ретімен экранға шығару */

fin.close(); getchar(); return 0;

}

Файл аты енгізілген соң fin.open (atau, ios :: in); операторы файлды окуға ашады, fin.get операторы файлдың жеке символдарын (in_char) ретімен буферге енгізеді де, while операторының құрамындағы cout « in_char операторы оларды ретімен оқып элранға шығарады.

Ал, Си тілінде файлдық ағынға қол жеткізудің т ә сілі - оны көрсеткіш (ғp) арқылы сипаттау. Оның сипатталу түрі:

FILE * fp;

Мұндағы FILE - <stdio.h> файлында анықталған тип. Көрсеткішті нақты файлмен байланыстыру мынадай оператор арқылы орындалады:

fopen ( " Файлға жол ", " қол жеткізу типі ");

Си тілінде файлға жол үшін ағымдық каталогта пайдаланатын файл идентификаторын не файлдың толық атын енгізуге болады, қол жеткізу типі үшін "wt" не "w" параметрі енгізіледі (Бұл - жазу үшін файлды ашу параметрі). Файл атын енгізуде қате кетсе, оператор көрсеткішті бос файлға (NULL) қайтарып береді. Бұл операторды пайдалану кезінде жаңа файл құру үшін бұрынғы printf(), scanf() операторлары пайдаланылады. Соңғысы әр жазба элементін ретімен буферге енгізеді де, арнайы fprintf() операторы файл элементтерін ретмен дискіге жазып шығады. Мысалы,

fp = fopen ("faiIl.dat", "wt");

операторының орындалу кезінде faiIl.dat атаулы файл fp көрсеткішінің көмегімен жазуға ашылады.

Жоғарғы операторды Турбо Си ++ тілінде де пайдалануға болады, мысалы , (ЗЗ)-программаның Турбо Си++ тілінде құрылуының жалпы түрі:

#include <stdio.h>

#include <conio.h>

void main()                                          (36)

{

int shifr, tjli, k; char fam[15], ati[15], ulti[6];

char atau[8]; clrscr();

FILE * out;                  /* fp=out */

printf("atau-?"); scanf("%s", &atau);

if ((out=fopen(atau,"wt")) = = NULL)

{ printf(" қ a т e"); getch(); return; }

for (k=l; k<=3; k++)

{

printf("Шифр- "); scanf("%d ", &shifr);

printf("Фамилия - "); scanf("%s ", &fam);

printf("Aты- "); scanf("%s",&ati);

printf("Туғанжылы- "); scanf("%d", &tjli);

printf("¦лты- "); scanf("%s", &ulti);

/* буферден дискіге көшіріп жазу операторы - fprintf  */

fprintf( out, "%d %s %s %d %s\ n",

shifr, fam, ati, tjli, ulti);

}

fclose(out); getch(); return;

}

Мұндағы ықшамдылық: кез келген құрылымдық файлдың элементтерін буферге енгізіп, ретімен дискіге көшіріп жазуға болатынында.

Турбо Си және Турбо Си ++ тілдеріндегі дискіде жазулы файлдарды (35) - программа арқылы экранға шығара беруге болады.

Ескерту. (34)-(36) программалар Турбо Си және Турбо Си++ тілдерінде жұмыс істей береді.

 

Файл соңына қосу

Файлға элемент қосу үшін файлды ашу режімі 4.1-кестеде берілген.

Мысал. (34)-программа бойынша құрылған программада жазылған үш жазудан тұратын файл соңына бір элемент қосу керек (ескерту: "Соңына жазу қосатын файл аты-?" сұрағына сақталған файл атын енгізу керек).

Программаны мынадай түрде құруға болады:

#include <stdio.h>

#include <conio.h>

#include <fstream.h>

ofsream fout;

main()                                      (37)

{

char atau[8]; clrscr();

puts ("Соңына жазу қосатын файл аты-? "); gets (atau);

fout.open (atau, ios :: app);

fout << " 1004 Ахметов Ержан І985.қазақ\n";

fout. close(); getch(); return 0;

}

 

Сызықтық массив

Массив - бір типті мәндерден тұратын деректер (берілгендер). Массив бір өлшемді (сызықтық) не көп өлшемді болуы мүмкін. Массив элементтері фигуралық жақшалар ішінде жазылады.

Бір өлшемдік массивте алдымен атауы жазылып, онан соң квадрат жақшалар ішінде элементтер саны көрсетіледі, ал элементтер нөмірлері 0-ден бастап есептеледі. Нөмірлер массив индекстері делінеді. Мысалы, a[6]={ 6, 5.3, 12, 4.7, 9, 1 } массивінің элементтері: a[0]=6, a[1]=5.3, .... , a[5]=1, массив индекстері: 0, 1, 2, ..., 5. Элементтер жадта қатар орналасқан ұяшықтарға енгізіледі.

Массивтер инициалданып сипатталуы да мүмкін. Мысалы,

/* Бір өлшемді массив */ float ms[10]={ 2, 1, 3.5, 9.7, 5, 6 12, 15, 3.9, 8 };

/* Екі өлшемді массив */ int a[3][3]={ 5, 3, 6, 2, 7 ,8, l,4,7};

не int a[3][3]={5,3,6,2,7,8, 1,4,7}

1-мысал. Бүтін сандардан тұратын сызықтық массивтің ең кіші элементін табу керек.

#include <stdio.h>

#include <conio.h>

#define M 8

main()                                                                                                  (17)

{

int ms[M]={ 5, 7, 4, 3, 8, 12, 16, 6 }

int k,j1, s1;

clrscr();

s1=ms[0]; j1=0;

for(k=l;k<=M;k++)

if(ms[k]<s1) {s1=ms[k];j1=k; }

printf("min=%d Hөмipi=%d\n", s1,j1+1);

getch(); return 0;

}

Массив элементтерінің нөмірлері 0-ден бастап есептеледі, бірақ программада ол 1-ден бастап есептеледі деп көрсетілді, оның қатесі жоқ. Бірақ әдеттегідей элемент нөмірін шығару үшін printf операторында ол j1+1 деп жазылды.

2- мысал . Берілген ( 6, 3, 9, 8, 5, 12, 4, 10, 35, 7 ) сызықтық массивін өспелі түрде реттеу керек.

#include <stdio.h>

#include <conio.h>

#define MAX 10

int main (void) (18)

{

int a[10]={ 6, 3, 9, a, 5, 12, 4, 10, 35, 7 }

int k,j,ss; clrscr(); for(k=0; k<MAX; k++)

{ for (j=(k+l);j<MAX;j++)

{ if(a[k] >a[j] )

{ ss=a[k]; a[k]=a[j]; a[j]=ss; } } /* for j циклінің соңы */

} /* for k циклінің соңы */

for (k=0; k<MAX; k++) printf("%d ",a[k]);

} Нәтиже: 3 4 5 6 7 8 9 10 12 35

Ескерту. Бірінші рет main() функциясының алдына int кілттік сөзі жазылды. Ол нәтижеде main() функциясының нақты аргументтерді кайтарып беретінін анықтайды. main() функциясының аргументі ретінде енгізілген void кілттік сөзі функцияның нақты аргументтерді қабылдамайтынын білдіреді.  Int main(void) тақырыбының орнына бұрынғыша main() тақырыбын қалдыру да мүмкін. Мұндағы ескеретін жайт: функция соңына енгізілген бос ашу, жабу () жа қ шалары айқын емес түрде функцияның аргументтерді қабьшдамай-тынын ғана біддіреді.

 

Тапсырма

Программа құрыңыз:

1. 1- мысалда берілген массив элементтерінің орта мәнін табу керек.

2. 1- мысалда берілген массив элементтерінің ең үлкен мәнін табу керек.

3. Сандар берілген: 8, 3.7, 5, 12.3, 1.6, 9, 4. Оларды сызықтық массив элементтері түрінде қарастырып, элементтерінің қосындысьш табу керек.

4. a[6] = { 3, 4, -2, 5, 8, 6 } және b[6] = { 8, 3, 4, -4, -3, 2 } массивтерін қосу және скалярлық көбейтіндісін табу керек.

          m                               m

Нұсқау.  және массивтерінің қосындысы мен скалярлық көбейтіндісінің формулалары :

/* қосынды */

m[k]= Ia[k] . Zb[k] .= Z( a[k] * b[k]) /*ск. көбейтінді */

5. Элементтері ak = (-l)k * l/k (k =1,2,3,...) болатын массивтің алғашқы 10 мүшесінің қосындысын табу керек.

Матрицалармен жұмыс

Екі ( m X n ) өлшемді массив (матрица) элементтерінің жазылу үлгісі: ms[m][n]. Программада матрица элементтері де фигуралық жақшалар ішінде жолдар бойынша ретімен үтір арқылы бөлініп сипатталады. Оларды тек бір жолда жазып сипаттауға болады.

1-мысал. Берілген квадрат матрицаларды қосу керек.

                 

Ескерту . ¤лшемдері бірдей матрицаларды қосу үшін сәйкес элементтерін қосып, қосынды болатын массивтің сәйкес орнына жазу керек. Формуласы: c[k][j] = a[k][j] + b[k][j]

 

#include <stdio.h>

#include <conio.h>

#define MAX 3

main()                                                              (19)

{

int a[3][3] = {2,3,-1, 3,4, 2, 1,-3,4}

int b[3][3] = { 1, 0, 1, 0, 1, 0, 1, -3, 4 }

int k, j, c[3][3]; clrscr();

for(k=0; k<M; k++)

{

 for j=0; j<M; j++)

c[k][j] =a[k][j] + b[k][j];

printf("%d %d %d\n", c[k][0], c[k][l], c[k][2] ); }

getch(); return 0;

}

3 3 0

// Нәтиже : 3 5 2

2-6 8

2- мысал . 1-мысалда берілген матрицалардьщ көбейтіндісін табу керек.

Нұскау. Матрицаларды көбейту үшін біріншісінің k- қатарын екіншісінің j-бағанына скалярлық түрде көбейтіп, нәтижесін көбейтінді матрицаның (k, j) элементі етіп жазу керек:

 

#include <stdio.h>

#include <conio.h>

#define MAX 3

main()                                                                                      (20)

{

int a[3][3] = { 2, 3, -1, 3, 4, 2, 1, -3, 4 };

int b[3][3] = { 1,0, 1,0, 1,0, 1, -3,4 };

int k, i,j, c[3][3];

clrscr();

for(k=0; k<M; k++)

{

forO=0;j<M;j++)

{

c[k]D] = 0; for (i=0; i<M; i++)

c[k]O] = I a[k][i]*b[i]D] i=l

printf ("%d", c[k]Dl;};

}

printf("\n");

getch(); return 0;

 /*for j V /* fork 7

// Нәтиже:      1 6 -2

                          5 -2 11

                         5 -15 17

 

Программаға енгізілген соңғы printf("\n") операторы бір k үшін бір қатарлық элементтерді шығарган соң курсорды жаңа жолдан бастап орналастырады.

 

Бақылау сұрақтары

1. Файл. Файл элементі.

2. Файлмен жүргізілуі мүмкін жұмыстар.

3. Символдар тасқыны (ағыны), файл көрсеткіші.

4. Файлмен жұмыс істеу командалары.

5. Файлмен жұмыс істеуде қол жеткізу режімдері.

6. Файлмен жұмыс істеу үшін арналған кластар.

7. Cin, cout операторлары.

8. Тізбекті ену файлы дегеніміз не? Оны құруда пайдаланылатын операторлар.

9. Тізбекті ену файлын оқу үшін пайдаланылатын операторлар.

10. FILE * fp ; fp = fopen ( atau , " wt "); fprintf ( out , ...); -операторлары қай тілде пайдаланылады? Олардың жазылу түрі мен орындайтын ic-әрекеттері.


22-лекция. Жадыны ұйымдастыру және Си тілінің көрсеткіштері.

Жоспар:

1. Функцияға көрсеткіш.

2. Көрсеткіштер

3. Сілтемелер.

4. Функцияларды қайта анықтау.

5. Функциялар нұсқасы.

Көрсеткіш

Көрсеткіш кәдімгідей айнымалы, бірақ көрсеткіш жадта айнымалының адресін сақтайды, ал айнымалы мәнді сактайды. Көрсеткіш жұлдызша (*) символымен белгіленеді де, айнымалының алдында жазылады. Көрсеткіш көбінесе типті сипаттауда пайдаланады.

Мысалдар:

int *x, *y;

char *ch;

float*y, z;

printf("%d",*x);

Жоғарыда z айнымалысы көрсеткіш ретінде сипатталмаған, ал x, y, ch айнымалылары — көрсеткіштер. Егер олар оператор ішінде кездессе, сәйкес типтік айнымалылар да көрсеткіштер түрінде сипатталуы тиіс.

printf операторындағы сияқты, *x айнымалысының оқылуы "x көрсеткішінің мәні". Айнымалы көрсеткішін & символымен белгілеуге де болады. Мысалы, ол (і)-программаның scanf операторында пайдаланылған (&x). Оның оқылуы: " x айнымалысын ың адресі н ".

Негізгі типте көрсеткіш түрінде сипатталған айнымалыға компилятор айнымалы адресін тағайындайды. Мысалы, негізгі тип int болса, көрсеткішке 2 байттық, char болса, 1 байттық адрес бөліп қояды. Компилятор көрсеткіш арқылы белгіленген айнымалы мәнін жадтан тезірек табады.

Жалпы, * операторы айнымалының алдында тек екі жа ғ дайда жазылады: осындай айнымалыны жариялау (сипаттау) алдында және ол көрсеткен мәнді пайдаланып алу кезінде.

Массивті де көрсеткіш енгізіп сипаттауға болады, мысалы: char * ms[12]; Мұндағы сипатталған символдық ms массивінің элементтеріне 12 көрсеткіш орнатылған.

Си, C++ тілдерінде көрсеткіштің көрсетілуі мен оның дұрыс пайдалануын түсіну маңызды орын алады. Көрсеткіштер функцияларды ойдаәыдай пайдалану үшін қажет. Мұндағы ескеретін жайт : көрсеткіш дұрыс орнатылмаған программаның орындалмай қалуы мүмкін және бұл кезде қатені табу да көп қиындық келтіреді.

Жалпы, айнымалы к ө рсеткіш т ү рінде сипатталса , scanf операторының сәйкес аргументіне көрсеткіш белгісі қосылмайды да, программада, меншіктеу операторы бар болса, ол операторға енгізілген сәйкес айнымалы алдында жазылады.

Мысалы : *x, *y көрсеткіштері пайдаланылған y=3(x+2y) функциясының мәнін есептеу программасы:

# include < stdio.h>

main()                          (5)

{

float u, *x, *y;

printf ("x, y=?");

scanf ("%f%f',x,y);

u=3*(*x+2* *y);

printf ("u=%f',u);

getch(); return 0;

}


23-лекция. Программалау жүйелері

Жоспар:

1. Программалау тілінің синтаксисі және семантикасы: алфавит, түсініктері,

синтаксистік ережелері.

2. Тілдің синтаксисі және семантика сипаттау формалары.

 

Тілдің құрылуына осы тілде жазылған программаның қандай құрылғыларда орындалатын үлкен роль атқарады.Программалау тілі есепті шешу құралы ретінде барлық қолданылатын технологиялардың тек бір құрамдас бөлігі ғана болып табылады. Программаның орындалуын қолдайтын сыртқы орта операциалық жүйе .Ал програмалар құрылатын, кодталатын, тестемелелейтін және тексерілетін ортаны программалау ортасы деп атаймыз.Олардың әрқайсысы сол кездердегі қосымшаларды дайындау үшін үлкен әсер етті.

Әмбебап ЭЕМ-дер дәуірі. 40-жылдары компьютер пайда болғаннан 70-жылдарға дейін есептеулер саласында үлкен әмебап ЭЕМ-дер қолданылды. Олардың бағасы өте жоғары, көлемі үлкен орын алатын және көптеген адамдар қызмет көрсететін.

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

Тілді трансляциялау мәселелері . Программалау тілдерінің пайда болыуының алғашқы кезеңдерінде программа жазу үшін синтаксистің формальды ережелерін сақтау жеткілікті деп есептелді.Комтекстілі-еркін грамматика концепциясы немесе Бэкустың нормал формалары ойлап табылды. Бұл концепция тіл синтаксисінің спецификациялары үшін қолданылды. Қазіргі кезде де ол программаның компанентерін сипаттау үшін негізгі құрал ретінде пайдаланылды. Бірақ тілдің көптеген мәселелерді шешу барысында жалғыз ғана синтаксис жеткіліксіз. Онымен тілдің конструкцияларының сондай-ақ түгел программаның мазмұнын анықтайтын ережелер жиынтығы –программалау семантикасы да үлкен мәнге ие.

Программалау тілінің синтаксисі . Програмалау тілдерінің синтаксисі дегеніміз программаның дұрыс сипатталуын   бейнелеуші символдар тізбегі болып табылады. Мысалы, Паскаль тіліндегі х:=у+z өрнегі дұрыс жазылған құрылым, ал ху+ операторы дұрыс емес құрылым деп саналады.

Синтаксис жалпы программаны түсіну және оны объектілі программаға трансляциялау үшін аса маңызды болып табылады. Мысалы 2+3*4 өрнегінің мәні 14 екені баршаға аян. Демек, бұл өрнек 2+(3*4) түрінде интерпретацияланады. Ал осы өрнекті машинаға (2+3)*4 түрінде трансляцияласақ, ол оның нәтижесі 20 болатындығын хабарлайды.Олай балса, сәйкес синтаксистік ережелерді беру арқылы трансляторға жоғарғы өрнекті есептеу үшін дұрыс амалдар тізбегін бере аламыз.

Бірақ, жоғарыда айтып өткеніміздей, оператар құрылымын бір жақтытүсіну үшін тек оның синтаксисі жеткіліксіз. Мысалы, х:=2.45+3.67 өрнегінде оның синтаксисі бізге х айнымалының қалай анықталғанын қабарлай алмайды. х айнымалысымен “+” амалының қалайша анықталғанына байланысты бұл өрнектің мәні х=5, х=6 не х=6.12 болуы мүмкін. Яғни, егер х бүтін типті, “+” таңбасы бүтін қосу ретінде анықталса, х=5, ал х бүтін, “+” – нақты сандық қосу ретінде сипатталса, х=6, сондай- ақ, х –те, ”+” таңбасы да нақты типті деп сипатталса, х=6.12 болады. Демек, программалау түрін толық сипаттау үшін тек қана синтаксистік құрылымдарды анықтау жеткіліксіз. Тілде семантика деп аталатын атрибуттар да қолданылады. Ол синтаксистік ережелермен анықталмайды, бірақ айнымалыға үлкен әсер етеді. Симантикаға сипаттауларды амалдарды қолдану, іс - әрекеттер тізбегін басқару және сілтемелер ортасы жатады.

Жалпы синтаксистік критерийлер . Программалау түрінің синтаксисінің негізгі қызметі программист пен программалау тілінің процессорының арасында ақпарат алмасуға арналған белгілеулер жүйесін қамтамасыз ету болып табылады. Нақты синтаксистік құрылымды таңдау қандай-да бір ақпаратты тасымалдау қажеттілігіне аса байланысты емес.Мысалы қандайда бір айнымалының мәні нақты текті екендігін көптеген тәсілдермен беруге болады. Синтаксис элементтерін құру барысында ақпаратты тілдің процессорына жеткізу мәселесіне тікелей қатысы жоқ мәселелерді ескереді.

Мұндай мәсеелелер өте көп, бірақ оларды негізгі 4 топқа біріктіруге болады.

1. Оқу жеңілдігі;

2. Жазу жеңілдігі;

3. Трансляциялау жеңілдігі;

4. Біркелкілік;

Оқу жеңілдігі. Программадағы алгоритм құрылымы мен онда берілген мәліметтер тексті қарау барысында түсінікті болса, онда программа оқуға жеңіл деп есептеледі. Мұндай программалар өзін-өзі құжаттандырушы программалар депте аталады, себебі оны түсіну үшін қосымша құжаттаркерек емес. Программаның оқылуын жеңілдетуге операторлардың табиғи форматтары, құрылымдық операторлар, қызметщі және міндетті емес сөздерді кеңінен қолдану, программалар текстіне ттүсініктемелер орнату мүмкіндіктері идентификаторлар ұзындығының шектклмегендігі, мнемоникалық амал белгілері, программалы еркін форматта жазу және қолданылатын мәліметтердің сипатталуының толықтылығы сияқты тілдің ішкі қасиеті әсер етеді.

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

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

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

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

Трансляциялау жеңілдігі. Алғашқы екі мақсатқа қарама-қайшы мақсат- программалы орындалатын формаға трансляциялау болып табылады.Оқу және жазу жеңілдіктері программистің мұқтаждықтарын қанағаттандырса, транляциялау жеңілдігі жазылған программаны өңдейтін транслиятордың мұқттаждығы болып табылады. Трансляцияны жеңілдетудің ең басты көзі –программа құрылымының бірізділігі (регулярность) болып табылады LІSP тілі программаның оқылуы мен жазылуына қолайсыз болғанымен ,тансляциялау үщін аса ыңғайлы тіл болып табылады .Синтаксистің бірілділігі арқасында LІSP тіліндегі программаның синтаксистік құрылымы бірнеше қарапайым ережелермен жазылуы мұмкін. Программаны трансляциялау ондағы арнайы синтаксистік құрылым салымын артуына байланыстты қиындай түседі.

 Біркелкілік. Кез-келген тілдің негізгі шешімін таппаған мәселелерінің бірі – біркеліктің жоқтылығы. Негізінде, тілдің анықталуы ондағы кез-келген құрылымның біркеліктілігін қамтамасыз етуі керек. Біркелкі емес құрылым оны екі не одан да көп түрлі түсінуге алып келді. Бұл мәселе программаның жекелеген элементінің емес, түрліше құрылымдарды өзара байланысттырғанда пайда болады. Мысалы, Pascal және Algol тілдерінде шартты операция екі түрлі формасы қолданылады:

1. іf <логик.өрнек> then <1-оператор> else <2-оператор>

2. іf <логик.өрнек> then <оператор>

 

Бұл операторды жеке қарастырғанда оның мағнасы анық түсінікті.Бірақ бұл екі форманы біріктірсек және <бірінші операттор> ретінде және 2-ші форманы алсақ ,онда төмендегі құрылым пайда болады:

Іf <логик.өрнек> then іf <1-оператор> else <2-оператор>

Бұл құрылым біркелкі емес, себебі оған мына суреттегі қай тізбек сай келетіні белгісіз:                 

1)                                                                 2)                                                                                                                       

         

 


             

 

Тағы да бір мысал. FORTRAN тіліндегі A(І,J) сілтемесін екі өлшемді А массивіне жасалған сілтеме ретінде де, параметрлері І және J болатын А көмекші программа функцияға жасалған сілтеме ретінде де түсінуге болады. Мұндай кемшіліктерді кез-келген тілден кездестіруге болады.

Жоғарыдағы тілдерде кездескен мәселелердің екеуі де шешілді. Algol-ғы шартты операторларды пайдаланғандағы кемшілікті шешу үшін тілдің синтаксисіне begіn-end операторлары қосылды. Осылайша, табиғи бірақ біркелкі емес екі шартты оператордан тұратын құрылым енді табиғилығы төмен, бірақ жеке-жеке біркелкі құрылымдармен ауыстырылды. Енді жазылу формасына қарап, жоғарыдағыдай құрылымдардың қажеттісін таңдауға болады.

Іf <Л¤1> then begіn іf <Л¤2> then <опер.1> end else <опер.2>

 Немесе

Іf <Л¤1> then begіn іf <Л¤2> then <опер.1> else <опер.2> end

Бұл кемшілік Ada тілінде өте жеңіл шешімін тапқан: мұндағы әрбір іf операторы end іf ажыратқыштарымен аяқталады. Ал С және Pascal тілдерінде мәселе өзгешелеу шешілген. Мұнда алдын-ала келісілген ереже бойынша әрбір else ең жақын іf-пен біріктіріледі, яғни ең алғаш келтірілген құрылым ALGON-дағы екінші операторлар тізбегіне сай келеді.

Fortran-дағы кемшілік былайша жойылады: егер алдын ала А массиві сипатталмаған болса, A(І,J) сілтемесі көмекші программаны шақыру деп қарастырылады.


24-лекция. Интегралданған программалау жүйелері: олардың міндеті және компоненттері.

 

Жоспар:

1. Программаны компиляциялау (түрлендіру) және орындау процестерін басқару

құралдары.

2. С/C++ тілінің түрлендіру директивасы, олардың түрлері және міндеті.

Си-дi iске қосу және күйге келтіру

Си программалау ортасы келесi блоктарды бiріктiредi:

· Тексттiк редактор;

· Компилятор;

· Программаның жұмысын жөнге салу (отладчик);

· Анықтамалар жүйесi;

Турбо Си программалау ортасын келесi командалар арқылы iске қосуға болады:

А) рабочий стол ® tc . exe;

В) проводник ® C : ® TC ® BIN ® t c . exe

Осы әрекеттердi орындаған соң экранға бiрнеше бөлiмнен тұратын Cи терезесi шығады. Ол бөлiмдер:

· Экранның жоғарғы жағындағы жол – Cи-дiң нег i зг i меню i;

· Жұмыс i стейт i н аудан – экранның ортасы;

· Программаның атқарып жатқан жұмысын көрсететiн жол, статус деп аталады – экранның төменгi жағы.

Негiзгi менюдiң жолын F10 клавишасы арқылы iске қосуға болады. Осы менюдiң командалары:


Дата добавления: 2019-02-12; просмотров: 266; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!