Döngü konusunda yardım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Döngü konusunda yardım

Mesaj gönderen naturelmania »

Arkadaşlar bir döngü belirlemeye çalışıyorum fakat bir türlü tam istediğimi yapacak bir döngü belirleyemedim. Bir yandan sizler de yardımcı olabilirseniz çok sevinirim
Döngü şöyle olacak:
Elimde A[1..10000] tane integer değeri var. Ben bunların istediğim kadarının sırayla aritmetik ortalamasını aldırmak istiyorum
Örneğin, x:=2 ise ilk 2 değeri alıp toplamı 2 ye bölcek ve Aort[1]'e aktarcak ve sonra sıradaki 2 değeri toplayıp 2 ye bölüp Aort[2] ye aktarcak.
Ancak x:=5 ise ilk 5 değeri alıp toplamı 5 e bölcek ve Aort[1]'e aktarcak ve sonra sıradaki 5 değeri toplayıp 5 e bölcek ve Aort[2] ye aktarcak, elimizdeki verilerin sonuna kadar bunu yapacak. For do deyimiyle bir türlü yapamadım. Şöyle bişey düşündüm onu da tamamlayamadım, halen düşünüyorum

Kod: Tümünü seç

var
A:Array[1..10000] of integer;
Aort:Array[1.1000] of double;
x, b:integer;
begin
      for b:= 0 to sayıa - 1 do
        begin
         Aort[b]:= ((A[x]+A[x+1])/2);
        end
end;
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Selam.

Aklıma gelen ilk çözüm şu:

Kod: Tümünü seç

var
  A: Array [1..10000] of Integer;
  AOrt: Array of Integer;
  AraToplam: Integer;
  i: Integer;
  GaripSayi: Integer;
  OrtalamaSayisi: Integer;
begin
  OrtalamaSayisi := ((10000 - 1) div GaripSayi) + 1;
  //Bu kadar ortalama çıkacak

  SetLength(AOrt, OrtalamaSayisi);
  //Ortalamaların tutulacağı dizinin boyutu belirleniyor

  i := 1;
  AraToplam := 0;

  while i < 10000 do
  begin
    inc(AraToplam, A[i]);
    // AraToplam := AraToplam + A[i]; ile aynı

    if (i mod GaripSayi) = 0 then
    begin
      AOrt[((i - 1) div GaripSayi) + 1] := (AraToplam / GaripSayi);
      AraToplam := 0;
    end;//end

    inc(i);// i := i+1; ile aynı
  end;//while
end;
Kolay Gelsin...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

@ulucoder
garipsayı için birde input yapsan tam süper olacak :wink:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

aslangeri yazdı:@ulucoder
garipsayı için birde input yapsan tam süper olacak :wink:
Hocam hep böyleyim, misal prosedür yazar, tetiklemeyi unutur, sonra da "yahu neden çalışmıyor bu!!!" diyip kendimi yerim. :)

Neyse arkadaş düzeltir artık :P
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

selam ulucoder kardeşim yapmış olduğun yardımdan ötürü çok teşekkür ederim ancak ufak bir sorun oluştu o da şudur vermiş olduğun kodu tam olarak anlayamadım :( mesela 'div' ibaresi neyi temsil ediyor?
Sanırım bilgi eksikliğinden bi türlü döngüyü belirleyemiyorum...
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

div bölme işlemininin tam kısmını verir.
örneğin,
11 div 2 = 5 dir gibi...

En iyisi satır satır açıklayayım :wink:

Kod: Tümünü seç

OrtalamaSayisi := ((10000 - 1) div GaripSayi) + 1;
//Sonuçta kaç tane ortalama bulacağız?
//Sanırım şu kod daha anlaşılır olacak:
Ortlama sayisi := (10000 div GaripSayi); 
//Örneğin sayımız 6 olsun,
//10000'in içinde kaç tane 6 varsa, o kadar ortalama buluruz
//Fakat bu kodu kullandığınızda, yine 6 sayısını düşünürsek, 10000 6'ya tam olarak bölünmez. Altışar altışar ortalama aldığınızda, kalan sayılar ne olacak?

//Kaç tane ortalama bulacağımız belli olmadığı için, ortalamaların tutulacağı diziyi dinamik tanımladık.
SetLength(AOrt, OrtalamaSayisi);
// diyerek de dizinin uzunluğunu belirledik.

AraToplam := 0;
//Ortalama almak için sayıların toplamını AraToplam değişkeninde tutacağız.

//While kullanmak gereksizmiş, for kullanalım.

for i := 1 to 10000 do
begin
  AraToplam := AraToplam + A[i];
  //AraToplam'a dizinin sıradaki elemanını ekle

  if (i mod GaripSayi) = 0 then
  // mod matematikte bildiğimiz mod. Yani bölümden kalanı veriyor.
  //Eğer i, kaçar ortalama alacağımıza eşitse...
  //Örneğin 5'erli ortalama alacaksak, 5, 10, 15 ise...
  begin
    AOrt[(i div GaripSayi)] := (AraToplam / GaripSayi);
    //(i div GaripSayi) kaçıncı ortalama olduğunu veriyor.
    //(5 div 5 = 1), (10 div 5 = 2) vs. vs.
    //Bir önceki kodda ne kadar saçmaladığımı şimdi farkettim :s

    AraToplam := 0;
    //Yeni ortalama için toplamı sıfıra eşitliyoruz...
  end;//if
end;//for
Umarım daha açıklayıcı olmuştur...
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

:oops: walla dostum sağoll ya ellerinden öpüyoruz arkadaşlarla, çok daha iyi oldu, Allah razı olsun. bizi uzun düşüncelerden büyük dertlerden kurtardın :oops:
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

naturelmania yazdı::oops: walla dostum sağoll ya ellerinden öpüyoruz arkadaşlarla, çok daha iyi oldu, Allah razı olsun. bizi uzun düşüncelerden büyük dertlerden kurtardın :oops:
Hocam estağfirullah :oops:

Kolay gelsin...
Cevapla