Лекция өңдеу Жиымдарды Сұрақтар: Кездейсоқ сандарды енгізу > Жиымдарды өңдеу тәсілдері Екі өлшемді жиымдар



жүктеу 28,48 Kb.
Дата25.05.2018
өлшемі28,48 Kb.
#17752
түріЛекция
  • 9 лекция
  • өңдеу
  • Жиымдарды
  • Сұрақтар:

1. Кездейсоқ сандарды енгізу

  • Си тілінде кездейсоқ сандар беретін функция бар.
  • int rand() – 0..RAND_MAX=32767 аралығынан кез келген кездейсоқ бүтін сан береді. функцияны пайдалану файлы арқылы орындалады.
  • Мысалы:
  • //a[n], n енгізіледі
  • #include
  • #include
  • #include
  • void main()
  • {int a[100],n; randomize(); clrscr();
  • printf("\nЖиым ұзындығы:",n);
  • scanf("%i",&n);
  • printf("\nЖиым элементтері:",n);
  • for(int I=0;I
  • {a[I]=rand()%100-50;
  • printf(" %i ", a[I]);
  • }
  • getch();
  • }
  • int randом(n) – 0..n аралығынан кез келген кездейсоқ бүтін сан береді. Бұл функцияны да пайдалану файлы арқылы орындалады.
  • #include
  • #include
  • #include
  • main ()
  • { int i,j,a[3][4];
  • clrscr();
  • randomize();
  • printf(“Жиым элементтері:\n");
  • for (i=0; i<3; i++)
  • {for (j=0; j<4; j++)
  • a[i][j]=random(50);
  • printf(" %2i",a[i][j]);
  • }
  • getch();
  • }

2. Жиымдарды өңдеу тәсілдері

  • Жиымдарды өңдеу есептерінің түрлері:
  • 1) Есептердің 1-түріне жиым элементтерінің барлы-ғын немесе көрсетілгендерін бірдей бір тәсілмен өңдеу есептері жатады.
  • 2) Есептердің 2-түріне (класына) жиым элементтері-нің орналасу реттілігін өзгерту тәсілдері жатады.
  • 3) Есептердің 3-класына бірнеше жиымдарды қатар өңдеу немесе бір жиымның ішкі элементтерін бірнеше топқа бөліп жеке-жеке өңдеу тәсілдері жатады. Жиымдар бір тәсілмен – синхронды өңделеді немесе әр түрлі тәсілмен – асинхронды түрде өңделеді.
  • 4) Жиымның берілген санға тең элементін табу, яғни іздеу есептері жатады.
  • 1 түрдегі есеп. Массивтің жұп индексті элементтері қосындысын анықтау.
  • /* a[n] массивінің жұп индексті элементтері қосындысы */
  • #include
  • #include
  • #include
  • #define n 50  
  • void main()
  • {
  • int a[n],I; randomize();
  • for(int I=0;I
  • {a[I]=random(100)-50;
  • printf(" %i ", a[I]);
  • }
  • int Sum=0;
  • for(I=0;I
  • Sum+=a[I];
  • //жұп индексті элементтер 0, 2, 4... қосындысы
  • printf("\nSum= %i ", Sum);
  • getch();
  • }
  • 2-түрдегі есептер
  • Массив ішіндегі екі элементтің бір-бірімен орнын ауыстыру үшін қосымша тағы бір айнымалы керек. Мысалы, a[I] және a[J] элементтерінің орнын ауыстыру үшін қосымша R айнымалысы керек:
  • 1 – есеп. Массивтің қатар тұрған екі элементін: 1және 2, 3 және 4, 5 және 6, т.с.с. элементтерін бір-бірімен орын ауыстыру
  • for(int i=0;i
  • {int r=a[i];
  • a[i]=a[i+1];
  • a[i+1]=r;
  • }
  • 2 – есеп. Массив элементтерін k орынға солға (оңға) ығыстыру, яғни жылжыту.
  • int k,i,t,r, a[n];
  • printf(“k = “);
  • skanf(“%d”,&k);
  • for(t=0;t
  • {
  • r=a[0];
  • for(int i=0; i
  • a[i]=a[i+1];
  • a[n-1]=r;
  • }
  • 3 түрдегі есептер
  • Жиымдарды синхронды түрде өңдеуде жиымдар элементін қарастыру кезінде индекстер бірдей түрде өзгереді (при синхронной обработке массивов индексы при переборе массивов меняются одинаково).
  • 1 есеп. Бүтін сандардан құралған n элементтерден тұратын 2 массив берілген. Жаңа c массивін мынадай формула арқылы алу керек: c[I]=a[I]+b[I].
  • for (int I=0; I
  • c[I]=a[I]+b[I];
  • Жиымдарды асинхрондық өңдеу кезінде әр жиым индексі өз реттілігімен өзгеріп отырады.
  • 2 есеп. Бүтін сандардан құралған массивтегі теріс элемент-тердің барлығын массивтің бас жағына орналастыру керек.
  • int b[10]; //қосымша массив
  • int i,j=0;
  • for(i=0;i
  • if(a[i]<0){b[j]=a[i];j++;}
  • //а-дан b-ға барлық теріс элементтерді көшіру
  • for(i=0;i
  • if(a[i]>=0){b[j]=a[i];j++;}
  • //а-дан b-ға барлық оң элементтерді көшіру
  • for(i=0;i
  • 3 есеп.
  • Массивтің барлық жұп элементтерін жою керек.
  • int b[10];
  • int i,j=0;
  • for(i=0;i
  • if(a[i]%2!=0){b[j]=a[i];j++;}
  • for(i=0;i
  • printf(“ %d ”, b[I]);
  • printf ("\n");
  • 4-түрдегі есептер
  • Іздеу есептерінде берілген шартқа сәйкес келетін элементті іздеп табу керек. Ол үшін жиым элементтерін біртіндеп тізбектей қарастырып отырып шартты тексеріп шығу қажет. Осылай ету барысында циклден шығудың екі жолы бар:
  •    керекті элемент табылғаннан кейін ;
  •    жиым элементтері тегіс қаралып шықты, керекті элемент табылмады.
  • 1 есеп. Берілген К санына тең жиымның алғашқы элементін табу керек.
  • int k;
  • printf("\nK=");
  • scanf(“%i”,&k);
  • int ok=0;
  • // элемент табылғаны||табылмағаны белгісі
  • int i,nom;
  • for(i=0;i
  • if(a[i]==k){ok=1;nom=i;break;}
  • if(ok==1)
  • printf("\nnom=",nom);
  • else
  • printf("\nk-ға тең элемент
  • табылмады!");
  • Жиымды сұрыптау (сорттау, реттеу)
  • Сұрыптау – берілген объектілер жиынын (сандарды) ұсынылған реттілікпен қайта теріп орналастыру процесі.
  • Жиымдарды сұрыптау жылдамдығы әр түрлі болады. Қарапайым сұрыптау тәсілдері n*n рет салыстыруды керек етеді, мұндағы n – жиым элементтері саны; ал жылдам сұрыптау тәсілі n*ln(n) рет салыстыруды қажет етеді. Қарапайым тәсілдер түсінуге жеңіл, өйткені алгоритмі түсінікті. Күрделі тәсілдер аз әрекеттер санын керек еткенмен, операциялары күрделірек болады, сондықтан элементтер саны аз жиымдарға қарапайым тәсілдерді қолданған дұрыс.
  • Қарапайым тәсілдер 2топқа бөлінеді:
  • -      жай таңдау жолымен сұрыптау;
  • -      жай алмастыру тәсілімен сұрыптау.
  • Жай таңдау жолымен сұрыптау
  • Жиымның ең кіші элементі анықталады да, ол бірінші элементпен орын ауыстырады. Қалған элементтермен де осы тәсіл қайталанады.
  • int i,min,n_min,j;
  • for(i=0;i
  • {min=a[i];n_min=i; //минимум іздеу
  • for(j=i+1;j
  • if(a[j]
  • {min=a[j];n_min=j;
  • }
  • a[n_min]=a[i]; //орын ауыстыру
  • a[i]=min}
  • Жай алмастыру арқылы сұрыптау
  • Ең соңғыдан бастап, екі элемент салыстырылады да, қажет болса, орын алмастырады. Осындай әрекет нәтижесінде ең кіші элемент жиымның ең сол жақ шетіне ығысады. Қалған жиым элементтері үшін де осы процесс қайталанады.
  • for(int i=1;i
  • for(int j=n-1;j>=i;j--)
  • if(a[j]
  • {int r=a[j];a[j]=a[j-1];a[j-1]=r;}
  • }

3. Екі өлшемді жиымдар

  • Екі өлшемді жиымды – матрицаны пайдалану үшін тік жақшалар ішінде олардың екі өлшемінің де енін көрсету керек.
  • Си тілінде екі өлшемді жиым былай сипатталады:
  • [<жады класы>] <типі>
  • <жиым аты> [<1-өлшемі>][<2-өлшемі>]
  • Жиым элементтері типі ескеріліп, олардың көле-міне жеткілікті етіп жиым үшін компьютер жадын-да қажетті орын бөлініп беріледі немесе жиымның аты осы аймақтың басына сілтейтін нұсқауыш типті константа болып табылады.
  • Мысалы:
  • int a[4][3];
  • алғашқы сан жолдар санын, ал екінші сан бағаналар санын көрсетеді, а жиымы 12 элементтен тұрады. Оларға бастапқы мәнді былай береміз:
  • int a[4][3]={ {0,1,2},
  • {3,4,5},
  • {6,7,8},
  • {9,10,11}
  • };
  • ішкі жүйелі жақшаларды қоймаса да болады:
  • int a[4][3]={0,1,2,3,4,5,6,7,8,9,10,11};
  • Келесі түрде сипаттау жолдардың тек бірінші элементтерін ғана анықтайды, қалған элементтер 0-ге тең болып саналады:
  • int a[4][3]={ {0},{3},{6},{9} };
  • Егер ішкі жүйелі жақшалар алынып тасталса, онда мағынасы өзгереді.
  • int a[4][3]={0,3,6,9};
  • мұнда бірінші жолдың 3 элементі мен екінші жолдың бірінші элементі анықталады да, қалғандары 0 болып саналады.
  • Егер ішкі жүйелі жақшалар алынып тасталса, онда мағынасы өзгереді.
  • int a[4][3]={ 0,3,6,9 };
  • мұнда бірінші жолдың 3 элементі мен екінші жолдың бірінші элементі анықталады да, қалғандары 0 болып саналады.
  • 4. Екі өлшемді жиым элементтерін енгізу
  • Екі өлшемді жиымды инициалдау қабаттасқан циклдер арқылы орындалады:
  • main()
  • {const int row=3, col=4;
  • int a[row][col];
  • clrscr(); randomize();
  • for (int i=0; i
  • for (int j=0; j
  • a[i][j]=random(100)-50;
  • printf("\nа[3][4] жиым элементтері:");
  • for (i=0; i
  • for (j=0; j
  • printf(" %i",a[i][j]);
  • getch();
  • }
  • //матрица элементтерін қолмен енгізу мысалы
  • #include
  • #include
  • #include
  • main()
  • { int a[4][5];
  • int i,j;
  • printf(“жиым элементтерін қолмен енгізу:\n");
  • for (i=0; i<4; i++)
  • for (j=0; j<5; j++)
  • { printf("a[%i][%i]=",i,j);
  • scanf("%i",&a[i][j]);
  • }
  • printf(“Енгізілген жиым элементтері:\n");
  • for (i=0; i<4; i++)
  • {for (j=0; j<5; j++)
  • printf(" %3i",a[i][j]);
  • printf("\n");
  • }
  • getch();
  • }
  • Массив элементтері типі ескеріліп, олардың көлеміне жеткілікті етіп массив үшін компьютер жадында қажет-ті орын бөлініп беріледі немесе массивтің аты осы ай-мақтың басына сілтейтін нұсқауыш типті константа болып табылады.
  • Берілген екі өлшемді массив мынадай түрде инициалданған болсын:
  • static int a[3][4]={
  • {5,3,4,2},
  • {3,3,4,5},
  • {2,3,3,4}
  • };
  • Осы массивтің әрбір жолдағы элементтер қосынды-ларын және сол қосындылардың орташа мәнін анықтау керек.
  • // әр жол қосындысы және солардың арифм. ортасы
  • #include
  • #include
  •  main ()
  • { static int a[3][4]={
  • {5,3,4,2},
  • {3,3,4,5},
  • {2,3,3,4}
  • };
  • int i,j,s=0; float c=0;
  • clrscr();
  • for (i=0; i<3; i++)
  • {for (j=0; j<4; j ++) s+=a[i][j];
  • printf("%i-жол косындысы:%i\n",i+1,s);
  • c+=s;
  • }
  • printf("--------------------");
  • printf("\nарифм.ортасы %5.2f",c/4);
  • }

5. Матрицаны өңдеу тәсілдері

  • Матрица мынадай түрде беріледі:
  • А(0,0) A(0,1) A(0,2) A(0,3) ... A(0, j) … A(0,n-1)
  • A(1, 0) A(1,1) A(1, 2) A(1, 3) ... A(1, j) … A(1, n-1)
  • A(2, 0) A(2, 1) A(2,2) A(2, 3) ... A(2, j) … A(2, n-1)
  • A(3, 0) A(3, 1 A(3, 2 A(3, 3 ... A(3, j) … A(3, n-1)
  • … … … … … A(i, j) … …
  • A(n-2, 0) A(n-2, 1) A(n-2, 2) A(n-2, 3) ... A(n-2, j) … A(n-2, n)
  • A(n-1, 0) A(n-1, 1) A(n-1, 2) A(n-1, 3) ... A(n-1, j) … A(n-1, n-1)
  • Бас диагональ элементтері белгісі: i=j
  • Бас диагональдан жоғары тұрған элементтері белгісі: i
  • Бас диагональдан жоғары тұрған элементтері белгісі: i>j
  • Қосалқы диагональ элементтері белгісі: i+j=n-1
  • Қосалқы диагональдан жоғары элементтер белгісі: i+j
  • Қосалқы диагональдан төмен элементтер белгісі: j+j>n-1
  • // бас диагональда орналасқан элементтерді қосу
  • #include
  • #include
  • main ()
  • {static int a[3][3]={0,1,2,3,4,5,6,7,8};
  • int i,j,r,s; clrscr();
  • printf(“Енгізілген элементтер:");
  • for (i=0; i<3; i++)
  • {for (j=0; j<3; j++)
  • printf("%2i,",a[i][j]);
  • printf("\n");
  • }
  • s=0; //қосынды табу
  • for (i=0; i<3; i++)
  • for (j=0; j<3; j++)
  • if (j=i) s+=a[i][j];
  • printf("\ns=%i",s);
  • getch();
  • }
  • //қосалқы диагональдан жоғары элементтер қосындысы
  • #include
  • #include
  •  main()
  • { static int a[3][3]={0,1,2,3,4,5,6,7,8};
  • int i,j,r,s,n=3; clrscr();
  • printf(“Енгізілген элементтер:");
  • for (i=0; i<3; i++)
  • {for (j=0; j<3; j++)
  • printf(" %2i",a[i][j]);
  • printf("\n");}
  • s=0;
  • for (i=0; i<3; i++)
  • for (j=0; j<3; j++)
  • if (j+i
  • printf("\ns=%i",s);
  • getch();
  • }
  • /*матрица жолдарын өсуі бойынша реттеу -sortstr.cpp*/
  • #include
  • #include
  • main ()
  • {static int a[3][3]={8,7,6,5,4,3,2,1,0};
  • int i,j,r,s,n=3,amin,m,k; clrscr();
  • printf(" Енгізілген элементтер:");
  • for (i=0; i<3; i++)
  • {for (j=0; j<3; j++)
  • printf(" %2i",a[i][j]);
  • printf("\n");
  • }
  • for (i=0; i
  • { //минимумды тауып, оны керекті элементпен ауыстыру
  • for (k=0; k
  • { amin=a[i][k];m=k;
  • for (j=k+1; j
  • if (a[i][j] < amin)
  • {amin=a[i][j]; m = j;}
  • a[i][m]=a[i][k]; a[i][k]=amin;
  • }
  • }
  • printf("\nсұрыпталған жиым элементтері:\n");
  • for (i=0; i<3; i++)
  • {for (j=0; j<3; j++)
  • printf(" %2i",a[i][j]);
  • printf("\n");
  • }
  • getch();
  • }

6. Матрицаларда нұсқауышты пайдалану

  • a[3][2] жиымы берілген болсын. Олар бүтін сандар, яғни
  • int a[3][2];
  • int *pri;
  • pri = a; // бұл pri=a[0][0] деген сөз
  • a – жиымның аты немесе a[0][0] элементінің адресі
  • a=&a[0][0];
  • pri нұсқауышына 1-ді қоссақ, pri+1 нұсқауышы a[0][1] элементін көрсетеді. Келесі теңдіктер дұрыс болып табылады:
  • pri == &a[0][0];
  • pri+1== &a[0][1];
  • pri+2== &a[1][0];
  • pri+3== &a[1][1];
  • pri+4== &a[2][0];
  • pri+5== &a[2][1];
  • //Жиым қосындысын табу мысалы
  • #include
  • #include
  • main ()
  • {
  • int b[4][4]={{0,1,2,3},
  • {4,5,6,7},
  • {8,9,1,0},
  • {1,2,3,4}};
  • int i,s=0,*pri;
  • clrscr();
  • pri=&b[0][0];
  • for (i=0;i<15;i++)
  • s+=*(pri+i);
  • printf("сумма = %d",s);
  • getch();
  • }
  • Екі өлшемді жиым бір өлшемді жиымдардан құрастырылған жиым ретінде қарастырылуы мүмкін. Яғни берілген екі өлшемді жиым үш жолдан тұрады, ал әрбір жол екі элементтен тұратын жиым болып табылады.
  • Бірінші жол аты - a[0],
  • екінші жол аты - a[1],
  • үшінші жол аты - a[2].
  • Жиымның аты берілген жиымның нұсқауышы болып табылады, яғни ол жиымның ең алғашқы элементіне сілтейді.
  • Екі өлшемді жиымның осы қасиеті бір өлшемді жиымға арналған функцияны екі өлшемді жиыммен жұмыс істеуге мүмкіндік береді. Төменде b[3][4] матрицасы жолдарының арифметикалық ортасын табатын программада функция қолданылған.
  • float f1(int x[], int n)
  • { int k; float s;
  • for (k=0,s=0;k
  • s+=x[k];
  • return(s/n);
  • }
  • main ()
  • { int i,b[3][4]={ {6,4,3,3},
  • {7,5,3,3},
  • {8,4,2,6}
  • };
  • clrscr();
  • for (i=0;i<3;i++)
  • printf("cредн.значение строки %d = %f\n",
  • i,f1(b[i],4));
  • getch();
  • }
  • Тыңдағандарыңызға
  • рахмет!

жүктеу 28,48 Kb.

Достарыңызбен бөлісу:




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

    Басты бет
рсетілетін қызмет
халықаралық қаржы
Астана халықаралық
қызмет регламенті
бекіту туралы
туралы ережені
орталығы туралы
субсидиялау мемлекеттік
кеңес туралы
ніндегі кеңес
орталығын басқару
қаржы орталығын
қаржы орталығы
құрамын бекіту
неркәсіптік кешен
міндетті құпия
болуына ерікті
тексерілу мемлекеттік
медициналық тексерілу
құпия медициналық
ерікті анонимді
Бастауыш тәлім
қатысуға жолдамалар
қызметшілері арасындағы
академиялық демалыс
алушыларға академиялық
білім алушыларға
ұйымдарында білім
туралы хабарландыру
конкурс туралы
мемлекеттік қызметшілері
мемлекеттік әкімшілік
органдардың мемлекеттік
мемлекеттік органдардың
барлық мемлекеттік
арналған барлық
орналасуға арналған
лауазымына орналасуға
әкімшілік лауазымына
инфекцияның болуына
жәрдемдесудің белсенді
шараларына қатысуға
саласындағы дайындаушы
ленген қосылған
шегінде бюджетке
салығы шегінде
есептелген қосылған
ұйымдарға есептелген
дайындаушы ұйымдарға
кешен саласындағы
сомасын субсидиялау