C Dili Dersleri Matris' te Ada Bulma Örneği


C dili derslerinin bu dersinde fonksiyon kullanarak bir matriste birbiri ile bağlantılı olan elemanların sayısını (Ada) ve büyüklüğünü ve hiç bağlantılı olmayanların sayısını bulan bir program örneği paylaşacağım sizlerle.

Bu örnek programda adalara birlik, bağlantılı olmayan elemanları da sniper olarak adlandıralım.

Program kodlarına isterseniz aşağıdan bakabilir veya renkli ve sıralı bir şekilde görmek için buraya tıklayabilirsiniz.

Soru: Satır ve sutun sayısını kullanıcının girdiği bir matrise kullanıcının girdiği sayıda rastgele yerlere 1 sayısını atayın. Daha sonra 1 sayılarından etrafında hiç bir olmayanları tespit edip(sniper) koordinatlarını yazın. Etrafında 1 olanların, yani birbirleriyle temas halinde olanların(Birlikler) sayısını bulun. Son olarakta en büyük ve en küçük birlik sayısını bulun.

Çözüm: Kullanıcıdan satır, sutun ve asker sayısını aldım. Daha sonra while döngüsü içerisinde asker sayısı kadar rastgele yerlere 1 sayısı atadım. Oluşturduğum matrisi ekrana yazdırdım. Daha sonra matristeki her bir elemanın 1 e eşit olup olmadığını kontrol ettim. 1 e eşit olanlar oluşturduğum x fonksiyonu içerisinde önce daha önce kontrol ettiğimi belirtmek için kontrol matrisindeki aynı yerinin değerini 1 yaptım. Daha sonra etrafını (3x3 lük kısmı) başka bir varmı diye kontrol ettim for döngüsü ile.Eğer yoksa sniper olarak ekrana koordinatları ile beraber yazdırdım. Eğer varsa for döngüsü içerisinde x fonksiyonunu tekrar çağırdım ve her seferinde kontrol matrisinin aynı koordinatlardaki yerini 1 yaptım. Bulduğum 1 sayılarını troop adında bir diziye atadım. Daha sonra troop dizisinde değeri 1 olan elemanları çıkarıp realtroop adında bir matrise atadım ve bu matrisin en buyuk ve en kucuk elemanlarını ve toplam eleman sayısını bulup ekrana yazdırdım.


Ayrıca kaynak kodu yorum satıları ile açıklanmış bir şeklide ve çalışır halde ekran görüntülerini aşağıya sizin için ekledik.

C Dili Dersleri Matris' te Ada Bulma Örneği Kaynak Kod


#include
#include
#include

// Bu fonksiyon matriste 1 sayısı bulunduğunda o 1 in etrafında baska bir varmı diye bakar. Eğer başka bir bulursa bu sefer o 1 in etrafında
// başka 1 varmı diye bakar ve bulduğu 1 leri sayar.

void x(int matris[][100],int i,int j,int satir,int sutun,int kontrol[][100],int troop[],int t)
{
static int a,b;

for(a=i-1;a<=i+1;a++)
{
for(b=j-1;b<=j+1;b++)
{
if((a>=0) && (b>=0) && (a<=satir) && (b<=sutun) && (matris[a]==1) && (kontrol[a][b]==0)) // Burada matrisin bakılan elemanına daha önce bakılmış mı
{ // baktığımız satır ve sutun numaraları matrisin dışına
troop[t]++; // çıkıyormu diye kontrol edilir.
kontrol[a][b]=1;
x(matris,a,b,satir,sutun,kontrol,troop,t);
}
}
}

}

// Ana Fonksiyon

int main()
{

srand(time(NULL));
static int i,satir,sutun,j,t,asker,matris[100][100],a,b,kontrol[100][100],troop[100],max,min,p,realtroop[100],sniper;
printf("Satir sayisini giriniz :"); scanf("%d",&satir);
printf("Sutun sayisini giriniz :"); scanf("%d",&sutun); // Kullanıcıdan satır sutun ve asker sayılarını aldık.
printf("Asker sayisini giriniz :"); scanf("%d",&asker);
i=0;
while(i {
a=rand()%satir;
b=rand()%sutun;
if(matris[a][b]!=1) // girilen asker sayısı kadar 1 atadık.
{
matris[a][b]=1;
i++;
}
}

printf("\n\n Savas Alani\n\n\n");
for(i=0;i {
for(j=0;j {
printf("%d ",matris[j]); // matrisi ekrana yazdırdık.
}
printf("\n");
}
sniper=0;
for(i=0;i {
for(j=0;j {
if((matris[i][j]==1) && (kontrol[i][j]==0)) // matrisin 1 bulduğumuz elemanı için kontrol matrisinde aynı yerdeki elemanı 1 yaptık. Birlikteki
{ // asker sayısını bir arttırıp x fonksiyonunu çağırdık.
kontrol[i][j]=1;
troop[t]++;
x(matris,i,j,satir,sutun,kontrol,troop,t);
if(troop[t]==1)
{
printf("\n%d %d noktasinda sniper var.",i,j);
sniper++; // x fonksiyonu sonunda birlikteki asker sayısında artış yoksa sniper olarak ekrana yazdık.
} // ve sniper sayısını arttırdık.
t++;
}
}
}
max=0;
min=0;
p=0;
for(i=0;i<=t;i++) // Bu kısımda troop dizisinin 1 denn büyük elemanlarını yani sniperları değilde birlikleri realtroop dizisine aldık.
{
if(troop[i]>1)
{
realtroop[p]=troop[i];
p++;
}
}
for(i=1;i {
if(realtroop[min]>realtroop[i])
{
min=i;
}
if(realtroop[max] {
max=i;
}
}
printf("\nSniper sayisi :%d",sniper);
printf("\n%d adet birlik vardir.",p);
if(p>0)
{
if(p>1)
{
if(realtroop[min]!=realtroop[max])
{
printf("\nEn buyuk birligin asker sayisi %d.",realtroop[max]);
printf("\nEn kucuk birligin asker sayisi %d.",realtroop[min]);
}
else{
printf("\nBirliklerin asker sayilari birbirlerine esit ve %d.",realtroop[max]);
}
}
else{
printf("\nBirlik sayisi %d.",realtroop[0]);
}
}



return 0;
}

Ekran Görüntüleri :





Yukarıda ki kod da yorum satırlarından, sorunun anlatımı ve çözümün anlatımı kısmında soruyu ve çözümü anladığınızı umuyorum. Anlamadığınız takıldığınız yerleri lütfen yorum olarak yazmayı unutmayın.

Kaynak: [B][I]Pubtekno

Ayrıntılı olarak c dilini resimli ve videolu bir şekilde öğrenmek için buraya tıklayın