- Си тілінде кездейсоқ сандар беретін функция бар.
- 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();
- }
Достарыңызбен бөлісу: |