Программа денесі(операторлар тізбегі)



бет18/21
Дата16.03.2018
өлшемі5,46 Mb.
#39417
түріПрограмма
1   ...   13   14   15   16   17   18   19   20   21

  • Функция мәндерінің кестесін құрыңыз: , . У мәнін келесі функция арқылы есептеу керек, соған процедруа құрыңыз.

  • Герон формуласы арқылы үшбұрыштың ауданын табуға процедура жазыңыз.

  • Екіөлшемді массив берілген. Массивтің ең кіші және ең үлкен элементтерін табуды функцияны қолдану арқылы шығарыңыз.

  • Екіөлшемді массив берілген. Массивтің ең кіші және ең үлкен элементтерін табуды және олардың реттік номерін табуды функцияны қолдану арқылы шығарыңыз.

    Зертханалық жұмыс №11
    Тақырыбы: Файлдар. Файлдармен орындалатын операциялар.

    Мақсаты: Файлдармен танысу, оларды құру, ашу, текстік файл дарға қолданылатын процедуралармен танысу. Файлдарды қолданып программа құрып үйрену.

    Паскаль тіліндегі файл дегеніміз - бір типтегі (жай немесе күрделі) элементтер тізбегі. Массивтен өзгешелігі файлдың ұзындығы берілмейді, яғни элементтер саны берілмейді. Әрбір элементтің алатын орны индекс арқылы көрсетіледі және әрбір элемент оның алдындағы элементтен кейін ғана іске қосылады. Мұндай файлдар тізбектелген деп аталады. Паскаль тілінде файлдың 3 категориясы бар:



    1) Текстік(типы Text);

    2) Типтендірілген (File of <типы>);

    3) Типтендірілмеген файл(File);

    Файлдық типтегі айнымалылар программада Var жєне Type бөліктерінде сипатталады.



    Var (айнымалылар) бөлігінде сипатталуы:

    Var <файл аты>: File of <элементтың базалық типi>;

    Мысалы:

    Ft: File of integer; (бүтін мәндер файлы)



    M: File of char; (символдық мәндер файлы)

    S: File of real; (нақты мәндер файлы)



    Type типтер бөлігінде хабарлануы:

    Type <тип атауы>= File of <базалық тип>;

    Var <файл атауы>: <тип атауы>;

    Мысалы:


    Type File_integer=File of integer;

    Var F: File_integer;

    Turbo Pascal программалау тілінде файлды оқуға, жазуға, ашуға болады. Файлды ашу алдын ала анықталған файлдық айнымалы арқылы және Assign процедурасының көмегімен байланыстырылады. Файлды ашу кезінде алдымен дискіден көрсетілген файл ізделеді немесе жаңа файл ашылып, ағымдағы бағыттағыш файл басына орналастырылады.

    Assign процедурасының жалпы жазылу түрі:

    Assign (Var F; File_name: string);

    Мұндағы F дегеніміз- File_name параметрі бойынша файлдық айнымалы атауы. File_name дегеніміз- қатарлық типтегі дискідегі файл атауы.

    Файлды оқу.

    Файлды оқу - дегенiмiз машинаның оперативтi жадысына мәндердi дискiде сақталып тұрған сыртқы файлдан енгiзу. Файлды оқу үшiн программада мынадай амалдарды орындау қажет:

    Оқуға арналған файлды ашу (Reset); Файл туралы мәлiметтердi программаға енгiзу(read операторы); Оқуға арналған файлды жабу(Close операторы);

    Мәндерi оқылатын сыртқы файлды кiру файлы деп атайды. Reset(1-атау);

    ...........................

    Read(1-атау, параметр );

    ..........................

    Close(1-атау);

    Көп нүктемен программада қандай да бiр операторлар орындалуы берiлген. Файл анықталған элементтер саны арқылы берiлмейтiндiктен Паскаль тiлiнде файлдың соңы белгiсi енгiзiлген. EOF(файл атауы) стандартты функциясы файлдың соңына жеткен-жетпегенiн аныктау үшiн қолданылады. Файл соңына жетпеген жағдайда ол ақиқат мән қабылдайды, керi жағдайда жалған мән қабылдайды. EOF функциясын логикалық өрнекте қолдануға болады, атап айт-қанда циклдiк операторда.

    Мысалы:


    While not EOF(f1) do

    Begin


    ......................................

    End.


    f1файлының соңына жеткенше Begin end операторлық жақшасына алынған циклдiк бөлiк қайталана бередi. Файлда элементтер жол бойынша сақталады. Файл жолының соңын анықтау цикл операторы:

    Мысалы:


    While not EOLN(1-f) do

    Ал файлдың жаңа жолға көшу үшiн Readln (1-атау) операторы қолданылады.



    Файлды сақтау.

    Файлды сақтау дегенiмiз – программаның орындалу нәтижесiн ЭВМ-нiң оперативтi жадынан дискiге шығару, сыртқы құрылғыда жаңа файл құру.Файлды сақтау үшiн программада төмендегiдей операторларды орындау керек:

    Сақтау үшiн файл ашу(rewrite операторы).

    Мәндердi шығару(write операторы).

    Сақтау үшiн ашылған файлды жабу(close операторы).

    Программадағы мәндер сақталатын сыртқы файл шығу файлы деп аталады. Файлды сақтаудың жалпы формасы:

    Rewrite(1-атау);

    ……………….


    Write(1-атау, параметр);

    ……………….


    Close(1-атау);

    Мәндердi файлға жазуға арналған шығару операторы Write(параметрлер) болса, онда мәндер экранға шығарылады, ал Write(1-атау, параметрлер) болса, онда мәндер дискiде сақталатын файлға жазылады.



    Барлық файлдарға арналған процедуралар және функциялар:

    CHDIR(PATH) – ағымдағы директорияны өзгерту жолы PATH параметрiндегi жаңа ағымдық католог орнатады.

    ERACE(F) – сыртқы файлды жою.

    GETDIR(N,S) – жинақтауыштан ағымдық катологты алу.

    MKDIR(PATH) – жаңа католог құру.

    RENAME(F,NEW) – сыртқы файлдың атын ауыстыру.

    RMDIR(PATH) – бос катологты жою.

    IORESULT – соңғы енгiзу-шығару операциясының нәтижесi. Егер енгiзу-шығару операциясы дұрыс орындалса 0 болады, қарсы жағдайда басқа сандар болады.



    Текстiк файлдар.

    Текстiк файлдар жолдарға болiнген символдар жиынынан тұрады. Әрбiр жол соңында жол соңын бiлдiретiн белгi тұрады. Текстiк файлдың ерекшелiгi Read немесе Write процедураларының көмегiмен енгiзiлетiн немесе шығарылатын мәндер параметрлерi тек қана String немесе Char типтерiнде ғана емес, баска да жай типтерде болады: енгiзуде -бүтiн, заттық; шығаруда-бүтiн, заттық, логикалық. Текстiк файлдарға арналған программаны iске қосуда автоматты түрде ашылатын және автоматты түрде жабылатын 2 стандартты файлдық айнымалылар бар: Input және Output.

    Текстiк файлдарға арналған процедуралар мен функциялар:

    APPEND(F) – ақпатаратты толықтыру үшiн файлды ашу.

    FLUSH(F) – шығу файлының буферiн босату. Шығару буферiндегi ақпарат файлға жазылады.

    READ(F,<тiзiм>) – файлдан оқу.

    READLN(F,<тiзiм>) – файлдағы жолдарды оқу.

    SETTEXT BUF(F, BUF[ , SIZE] ) – енгiзу-шығару буферiн тағайындау.

    WRITE(F,<тiзiм>) – файлға жазу.

    WRITELN(F,<тiзiм>) – файлға жол жазу.

    EOLN(F) – файл жолының соңы.

    SEEKEOF(F) – файл соңы.

    SEEKEOLN(F) – файл жолының соңы, жол соңында пробел және табуляция символдарын жiбередi.

    Типтендірілген файлдар.

    Типизировалық файл деп – олардың элементтерiнiң типi көрсетiлетiн файлды айтамыз. Барлық компоненттер жалпы атқа ие, ал әрқайсысының өз номерi бар.

    Алғашқы элемент 0-ге тен.

    Типтендірілген файлдарға қолданылатын процедуралар мен функциялар:

    SEEK(<файлдық айнымалының аты>, N) – процедурасы N-шi элементке ағымдық нұсқағыш орнатады. Мысалы: нұсқағышты F1 файлының 3-шi элементiне орнату керек. SEEK(F1,3).

    FILE POS(<файлдық айнымалы аты>) – функциясы ағымдық нұсқаушы көрсетiп тұрған элемент номерiн анықтайды. Мысалы: келесi әрекет орындалатын элемент номерiн табу. N:=FILE POS(F1). Мұндағы N – бүтiн айнымалы элемент номерiне тең болады.

    FILE SIZE(<файлдық айнымалының аты>) – функциясы файлдағы элементтер санын аныктайды.

    TRANCATE(F) – ағымдық компоненттен бастап файлдың бөлiгiн жою.

    WRITE(F,<тiзiм>) – нұсқалған типтегi компоненттердi файлға жазу.

    READ(F,<тiзiм>) – нұсқалған типтегi компоненттердi файлдан оқу.



    Типсiз файлдар.

    Типi берiлмейтiн файлды типсiз файл деп атайды. Типсiз файлдарға қолданылатын процедуралар мен функциялар:

    FILE POS(<файлдық айнымалы аты>) – функциясы ағымдық нұсқаушы көрсетiп тұрған элемент номерiн аныктайды.

    FILE SIZE(<файлдық айнымалы аты>) – функциясы файлдағы элементтер санын аныктайды.

    TRANCATE(F) – ағымдық компоненттен бастап файлдың бөлiгiн жою.

    BLOCKWRITE(F, BUF, N[ , RESULT] ) – көрсетiлген типтегi файл компонентiне жазу.

    BLOCKREAD(F, BUF, N[ , RESULT] ) – файл компонентiнен оқу.


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


      1. Файл дегеніміз не?

      2. Файлдың қандай үрлері бар?

      3. Файлдарды сипаттауға мысал келтіріңіз.

      4. Текстік файлдарға қолданылатын функцияларды атаңыз.

      5. Типтендірілген файл мен типтенндірілмеген файлдардың айырмашылығы неде?


    Тапсырмалар

        1. Мекеме қызметкерлерінің аты-жөнінен, жалақы мөлшерінен, телефон номерінен тұратын файл берілген. Жалақысы 10000-нан төмен қызметкерлерді анықтау

        2. Студенттердің топ номері, аты-жөні, стипендия мөлшері, адресі туралы ақпарат берілген типтендірілмеген файл құрыңыз. Адресі бойынша аты-жөнін анықтау.

        3. Типтендірілген файлда бірнеше жолға бүтін сандар сақталған. Әрбір баған элементтерінің қосындысын тауып, алғашқы мәндерімен бірге басқа файлға сақтаңыз.

        4. Мекеме қызметкерлерінің аты-жөнінен, жалақы мөлшерінен, телефон номерінен тұратын файл берілген. Аты-жөндері бойынша телефондарын анықтау.

        5. Нақты сандардан тұратын файл берілген. Осы сандардың қосындысын, көбейтіндісін, айырмасын табыңыз.

        6. f файлы берілген. Компоненттері бүтін сандар. G файлына осы файлдың тақ сандарын, ал h файлына жұп сандарын көшіру.

        7. Берілген мәтіндік файлдың көшірмесін алыңыз.

        8. Нақты сандардан тұратын файл берілген. Осы файлдың оң сандарының қосындысын, ал теріс сандарының кубын есептеңіз.

        9.  Мекеме қызметкерлерінің аты-жөнінен, жалақы мөлшерінен, телефон номерінен, адресінен тұратын файл берілген. Аты-жөндері бойынша жалақысын анықтау.

        10. Студенттердің топ номері, аты-жөні, курсы, стипендия мөлшері, адресі туралы ақпарат берілген типтендірілмеген файл құрыңыз. Курсы бойынша топ номерін анықтау.


    Зертханалық жұмыс №12
    Тақырыбы: Жиындар

    Мақсаты: Жиындар ұғымымен таныстыру. Жиындарды қолдану ерекшеліктерімен таныстыру. Програмада қолдануды үйрету.
    Жиындар – бір ата ие, қайталанбайтын элементтерден тұратын жиынтық немесе логикалық байланысқан бір типті объектілер жиынтығы. Жиынға енетін элементтер 0-ден 256-ға дейін өзгеруі мүмкін. Элементтерінің тұрақсыздығымен жиындар массивтер мен жазулардан ерекшелінеді.

    Екі жиын эквивалентті болады, егер олардың элементтерінің жиындарда орналасу реті кез келген, бірақ элементтері бурдей болса.

    Бір жиынның барлық элементтері басқа жиындарда кездессе, бір інші жиын екіншіге енгізілген немесе ішкі жиын деп аталады.

    Жиындарды сипаттау:


    <тип аты> = Set Of <базалық тип>;
    Мұндағы <базалық тип> - жиын элементтерінің типтері. Мұндай тип ретінде кез келген Integer-дан басқа тип алынады. это (Турбо-Паскальда Word, Shortint, Longint типтерінен басқа).
    Type

    TypeSet1 = set of Char; {символдардан тұратын жиын}

    TypeSet2 = set of 0..9; {0-9 аралығындағы сандардан тұратын жиын }

       


    Жиынды беру үшін жиын конструкторы қолданылады. Ол тік жақшаға жазылады және элементтері бір-бірінен үтірмен ажыратылады. Элементтері тұрақтылар немесе кез келген базалық типтегі өрнектер бола алады. Бос жиын конструкторы - [ ].
    Мысал: Жиынды анықтау және беру:

       


    Type

            digitChar = Set Of ‘0’ .. ‘9’;

            digit = Set Of 0 .. 9;

        Var


            s1, s2, s3 : digitChar;

            s4, s5, s6 : digit;

            . . . . . .

            s1 := [‘1’, ‘2’, ‘3’];

            s2 := [‘3’, ‘2’, ‘1’];

            s3 := [‘2’, ‘3’];

            s4 := [0. .3, 6];

            s5 := [4, 5];

            s6 := [3. .9];. . . . . .
    Келесі операцияларды қолдануға болады: 
    Операция Мағынасы Мысал* Нәтиже

    * жиындардың қиылысуы s1*s3 [‘2’, ‘3’]

    + жиындарды біріктіру s4+s5 [0. .6]

    - жиындардың айырымы s2-s3 [‘1’]

    = True, егер жиындар

    эквивалентті болса s1=s2s1=s3 TrueFalse



    <> True, егер жиындар

    эквивалентті емес болса s1<>s2s1<>s3 FalseTrue



    <= True, егер бір жиын

    екіншісінде жоқ болса s5<=s6 True

    >= True, егер бір жиын

    екіншісінде бар болса s2>=s3 True

    In жиынның сол жағында

    тұрған өрнектің мәнінің оң

    жақтағы өрнекке

    жатуын тексеру 7-5 In s4 True


    Мысал:

    А, В, С жиындарының элементтерін енгізу керек. A + B, B * C, C – A жиындарын есептеу және шығару.
    Program CalcSet;

    Type SetChar: Set Of Char;

    Var A, B, C : SetChar;

    {жиынды енгізу процедурасы}

    Procedure EnterSet(Var D: SetChar);

    Var ch: Char;

    Begin

        Writeln(‘Жиын элементтерін енгіз, нүкте – енгізу соңы’);



        Read(ch);

        D:=[];

        While ch<>‘.’ Do

            Begin D := D + [ch]; Read(ch) End;

    End;{EnterSet}

    {жиынды шығару процедурасы}

    Procedure PrintSet(D: SetChar);

    Var i: Byte;

    Begin For i := 0 To 255 Do

          If Chr(i) in D Then Writeln(Chr(i))

    End;{PrintSet}

    Begin {негізгі программа}

        Writeln(‘A жиыны элементтерін енгіз’);

        EnterSet(A);

        Writeln(‘B жиыны элементтерін енгіз’);

        EnterSet(B);

        Writeln(‘C жиыны элементтерін енгіз’);

        EnterSet(C);

        PrintSet(A+B); PrintSet(B*C); PrintSet(C-A)

    End.


    Жиындарға екі процедура қолданылады:

    INCLUDE (S,I) - S жиынына жаңа I элементін қосады, ол элемент S жиынының базалық типіне жатауы керек.


    EXCLUDE (S,I) – S жиынынан I элементін алып тастайды.
    Екі жиынға қолданылатын (+) және (–) операцияларынан бұл процедуралардың айырмашылығы тек бір элементке ғана орындалады. Сондықтан жоғары жылдадығымен ерекшелінеді.

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


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

    1. Жиын дегеніміз не?

    2. Сипаттауына мысал келтіріңіз.

    3. Жиынға қолданылатын операцияларды атаңыз.

    4. Қандай процедуралар жиынмен жұмыста қолданылады?

    5. Жиынның массивтерден ерекшелігі неде?


    Тапсырмалар

    1. А жиынының барлық элементтерінің типі Х, олар аралық типпен берілген. Элементтер санын анықтайтын функцияны жазу керек.

    2. Екі жиын берілген. Оларды бірітіріңіз.

    3. Екі жиын берілген. Олардың айырмасын көрсетіңіз.

    4. Екі жиын берілген. Олардың қиылысу нәтижесін көрсетіңіз.

    5. Бүтін сандар жиыны берілген. Олардың 2-ге бөлінетінін анықтаңыз.

    6. Берілген жиынның N-ші элементтен кейінгі элементтерін экранға шығару.

    7. Берілген жиынның N-ші элементтен дейінгі элементтерін экранға шығару.

    8. Берілген жиынға N элементінің тиістілігін анықтау керек.

    9. Бүтін сандар жиыны берілген. Олардың 2-ге бөлінетінін анықтаңыз.

    10. Орыс алфавитінің әріптері берілген. Осылардың ішінен дауысты дыбыстардан жиын құрау.



    Зертханалық жұмыс №13
    Тақырыбы: Жазулар

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

    <тип атауы> = record <өрістер тізімі> end

    <өрістер тізімі> - жазулар бөліктерінің тізбегі, олар бір-бірінен нүктелі үтірмен ажыратылады. Атаулардан кейін қос нүкте қойылып өріс типтері сипатталады. Мысалы:

    Type


    Data = record

    X,Y : integer;

    Z : char

    end;


    Var

    D1,D2 : Data;

    Begin



    D1.X := 10;



    D2.Z := ‘n’;

    End.



    Жазу өрісін шақыру үшін жазу-айнымалының идентификаторын және нүктеден кейін өріс атын көрсету керек

    Var бөлімінде де жазуларды сипаттауға болады.

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

    Жазу өрісі кез келген типтті қабылдай алады:

    Var

    D : record



    X : integer;

    R : record

    RX : integer;

    RZ : char

    end

    end;


    Begin

    D.R.RX := 2;



    End.


    Жазу өрістерімен жұмысты жеңілдету үшін WITH біріктіру операторын қодануға болады. со следующим форматом:

    with <жазу-айнымалының аты> do <оператор>



    Нұсқалы өрістер (Записи с вариантами)

    ТР-да нұсқалы өрістер деп аталатын жазуларды қолдануға болады.

    Мысалы:

    Var


    D : record

    X : integer;

    case V: boolean of

    True : (Y_one : integer);

    False : (Y_two : array [1..4] of real)

    end;


    Мұндағы, Х өрісі – анықталған (фиксирленген). V өрісі – True және False мәндеріне ие болатын белгі (признак) өрісі. Үшінші өріс әр түрлі нұсқаларғка ие бола алады. Ол V өрісінің мәніне байланысты (D.Y_one немесе D.Y_two). Нұсқалық өріс тек біреу және олл соңында жазылады. Кез келген уақытта нұсқалардың ішінен тек біреуімен ғана жұмыс істеуге болады.

    CASE... OF нұсқалық бөлікті ашатын, таңдаау операторына ұқсас болып көрінгенмен, ол тек нұсқалық бөліктің басталғанын білдіреді. Сондықтан таңдау операорындағы сияқты END сөзі қойылмайды. Жалғыз қойыылатын талап, таңдай кілті алдын-ала анықталған немесе стандартты типімен анықталуы керек. Бірақ бұл тип келесі вариантты өрістердің санына да, тіпті таңдау тұрақтысының мінездемесіне де өз әсері н тигізбеуі керек. Турбо Паскальда таңдау кілті әлдебір реттелген және программаның орындалатын бөлігінде мән меншіктеуге болатын айнымалы ретінде алғанмен, оныі өрісті таңдауға әсері тимейді: яғни, таңдау тұрақтысының мәндері Турбо Паскальда еркін таңдалады.

    Мысалы:

    type


    reel = record

    a : Byte;

    b : Word; 

    end; 


    rec2 = record

    с : longint;

    case x : Byte of

    1 : (d : Word);

    2 : (e : record

    case Boolean of

    3 :( freel);

    3 :( g Single);

    '3':( с Word);

    end)


    end; 

    var


    r : rec2; 

    begin


    r.x := 255;

    if r.e.g = 0 then

    WriteLn('O.K. ')  

    else


    WriteLn(r.e.g) 

    end.


    Бұл мысалда case Boolean of сөйлемді таңдау кілті ретінде логикалық типті сипаттайды. Ол TRUE және FALSE мәндерінің бірін қабылдайды. Келесі нұсқаларды таңдау тұрақтыларының жалпы саны 3 жәнебұл логикалық типке жатпайтын, екеуі қайталанатын мәндер қабылдайды. Өрістер атаулары өзлері сипатталған жазу шегінен аспауы керек.

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

    1. Жазу дегеніміз не?

    2. Сипаттауына мысал келтіріңіз.

    3. Жазуға қолданылатын WITH DO операторының қызметі қандай?

    4. Нұсқалы өрістер деп аталатын жазулар дегеніміз не?

    5. Жазудың массивтерден ерекшелігі неде?


    Тапсырмалар

    1. Файлда мектеп оқушыларының фамилиясы, есімі, оқу жылы, берілген. Мектептегі параллель сыныптарда оқитын оқушылар арасында фамилиясы бірдей оқушыларды анықтау программасын құру.

    2. Файлда мектеп оқушыларының фамилиясы, есімі, оқу жылы, әріп (сынып атауындағы әріп) берілген. 9а сынып оқушыларының фамилиясы мен есімінің бас әріпін ғана шығару.

    3. Файлда мектеп оқушыларының фамилиясы, есімі, оқу жылы, берілген. Есімі мен фамилиясы бірдей оқушыларды анықтау программасын құру.

    4. Файлда мектеп оқушыларының фамилиясы, есімі, адресі берілген. Бір көшеде тұратын оқушыларды табу.

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

    Зертханалық жұмыс №14
    Тақырыбы: Рекурсиялы функциялар

    Мақсаты: Рекурсия ұғымымен таныстыру. Программада қолдануды үйрету.

    Рекурсия — бұл көмекші алгоритмді (ішкі программаны) ұймдастырудың әдісі. Мұнда сол ішкі программа (процедура немесе функция) операторлары орындалуы кезінде өз-өзін шақырады (обращаться). Рекурсиялы деп өзі арқылы анықталатын кез келген объектіні атауға болады. Мысалы:

    <екілік код> ::= <екілік цифр> | <екілік код><екілік цифр>

    <екілік цифр> ::= 0 | 1

    Мұнда ұғымдарды сипаттау үшіінн Бэкус-Наурдың металингвистикалық формулалары қолданылды: "::=" таңбасы "анықтама бойынша бар", ал "|" — "немесе" дегенді білдіреді. Рекурсивті анықтамада шектеу болуы керек. Басқа да мысалдарды қарастырайық:



    Мысал. Рекурсияны айтқанда айтпау кетуге болмайтын классикалық мысал факториалды қарастырайық. Ол былай анықталады:

    n!=1*2*3*...*n. Ал тағы бір жағынан алып қарасақ, шектік шарт n<=1.

    Рекурсиялы ішкі программаны шақыру басқа да ішкі программаларды шақырудан ерекшелігі жоқ. Алайда рекурсиялы ішкі программаны шақырғанда жадыда сол ішкі программаның барлық жергілікті айнымалыларымен бірге көшірмесі пайда болады. Мұндай көшірмелер шектік шартқа жеткеше қайталана береді. Ал шектік шарт болмаса ол стек толып, программаның дұрыс аяқталмауына әкеледі. Рекурсиялы ішкі программалардың шектік шартқа жеткенге дейінгі көшірмелерінің пайда болуы рекурсивті түсу (рекурсивный спуск) деп аталады. Көшірмелердің компьютер жадысында орналасқан максималды саны рекурсия тереңдігі (глубина рекурсии) деп аталады. Ал көшірмелер алудың аяқталуы рекурсивті көтеріліс (рекурсивный подъем) ддеп аталады.



    Рекурсиялы ішкі программалардың қолданылуы.

    Begin Begin Begin

    P; операторы; операторы;

    операторы; P P;

    End; End; операторы

    End;
    Рекурсивті көтеріліс Рекурсивті түсу Рекурсивті көтеріліс



    және рекурсивті түсу

    Мұндағы P — рекурсивті ішкі программа. Әрекеттерді ұйымдастыру алгоритмге байланысты. Осы келтірі лген мысалдарды Турбо паскаль тіліндегі функциялар және процедуралар түрінде көрсетейік:



    Мысал:

    {Функция}

    Function Factorial(N:integer):Extended;

    Begin

    If N<=1


    Then Factorial:=1

    Else Factorial:=Factorial(N-1)*N

    End;
    {Процедура}
    Procedure Factorial(N:integer; Var F:Extended);

    Begin


    If N<=1

    Then F:=1

    Else Begin Factorial(N-1, F); F:=F*N End

    End;


    Осы мысалдарда программалар рекурсивті көтерілу кезінде орындалады.

    Мысал:

    Сызықтық массив элементтерінің қосындысын есептеу.

    Есепті шешу барысында келесілерді қолданамыз: элементтер саны нольге тең болса, қосынды нольге тең және алдыңғы элементтер қосындысына соңғы элементті қосу, егер элементтер саны тең емес ноль болса.

    Program Rec2;

    Type LinMas = Array[1..100] Of Integer;

    Var A : LinMas;

    I, N : Byte;

    {Рекурсивті функция}

    Function Summa(N : Byte; A: LinMas) : Integer;

    Begin

    If N = 0 Then Summa := 0 Else Summa := A[N] + Summa(N - 1, A)



    End;

    {Негізгі программа}

    Begin

    Write(Массив элементтерінің саны ');



    ReadLn(N);

    Randomize;

    For I := 1 To N Do

    Begin


    A[I] := -10 + Random(21); Write(A[I] : 4)

    End;


    WriteLn; WriteLn('Қосынды: ', Summa(N, A))

    End.


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

     

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



    1. Рекурсия дегенді қалай түсінеміз?

    2. Қандай көмекші алгоритм рекурсивті деп аталады? Өз мысалдарыңызды келтіріңіз.

    3. Шектік шарт дегеніміз не? Оның қолданысы не үшін керек?

    4. Рекурсивті түсу дегеніміз не?

    5. Рекурсивті көтерілу дегеніміз не?


    Тапсырмалар

    1. Торкөздерден тұратын, тіктөртбұрышты тақтай берілген. Тақтаның кейбір торкөздері ойылып алынған. Тақта неше бөлікке бөлінетінін анықтау.

    2. Тіктөртбұрыш құрылып жатыр. Оның әрбір қабырғасы берілген төбенің жаңа координаталарын бере отырып, қатынаста бөлінген. Соданкейін осы төбелерде қайтадан төртбұрыштар құрылады. Осының программасын құру.

    3. Келесі өлең жолдарын шығару:

    У Вовы была собака

    Он ее любил

    Она съела кусок мяса

    Он ее убил и на камне написал:

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




    Зертханалық жұмыс №15
    Тақырыбы: Жадының динамикалық бөлінуі

    Мақсаты: Динамикалық жады ұғымымен таныстыру. Программада қолдануды үйрету.

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



    · объектілер құруға;

    · оларға жады бөлуге;

    · олардың қажеттілігі болмаған кезде жоюға;

    Динамикалық жадының басқаша атауы – топ (куча). Динамикалық жадының бөлінуі туралы жақсы түсіну үшін Турбо паскаль тіліндегі программа орындалу кезіндегі жады құрылымымен танысу керек. ке Паскаль (Сурет 1).

    Динамикалық жадыда мәліметтерді көрсеткіштер (указатели) көмегімен орналастырады.

    Көрсеткіш – жадының анықталған ұяшығына сілтеме. Мұндай типтегі мәліметтер сілтемелі деп те аталады.

    Сілтемелі типтегі мәліметтерді сипаттау параметрлері:

    Type <көрсеткіш типі> = ^ <тип идентификаторы>,

    Көрсеткіш қандай да бір типпен байланыстырылған, сондықтан ол типтендірілген деп аталады.

    Мысал:

    Type


      p1=^integer;

      p2=^real;

    Var

      A,B,C:p1;



      X,Y,Z:p2;

      P:^char;

    Сілтемелі айнымалылар A, B, C динамикалық бүтін типті объектілерге нұсқайды, X,Y,Z – нақты тип, P - символдық. Сілтемелі айнымалының мәні болып, ерекшеленген динамикалық жадыдағы адрес табылады. Мұнда осы типтегі объект сақталады.


    Жүйелік облыс (Паскаль кітапханасы, компилятор, интерфейс, қатліктер туралы хабарлама жіберетін файл)

    Программа

    Динамикалық жады

    Жүйелік облыс

    Сурет 1. Программа орындалуы кезіндегі жады құрылымы

    Сілтемелі айнымалыны шақыру үшін келесі “ A^ ” жазуы қолданылады. Ол жазу «А сақталып тұрған адрес бойынша жүру» дегенді білдіреді.

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

    1. Көрсеткішті жариялау;

    2. Программаның орындалуы кезінде жады бөлінетін динамикалық мәліметтердің құрылуы.

    Көрсеткіштермен жұмыста келесі процедуралар қолданылады:

    New(P) – динамикалық жадыда жаңа айнымалы құратын процедура. Р – қандай типті айнымалы құру керек болса, сол типті айнымалы құратын көрсеткіш.

    Dispose(P) – топқа (куча) Р көрсеткішті объекті алып тұрған жады бөлігін қайтаруға мүмкіндік беретін процедура.

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



    GetMem(P,Size) – жадыны резервке алу;

    FreeMem(P,Size) – жадыны босату.

    Мұндағы, Р – типтендірілмеген көрстекіш, Size – топтың байтпен берілген бөлігінің өлшемі ( до 65521 байт). Көрсеткіштерге теңдік пен меншіктеуге тексеру операцияларын да қолдануға болады.



    Мысал:

    Var x,y:^integer;

    Begin

      new(x); {бүтін типті динамикалық объект құрамыз}



      x^:=13; {х адресі бойынша 13 мәнін егіземіз}

      y:=x; { у-ке де сол адресті енгіземіз}

      writeln(y^);

    end.


    Сілтемелі айнымалы «бос» мән қабылдай алады. Ол nil қызметші сөзімен ерекшелінеді. Бұл меншіктеуді new процедурасы орындалғанға дейін жүргізуге болады. Nil мәні - бұл екі нольдік сөз. Ол кез келген типтегі көрсеткішке меншіктелінеді. Динамикалық орналастырылған мәліметтерді программаның кез келген жеріне орналастыруға болады. Мысалы:

    Var a, b, c : ^ real;

    Begin a^ := sqr(b^)+c^-17;

    a:=sqr(b^) деп жазуға болмайды, себебі, көрсеткішке нақты мәндегі өрнекті меншіктеуге болмайды.



    Мысал:

    64 Кб өлшемді мәтіндік файл берілген. Әр жолда бір нақты сан орналасқан. Файл мазмұнын динамикалық жадыға орналастыра отырып, массивке жазу керек. Массив элементтерінің орташа мәнін табу керек. 10000 өлшемді бүтін массив құру керек. Оны -100-ден 100-ге дейінгі кездейсоқ сандармен толтыру керек және орташа мәнін есептеу қажет.

    Program Srednee;

    Const NMax = 10000;

    Type Diapazon = 1..NMax;

    MasInt = Array[Diapazon] Of Integer;

    MasReal = Array[Diapazon] Of Real;

    Var PIint : ^MasInt; PReal : ^MasReal;

    I, Midint : longInt; MidReal : Real; T : Text; S : string;

    Begin

    Write('Файл атын енгізіңіз: '); ReadLn(S);



    Assign(T, S); Reset(T); MidReal := 0; MidInt := 0;

    Randomize;

    NEW(PReal); {Нақты массивке жады бөлу}

    {Нақты массивті енгізу және қосындысын есептеу}

    While Not Eof (T) Do

    Begin ReadLn(T, PReal^[I]); MidReal := MidReal + PReal^[I] End;

    DISPOSE(PReal); {Нақты массивті жою}

    NEW(PInt); {Бүтін массивке орын бөлу}

    { Бүтін массивті енгізу және қосындысын есептеу }

    For I := 1 To NMax Do

    Begin PInt^[I] := -100 + Random(201); MidInt := MidInt + PInt^[I] End;

    {Орташа мәндерін шығару }

    WriteLn('орташа бүтін мән: ', MidInt Div NMax);

    WriteLn('орташа нақты мән: ', (MidReal / NMax) : 10 : 6)

    End.

    Сызықтық тізімдер. Стек. Реттер.

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



    Сызықтық тізім – ол тораптардың айнымалы сандарынан тұратын жиын X[1], X[2], ... , X[n].
    Мұндай тізімдердің құрылымы:

    1. Егер n>0, онда Х[1] бірінші торап;


    2. Егер 1онда k-ншы торапқа Х[k] және Х[k-1], Х[k+1];
    3. Х[n] соңғы торап болып табылады.

    Осындай тізімдердің ішінен арнайы тізімдерді де бөліп алуға болады.



    Стек – сызықтық тізім. Онда қосуда, алып тастауда тізім соңында орындалады.

    Стектерге мысал: асханадағы табақтар тобы т.б. Стектерді рекурсивті алгоритмдерде қолданған тиімді. Стек соңын стек төбесі деп атайды. Стектің жұмыс істей принципі: «бірінші келіп, бірінші шығу».

    Реттер (очередь) – бас жағынан элемент қосылып жатса, соңынан элементтер жойылып жататын сызықтық тізім. Жұмыс істеу принципі: «бірінші келіп, бірінші шығу».
    Бақылау сұрақтары


    1. Статистикалы және динамикалық өлшемдердің айырмашылықтары неде?

    2. Динамикалық бөлетін жады қалай аталады?

    3. Көрсеткіш дегеніміз не?

    4. Стектер мен реттердің бір-бірінен айырмашылықтар және ұқсастықтары?

    5. Айнымалы адресі қалай анықталады?

    Тапсырма

    1. Екібағытты тізім келесі түрде жарияланған:

    Type BT = Byte;

    U = ^Zveno;

    Zveno = Record Inf : BT; Pred, Next: U End;

    Мұндағы, Pred, Next — тізім элементтеріне көрстекіштер. Осындай тізім жұмысын қамтамасыз ететін ішкі программаларды құрыңыз.



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

    2. Тізім элементтерінің саны белгісіз. Тізім құру, соңы қандай да бір шартты символ енгізу (тізім басына, тізім соңына)

    3. Динамикалық жадыда тізім құру. Бір байланысты элементтерді сәйкес екі байланысы бар элементтер бойынша іздеуді орындау.

    4. Динамикалық жады түрінде жолдар картасын құру. Картаға кіру нүктесі ретінде қалалар адрестерінің массивін енгізу.

    5. Бинарлық ағаш құру (жолдық , бүтінсанды, символдық типтердің біріне).



    Зертханалық жұмыс №16
    Тақырыбы: Графикалық режимде жұмыс. Графикалық объектілерді салу.

    Мақсаты: Графикалық режиммен танысу. Графикалық объектілерді салатын процедуралармен жұмыс жасауды үйрену, программада қолдануды меңгеру.
        Турбо Паскальда графикамен жұмыс істеу үшін графиктік операторларды (Uses), драйверлерді   (GraphDrіver),   модульдерді (Crt, Graph),  режимдерді (GraphMode, CloseGraph) қосуымыз қажет.

        Арнайы графиктік оператор Uses болып табылады.

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

     



    Достарыңызбен бөлісу:
  • 1   ...   13   14   15   16   17   18   19   20   21




    ©engime.org 2024
    әкімшілігінің қараңыз

        Басты бет