Soruda tamsayı dizisi icerisinde Ard Arda sıralanan en yuksek frekanslı deger sorulmaktadır.Ayrıca bu degerin indeks numarası ve kac kez tekrar ettiğide programcıdan istenmektedir.
Burada kritik soru ARD ARD'A gelmesi gereken frekans degerinin hesaplanmasıdır.Bu problem icin iç içe iki dongu(nested two loops) kullanabilir.Ilk dongu,dizideki mevcut sayı adedi kadar donerken,içteki dongu ise her elemanın pes pese gelen komsu elemanlarına bakmasını saglayacaktır.Ornegin
1 2 1 3 3 3 sayıları icin program su analizi yapacaktır.
Ilk olarak ele alınan sayı 1 iken sırasıyla bir sonraki degerleri taramaya baslayacaktır.Burada dikkat edilirse,dizide iki adet 1 elemanı var iken,tarama sırasında bastaki 1 sayısının frekansı,programa gore 1 olacaktır.Cunku bu sayının kendisinden bir sonra gelen yeni deger 2'dir.Dolayısıyla bu esitsizliği goruldugu anda tarama bırakılarak bir sonraki eleman taramasına gecilecektir.
Dolayısıyla beklenen frekans degeri 3 olacaktır.(3 adet 3)
Frekans degeri bilindiği anda diger degisken degerlerini hesaplamak kolaylasacaktır.Daha once frekans degerleri hesaplanan dizi icerisindeki en buyuk deger bulunarak,bu degerler icerisindeki baslangıc posizyon ve tekrarlanan adet kolaylıkla hesaplanacaktır.
Yukarıdaki algoritmanın C dilindeki karsılıgı asagıdaki gibi olacaktır.
#include <stdio.h>
void in(int array[],int num[])
{
int i;
for(i=0;i<15;i++)
{
printf("Enter the %d. element",i+1);
scanf("%d",&array);
num=1;
}
}
void calculateFrequency(int array[],int num[],int *startingPosition,int *number,int *length)
{
int i=0,j=0;
for(i=0;i<15;i++)
{
j=i+1;
while(array==array[j++])
num++;
}
*length=num[0];
for(i=0;i<15;i++)
if(*length < num)
{
*startingPosition=i+1;
*number=array;
*length=num;
}
}
int main()
{
int array[15]={0};
int num[15]={0};
int startingPosition,number,length;
in(array,num);
calculateFrequency(array,num,&startingPosition,&number,&length);
printf("Number:%d\n",number);
printf("Starting Position:%d\n",startingPosition);
printf("Length:%d",length);
getchar();
getchar();
return 0;
}
Başarılar