Б. БӨрібаев c/C++ тілдерінде программалау (практикалық курс) Жогары оқу орьшдарына арналған оку құралы э в е р о алматы 2015 Эверо


жүмыс эрекеттерді төмендеп Жиымның эр жолдарында орналасқан



жүктеу 1.78 Mb.
Pdf просмотр
бет15/16
Дата26.04.2017
өлшемі1.78 Mb.
1   ...   8   9   10   11   12   13   14   15   16

жүмыс
эрекеттерді
төмендеп
Жиымның эр жолдарында орналасқан 
элементтерініц қосындысын анықтау
ылар ретінде п элементтен
(6.1-сурет): 
for(i=0;і<п;і++)
кұрастырамыз.  Мысалы
s=0;
for(j=0;js+=a[i][j]; 
d[i]=s;
Жиымның 
әр 
баганаларыңда 
орналаскан
элементтерінщ  косындысын  анықтау 
тәсілмен  іске  асырылады.  Мунда 
циклді  j   айнымалысы,  ал  ішкі  циклді 
малысы бойынша орындау керек.
сыртқы
6.1-сурет. 
Екі өлшемді 
жиым қосындысын табу
Матрицаныц ап т ең кііиі эл< 
элементтің  мэнін  сактайды 
айнымалысы  —  бағанасы 
сактайды (
6
.
2
-сурет).
min=a[0][0];  k=0;  t=0j 
for(i=0;ifor(j=0;j{  min  =  a [ i ] [ j ] ;  
k  =  i ;   t   =  j ;
}
кезінде
k  айнымалысы  оның  жолы  нөмірін,  ал  t
нөмірін  есте
■  а матрицасын  х векторы на көбейту 
кезінде жаңа у  векторы шығады. 
f о г ( і =
0
; і < л ; і+ + )
{ s=0;
for(j=0;js+=a[i][j]*x[j];
y[i]=s;
Енді тағы бір мысал қарастырайық.
Квадрат түріндегі  матрица а[3,3] берілген. Оның
6.2-сурет. Матрицаның ең 
кіші мәнін анықтау
152

элементтерін пернетақтадан енгізіп, одан екі бірөлшемді жиым құру керек, 
алға шкысына — матрицаның бас диагоналында және одан жоғары орналаскан 
элементгерін, ал екіншісіне — бас диагональдан төмен орналасқан элементтерін 
жазып шығу керек.
«include 
«include  
main()
{ const  row=3j  // жолдар саны
col=row;  // бағаналар саны 
int i,j,m,n,a[row][col], 
b[row*col], 
c[row*col]; 
clrscr();
cout  <<  "Жиымды жолдар бойынша енгіз:\п"; 
for(i=0;i{  cout «   "жол #"  <<  i <<  " 
for(j=0;jcin »  a[i][j];
}
n=
0
;
m=0;
for(i=0;ifor(j=0;jif(j>=i)
{
b[n]=a[i][j]; 
n++:
}
{
c[m]=a[i][j];
m++j
>
cout <<  "Бас диагональда жане одан жоғары
орналаскан элементтер:\п"; 
for(i=0;icout << b[i]  «   " 
cout << endl;
cout <<  "  Бас диагональдан томен орналаскан
элементтер:\п"; 
for(i=0;icout  << c[i]  «   "  "j 
cout << endl;
153

>
Программаны орындау нэпгижесі:
Жиымды жолдар бойынша енгіз:
жол  # 0 4 5 6  
жол  # 1 8   6  4 
жол  # 2 2 6 9
Бас диагональда жэне одан жоғары орналасқан  элементтер:
Жиымдағы элсменттердің орындарын ал маеты ру
Жиымдағы  элементтердің  орындарын  алмастыру  кезінде  олардын  мәндері 
өзгермейді  де,  тек  элементтердің  реттілігі,  ягни  жиым  ішіндегі  индекстері 
өзгереді.
Екі  элементті  бір-бірімен  орын  алмастыру  үшін  үшінші  бір  айнымалы  кажет 
болады,  ол  элементтердің  бірін  уакытша  есте  сақтай  тұрады  да,  буферлік 
айнымалы  рөлін  атқарады.  Мысалы, 
а  жиымындагы  үшінші  жэне  төртінші 
элементтердің орнын алмастырайық.
b u f   = 
a[3]j  a[3] 

a[4]j  a[4] 
=  b u f ;
Матрица  жолдарын  алмастыру  кезінде  екі  жолдың  барлық  элементтерін 
алмастырып  шыгу  керек.  Мысалы,  матрицаның  екінші  және  үшінші  жолдарын 
алмастыру  үшін,  буфер  ретінде  жиымды  емес,  тек  бір  айнымалыны  гана 
пайдапануга  болады,  өткені  оларды  кезекпен,  бірінен  сон  бірін  ала  отырып 
алмастырамыз.
for(j=0;j{  buf = а [ 1 ] Ш ;   a[l][j]=a[2][j];  a[2][j]=buf;  >
Екі  өлшемді  матрица  жолдарын  алмастырудың  көрнекі  мысапы  ретінде 
матрицаны 
транспонирлеуді 
айтуга 
болады. 
Мұнда 
қарастырылатын 
матрицалардың  бірінің  жолын  екіншісінін  баганасы  ретінде  түрлендіруге  тура 
келеді,  бірақ  екеуінің  де  бас  диагоналындагы 
элементтері  өзгермейді. 
Транспонирлеу  эрекеті  бас  диагонал  бойынша  симметриялы  түрде  орналаскан 
матрица элементтерін алмастыруга келіп тіреледі.
Келесі  есепте  матрица элементтері  кездейсок сандармен толтырылады да, оны 
транспонирлеу әрекеті  жүзеге асырылады.
/*  Кездейсок сандар матрицасын транспонирлеу  */
#include  
#include  
#include  
#include 
ntainO
{
const  row=3,  // жолдар саны 
col=row;  //  бағаналар  саны
getch();
154

int  i,j,buf,a[row][col];
clrscr();  randomize();
cout  <<  "Кездейсоқ сандар матрицасы  \n";
for(i=0;i
{
for(j=0;j
{
a[i][j]=random(100); // элементтің кездейсоқмәні
cout  <<  setw(4)  <<  a[i][j];  //  элементті шығару
>
cout  <<  endl;
}
// матрицаны транспонирлеу 
for(i=0;i
{  //  бас диагоналдан жоғары турған жолдар  эл-терін  қарау 
for(j=i+l;j
{  //  бас диагонал  бойынша  симметриялы түрде 
// орналасқан элементтерді  алмастыру 
buf=a[i][j];  a[i]
[ j] =  
a[j][i];  a[j][i]=buf;  }
У
cout  <<  "Матрицаны транспонирлеу нәтижесі:\п"; 
for(i=0;i
{
for(j=0;j
cout  <<  setw(4)  <<  a[i][j]; 
cout  <<  endl;
}
getch();
Матрицаларды өңдейтін  негізгі алгоритмдер ретінде бір өлшемді жиым­
дарды өңдеу кезінде қолданылған алгоритмдер саналады. Жалпы матрицаларды 
өңдейтін барлык алгоритмдерді екі топка бөліп қарастыруга болады, олар:
1)  матрицанын барлық элементтерін өндейтін алгоритмдер;
2
)  матрицанын эр жолы  немесе эр баганасы элементтерін жеке-жеке өңдейтін 
алгоритмдер.
6.1  М атрицанын барлы қэлем енттерін өңдейтін алгоритмдер
1-мысал.  Накты сандардан тұратын a
4t6
 матрицасы берілген. Мынадай өр-
P i
некл  Z = —   есептеу керек, мұндагы  Р1  жэне 
Р2 
-  сәйкесінше алынган матри­
цанын он жэне теріс элементтерінің көбейтіндісі.
/ *
  а[4][6]  матрицасы берілген.  г=р1/|р2|мәнін есептеу керек,  pi 
жэне р2 - матрицаның 
оң 
жэне теріс элементтерінің көбейтіндісі 
* f
#include 
155
Ш

#include  
#include 
void  line() 
// көлденең сызық сызу функциясы
{printf ( ”........................ .... \n");
return;






raain()
{  static int a[4][6]={  {5,-11,4,-2,5,6},
{3,3,-12,-5,7,8}, 
{2,3,-3,14,-9,-3}, 
{-9,3,-6,14,9,-3}
} ;
int i,  j; 
float pl,p2,z; 
clrscrQ;
printf("Берілген матрица  :\n"); 
line();
for(i=0;  i<4;  i++)
{for(j=0;  j<6;  j ++)
printf(" %3i  ",  a[i][j]); 
printf("\n");} 
line();
/* Матрицаны өңдеу */ 
pi = 1 ;   p2 = 1; 
for(i=0;  i<4;  i++)
for(j=0;  j<6;  j  ++)
{  if  (a[i][j]>0)  pi = pl*a[i][j]; 
if (a[i][j]<0)  p2 = p2*a[i][j];
}
z = pl/fabs(p2); 
printf(" 
z = %f\n",z); 
line();
getch();
}
Программаны орындау нәтижесі:
Б е р іл г е н   м а т р и ц а :
I
5
-1 1
4
-2
5
6
3
3
-1 2
-5
7
8
2
3
-3
14
-9
-3
-9
3
- 6
14
9
-3
Z
=  554. 343384
156

2-мысал.Бүтін  сандардан  тұратын  квадрат  b
55
  матрицасы  берілген.  Оның  бас 
диагоналының сол жағыңда жэне он жағында орналаскан нөлге тең элементтер! 
саиын аныктап, солардың  айырмасының модулін табу керек.
Мынадай белгілеулер енгізейік:
L
1
  -  бас диагоналдың сол жағында (төменіңде) орналаскан элементтер саны;
L2 -  бас диагоналдың оң жагында (жоғарысында) орналаскан элементтер саны; 
L= |L 1 -L2|  —  солардың айырмасының модулі.
#include 
#include 
#include  
void line()
{printf ("----- ------- ---------- \n");
return;}
m a in ()
{  s t a t i c   i n t   b [ 5 ] [ 5 ] = {  
{ 5 , 0 , 0 , 0 , 0 } ,
{ 0 , 3 , 1 2 , 0 , 0 } ,
{ 0 ,3 3 ,1 3 ,1 4 ,0 } ,
{ 0 ,2 3 ,0 ,1 4 ,0 } ,
{ 3 5 ,0 ,1 3 ,1 4 ,9 } ,
i n t   i , j ;
i n t   L 1 ,L 2 ,L ; 
c l r s c r ( ) ;
p r i n t f
("Берілген матрица
: \ n " ) ;  
l i n e ( ) ;
f o r ( i = 0 ;   i< 5 ;  i+ + )
{ f o r ( j = 0 ;   j< 5 ;  j   ++)
p r i n t f ( "   %3i  " ,  b [ i ] [ j ] ) ;  
p r i n t f ( " X n " ) ; }  
l i n e ( ) ;
LI  =  L2  =  0 ; 
f o r ( i = 0 ;   i< 5 ;  i+ + ) 
f o r ( j = 0 ;   j< 5 ;  j   ++) 
i f   ( b [ i ] [ j ] = =
0
)
{ i f   ( i > j )  
LI  =  L l+ 1; 
i f   ( i < j )  
L2  в   L2  +1;
I
L=  a b s ( L l  -  L 2 ); 
p r i n t f ("   L  =  %i  " ,L > ; 
g e t c h ( ) ;
}
157

1-мы с an. Бүтін сандардан тұратын а
36
 матрицасы жолдарының алгашқы 
элементін осы жолдын минималды элементімен алмастыру  керек.  Нәтижелік 
а
36
 матрицасы элементтерін экранга шыгару кажет.
6.2 Екінші типтегі есептер ал горит мдері
/*  а[3][б]  матрицасы жолдарының алғашқы элементін осы жолдың 
минималды элементімен алмастыру керек.  Нәтижелік X матрицасы 
элементтерін  экранға шығару қажет.*/
«include 
«include 
«include  
void line()
{  printf(
at
\n “);
return;  } 
main()
{static  int a[31[6]={  {5,-11,4,-2,5,6},
{2,3,-3,14,-9,-3}, 
{-9,3,-6,-14,9,-3}
};
int i,j,jmin,min; 
clrscr();
printf("Берілген матрица:\n");line(); 
for(i=0;  i<3;  i++)
{for(j=0;  j<6;  j ++)
printf(" %3i  ",  a[i][j]); 
printf("\n");
}
line(); 
for(i=0;  i<3;  i++)
{min=+lE6; 
for(j=0;  j<6;  j ++)
if  (a[i][j]{min=a[ij[j];
}
З т ш = з ;
a[i][jmin]=a[i][0];  a[i][0]=min;
}
printf("Өңделген матрица:\n");  line(); 
for(i=0;  i<3;  i++)
{for(j=0;  j<6;  j ++)
printf(" %3i  ",  a[i][j]); 
printf("\n");
} line();
158

2-мысал.  Бүпн  сандардан  тұратын  а
34
  матрицасының  әрбір  бағанапарының
арифметикапық орташа  мэнін  анықтап,  оларды  бір  өлшемді 
84
  жиымы  ретінде 
бейнелеу керек,
/*  а[3][4]  матрицасының әрбір бағаналарының арифметикалық
орташа мәнін анықтап,оларды бір өлшемді s[4] жиымы ретінде 
бейнелеу керек.  */
//әрбір бағана қосындысы және олардың орташа мәні 
«include <сопіо.һ>
«include  
main()
{
static int a[3][4]={ 
{5,11,4,2},
{3,3,12,5},
{2,3,3,14}
};
int i,j; 
float s[4]; 
clrscr();
printf("Bepi_nreH матрица  :\n");
printf ("---- ---------------- \n");
for(i=0;  i<3;  i++)
{for(j=0;  j<4;  j ++)
printf(- %3i  ",  a[i][j]);
printf("\n");}
/* матрицаны өңцеу 
*/
printf ("............ ........ \n");
printf("");
for(j=0;  j<4;  j++)
{  s[j]=0; 
for(i=0;  i<3j  i ++)  s[j]+=a[i][j] 
printf(" %4.2f",s[j]/3);
>
printf("\n--------------------
getch();
}
Программаны орындау нәтижесі:
getchQ;
Б е р іл г е н   матрица  :
5
1 1
4
2
3
3
1 2
5
2
3
3
14
3 .3 3   5 .6 7   6 .3 3   7 .0 0
159

I
Бұл программада s[j]  жиымының эрбір элементін есегггеуде қабатгаскан скі 
цикл қолданылган, онда j  индексі — сыртқы  цикл параметрі, ал і индексі — ішкі 
цикл  параметрі. Осы тәсіл матрица элемеиттеріи бағаналар бойынша өңдеу ісін
жүзеге асырады.
3-мысал.  Берілген  жиымнын  әрбір  жолындағы  элементтері  косындыларын  жэне 
сол қосындылардың орташа мәнін анықтау керек.
//әржол қосындысы және олардың арифметикалық ортасы 
i i n c l u d e   < c o n i o . h >
# i n c l u d e   < s t d i o . h >  
m a i n {)
{  s t a t i c   i n t   a [ 3 ] [ 4 ] = {
{ 5 , 3 , 4 , 2 } ,
{ 3 , 3 , 4 , 5 } ,
{2,3,3,4}
};
i n t   i , j , s =
0

f l o a t   c =
0

c l r s c r ( ) ;
f o r ( i = 0 ;   i < 3 ;   i + + )
{f o r ( j =
0
;  j < 4 ;  j   ++)  s + = a [ i ] [ j ] ;
p r i n t f ( " % і - ж о л   к о с ы н д ы с ы : % i \ n " , i +
1
, s ) ;
C+=S; 

 . •
 '
 
!•;, 
- V - \


1
 
• 
p r i n t f  { " ------------------------------------- " ) ;
p r i n t f ( " Х п а р и ф м . о р т а с ы   %
5
/
2
f ” ,  c /
4
)  ;

- ; 
 
v
4-мысал.  Берілген  жиымнын  әрбір  бағанадагы  элементтері  косындыларын  жэне 
сол косындылардын орташа мәнін аныктау керек.
// әрбір бағана қосындылары мен олардын орташа мәнін анықтау 
#include 
#include 
main()
Щ
I
static  int a[3][4]={
{5,11,4,2},
{3,3,12,5},
{2,3,3,14}
};
int  i,j,s;  float c;
clrscr()j  printf("Берілген матрица  :\n");
printf (".................... -\n”);
for(i=0;  i<3;  i++)
{f°r(j=0;  j<4;  j++)
160

p r i n t f ( -   ХЗі  \   a [ i ] [ j ] ) ;  
p rin tf(- \n - );)
Г*
  Матрицами  өңдеу  • /
p r i n t f  С ............................................... \ n - ) ;
p r i n t f ( " s - " ) ;  
f o r ( j = 0 ;  
j<4;  j-*-*)
{  s-e >
fo r(i« e ;  i<3; 
i  
h
)  s « « a [l][j]; 
p r i n t f
(
"%3i 
-,s );  //  қосыңды  s 
c+=s;
}
p r i n t f  ( " \ n ------- — — — . . . . ----------
p r i n t f
("\n 
арифм, 
ортасы 
* 5 . 2 f , c / 4 ) ;
g e t c h ( j ;
)
5-
mmcoi
  Бсрілгсн  а м  жнымынын  бас  дтгон& пінаігы  'мемскттеряі  m x rt,  u  
қосалкы днагомалындагы  икмекгпфді бірге тсиссп ру іф ограю пш .
« in c lu d e   < * td io .h >
« in c lu d e  

• i n c l u d e   < co n io .h>
■ain()
in t  a£4][4}*{
{« ,S,9 ,2 ),
{5 ,3 ,4 ,2 b
{3 ,3 ,4 ,5 ),
{2 ,3 ,3 ,4 )
) i
in t  l , j ;
c l r s c r ( ) ;
p r i n t f (" Б е р іл г аи  матрица  : \ n * ) ;
fo r(i*# ;  i<4;  І н )
{ f o r ( j * 0 ;   J< 4 ;  j   ♦♦)
p rirrtfC   121  *,  a ( l ] ( j ) ) ;  
p rlfrtf("\ n * )i)
f*
  Нітрицамы  ендеу  • /  
f o r ( l * # ;  
1<4;  !♦+}
i<4;  і и )
f o r ( j * f t ;   )< 4 ;  J  ♦+)
i f   ( u j - 3 )   « { i H J M i
/ •   бңделгам  матрица  і м м и т т і р і й   іммару  • /  
p r i n t f ( “Мативалік  матрица  : \ n “ ) ;
IB

ТОГ(і=0;  i<4;  І++)
{f°r(j=0J  j<4j  j ++) 
printf(" %2i  ",  a[i][j]); 
printf("\n")j} 
getch();
}
Программами орындау нэтижесі:
Берілғен матрица  :
I
б 


2



2 



5



4 
Нәтижелік матрица  : 
I



1


1
2

1
0
 
5
1
3
 

0
6-мысап.
 Берілген 
жиымының б
а
с
 диагонапынан төмен о
р
н
а
л
а
с
к
а
н
 э
л
е
м
е
н
т
т
е
р
 
косындысын аныктау программасы.
«include 
«include 
main()
{  static  int a[3][3]={  {0,1,2},
{3,4,5},
{6,7,8}
>;
int  i,j,r,s; 
clrscr();
printf("Енгізілген a[3][3]  жиым элементтері:\п");
for(i=0;  i<3;  i++)
{f°r(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
162

printf("\ns=%i",s);
getch();
>
7-мысап.
 Ь
е
р
іл
г
е
н
 
ajs
 жиымынын эрбір жолындагы э
л
е
м
е
н
т
т
е
р
ді өсуі бойынша 
р
е
т
т
е
п
 о
рналастыру программасы.
#include  
#include 
«include  
main()
{  static  int  a[3][3]={{8,7,6},
(5,4,3),
{2,1,Ө>
>;
int  i,j,r,s,n=3,amin,m,k; 
clrscr();
printf("Берілген матрица:\n“); 
for(i=0;  i<3;  i++)
{for(j=0;  j<3;  j++) 
printf('* %2i",a[i][j]); 
printf(н\пи);
>
for(i=0;  i
//жояды таңдау 

//мин тауып аямастыру
for(k=0;  k
{  amin=a[i][k]jm=k; 
for(j=k+l;  j
if  (a[i][j]  <  amin){amin=a[i][j];  rn = j;} 
a[i][m]=a[i][k];  a[i][k]=amin;
>
>
printf("\пНәтижел i к матрица:\n"); 
for(i=0;  i<3;  i++)
{for(j=0;  j<3;  j++) 
printf(" %2i”,a[i][j]); 
printf(”\n");
}
getch();
8-мысал.
  Б
е
р
іл
г
е
н
 
a3J
  жиымынын  эрбір  бағанасындағы  э
л
е
м
е
н
т
т
е
р
д
і  өсуі 
бойынша р
е
т
г
е
п
 о
рналастыру программасы.
#include 
#include 
163

#include  
main()
{
static int a[3][3]={  {8,7,6},
{5,4,3},
{2,1,0}
>J
int  i, j,r,s,n=3; 
int amin;
int m,k;  clrscrQ;
printf("Берілген матрица:\n");
for(i=0;  i<3;  i++)
{for(j=0;  j<3j  j++)
printf(" %2i",a[i][jJ); 
printf("\n”);
}
f°r(j=0j  j
//бағананы таңдау 
{for(k=0;  k
{  amin=a[k][j];m=k;
for(i=k+l;  i 
if  (a[i][j]  <  amin)
{amin=a[i][j]j  m = i;} 
a[m][j]=a[k][j];  a[k][j]=amin;
>
}
printf("\пСурыпталған матрица  элементтері:\п“); 
for(i=0;  i<3j  i++)
{for(j=0;  j<3;  j++) 
printf(" %2i",a[i][j]); 
printf("\n")j
}
getch();
}
Программаны  орындау нәтижесі:
Берілген матрица:
8  7  6 
5  4  3 
2
 
1 0
Сұрыпталған  матрица  э л е м е н т т е р і :

1 0  
5  4  3
8  7  6
164

9 мы can.
 Келесі түрдегі А(10, 10) матрицасын кұрастыру к
е
р
е
к
:
1 0  
0 .  
. 0  
2 
1
0
.
 
. 0


1 .  
. 0

 

0
10 




1
#include 
#include  
#define N 10 
void main ()
{
static int a[Nj[N];  //  статикалық жиым нөлдермен
// инициалданады 
int і,j; 
,
clrscr();
for(i=0;  i 
for(j=0;  j
if(i>=j)  a[i][j]=i-j+1;  // бас диагоналдан төмен
// болу шарты
// матрицаны шығару 
for(i=0;  i
{
for(j=0;  j
putchar('\n');


I
  , 

 
-

.
.
  /  .
 
~
 
:; 

Erep матрицаларды толтыру әрекеті к
е
л
е
с
і түрде жазылса, циклдің қайталану 
санын а
з
а
й
т
у
г
а
 жэне IF о
п
е
р
а
т
о
р
ында т
е
к
с
е
р
у
д
е
н
 құтылуға болады:
for  (і=0;  iі++) 
for  (j=
0
;  j<=i;  j++)
a [ i ] [j]~i-j+l;
Матрицаларды  көбейту
Екі өлшемді жиымдарды көбейту е
с
е
п
т
е
р
ін
 карастырайық. Келесі мысалда үш 
сатушы төрт түрлі т
а
у
а
р
 сатады. Сатылатын т
а
у
а
р
л
а
р
 саны 1-кестеде көрсетілген.
1 к
е
с
т
е
 - Сатушылар мен т
а
у
а
р
л
а
р
Сатушы
Т
а
у
а
р
№ 

жүктеу 1.78 Mb.

Поделитесь с Вашими друзьями:
1   ...   8   9   10   11   12   13   14   15   16




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

    Басты бет