Жиымдар мен нұсқауыштарды сипаттауға қатысты жалпы мәліметтер №4 зертханалық жұмыста көрсетілген. Си тілінде тек бір өлшемді жиымдар анықталған, алайда жиым элементі ретінде жиымның өзі болса, онда көп өлшемді жиымдарды да анықтауға болады, олардың қарапайым түрі ретінде
#define n 10
void main()
{ int a[n][n],i,j,k,*pa,s1;
pa=&a[0][0];
for(i=0;i{for(j=0;j{*pa=rand()%9;
printf("%d ",*pa);
pa++;
} printf("\n"); }
getch();
}
А тапсырмасы.
Блок-сұлбасын және жиымды өңдейтін программаны құрыңыз. Жиым элементтерін кездейсоқ сандар генераторының көмегімен толтыру керек.
тапсырмасының мысалы. Бүтін санды 8 жолдан, 8 бағаннан тұратын жиым берілген. Табыңыз: 1) жиымның k-ншы жолы k-ншы бағанмен сәйкес келетін k-ны; 2) теріс элементі бар жолдардағы элементтердің қосындысын.
2.5 суретте есептің шешімінің блок-сұлбасы келтірілген.
басы
a[n][m] жиымын
генерациялау
-
i=1;n;1
|
1
|
|
P=1
|
|
|
j=1;m;1
|
p=
|
3
|
|
|
|
Жолдың
|
a[i][j]=
|
5
|
нөмірін
|
33
-
P=0
|
3
|
|
|
|
i=1;n;1
|
соңы
|
|
3
|
|
|
P1=0, s=0
|
|
|
j=1;m;1
|
P1= 1
|
1
|
|
s=s+ a[i][j]
|
i –нші жолдың
|
|
|
|
|
қосындысын шығару
|
|
a[i][j]<0 1
1
P1=1
2.5 сурет – Есептің шешімінің блок-сұлбасы
Программа келесі түрде болады:
-
#include
|
|
|
#include
|
|
|
#define m 8
|
|
|
#define n 8
|
|
|
int main()
|
1
|
|
{ int
|
matrix[n][m];
|
/* nхm өлшемді жиымды хабарлау */
|
int
|
i, j, p; /* сәйкес келу санауышы және белгісі */
|
int
|
p1, iSumm;
|
/*
|
теріс элементін табу белгісі және қосындыны
|
сақтайтын айнымалы */
/* жиымды кездейсоқ сандар генераторының көмегімен толтырамыз */
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
matrix[i][j]=rand()%10-1;
printf("\n Генерацияланған жиымның түрі:\n ");
/* жиымды шығару */
for (i = 0; i < m; i++)
{ for (j = 0; j < n; j++) printf(“%d “, matrix[i][j]);
printf("\n ");
}
printf("\n \t Тапсырманың бірінші бөлімінің нәтижесі");
34
for (i = 0; i < m; i++)
{ p=1;
for (j = 0; j < n; j++)
{ /* i-нші жолдың j-нші бағанындағы элементті j-нші жолдың i-нші бағанымен салыстырамыз. Олар сәйкес келмесе p-ға нөл мәнін меншіктеп, j бойынша циклды break операторымен үземіз */
if (matrix [i][j] != matrix [j][i])
{ p=0;
break;
}
}
/* егер p=1 болса, онда экранға сәйкес жолдың нөмірін шығарамыз */ if (p==1) printf("\n k = %d ", i);
}
if (p==0) printf("\n бірдей жол мен баған жоқ "); printf("\n \t\t\ Тапсырманың екінші бөлімінің нәтижесі ");
printf("\n\n");
for (i = 0; i < m; i++)
{
/* айнымалыларға бастапқы мәндерді меншіктейміз */
iSumm = 0;
p1=0;
for (j = 0; j < n; j++)
{ /* i-нші жолдың элементтерінің қосындысын табамыз */
iSumm += matrix [i][j];
/* егер де бір ғана теріс элементі табылса, қосындыны экранға шығаруды белгілейтін, p1=1 меншіктейміз */
if (matrix [i][j] < 0) p1=1;
}
/* егерде жолда бір ғана теріс элемент болса, онда экранға i-нші жолдың элементтерінің қосындысын шығарамыз */
if (p1==1) printf("жолдағы элементтердің қосындысы #%d = %d\n", i+1, iSumm);
}
system("PAUSE");/* экранды тоқтату */
return 0;
}
Программаның орындалу нәтижесі:
Генерацияланған жиымның түрі мынадай:
27271403
10760-835
27181493
35
92852006
71139391
82491-649
03909488
18328280
Тапсырманың бірінші бөлімінің нәтижесі Сәйкес келген жолдар мен бағандар
k = 2
k = 6
Тапсырманың екінші бөлімінің нәтижесі жолдағы элементтердің қосындысы #1 = 14 жолдағы элементтердің қосындысы #5 = 31
А тапсырмасының нұсқасы.
Бүтінсанды квадрат матрица берілген. Анықтау керек: а) нөлдік элементі жоқ жолдар санын;
б) берілген матрицада бірнеше рет кездесетін ең үлкен мәнін.
Бүтінсанды квадрат матрица берілген.
а) нөлдік элементі жоқ бағандар санын анықтау;
б) бүтінсанды матрицаның жолдарындағы оң тақ элементтерінің қосындысын табыңыз. Берілген матрицаның жолдарын алмастыра отырып, оны өсу реті бойынша орналастырыңыз.
Бүтінсанды квадрат матрица берілген. Анықтау керек: а) бір ғана нөлдік элементі бар бағандар санын;
б) ең ұзын бірдей элементтер сериясы орналасқан жолдарды.
Бүтінсанды квадрат матрица берілген. Анықтау керек:
а) теріс элементтері жоқ жолдардағы элементтердің көбейтіндісін;
б) матрицаның бас диагоналына параллель орналасқан диагоналдағы элементтердің қосындысының ең үлкенін.
Бүтінсанды квадрат матрица берілген. Анықтау керек:
а) теріс элементтері жоқ бағандардағы элементтердің көбейтіндісін;
б) матрицаның бүйір диагоналына параллель орналасқан диагоналдағы элементтердің қосындысының ең кішісін.
Бүтінсанды квадрат матрица берілген. Анықтау керек:
а) теріс элементі бар жолдардағы элементтердің қосындысын;
б) матрицаның барлық ершік нүктесі орналасқан жолдар мен бағандардың нөмірін.
Ескерту - А матрицасының Аij ершік нүктесі дегеніміз i-нші жолдағы ең кіші элементі және j-нші бағандағы ең үлкен элементін айтады.
8-де 8 өлшемнен тұратын матрицаның:
а) k-ншы жолымен k-ншы бағаны сәйкес келетін k-ны табу;
36
б) бір ғана теріс элементі бар жолдардағы элементтердің қосындысын
табу.
Бүтін санды матрицаның бағандарының мінездемесі деп оның теріс жұп элементтерінің модулінің қосындысын атайды:
а) берілген матрицаның бағандарын ауыстырып, оны өсу реті бойынша орналастыр;
б) ең болмағанда бір ғана теріс элементі бар бағандардағы элементтердің қосындысын тап.
Матрицадағы Аij элементінің көршілері деп мына элементтерді
айтамыз Аi-1,j-1. Аi-1,j, Аi-1,j+1, Аi,j-1, Аi,j+1, Аi+1,j-1. Аi+1,j, Аi+1,j+1. Жиымды тегістеу
операциясы берілген жиымның көрші элементтерінің орташа арифметикалық мәнімен толтырылған сол өлшемдегі жаңа жиымды береді.
а) өлшемі 10-да 10 болатын нақты сандардан тұратын жиымды тегістеу нәтижесін құрыңыз;
б) тегістелген жиымда бас диагоналдың төмен жағында орналасқан элементтерінің модулінің қосындысын табыңыз.
Жиымның элементі локальды минимум деп аталады, егер ол жанындағы көрші элементтерінен кіші болса.
а) өлшемі 10-да 10 болатын жиымның локалды минимум санын есептеңіз;
б) бас диагоналдың жоғарғы жағында орналасқан элементтерінің модулінің қосындысын табыңыз.
Сызықты теңдеулер жүйесінің коэффициенттері тік төртбұрышты жиым түрінде берілген.
а) түрлендірудің көмегімен жүйені үшбұрышты түрге келтіріңіз;
б) элементтерінің орташа арифметикалық мәні берілген мәннен кіші болатын жолдарының санын табыңыз.
n ретті нақты квадрат жиым берілген.
а) нөлдермен толтырылған баған мен жолды алып тастау арқылы жиымды ығыстыру;
б) оң элементі бар алғашқы жолдың нөмірін табыңыз.
n ретті нақты квадрат жиым берілген.
а) тік төртбұрышты жиымның элементтерін п элементке оңға немесе төмен циклдік жылжыту жасаңыз (енгізілген режимге байланысты). п жолдағы немесе бағандағы элементтер санынан үлкен болуы мүмкін;
б) нөлдік емес элементі бар соңғы жолдың нөмірін табыңыз.
n ретті нақты квадрат жиым берілген.
а) М×N өлшемді тіктөртбұрышты жиым элементтерін k элементке оңға циклдік жылжытуды былай орындаңыз: 1-ші жолдың элементтерін соңғы бағанға жоғарыдан төмен, одан соңғы жолға оңнан солға, одан – бірінші бағанға төменнен жоғары, одан – бірінші жолға, қалған элементтері үшін де – дәл солай жылжыту қажет;
б) тақ жолдардағы оң элементтердің қосындысын тап.
Тіктөртбұрышты бүтін сандардан тұратын жиым берілген.
37
а) бір ғана нөлдік элементі бар алғашқы бағанның нөмірін анықтау;
б) бүтінсанды жиымның жолдарындағы элементтері оның жұп теріс элементтерінің қосындысы болсын. Берілген жиымның жолдарының орнын оның кему ретімен орналастыру қажет.
Тіктөртбұрышты бүтін сандардан тұратын жиым берілген.
а) тіктөртбұрышты бүтін сандардан тұратын жиымның жолдарындағы элементтерді өсу ретімен орналастыру;
б) бірде бір теріс элементі жоқ алғашқы бағанды табыңыз.
Нақты сандардан тұратын квадрат жиым берілген.
а) элементтерінің орнын ауыстыру арқылы оның ең үлкен элементі сол жақ жоғарғы бұрышта орналасқан болсын, келесі үлкен мәні (2,2) позициясында, келесісі - (3,3) позициясында және т.с.с., осылайша бас диагональ элементтерін толтырыңыз;
б) бірде бір оң элементі жоқ алғашқы жолдың нөмірін табыңыз.
Тіктөртбұрышты бүтін сандардан тұратын жиым берілген. Анықтаңыз:
а) тек бір ғана нөлдік элементі бар жолдың санын; б) бірдей элементтері бар бағанның нөмірін.
Бүтін санды квадрат жиым берілген. Анықтаңыз:
а) теріс элементтері жоқ жолдарының элементтерінің қосындысын;
б) бас диагоналға паралель орналасқан диагоналдың элементтерінің қосындысын.
Тіктөртбұрышты бүтін сандардан тұратын жиым берілген. Анықтаңыз:
а) тек бір ғана нөлдік элементі бар жолдардағы теріс элементтер санын; б) жиымның барлық ершік нүктесі бар жолдар мен бағанның нөмірін. Ескерту - А жиымында Aij ершік нүктесі болады, егер Aij i-ші жолдағы
ең кіші элемент болса және j-нші бағандағы ең үлкен мәні болса.
Б тапсырмасы.
Жиымды өңдеу программасын құрыңыз. Жиым элементтеріне қол жеткізуді нұсқауыштың көмегімен жүзеге асырыңыз. Жиым элементтерін кездейсоқ сандар генераторын пайдаланып толтырыңыз.
Мысалы. 8-де 8 өлшемнен тұратын бүтінсанды квадрат матрица берілген. Табыңыз:
а) матрицаның k-ншы жолымен k-ншы бағаны сәйкес келетін k-ны табу; б) бір ғана теріс элементі бар жолдардың элементтерінің қосындысын.
Есепті шешудің мысалы:
#include
#include
#define m 8
#define n 8
38
void main()
{ int matrix[n][m]; /* nхm матрицасын хабарлау */
int i, j, p; /* Санауыш және сәйкес келу белгісі */
int *mat; /* matrix[n][m] жиымына нұсқауышты хабарлаймыз */ mat=&matrix[0][0]; /* mat нұсқауышына matrix[n][m] жиымының нөлдік
элементінің адресін меншіктейміз */
/* жиымды кездейсоқ сандар генераторымен толтырамыз */
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
{*mat=rand()%10-1;
mat++;
}
mat-= n*m; /* mat нұсқауышына алғашқы адресті меншіктейміз*/
printf("\n Генерацияланған жиым: \n ");
/* жиымды шығару */
for (i = 0; i < m; i++)
{ for (j = 0; j < n; j++)
{printf(“%d “,*mat); mat++;
}
printf("\n ");
}
mat-= n*m;
printf("\n \t\t\t Тапсырманың бірінші бөлігінің нәтижесі"); printf("\n Сәйкес келген жол мен баған"); for (i = 0; i < m; i++)
{ p=1;
for (j = 0; j < n; j++)
{ /* j-нші бағанның i-нші жолын j-нші жолдың i-нші бағанымен салыстырамыз. Егер олар сәйкес келмесе р-ға нуль мәнін меншіктеп, циклды j бойынша break операторымен үземіз */
if (*(mat+i * m + j) != *(mat+j * m + i)) { p=0;
break;
}
}
/* егер p=1 болса, онда экранға сәйкес жолдың нөмірін шығарамыз */ if (p==1) printf("\n k = %d ", i);
}
if (p==0) printf("\n бірдей жол мен баған жоқ "); printf("\n \t\t\ Тапсырманың екінші бөлігінің нәтижесі "); mat=&matrix[0][0];
int p1, iSumm; /* теріс элементті табу белгісі және қосындыны сақтайтын айнымалы */
39
printf("\n\n");
for (i = 0; i < m; i++)
{
/* Айнымалыларға бастапқы мәндерін меншіктейміз */
iSumm = 0;
p1=0;
for (j = 0; j < n; j++)
{ /* i-нші жолдың элементтерін қосамыз */
iSumm += *mat;
/* ең болмағанда бір теріс элементті табу үшін, Қосындыны экранға шығару қажеттілігін білдіретін p1=1 меншіктейміз */
if (*mat < 0) p1=1; mat++;
}
/* жолда тым болмағанда бір теріс элементті тапса, онда экранға i-нші жолдың элементтерінің қосындысын шығарамыз */
if (p1==1) printf("Жолдағы элементтердің қосындысы #%d = %d\n", i+1, iSumm);
}
system("PAUSE");/* экранды тоқтату */
return 0;
}
Программаның орындалу нәтижесі.
Есептің шешімі А тапсырмасындағыдай нәтижеге тең.
тапсырмасының нұсқалары зертханалық жұмыстың А тапсырмасының нұсқаларына сәйкес келеді.
0>
Достарыңызбен бөлісу: