Коммерциялық емес акционерлік қоғам

Алматы энергетика  және байланыс институты 

 

АЛГОРИТМДЕУ ЖӘНЕ ПРОГРАММАЛАУ ТІЛДЕРІ

                                                                  

050703 – «Ақпараттық жүйелер»

мамандығының  барлық оқу түрінің студенттері үшін зертханалық жұмыстарды орындауға арналған әдістемелік нұсқаулар

 

 

Алматы, 2008 

ҚҰРАСТЫРУШЫ:  З. Қ. Құралбаев.  «Алгоритмдеу және программалау тілдері»  050703 – «Ақпараттық жүйелер» мамандығының барлық оқу түрінің студенттері үшін зертханалық жұмыстарды орындауға арналған әдістемелік нұсқаулар. – Алматы: АЭжБИ, 2008. -  32 б. 

Әдістемелік нұсқаулар компьютерлік сыныпта тоғыз зертханалық жұмысты орындауға арналған. Әрбір жұмыстың тақырыбына байланысты тапсырманың алгоритмі мен программасын құрастыру, оны компьютерде орындау мен нәтижесін талдауға арналған нұсқаулар келтірілген.

Әдістемелік нұсқаулар 050703 – «Ақпараттық жүйелер» мамандығының барлық оқу түрлерінің студентері үшін арналған.

 

МАЗМҰНЫ:

                                                                        беттер

Кіріспе                                                                                                                    4

№ 1 Зертханалық жұмыс. Сызықтық алгоритмдер                                            5

№ 2 Зертханалық жұмыс. Тармақталған алгоритмдер                                      7

№ 3 Зертханалық жұмыс. Қайталану саны белгілі  циклдар                           10

№ 4 Зертханалық жұмыс. Қайталану саны белгісіз  циклдар                          15

№ 5 Зертханалық жұмыс. Итерациялық есептеу  процестері                          18

№ 6 Зертханалық жұмыс. Массивтерге байланысты алгоритмдер                 22

№ 7 Зертханалық жұмыс. Қосалқы программаларды пайдалану                    25

№ 8 Зертханалық жұмыс. Көрсеткіштер                                                            27

№ 9 Зертханалық жұмыс. Графикалық жұмыстарды орындау                        30

Әдебиеттер тізімі                                                                                                  33

 

КІРІСПЕ 

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

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

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

Әрбір зертханалық жұмысты орындау тәртібі келесі кезеңдерден тұрады:

1. Зертханалық жұмыстың тақырыбына байланысты теориялық материалдарды дәрістер мен оқулықтардан оқу.

2. Осында келтірілген әдістемелік нұсқаулармен танысып, жаттығу үшін берілген мысалдарды орындау.

3.  Өз бетімен орындауға арналған тапсырманы орындау.

4.  Есептердің алгоритмдерін құрастыру.

5.  Программаларда қолданылатын идентификаторларды анықтап, олардың типтерін белгілеу.

6.  Программалардың мәтіндерін жазып, компьютер жадына енгізу.

7.  Программаларды компиляциялау және анықталған қателерді түзету.

8.  Программаларды орындау.

9. Программалардың дұрыс орындалатындығын тексеру (тестілеу) .

10. Зертханалық жұмыс бойынша есеп беру; әрбр зертханалық жұмыс бір папка (десте) күйінде сақталынады.

Әрбір студент зертханалық жұмысты орындағаннан кейін міндетті түрде жазбаша немесе электрондық тасымалдаушыда сақталынған түрде есеп беруі тиіс. Зертханалық жұмыс бойынша есеп келесі бөлімдерден тұрады:

1. Зертханалық жұмыстың аты.

2. Есептердің (тапсырмалардың) қойылуы.

3. Есептердің алгоритмдері.

4. Идентификаторларды белгілеу.

5. Программалардың мәтіндері (листингтері).

6. Программалардың орындалу нәтижелері.

7. Нәтижелерді талдау.

 

№1 Зертханалық жұмыс.  Сызықтық алгоритмдер

Жұмыстың мақсаты: Ең қарапайым алгоритмдердің түрі - сызықтық алгоритмдерді жүзеге асыру  арқылы программаларды құрастыру және оны компьютерде орындаудың тәртіптерімен танысу.

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

1.Сызықтық алгоритмді жүзеге асыру үшін  қандай операторларды пайдалануға болады?

2. Меншіктеу операторы қандай амалдарды орындай алады?

3.Деректерді компьютер жадына енгізу үшін қандай амалдар қолданылады?

4. Программаның орындалу нәтижесі қалай шығарылады?

5. Деректерді сипаттау қалай орындалады?

Жаттығулар және олардың орындалу үлгілері.

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

№1 Мысал . Өрнектің мәнін есептеу.

1. Есептің қойылуы. Келесі өрнектің мәнін берілген x-тің мәні үшін есептеу керек:

         2x4- 3x3 + 4x3- 5x +6

Есептеу кезінде қосу  алу, көбейту амалдарынан басқасын қолданбау керек.

2. Алгоритм. Есепті шешудің алгоритмі келесі кезеңдерден тұрады:

          1)  берілген x-тің мәнін енгізу;

          2)  x-тің квадратын есептеу;

          3)  x-тің кубын есептеу;

          4)  өрнектің мәнін есептеу;

          5)  есептеу нәтижесін шығару.

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

3. Идентификаторлар.  Бұл жерде қолданылатын параметрлердің барлығы нақты мәндерді қабылдайды:

     x-берілген параметр;    y-берілген параметрдің квадраты;

     z-берілген параметрдің кубы; u-өрнектің мәні.

4. Программаның мәтіні  

4.1  Паскаль тіліндегі программаның мәтіні

Program PR1;

  Var x,y,z,u: real;

 Begin

     Writeln(‘Vvedite x=’); Read(x);

     y:=x*x; z:=y*x; u:=2*x*z-3*z+4*y-5*x+6;

     Writeln(‘u=’,u);

  End.

4.2  Си тіліндегі программаның мәтіні.

 #include<stdio.h>

main()    /*zadacha28*/

{

float x,y,z,u;

  printf("\n Vvedite x=");  scanf("%f",&x);

  printf("\n Rezultat:");

   y=x*x; z=x*y;  u=2*x*z-3*z+4*y-5*x+6;

   printf("\n u=%f",u);

    }

5. Программаның орындалу нәтижесі. Егер x-тің мәні үшін 2 деген сан енгізілсе, онда u=20.0000 деген жауап алынады.

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

№2 Мысал. Үшбұрыштың ауданын табу.

Бұл есепті шешу үшін келесі кезеңдерден тұратын жұмысты орындау керек.

1.Есептің қойылуы. Қабырғаларының ұзындықтары берілген  үшбұрыштың ауданын табу керек. Бұл есепті шешу үшін Герон формуласын пайдалануға болады.

Есепті шешудің алгоритмі келесі амалдардың тізбегін  орындаудан тұрады:

1)     қабырғалардың мәндерін компьютер жадына енгізу;

2)     үшбұрыштың периметрінің жартысын формуласы бойынша есептеу;

3)     Герон формуласы бойынша  үшбұрыштың ауданын табу;

4)     есептің шешімін  экранға шығару.

3. Идентификаторлар.Үшбұрыштың қабырғалары a,b,c, ал периметрінің жартысы p=(a+b+c)/2  және ауданы S=(p(p - a)(p - b)(p - c))1/2 деп белгіленсін. Мұндағы айнымалылардың барлығы нақты мәндерді қабылдайды.

4. Программаның мәтіні.

4.1  Паскаль тіліндегі программаның мәтіні.  Программада бір сипаттау бөлімі (Var айнымалыларды сипаттау) және төрт оператор болуы тиіс; операторлардың біреуі енгізу, екеуі меншіктеу, ал біреуі шығару операторы болады. Осы алгоритм бойынша оның мәтіні келесі түрде жазылады:

PROGRAM PR2;

    VAR a, b, c, p, s : real;

BEGIN

    READ(a,b,c);  p:=(a + b + c)/2;

    s:=sqrt(p*(p–a)*(p-b)*(p-c));

    WRITELN (‘ploshad ravna: s = ‘ ,s:8:4);

END.

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

#include<stdio.h>

#include< math.h >

void main()

{

double a,b,c,p,s;

printf(“\n a=”);scanf(“%lf”, &a”);

printf(“\n b=”);scanf(“%lf”,&b);

printf(“\n c=”);scanf(“%lf”, &c;

p=(a+b+c)/2; s=sqrt (p*(p-a)*(p-b)*(p-c));

printf(“\n ploshad ravna: s= %f”, s);

}

5. Программаның орындалу нәтижесі. Егер клавиатурадан 5, 6, 7 деген сандар енгізілсе, онда есептің жауабы келесі түрде экранға шығарылады:

 ploshad ravna: S =  14.6969

Ескертетін жай, енгізілетін үш сан үшбұрыштың қабырғаларының ұзындықтары болғандықтан, үшбұрыштың негізгі қасиетін қанағаттандыруы керек:

    a + b > c, a + c > b, b + c > a

немесе кез келген екі қабырғаның қосындысы үшіншісінен үлкен болады.

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

Өз бетімен орындауға арналған  тапсырмалар:

1. Екі нақты оң  сан берілген. Осы сандардың арифметикалық ортасы мен геометриялық ортасын табу керек.

2. Көлемі литр v1, температурасы  t1 сумен көлемі v2 литр, температурасы t2 араластырылған. Араласқаннан кейінгі судың көлемі мен температурасын табу керек.

3. Радиусы  r шеңберге  сырттай сызылған дұрыс n-бұрыштың периметрін табу керек.

4. Үш R1,R2,R3 кедергі параллель қосылған  электр тізбегінің кедергісінің мәнін табу керек.

5. Жер бетіне h  биіктіктен құлаған тастың құлау уақытын табу керек.

 

№ 2 Зертханалық жұмыс. Тармақталған алгоритмдер

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

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

1.  Алгоритмнің бұтағы деп нені атайды?

2. Тармақталу процесі қандай құралдардың көмегімен орындалады?

3. Шартты өту операторы қандай қызмет атқарады?

4. Егер алгоритмде бұтақ саны көп болса (екеуден көп), онда есептеу процесінде қандай  операторлар қолданылады?

5. Операторлардың алдына белгілер не үшін қойылады және оларды қалай құрастырады?

Жаттығулар және олардың орындалу үлгілері

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

№3 Мысал. Квадрат теңдеуді шешу.

 1. Есептің қойылуы. Коэффициенттері берілген квадрат теңдеуді шешу керек болсын:          ax2 + bx + c = 0.

2.Алгоритм. Бұл теңдеуді шешудің алгоритмі мынадай түрде жазылады:

1)     теңдеудің коэффициенттерінің  a,b,c мәндерін компьютер жадына енгізу;

2)      дискриминантты есептеу d=b2–4aс ;

3)      егер дискриминант d >=0 болса, онда теңдеудің екі нақты шешімі  x1, x2 болады, ал керісінші жағдайда – теңдеудің нақты шешімі болмайды;

4)     есептің шешімін экранға шығару.

3. Идентификаторлар. Есептің программасында  қолданылатын  шамалардың барлығы нақты айнымалылар: a,b,c,d,x1,x2.

4. Программаның мәтіні. Бұл алгоритм бойынша дискриминанттың мәніне байланысты екі тармақтың бірі таңдалынады.

4.1 Оны жүзеге асыратын программаның мәтінін Паскаль тілінде келесі түрде жазуға болады:

PROGRAM PR3;

   LABEL 5,6;

   VAR a, b, c, d, x1, x2 : real;

     BEGIN

Writeln (‘Vvedite a,b,c’); READ (a, b, c);

   d:= b*b – 4*a*c; IF d < 0 THEN GOTO 5;

 x1:=(-b+sqrt(d))/(2*a); x2:=(-b–sqrt(d))/(2*a);

   WRITELN (‘Korni: x1=‘,x1,‘x2 =’, x2); GOTO 6;

 5:    WRITELN (‘Net deistvitelnych kornei ‘);

 6: END.

  4.2 Егер  Си тілі   қолданылса, онда оның мәтіні келесі түрде хазылады:

#include<stdio.h>

#include<math.h>

void main()

{

float a,b,c,x1,x2,d;

printf("\n Vvedite a="); scanf("%f", &a);

printf("\n Vvedite b="); scanf ("%f", &b);

printf("\n Vvedite c="); scanf("%f", &c);

d=b*b - 4*a*c; printf("\nd=%f", d);

if (d<0.0) goto M;

 x1=(-b+sqrt(d))/2/a; x2=(-b-sqrt(d))/2/a;

 printf("\n Korni: x1=%f, x2=%f", x1,x2);

goto M1;

M:  printf("\n Net deistvitelnych kornei");

M1: ;

 }

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

5. Программаның орындалу нәтижесі.  Программа орындалуға жіберілгеннен кейін  клавиатурадан 4, 5, 6 сандары теріліп енгізілсе, онда

Net deistvitelnych kornei

 деген жауап шығады, ал 2, 9, 4 сандары енгізілсе, онда

Korni: x1 = - 0.5   x2 = - 4.0

 деген жауап шығады.

4 Мысал. Қалалардың телефон байланысының кодтары.

1. Есептің қойылуы Бұл тапсырмада үш таңбадан тұратын бүтін санды немесе кодты енгізгенде қаланың аты шығуы керек. Егер мұнда көрсетілмеген сан енгізілсе, «Такого кода в базе нет» (Takogo koda v base net) деген жауап шығарылсын.

2.Алгоритм. Бұл есептің алгоритмі келесі түрде жазылады:

1)  әрбір қаланың үш таңбалы халықаралық телефон байланысының сандық коды енгізіледі;

2)  берілген үш таңбалы бүтін сан енгізіледі;

3)  енгізілген сан әрбір қаланың кодымен салыстырылады;

4) егер енгізілген сан қала кодымен бірдей болса, онда қаланың аты шығарылады;

5) егер енгізілген сан ешбір қаланың кодымен сәйкес болмаса, онда «Takogo koda v base net» деген мәтін шығарылады.

3. Идентификаторлар.  Мұнда тек бір ғана бүтін мәнді айнымалы қолданылады, ол k деп белгіленсін.

4. Программаның мәтіні.

4.1 Программаның Паскаль тіліндегі мәтіні:

Program PR4;

  Var

     k:integer;

  Begin

     Writeln(‘Vvedite chislo:k=’);

     Readln(k);

      Case k of

        714: writeln(kod goroda Kostanai-‘,k);

        717: writeln(kod goroda Astana-‘,k);

        721: writeln(kod goroda Karaganda-‘,k);

        722: writeln(kod goroda Semey-‘,k);

        726: writeln(kod goroda Taraz-‘,k);

        727: writeln(kod goroda Almaty-‘,k);

        495: writeln(‘Takogo koda v base net.’)

      else writeln  end

  End.

4.2 Бұл программаның мәтіні Си тілінде келесі түрде жазылады:

#include<stdio.h>

void main()

{

  int k;

  printf("\n Vvedite  chislo:k="); scanf("%d",&k);    switch(k)

  {

  case 714: printf("\n %d-kod goroda Kostanai",k); break;

  case 717: printf("\n %d-kod goroda Astana",k);  break;

  case 721: printf("\n %d-kod goroda Karaganda",k); break;

  case 722: printf("\n %d-kod goroda Semey",k); break;

  case 726: printf("\n %d-kod goroda Taraz",k); break;

  case 727: printf("\n %d-kod goroda Almaty",k); break;

  default:  printf("\n Takogo koda v base net."); return;

  }  }

Өз бетімен орындауға арналған  тапсырмалар:

1. Үш нақты сан  a,b,c берілген. Келесі теңсіздіктің  a<b<c орындалуын тексеру керек.

2. Үш нақты сан  a,b,c берілген. Егер  a≥b≥c  шарты орындалса, олардың мәндерін екі есеге үлкейту керек. Ал ол шарт орындалмаса, онда олардың абсолют шамасымен ауыстыру керек.

3. Берілгені екі нақты сан. Егер біріншісі екіншісінен үлкен болса, онда біріншісінің мәнін шығару керек, ал ол шарт орындалмаған жағдайда екеуінің де мәндерін шығару керек.

4. Берілгені екі нақты сан. Егер бірінші сан екіншісінен кіші немесе оған тең болса, онда біріншісінің орнына нол жазу керек, ал ол шарт орындалмаса сандардың мәндері өзгеріссіз қалады.

5. Берілгені үш нақты сан. Осылардың келесі интервалға  (1,3) жататындарын таңдау керек.

 

№ 3 Зертханалық жұмыс.  Қайталану саны белгілі циклдар

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

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

1. Цикл есптегіші дегеніміз не, ол қайталау процесінде қандай қызмет атқарады?

2. Алгоритмде қайталану саны қалай анықталады?

3. Цикл денесі дегеніміз не, оның құрамына қандай операторлар  кіреді?

4. Цикл басы мен соңын қалай анықтауға болады?

         5. Қайталану саны белгілі циклдерді жүзеге асыру үшін қандай операторларды қолдануға болады?

Жаттығулар және олардың орындалу үлгілері

Есептеу процесінде амалдар жиыны  белгілі бір шартқа байланысты көп рет қайталанатын  және оның қайталану саны алдынала белгілі болса, оны қайталану саны белгілі циклдық алгоритм деп атайды. Қайталануды ұйымдастыру үшін цикл есептегіші атты  бүтін мәнді параметр қолданылады; оның ең үлкен мәні  қайталану санына тең.

№ 5 Мысал.  Функция мәндерін есептеу

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

2. Алгоритм.  Төрт функцияның мәндерін есептеуді бір цикл арқылы қатар орындауға болады; оның алгоритмі келесі түрде жазылады:

1)  аргументтің және цикл есептегішінің алғашқы мәнін беру;

2)  аталынған функциялардың мәндерін аргументтің мәні үшін есептеу;

3)  аргументтің және төрт функцияның есептелген мәндерін шығару;

4)  аргумент пен цикл есептегішінің келесі мәндерін табу;

5)  цикл есептегішінің соңғы мәніне жетуі туралы  шартты тексеру және ол шарт орындалмаған жағдайда функциялардың келесі мәндерін анықтау үшін 2) кезеңнен бастап қайталау.

3. Идентификаторлар. Қолданылатын шамалар келесі түрде белгіленсін:

k – цикл есептегіші; x - аргумент; y=x2аргументтің квадраты ;

z= x2 аргументтің екінші дәрежесі;

u= - аргумент квадрат түбір астында;

p=sin(x) – аргументтің синусы;

Мұнда бірдей екі функция қарастырылған, оның себебі квадрат функцияны екі түрлі есептеуге болатындығын көрсету. Нақты мысал үшін аргументтің алғашқы мәнін x=0, соңғы мәнін x=1, ал өзгеру қадамын 0,1 деп  алынған. Сонда цикл есептегіші k 1-ден 11-ге дейін өзгереді.

4. Программаның мәтіні.

4.1 Паскаль тіліндегі программаның мәтіні:

Program PR5;  Label 5;

   Var  k:integer;  x,y,z,u,p:real;

Begin  x:=0; k:=1;

5: y:=x*x; z:=sqr(x); u:=sqrt(x); p:=sin(x);

Writeln(‘x=’,x:4:1,’y=’,y:8:2,’z=’,z:8:2,’u=’,u:8:3,’p=’,p:8:4);

  k:=k+1; x:=x+0.1;

if k<=11 then goto 5;

End.

4.2 Си тіліндегі программаның мәтіні:

#include<stdio.h>

#include<math.h>

void main()

{

int k; float x,y,z,u,p;

printf("\n"); printf("\n Значения функций:");

printf("\n y=x*x, z= pow(x,2), u=sqrt(x), p=sin(x)");

printf("\n");

k=1; x=0;

M: y=x*x; z=pow (x,2); u=sqrt(x); p=sin(x);

printf("\nx=%4.1f, y=%5.2f, z=%5.2f, u=%5.3f, p=%6.4f", x,y,z,u,p);

x=x+0.1; k=k+1;

if (k<=11) goto M;

    }

5. Программаның орындалу нәтижесі.  Программаның орындалу нәтижесі аргумент пен төрт функцияның мәндерінен құралған кесте болады.

№ 6 Мысал.  Қосындыны есептеу.

1. Есептің қойылуы  Берілгені нақты сан x.  Келесі шектелген қосындыны есептеу керек

                  x -  +  -  +  -  +

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

                                  

Сонымен бірге берілген есепте  соңғы қосылғыштың реттік нөмері  6 болады.

Қосындыны есептеудің алгоритмі қайталану саны белгілі цикл болады:

1)  берілген  x  пен  n мәндерін енгізу;

2)  кезектегі қосылғыш пен қосындының алғашқы мәндерін беру;

3) цикл басы;

4)  кезектегі қосылғыштың мәнін табу;

5) қосындының жаңа мәнін кезектегі қосылғышты қосу арқылы есептеу;

6) цикл есептегішінің келесі мәнін табу;

7) циклдың соңына жеткендігін көрсететін шартты тексеру;

8) егер цикл аяқталмаған болса, онда  4) кезеңнен бастап қайталануды ұйымдастыру;

9) нәтижені немесе қосындының соңғы мәнін шығару.

3. Идентификаторлар. Программаны құрастырудан бұрын келесі белгілеулер енгізілсін:

k – цикл есептегіші;

n – есептегіштің ең үлкен мәні;

S -  қосынды;

p - кезектегі қосылғыш.

4. Программаның мәтіні.

4.1 Паскаль тіліндегі программаның мәтіні:

Program PR6;

  var k,n :integer; x,p,s: real;

  Begin

    Writeln(‘Vvedite n=’); Read(n);

    Writeln(‘Vvedite x=’); Read();

     p:=x; s:=x;

  For k:=1 to n do

  begin p:=-p*x*x/(2*k)/(2*k+1); s:=s+p; end;

writeln(‘s=’, s);

End.

4.2 Си тіліндегі программа мәтіні:

#include<stdio.h>

void main()

{

float x,s,p;

int k,n;

  printf("\n Vvedite n=");  scanf("%d",&n);

  printf("\n Vvedite x=");  scanf("%f", &x);

  p=x; s=x;

  for (k=1; k<=n; k++)

  {  p=(-p)*x*x/(2*k*(2*k+1));  s+=p;  }

  printf("\ns=%f",s);

    }

5. Программаның орындалу нәтижесі.  Программаны орындау туралы команда берілгеннен кейін келесі сұраныс пайда болады:

Vvedite n=6

Vvedite x=0.125

Осыдан кейін келесі нәтиже алынады:  s=0.124675

№7 Мысал.  Анықталған интегралды есептеу

1. Есептің қойылуы. Келесі анықталған интегралды тіктөртбұрыштар тәсілімен шешу керек болсын:

                      S =  = (e –x + ex ) dx 

Тіктөртбұрыштар тәсілі бойынша интегралдың жуық мәні келесі формула арқылы анықталады:

S = h[f(x1)+f(x2)+f(x3)+ . . . + f(xn)].

Мұндағы   h – аргументтің өзгеру қадамы;  xi = a+h*i,i=1,2,3,...,n, n = .

2.Алгоритм. Бұл есептің  алгоритмі өте қарапайым: интеграл астындағы функцияның мәндерін тауып және  олардың  қосындыларын есептеу керек; осыдан кейін алынған қосынды аргументтің өзгеру қадамына көбейтіледі. Қосындыны табудан бұрын оған 0 деген мән беріледі, себебі 0 болашақ қосындының мәніне әсері болмайды.

 Алгоритмді келесі түрде жазуға болады:

1) S=0,  i=1,   циклдың басында қосынды сақталынатын ұяшық тазартылуы  керек немесе ол ұяшыққа 0 жіберіледі;

2)  x = a + h *i,   аргументтің жаңа мәні есептелінеді;

3)  f(x),    интеграл астындағы функцияның мәні есептелінеді;

4)  S=S+h*f(x),  жаңа қосылғышты қосу;

5)  i=i+1,  жаңа  қосылғышты есептеу үшін келесі нүктеге өту;

6)  егер  i≤n шарты орындалса, онда 2) жолдан бастап қайталанады;

7)  есептеудің нәтижесі S экранға шығарылады.

3. Идентификаторлар.  

i- цикл есептегіші;  n- цикл есептегішінің ең үлкен мәні;

x- аргумент;             a- аргументтің алғашқы мәні;

h- аргументтің өзгеру қадамы;  S- қосынды немесе интегралдың мәні;.

 4. Программаның мәтіні.

4.1  Паскаль тіліндегі программаның мәтіні: Осы алгоритмді жүзеге асыратын программаның мәтіні келесі түрде жазылады:

PROGRAM PR7;

   LABEL  5;

   VAR x,y,S,a,b,h:real;

       i:integer;

BEGIN READ(n);

   READ(a,b);

    S:=0; h:=(b–a)/n; i:=1;

5:   x:=a+i*h; S:=S+h*(Exp(-x)+Exp(x)); i:=i+1;

      IF i<=n THEN GOTO 5;

      WRITELN(‘Integral s=’,S:10:4);

END.

4.2  Си тіліндегі программа мәтіні:

#include <stdio.h>

#include <math.h>

void main()

{

float a,b,h,x,s;

int i,n;

printf("\n Vvedite a= "); scanf("%f",&a);

printf("\nVvedite  b="); scanf("%f",&b);

printf("\nVvedite n="); scanf("%d", &n);

h=(b-a)/n;

for(i=1; i<=n; i++)

{ x=a+i*h; s+=h*(exp(-x)+exp(x)); }

printf(“\n Integral s=%lf’,s);

}

5. Программаның орындалу нәтижесіЕгер клавиатурадан интегралдың төменгі  және жоғарғы  шектері болатын сандар (a=1 және b=2) енгізілсе,  ал  n=100 болса, онда

    Integral s = 4.925550

деген жауап шығарылады, ал 0 және 2 сандары енгізілсе, онда

      Integral s = 7.309206

деген жауап шығады.

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

Бұл  алынатын интеграл,  сондықтан оның жуық мәні оқушыға белгілі s=1.71828; жоғарыда келтірілген программа бойынша әртүрлі жағдайдағы жуық мәндерін тапқанда интегралдың келесі нәтижелерін алуға болады:

егер n=20  болса, онда s=1.761597;

егер n=200 болса, онда s=1.722581;

егер n=1000 болса, онда s=1.719140;

егер n=5000 болса, онда s=1.718454;

 

Өз бетімен орындауға арналған тапсырмалар:

1.  Берілгені натурал сан . Егер    . формуласы берілген болса, онда келесі көбейтінді  p=f0∙f1∙f2∙. . .∙fn  неге тең болады?

2. Келесі қосындыны есептеу керек:  s =.

3.       Берілгені натурал сан  және нақты сан. Есептеу керек:

         .

4.  Берілгені  натурал сан , нақты сан . Көбейтіндіні есептеу керек:

         .

5. Берілгені натурал сан n. Есептеу керек:

      1∙2 + 2∙3∙4 + . . . + n∙(n+1)∙. . . ∙2n.

 

№ 4 Зертханалық жұмыс.  Қайталау саны белгісіз  циклдық алгоритмдер

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

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

1.  Қайталану саны белгісіз цикл қарастырылғанда цикл есптегішін қолдануға болады ма?

2. Алгоритмде қайталану саны қалай анықталады?

3. Циклдық алгоритмде қайталану процесін қалай тоқтатуға болады?

4. Есптеу дәлдігі дегеніміз не, ол қалай анықталады?

5. Қайталану саны белгілісіз циклдарды жүзеге асыру үшін қандай операторларды қолдануға болады?

Жаттығулар және олардың орындалу үлгілері

Егер алгоритмде қйталану саны алдын ала белгісіз болса, ондай алгоритмді қайталану саны белгісіз алгоритм деп атайды.

 № 8 Мысал    Берілген дәлдікпен (ε>0)шексіз қосындыны есептеу.

1. Есептің қойылуы. Берілгені келесі шексіз қосынды:

   b =

Осы  қосындыны берілген дәлдікпен шешу керек немесе қосу процесі кезектегі қосылғыштың абсолют шамасы  берілген кішігірім оң санынан (ε>0) кіші болғанша жалғанады. 

2. Алгоритм. Есептеу процесі қайталану саны белгісіз цикл болады:

1)  берілген x пен ε мәндерін енгізу;

2)  қосылғыштың алғашқы мәнін беру, ол x-тің мәніне тең болады;

3)  қосындының алғашқы мәні 1-ге тең болады;

4)  циклдың басында есептегіштің мәні  2-ге тең болады;

5)  цикл денесіне кіретін амалдар орындалады немесе кезектегі қосылғыш қосындыға қосылады, ал қосындының жаңа мәні анықталады;

6)  циклдың соңы анықталады; егер  дәлдік шарты орындалса, онда есептеу процесі аяқталады, ал орындалмаса,  5) кезеңдегі  цикл денесі орындалады;

7)  қосындының соңғы мәнін шығару.

3. Идентификаторлар.  

r- қосымша енгізілген айнымалы шама; ол кезектегі қосылғыштың мәнін анықтайды;

k- цикл есептегіші;          x- берілген нақты сан;

b -  қосындының мәні;    eps- дәлдікті анықтайтын мәні берілген кішігірім сан.

4. Программаның мәтіндері.  Бұл жерде есептің программасы Си тілінің әртүрлі операторларын пайдалану арқылы құрастырылған.

4.1  while циклдық операторын пайдаланғандағы  программа мәтіні::

#include <stdio.h>

void main()

{

int k;

double eps, b=1.0, r, x;

printf("\n Vvedite znachenie x="); scanf(" %lf", &x);

 {

printf("\n Vvedite tochnost eps="); scanf("%lf", &eps);

   }

   k=2; r=x;

   while (r > eps || r < -eps)

   {   b=b+r;   r=r*x/k;  k++;   }

   printf("Rezultat: %f\n",b);

   printf("Pogreshnost: %f\n", r);

   printf("Chislo chlenov rjda: %d\n",k);

   }

4.2  do: циклдық операторын пайдаланғандағы программа мәтіні:

#include <stdio.h>

void main()

{

int k;  double eps, b=1.0, r,x;

printf("\n Vvedite znachenie x="); scanf(" %lf", &x);

printf("\n Vvedite tochnost eps="); scanf("%lf", &eps);

   k=1;  r=1.0;

do  {   r=r*x/k;   b=b+r;   k++;   }

   while(r>=eps || r<=-eps);

   printf("Rezultat: %f\n",b);

   printf("Pogreshnost: %f\n", r);

   printf("Chislo chlenov rjda: %d\n",k);

}

4.3   for  циклдық операторын пайдаланғандағы программа мәтіні:

#include <stdio.h>

void main()

{

int k;

double eps, b=1.0, r,x;

printf("\n Vvedite znachenie x="); scanf(" %lf", &x);

printf("\n Vvedite tochnost eps="); scanf("%lf", &eps);

for (k=1, r=1.0; r>eps || r<-eps; k++)

{   r=r*x/k;   b=b+r;  }

   printf("Rezultat: %f\n",b);

   printf("Pogreshnost: %f\n", r);

   printf("Chislo chlenov rjda: %d\n",k);

}

5. Программаның орындалу нәтижесі.   Осы үш программаның кез келгенін іске қосқанда, келесі сұраныс пайда болады:

Vvedite znachenie x=1

Vvedite tochnost eps=0.0001

Бұл мәндерді енгізгеннен кейін келесі жауап алынады:

Rezultat:2.718254

Pogreshnost:0.000025

Chislo chlenov rjda:9

Өз бетімен орындауға арналған  тапсырмалар:

1. Берілген натурал сан n-нен кіші Фибоначчи сандарын табу.

