C++ array ödevi

merlyn
31-03-2011, 21:37   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
3 mesaj
Kayıt Tarihi:Kayıt: Kas 2008

Given an array of integers, find the length and location of the longest contiguous sequence of equal values. The array length will be defined as 15 and the array elements will be taken from the user.

Example:

1, 2, 2, 1, 5, 1, 1, 7, 7, 7, 7, 1, 1, 3, 6
Output:
number=7
length=4
starting_position=8

bu kodu nasıl yazacağım konusunda yardımcı olurmusunuz?

muh34
01-04-2011, 11:15   |  #2  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

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

alp_tug
02-04-2011, 02:18   |  #3  
Taze Üye
Teşekkür Sayısı: 0
5 mesaj
Kayıt Tarihi:Kayıt: Nis 2011

1)Array'i tanımla
2) scanf'le sayıları array'a al.
3) bir tane i=1 ve number,length,start_position integer'ı tanımla
4) Array'in ilk elemanını ikinciyle karşılaştır. Aynıysa i'yi bir artır. i=1 oldu. Farklıysa bir şey yapma.
5) Aynıysa böyle artsın. Farklı sayı gelince i'nin değerini length'e ver. i'yi 1 yap. Mesela burada ilk eleman 1; i başlangıçta 1. İkinci elemanla birinci array elemanı karşılaştırınca bunlar farklı olduğu için i sabit kaldı ve length'e aktarıldı. i de yeni değer alması için 1'e dönüştü.
6) İkiyle üçü karşılaştırdın: 2 2 aynı dolayısıyla i++
Üçle dördü karşılaştır: 2 1 farklı i 2 olmuştu i'nin değeri length'e aktarıldı. Önceki length değeri daha büyük olsaydı length'in büyük değerini yutmuş olacaktık bu sebeple i'yi length'e atamadan length'le karşılaştır. i büyükse length'e ata küçükse atama böyle devam edecek işte.
7) Tabi bu sayıyı ve yerini de alman gerekiyor. Bunu da 3)'ten hemen sonra 4)'e başlamadan number ve start_position'a alırsın.
8) Hatırlarsan i length'ten büyükse temp değişiyordu. Burada da aynı mantık: i length'ten büyükse length'in yanında number ve start_position da değişmeli. Küçükse bir şey yapma yani number ve start_position'ı değiştirme.
9) Bu değerleri döngünün sonuna gelince yazdır.

Umarım yardımcı olur. Başarılar.

merlyn
04-04-2011, 08:58   |  #4  
OP Taze Üye
Teşekkür Sayısı: 0
3 mesaj
Kayıt Tarihi:Kayıt: Kas 2008

teşekkürler