Төменде берілген шексіз қосындыларды   берілген дәлдікпен  есептеу керек.  Есептеу үрдісін келесі қосылғыш ε = 0.0001 санынан кіші болғанда  ғана тоқтату керек.

1.   S = 1 +  +  +  + . . . ;         2. S =;       

3.  S =;    4.  S = ;  5.  S =, x-берілген нақты сан.

 

№ 5 Зертханалық жұмыс. Итерациялық есептеу процестері

Жұмыстың мақсаты: Итерациялық процестердің негізгі идеяларын түсініп, алгоритмдерін талдап, оларды жүзеге асыратын программаларды құрастыруға машықтану.

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

1.  Итерациялық  есептеу процесі дегеніміз не?

2. Алгоритмде қайталану саны қалай анықталады?

3. Есептеудің дәлдігі дегеніміз не?

4. Итерациялық есептеу процестерін жүзеге асыру үшін қандай операторлар қолданылады?

5. Рекурренттік формула дегеніміз не?

Жаттығулар және олардың орындалу үлгілері

№ 9 Мысал.

1. Есептің қойылуы. Келесі формулалар  бойынша анықталатын сандар тізбегінің

  x0=1; xk = , k = 1,2,3, . . .

келесі шартты  қанағаттандыратын мүшесінің мәнін табу керек.

2. Алгоритм. Сандар тізбегі рекурренттік формула арқылы анықталады; әрбір анықталған жаңа сан формуланың сол жағына қойылып, келесі мүше анықталады. Есептің алгоритмін келесі түрде жазуға болады:

1)  берілген бірінші мүше  мен дәлдікті анықтайтын кішігірім санды енгізу;

2)  анықталған мүшенің мәні алдыңғы мүшеге беріледі;

3)  тізбектің келесі мүшесінің мәнін анықтау;

4)  тізбектің ағымдағы және одан кейін орналасқан  мүшелерінің айырмасының  абсолют шамасының дәлдікті анықтайтын кішігірім саннан кіші екендігін тексеру; егер дәлдік шарты орындалмаса, онда 2) кезеңнен бастап қайталау;

5) ең соңғы анықталған мүшенің мәнін шығару.

3. Идентификаторлар.  Айнымалылардың индекстерінен арылу үшін келесі белгілеулер енгізіледі:  xn=xn, xk=xn-1; Сонда берілген формула келесі түрде жазылады:

xn=(2-xk3)/5.

Мұндағы:

xk - тізбектің алдыңғы (есептелінген) мүшесі;

xn - тізбектің кейінгі (есептелінетін) мүшесі;

d - екі көрші мүшелердің айырмасы;;

eps - дәлдікті анықтайтын мәні берілген кішігірім сан.

4. Программаның мәтіні.

4.1 Паскаль тіліндегі программаның мәтіні:

Program PR10;

   Label Metka;

   Const eps=0.0001;

   Var xn,xk,d:real;

  Begin xn:=1;

writeln; writeln(‘Promejutochnye znachenij:’);

Metka: xk=xn; xn=(2-xk*xk*xk)/5.0; d=xn-xk;

if abs(d)>eps then goto Metka;

 writeln(‘Rezultat:’); writeln(‘xn=’,xn)

End.

4.2  Си тіліндегі программа мәтіні:

#include<stdio.h>

main()

{

float xn,xk,d,eps;

eps=0.00001; xn=1;

printf("\n");

printf("\n Promejutochnye znachenij:");

Metka: xk=xn; xn=(2-xk*xk*xk)/5.0;

   d=xn-xk; printf("\nxn=%f",xn);

   if(d>eps||d<-eps) goto Metka;

   printf("\n");printf("\nRezultat:");

  printf("\nxn=%f", xn);

  }

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

Promejutochnye znachenij:

xn=0.200000

xn=0.398400

xn=0.387353

xn =0.388376

xn=0.388284

xn=0.388292

Rezultat:

xn=0.388292

Сан тізбегінің аралық мәндерін шығару арқылы оның өзгеруі көрсетілген. Сонымен бірге, әрбір қайталанудан кейін берілген дәлдіктің орындалуы  тексерілген. Соңғы екі мәннің айырмасының 0.388292-0.388284=0.000008 абсолют шамасы 10-5    санынан кіші болғаннан кейін есептеу процесі тоқтатылған.

10 Мысал. Теңдеуді тепе-тең бөлу тәсілімен  шешу.

1. Есептің қойылуы. Берілген теңдеуді тепе-тең бөлу (немесе бисекция) әдісі өте қарапайым, алгоритмі көпшілікке түсінікті.

Нақты мысал ретінде  келесі теңдеуді шешу қарастырылсын:

F(x)= x5 - x – 0,2 = 0.

Бұл теңдеудің түбірі жекешеленген немесе бір ғана түбір орналасқан [a,b] аралығы берілсін: a = 1; b = 1,1. Түбірдің мәні берілген дәлдік ε = 0.0001 бойынша анықталуы тиіс.

2.Алгоритм. Бұл әдіс бойынша түбір орналасқан аралық екіге тепе-тең бөлініп (бөлу нүктесі c=(a+b)/2 ), оның түбір орналасқан бөлігі анықталады. Ол берілген теңдеудің сол жағында орналасқан функцияның F(x) мәнінің таңбасы бойынша анықталады. Егер сол жақтағы аралықтың [a,c] шекараларындағы функция F(x) мәндерінің таңбалары  әртүрлі болса (F(a)·F(c)<0), онда теңдеудің түбірінің сол аралықта [a,c] орналасқанын көрсетеді, ал керісінші жағдайда – басқа [c,b] бөлігінде орналасқаны. Ескеретін жай, теңдеудің түбірінің дәл мәнінің анықталу мүмкіндігін ұмытпау керек; ол мынадай жағдайда болады: F(c)=0. Әрбір қайталану нәтижесінде түбір орналасқан аралық екі есе қысқарады. Бұл үрдіс көп қайталануы мүмкін, қайталау саны алдынала белгісіз, тек дәлдік шарты орындалғанда ғана тоқтайды. Дәлдік шарты келесі түрде  жазылады:

                 | b - a | < ε.

Есептің алгоритмі қайталау саны белгісіз цикл типіне жатады; оны келесі түрде сипаттауға болады:

1) a, b, ε мәндерін енгізу;

2) [a,b] аралығын тепе-тең екіге бөлу c = (a + b)/2 );

3) бұл мән теңдеуді қанағаттандыратыны тексеріледі F(c) = 0; егер бұл шарт орындалса, онда c – ның мәні теңдеудің түбірі деп, экранға шығарылады;

4) теңдеудің түбірінің орналасқан бөлігін анықтау; егер ол сол жақ бөлікте  орналасқан болса (F(a)·F(c)<0),   онда  b–ның орнына c–ның мәні жазылады, ал керісінші жағдайда ол мән a–ның орнына жазылады;

5) түбірдің мәнінің дәлдік шартын қанағаттандыратындығы  |b-a|<ε тексеріледі; егер бұл шарт орындалмаса, онда 2) жолынан бастап қайталанады; ал ол шарт орындалса, онда  есептің шешілгені.

3. Идентификаторлар.  

a - түбір орналасқан аралықтың сол жақтағы шекарасы;

b - түбір орналасқан аралықтың оң жақтағы шекарасы;

c – түбірдің кезекті жуық мәні;

y - теңдеудің сол жағындағы функциясының x=a нүктесіндегі мәні;

x - теңдеудің сол жағындағы функциясының x=c нүктесіндегі мәні;

eps - есептеу дәлдігін анықтайтын кішігірім оң сан.

 

4. Программаның мәтіні.

4.1  Паскаль тіліндегі программа мәтіні:

Есептің программасын келесі түрде жазуға болады:

Program PR11;

   Label 5,6; Const Eps=0.0001;

   Var x,y,a,b,c: real;

   Begin Read(a,b);

5: c:=(a+b)/2; y:=sqr(sqr(a))*a-a-0.2;

    if y = 0 then goto 6; x:=sqr(sqr(c))*c-c-0.2;

    if x*y<0  then b:=c else a:=c;

    if abs(a-b) > eps then goto 5;

6:  Writeln('Koren raven c =', c:8:4);

  Readln;

  End.

4.1 Программаның Си  тіліндегі мәтіні:

#include<stdio.h>

#include<math.h>

main()/*prostaj programma*/

{

float x,y,a,b,c,d,eps;

eps=0.0001;

  printf("\n Vvedite a="); scanf("%f",&a);

  printf("\n Vvedite b="); scanf("%f",&b);

 M5:  c=(a+b)/2;

   y=pow(a,5)-a-0.2; if(y == 0) goto M6;

   x=pow(c,5)-c-0.2; if(x*y<0) b=c; else a=c;

   d=b-a; if(d>eps || d<-eps) goto M5;

M6:   printf("\n Koren raven c=%f",c);

}

5. Программаның орындалу нәтижесі:    Программаны орындау үшін a=1 мен b =2 параметрлерінің мәндері клавиатурадан енгізілген. Бұл программаның орындалу нәтижесінде мынадай жауап алынады:

 Koren raven c =  1.044739

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

        Өз бетімен орындауға арналған тапсырмалар:

1. Берілгені:         келесі формулалар арқылы

 анықталатын тізбектің соңғы n-ші мүшесін  табу керек                                      

2.  Берілгені: нақты сандар  Төмендегі формула бойынша  құрастырылған   тізбегінің 

                  

берілген дәлдікті  қанағаттандыратын бірінші мүшесін  табу керек.

3. Бірінші мүшелері берілген екі тізбектің қалған мүшелері төмендегі формулалар бойынша анықталған

                           

                                             

Берілген натурал сан n үшін келесі қосындыны табу керек:        .

4.  Қос тізбек  төмендегі формулалардың көмегімен анықталған

                           

Берілген натурал сан  үшін келесі қосындыны есептеу керек  .

5. Келесі қосындыны есептеу керек .  Мұндағы:

                                                    

ал  нақты сандар   натурал сан   берілген.

 

№6 Зертханалық жұмыс. Массивтерге байланысты алгоритмдер

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

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

1. Бір өлшемді массив дегеніміз не, ол қалай сипатталынады?

2. Екі өлшемді массивті қалай сипаттауға болады?

3. Күрделі цикл дегеніміз не, олардың есептегіштерінің саны неге тең?

4. Ішкі және сыртқы циклдардың  басы мен соңын қалай анықтауға болады?

5. Массивтерге байланысты алгоритмдерді жүзеге асыру үшін қандай операторлар жиі қолданылады?

Жаттығулар және олардың орындалу үлгілері.

№11 Мысал. Берілген бір өлшемді массивтің ең кіші элементі мен оның номерін анықтау.

Программада келесі белгілеулер енгізілген: a[i]- массив элементі, x-массивтің ең кіші элементінің мәні, k-ең кіші элементтің нөмері.

 Программаның мәтінін келесі түрде жазуға болады

#include<stdio.h>

void main()

{

int i, k ,n;

float a[100], x;

while(1)

{

printf("\n Vvedite znachenie n="); scanf("%d", &n);

if(n>0 && n<100)break;

printf("\n Oshibka! Neobchodimo 0<n<100!");

}

printf("\n Vvedite znachenij elementov:\n");

for (i=0; i<n; i++)

{

printf("a[%d]=",i); scanf("%f", & a[i]);

}

x=a[0];  for( i=0; i<n; i++)

if (x>a[i])

{ x=a[i]; k=i; }

printf("Naimenshi element x=%f\ nEgo nomer k= %d\n", x,k);

}

Программаны орындағанда келесі нәтижені алуға болады

Vvedite znachenie n=5

Vvedite znachenij elementov:

a[0]=7

a[1]=9

a[2]=10

a[3]=5

a[4]=8

Naimenshi element x=5.0000

Ego nomer k=3

Осы жерде мынадай сұрақ туады: егер массивтің ең үлкен элементі мен оның нөмерін табу керек болса, осы программаға қандай өзгерістер енгізу қажет?

№12 Мысал. Енді массивті сорттау туралы есептің қарапайым түрі – массивті элементтерінің мәндерінің өсуі бойынша орналастыру.

Берілгені келесі  n элементтен тұратын массив:

a[0],a[1],a[2], . . . , a[n-1]

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

#include<stdio.h>

main()

{

int n,i,j;

double a[100],b;

while(1)

{

printf("\nVvedite kolichestvo elementov n=");

scanf("%d",&n);

if(n>1 && n<100) break;

printf("Oshibka! Neobchodimo 1<n<100!");

}

 printf("\n Vvedite znachenij elementov massiva:\n");

 for(j=0;j<n;j++)

 {

   printf("a[%d]=",j+1);  scanf("%lf", &a[j]);

   }

   for(i=0; i<n-1; i++)

   for(j=i+1; j<n; j++)

   if(a[i]>a[j])

   {  b=a[i];   a[i]=a[j];  a[j]=b;   }

     printf("\n Uporjdochenni massiv: \n");

     for(j=0;j<n; j++)

      printf("a[%d]=%5.1f\n",j+1,a[j]);

    }

Қажетті деректерді енгізіп, программаны орындағанда, келесі нәтижені алуға болады:

Vvedite kolichestvo elementov n=5

Vvedite znachenij elementov massiva:

a[1]=6

a[2]=8

a[3]=4

a[4]=7

a[5]=3

Uporjdochenni massiv:

a[1]=3.0

a[2]=4.0

a[3]=6.0

a[4]=7.0

a[5]=8.0

Массив элементтерінің нөмерлері нөльден емес бірден басталуы үшін printf("a[%d]=%f\n",j+1,a[j]); функциясында j-дың орнына j+1 жазылған.

   Өз бетімен орындауға арналған тапсырмалар:

1. Берілген матрицаның әрбір тік жолының қосындысы компоненті болатын векторды табу.

2. Матрицаның әрбір жатық жолының элементтерін мәндерінің өсуі бойынша орналастыру керек.

3. Матрицаның ең кіші элементін,  оның мәнін, орналасқан тік және жатық жолдардың нөмерлерін табу керек.

4. Массив элементтері келесі формула бойынша анықталсын

        yk = 2sin(πk)+3sin(πk/3), k=1,2,3,. . . 15;

Осы массивтің [0,1] аралығында орналасқан элементтерінің санын табу керек.

5. Массив элементтері келесі формула бойынша анықталсын:

   xi = e-i(5i +3), i = 1,2,3,. . .,20;

Осы массив элементтерінің келесі интервалдарда:

[0,1), [1,2), [2,3), [3,4), [4,5), [5,6),[6,7]

орналасқан мәндерінің сандарын    pk, k = 1,2,3,. . ., 7, табу керек. Осы сандардан pk, k = 1,2,3,. . .,7 тұратын массивті  элементтерінің өсуі бойынша сұрыптау керек.

 

№ 7 Зертханалық жұмыс.  Қосалқы программаларды пайдалану

Жұмыстың мақсаты:  Есептерді жеке кішігірім есептерге бөлу арқылы шешудің әдістері мен тәсілдерін игеру  және қосалқы программаларды құрастыруға машықтану.

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

1.  Модульдік программалау дегеніміз не, ол қандай жағдайларда қолданылады?

2.  Қосалқы программалардың түрлерін атаңыз және олардың бір-бірінен негізгі айырмашылықтары қандай?

3.  Функцияны құрастырудың  тәртібі қандай және ол қандай кезде қолданылады?

4.  Процедураны құрастырудың тәртібін атаңыз.

5. Программада қанша қосалқы программалар болуы мүмкін?

Жаттығулар және олардың орындалу үлгілері

№13 Мысал.  Көпбұрыштың периметрін табу.

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

i – көпбұрыштың төбесінің реттік номері;

xi,yi –  i - ші төбенің координатасы;

n – төбелер саны;  p– көпбұрыштың периметрі.

Көпбұрыштың периметрінің мәні оның қабырғаларының ұзындықтарының қосындысынан тұрады:    p = d1 +  d2 + d3 + . . . + dn ,

мұндағы            di =  (( xi+1 – xi)2 + (yi+1 – yi )2 )1/2  .

         Әрбір қабырғаның ұзындығын табу функция күйінде қарастырылады; ол функция D деп аталынсын.   

   Program PR13;

     Const n = 5;

     Var  i: integer; p:real;

          x,y: array[1..n] of real;

     Function D(xa,ya,xb,yb:real): real;

         Var s: real;

     Begin s:=sqr(xa-xb)+sqr(ya-yb); D:=sqrt(s); end;

{       Негізгі программа мәтіні:          }

     Begin

         For i:=1 to n do read(x[i],y[i]);

     p:=0; for i:=1 to n-1 do

           p:=p+D(x[i],y[i],x[i+1],y[i+1]);

           p:=p+d(x[1],y[1],x[n],y[n]);

          Writeln(' Периметр p= ', p:8:4);

     end.

Көпбұрыштың төбелерінің координаталарын енгізу керек:

(2,1),   (4,2),   (6,4),   (3,6),   (2,4).

Программаның орындалу нәтижесінде мынадай жауап алынады:

      Периметр p =  13.9061

№14 Мысал. Паскаль үшбұрышы

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

Program PR14;

   Const n=9;

   Var k,j: integer;

       c: array [1..n] of integer;

   Function Soch(p,m: integer):integer;

      Var i :integer;  s: longint;

      Begin   s:=1;

   For i:=1 to m do s:=s*(p+1-i) div (i); soch:=s;

      end;

{    Негізгі программаның мәтіні:        }

  Begin

    writeln('    Треугольник Паскаля:'); k:=1;

    c[k]:=1; write(' ',c[1]);

    writeln;

    For k:=1 to n do

      begin   c[1]:=1;

  For j:=2 to k+1 do begin c[j]:=soch(k,j-1); end;

  For j:=1 to k+1 do  write(' ',c[j],' ');

     writeln;  end; readln;

  end.

Бұл есептің жауабы келесі түрде экранға шығарылады:

Треугольник Паскаля:

  1

1    1

1    2     1

1    3     3    1

1    4     6    4     1

1    5    10   10     5    1

1    6    15   20    15    6    1

1    7    21   35    35   21    7     1

1    8    28   56    70   56   28     8   1

1    9    36   84   126  126   84    36   9   1

Математика пәнінен белгілі,  p - дан m теру саны келесі формула бойынша анықталады:

SOCH =  = ,

мұндағы p = 1,2,3,. . .,n.  Әрбір p параметрінің мәні үшін Паскаль үшбұрышының бір жолы анықталады.

Өз бетімен орындауға арналған тапсырмалар:

1. Берілгені келесі нақты сандар:  s,t, a0, a1, a2, . . . , a12.

Табу керек:

              D = p(1) – p(t) + p2(s-t) – p3(1),

eгер  p(x) = a12 x12 + a11 x11 + . . . + a0  болса.

Бұл жерде p(x) функция ретінде программаланады.

2. Берілгені натурал n саны және келесі нақты сандар: x1,y1,x2,y2,...,xn,yn. Төбелерінің координаталары (x1,y1), (x2,y2),...,(xn,yn) болатын көпбұрыштың ауданын табу керек. Көпбұрышты n-2 үшбұрыштан тұрады деп, әрбір үшбұрыштың ауданын төбелерінің координаталары арқылы Герон формуласын пайдаланып,  табуды функция ретінде құрастыру керек.

3. Берілген интегралдың

       y =

мәндерін t1=  + t2=  +, t3=  +, t4=  +, t5=  +  үшін есептеу керек. Осыдан кейін интегралдың осы мәндерінің орташа мәнін табу керек. Интегралды есептеу функция ретінде қарастырылсын.

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

5. Берілгені A квадрат матрица және бүтін оң сан n. Келесі қосындыны табу керек:

      A + A2 + A3 + . . . + An.

Мұндағы әрбір келесі қосылғышты табу үшін екі матрицаның көбейтіндісін табу керек болады. Матрицалардың көбейтіндісін табуды процедура ретінде құрастыру керек.

 

№8 Зертханалық жұмыс. Көрсеткіштер

Жұмыстың мақсаты:  Программалауда көрсеткіштерді пайдаланудың әдістері мен тәсілдерін игеру.

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

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

2. Көрсеткіштерге қолданылатын амалдарды атаңыз.

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

4. Көрсеткіштер қалай сипатталынады?

5. Объектілердің адрестері қалай белгіленеді?

Жаттығулар және олардың орындалу үлгілері

15 Мысал. Келесі программада көрсеткіштерге меншіктеу операциясын қолдану, көрсеткіштер мен объектілердің date, k, m орналасқан адрестерін табу қарастырылған:

#include<stdio.h>

 void main()

{

printf("\n Rezultaty: ");

char *c; c="Almaty"; int date=2007;

int  *k, *m; /* operator opisanij ukasatelei */

m=&date; /* operanor prisvaivanij */

k=m;     /* operanor prisvaivanij */

c=NULL;  /* operanor prisvaivanij */

printf("\n Znachenij objektov ukasatelei: *k=%d,*m=%d",*k,*m);    /* operator vyvoda */

printf("\n Adresa ukasatelei: &*k=%p, &*m=%p, &*c=%p", *k,*m,*c);     /* operator vyvoda */

printf("\n Adresa objektov: &date=%p, &k=%p, &m=%p", &date, &k, &m);         /* operator vyvoda */

}

Бұл программаның орындалу нәтижесі келесі түрде алынады:

Znachenij objektov ukasatelei: *k =2007, *m =2007

Adresa ukasatelei: &*k=07D7, &*m=07D7, &*c =0000

Adresa objektov: & date=FFF4, &k= FFF2, &m= FFF0

Есептің нәтижесіне талдау жасалынғанда келесі мәліметтерді алуға болады:

- жоғарыда айтылғандай, *k және *m бірдей мәнді көрсетеді;

- *k және *m бір адресті ғана көрсетеді, ал &*c нөлге тең;

- k,m,date айнымалылары орналасқан жад көлемдерінің әрқайсысы 2 байтқа тең;  m - FFF0 және FFF1,  k - FFF2 және FFF3, ал date -FFF4 және FFF5 номерлерге орналасқан.

№16 Мысал. Бұл мысалда массив пен екі көрсеткіш қарастырылған. Көрсеткіштер адрестерін, массив элементтерінің адрестерін және массив элементтерінің мәндерін шығару керек.

Программа мәтіні келесі түрде жазылады:

#include<stdio.h>

float x[]={10.0, 20.0, 30.0, 40.0, 50.0};

void main()

{

float *u1,*u2; int i;

  printf("\n Adresa ukasatelei: &u1=%p &u2=%p", &u1, &u2);

  printf("\n Adresa elementov massiva: \n");

  for(i=0; i<5; i++)

  {

  if(i==3) printf("\n");

  printf("&x[%d] = %p", i, &x[i]);

  }

 printf("\n Znachenij elementov massiva: \n");

 for(i=0; i<5; i++)

 {

 if(i==3) printf("\n");

 printf("x[%d] = %5.1f",i,x[i]);

 } }

Программаның орындалу нәтижесінде келесі жауап алынуы  мүмкін:

Adresa ukasatelei: &u1=FFF4  &u2=FFF2

Adresa elementov massiva:

&x[0]=00AA   &x[1]= 00AE  &x[2]=00B2

&x[3]=00B6   &x[4]=00BA

Znachenij elementov massiva:

x[0]=10.0   x[1]=20.0   x[2]=30.0

x[3]=40.0   x[4]=50.0

Массивтің әрбір  элементі 4 байттық орын алады, мысалы,  x[0]- массивтің бірінші элементі 00AA, 00AB, 00AC, 00AD нөмерлеріне, x[1]-екінші элементі  00AE, 00AF, 00B0, 00B1 нөмерлеріне және с.с. орналасқан.

№17 Мысал.   Берілгені  a,b,c  нақты сандар. Егер

    f(x,y)=

болғанда, келесі өрнектің мәнін табу керек:

    f(c,a)+f(a,b).

Бұл есепті шешу үшін f(x,y) функциясын fauz() функциясы ретінде қарастырып, параметрлердің көрсеткіштерін пайдалану керек. Параметрлердің көрсеткіштерін пайдалану оның мәндерінің орнына олардың адрестерін пайдалануға мүмкіншілік береді.

Программаның мәтіні келесі түрде жазылады:

#include<stdio.h>

double summa(int n, float *x, double *s)

{

int k;

*s=0;  for(k=0; k<n; k++)

if(*(x+k)>0) *s+=*(x+k);  return *s;

}

 void main()

{

float a[]={1.0, 2.0, -3.0, 4.0};

int j; double *p; summa(4,a,p);

printf("\n summa=%le",*p);

    }

Негізгі функцияда a[] массиві берілген, ол 4 элементтен тұрады. Мұнда сипаттау бөлімінен басқа функцияны шақыру summa(4,a,p); мен нәтижені шығару ғана бар.

Программаның орындалу нәтижесі:

summa=7.00000

Өз бетімен орындауға арналған тапсырмалар:

1. Берілген интегралдың

       y =

мәндерін аргументтің  келесі мәндері: t1=  + t2=  +, t3=  +, t4=  +, t5=  +  үшін есептеу керек. Осыдан кейін интегралдың осы мәндерінің орташа мәнін табу керек. Интегралды есептеу функция ретінде қарастырылсын.

2.Берілгені:  n-натурал сан, a1, a2, a3,...,an нақты сандар. Осы массивтің оң сандарының қосындысын табу керек. Ол үшін функция құрастырылады, ол summa деп белгіленсін. Бұл функцияның параметрлері ретінде x[]массиві, оның элементтерінің саны мен есептелінетін оң элементтердің қосындысы болуы тиіс. Мұнда массивтің басының ғана адресі көрсетіледі. Ал қалған элементтерін пайдалану үшін жоғарыда айтылғандай, оған бүтін мән қосылады.

3. Берілген бір өлшемді массив элементтерін a1, a2, a3,...,an бір мезгілде элементтерінің өсуі және кемуі бойынша реттеу туралы есеп. Есепті шешу үшін  көрсеткіштер массивін пайдалану керек.

 

№9 Зертханалық жұмыс.  Графикалық жұмыстарды орындау

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

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

1.     Графикалық режим дегеніміз не?

2.     Координаталар жүйесін орнату үшін қандай амалдарды орындау керек?

3.     Экрандағы графиктің көшірмесін қалай алуға болады?

4.     Бейнені сақтайтын экрандағы облыс қалай анықталады?

5.     Графикалық бейнені сақтайтын жады көлемін қалай анықтайды?

Жаттығулар және олардың орындалу үлгілері.

 Келесі жаттығуларды орындау үшін графикалық программаның келесі үлгісін пайдалануға болады:

Uses Graph;

Var

  EC,D,m: integer;

Begin

  D:=detect; InitGraph(D,m,’ ‘); EC:=GraphResult;

  If EC = grOk then

  Begin

{Осы жерге құрастырылатын программаға }

{ қажетті операторлар жазылады        }

  End;

  CloseGraph;

End

№18 Мысал.  Спиральді  сызу

 Берілген нүктенің айналасына n орамнан  тұратын спираль сызу керек. Оның алғашқы бағыты абсцисса осімен α бұрышын құрайды. Спиральдің параметрлік теңдеулерін келесі түрде жазуға болады:  x = xc + r cost, y = yc + r sint, r = at, α ≤ t ≤ 2nπ.   Мұндағы  a параметрінің мәні клавиатурадан енгізіледі. Оның мәні үлкен болған сайын спиральдің де үлкен болатындығына көз жеткізуге болады.

Спиральді сызу кезінде оның графигін кішігірім кесінділер күйінде құрастырылатын болғандықтан, t параметрінің өзгеру қадамы мен алғашқы мәні берілуі тиісті; оның өзгеру қадамы p6 = π/180, ал  α =π/4 тең деп алынған. Программада спиральдің ортасының координаталары xc =320, yc = 250, ал орам саны n = 20. Әрине, бұл мәндерді өзгертуге болады.

Осы есептің программасының мәтінін келесі түрде жазуға болады:

Program PR21;

   Uses Graph;

   const xc=320; yc=250; n=20;

         pi=3.1415926;  alf=pi/4; p6=pi/180;

   var t,r,a: real;

       k,d,m,i,x,y:integer;

   begin

      readln(a); d:=detect; InitGraph(d,m,' '); t:=alf;

    MoveTo(xc,yc);

       writeln(' Спираль для значения  a=',a:4:2);

         for i:=1 to n do

      begin for k:=1 to 360 do

       begin

    t:=t+p6; r:=a*t; x:=round(r*cos(t))+xc;

    y:= round (r*sin(t))+yc;  LineTo(x,y);

       end; end;

      Circle(xc,yc,round(r)); readln;

    CloseGraph;

   end.

Бұл программада спираль графигін сызғанда, оны құрайтын кішігірім кесінділерді тұрғызу үшін LineTo(x,y) процедурасы қолданылған. Әрбір келесі нүктенің координаталарының мәндері бүтін болуы тиіс болғандықтан, оларды табу кезінде  round функциясы пайдаланылған.

 

Өз бетімен орындауға арналған тапсырмалар:

Параметрлік теңдеулері берілген келесі қисық сызықтардың графигін  сызу керек:

а)  Координаталар осьтеріне параллель болатын, жарты осьтері r1 және r2 эллипсті   x=r1 cos t, y = r2 sin t,  t [0,2π) сызу.

б)  Паскаль ұлуын (улиткасын) сызу:

         x= a cos2 t + b cost,

    y= a costsint + b sint, a > 0, b > 0, t [0,2π).

Бұл жерде әртүрлі жағдайларды қарастыру керек.

в)  Кардоиданы сызу:

        x = a cost(1+cost),

   y = a sint(1+cost), a > 0, t [0,2π)  

г) Астроиданы сызу:

       x = b cos2t,

   y = b sin3t, t [0,2π)

д) Строфоиданы сызу:

   x = , y = , t , a > 0.

 

Әдебиеттер тізімі:

1.  Аляев Ю.А., Козлов д.А. Алгоритмизация и языки программирования Pascal, C++, Visual Basic: Учебно-справочное пособие.- М.: Финансы и статистика, 2004.-320 с.

2. Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И. Задачи по программированию. – М.: Наука. Гл. ред. физ.-мат. лит, 1988.  - 224 с.

3. Бөрібаев Б. Программалау тілдеріне кіріспе: Оқулық – Алматы: Алматы экономика және статистика академиясы, 2008. – 380 б.

4. Инструментальные средства персональных ЭВМ. В 10 кн. 4. Программирование в среде Турбо Паскаль: Практическое пособие / Л.А. Агабеков и др.; Под ред. Б.С.Трусова.- М.: Высшая школа, 1993. – 142 с.

5. Информатика. Базовый курс. 2-ое издание. / Под ред. С.В. Симоновича. – СПб.: Питер, 2006. – 640 с.

6. Керниган Б., Зитчи Д. Язык программирования Си / Пер. с англ. – М.: Финансы и статистика, 1972. -272 с.

7. Климова Л.М. PASCAL 7.0. Практическое программирование. Решение типовых задач. – М.: КУДИЦ-ОБРАЗ, 2000. – 528 с.

8. Культин Н.Б. Программирование в Turbo Pascal 7.0 и  Delphi. -  2-ое изд., перераб. и доп. – СПб.: БХВ – Петербург, 2004. – 416 с.

9. Культин Н. Turbo Pascal  в задачах и примерах. – СПб.: БХВ-Петербург, 2008. – 256 с.: ил.

10. Культин Н. C/C++  в задачах и примерах. – СПб.: БХВ-Петербург, 2008. – 288 с.: ил.

11. Құралбаев З.Қ. Алгоритмдеу және программалау тілдері. – Алматы, 2008. 353 бет.

12. Подбельский В.В., Фомин С.С. Программирование на языке Си: учеб. пособие. – 2-е доп. изд. – М.: Финансы  и статистика, 2007.- 600 с.: ил.

13. Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих: Пер. с англ. – М.: Мир, 1988. – 512 с., илл.