Thread overview
Bir Döngüyle İki Diziyi Kontrol Etmek
Oct 10
İbrahim
Oct 10
İbrahim
6 days ago
Ali Çehreli
6 days ago
Ali Çehreli
6 days ago
İbrahim
October 10

Merhaba.

Şöyle bir kod var diyelim:

Dizi a[10] = ...;
Dizi2 b[10] = ...;

void foo()
{
  for (int i = 0; i < len(a); i++)
  {
    a[i].x = b[i];
    a[i].y = b[i + 1]; // Bu taşacağı için hata verecek.
  }
}

Burada a da b de 10 elemanlı diziler. Her bir döngü aşamasında a[i].x'e b[i]'yi, a[i].y'ye ise b[i + 1]'i atamak istiyorum. Fazlaca değişken kullanmadan tek dögüyle bunu yapmanın yolu var mı? Veya siz nasıl bir yöntem kullanırdınız?

Teşekkürler.

October 10
On 10/10/21 1:07 PM, İbrahim wrote:
> Merhaba.
>
> Şöyle bir kod var diyelim:
>
> ```c++
> Dizi a[10] = ...;
> Dizi2 b[10] = ...;
>
> void foo()
> {
>    for (int i = 0; i < len(a); i++)
>    {
>      a[i].x = b[i];
>      a[i].y = b[i + 1]; // Bu taşacağı için hata verecek.

Peki sondaki a[i]'nin y'si ne olacak? 42 varsayacağım. :)

>    }
> }
> ```
>
> Burada a da b de 10 elemanlı diziler. Her bir döngü aşamasında a[i].x'e
> b[i]'yi, a[i].y'ye ise b[i + 1]'i atamak istiyorum. Fazlaca değişken
> kullanmadan tek dögüyle bunu yapmanın yolu var mı? Veya siz nasıl bir
> yöntem kullanırdınız?
>
> Teşekkürler.

Ben olsam son elemanı döngüden sonra hallederdim:

  foreach(i; 0 .. a.length - 1) {
    a[i].x = b[i];
    a[i].y = b[i+1];
  }

  a[$-1].x = b[$-1];
  a[$-1].y = 42;

Bütün kod şöyle:

import std.stdio;
import std.range;

struct Dizi {
  int x;
  int y;
}

alias Dizi2 = int;

void main() {
  Dizi[10] a;
  Dizi2[10] b = 10.iota.array;

  writeln("b: ", b);

  foreach(i; 0 .. a.length - 1) {
    a[i].x = b[i];
    a[i].y = b[i+1];
  }

  a[$-1].x = b[$-1];
  a[$-1].y = 42;

  writeln("a: ", a);
}

Çıktısı şöyle oluyor:

b: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a: [Dizi(0, 1), Dizi(1, 2), Dizi(2, 3), Dizi(3, 4), Dizi(4, 5), Dizi(5, 6), Dizi(6, 7), Dizi(7, 8), Dizi(8, 9), Dizi(9, 42)]

Ali


October 10
Cevap için teşekkürler.

Yalnız benim kod daha farklı:

```c++
Dizi a; // Bu da 10 elemanlı olacak.
Dizi2 b[10];

int miktar = 10;

for (int i = 0; i < miktar; i++)
{
  if (b.size() < miktar) // Eğer a dizisinin elemanları 10'dan küçükse, ilk önce 10 elemana kadar veri yerleştir.
  {
    b[i] = create();
  }
  a[i].x = b[i];
  a[i].y = b[i + 1];
}
```

Eğer dediğiniz şekilde yaparsam fazlaca şu kodları tekrar yazmış oluyorum:
```c++
for (int i = 0; i < miktar; i++)
{
  ...
}
b[i] = create();
a[i].x = b[i];
a[i].y = b[i + 1];
```

Bu tekrarı da önlemek mümkün mü? Çünkü asıl kodum bu değil ve asıl kod GDScript üzerinden ve create() ile kısalttığım kod aslında çok daha fazla. Yani döngü dışında tekrar yazdığım kod tek satırdan çok daha fazla.
6 days ago
On 10/10/21 2:12 PM, İbrahim wrote:
> Cevap için teşekkürler.
>
> Yalnız benim kod daha farklı:
>
> ```c++
> Dizi a; // Bu da 10 elemanlı olacak.

Peki neden değil? :)

> Dizi2 b[10];
>
> int miktar = 10;
>
> for (int i = 0; i < miktar; i++)
> {
>    if (b.size() < miktar) // Eğer a dizisinin elemanları 10'dan küçükse,
> ilk önce 10 elemana kadar veri yerleştir.
>    {
>      b[i] = create();
>    }

Ama onu döngüden önce yapmak istiyorsun tabii ki.

Ek olarak, herhalde a dizisini doldurmak istedin, değil mi? Yoksa b zaten 10 elemanlı. (?)

>    a[i].x = b[i];
>    a[i].y = b[i + 1];
> }
> ```
>
> Eğer dediğiniz şekilde yaparsam fazlaca şu kodları tekrar yazmış oluyorum:
> ```c++
> for (int i = 0; i < miktar; i++)
> {
>    ...
> }
> b[i] = create();
> a[i].x = b[i];
> a[i].y = b[i + 1];
> ```

Ama yine olmadı, değil mi? b[i+1] yine patlar. (?)

> Bu tekrarı da önlemek mümkün mü?

Ben olsam iki tane işlev yazarım: Birisi normal elemanlar için kullanılır; diğeri sondaki eleman için.

> Çünkü asıl kodum bu değil

Böyle anlaşmak zor oluyor. Yine de küçük ama tam kod üzerinden gösterir misin?

> ve asıl kod
> GDScript üzerinden ve create() ile kısalttığım kod aslında çok daha
> fazla.

Aklıma, o kodları bir işleve taşıyıp okunaklı hale getirmek geliyor.

> Yani döngü dışında tekrar yazdığım kod tek satırdan çok daha fazla.

İşleve taşıyınca değil ve anladığım kadarıyla zaten döngüdeki koddan biraz farklı olmak zorunda çünkü sondaki elemanın .y üyesine özel bir değer (önceki kodumdaki 42) vermek gerekiyor.

Ali


6 days ago
On 10/10/21 4:05 PM, Ali Çehreli wrote:

> Aklıma, o kodları bir işleve taşıyıp okunaklı hale getirmek geliyor.

Yani, aşağıdaki koddaki elemanYap() işlevi gibi:

import std.stdio;
import std.range;

struct Dizi {
  int x;
  int y;
}

alias Dizi2 = int;

void main() {
  Dizi[] a;
  Dizi2[10] b = 10.iota.array;

  writeln("b: ", b);

  if (a.length < b.length) {
    a.length = b.length;
    // O işlemin D'de 3 farklı etkisi olabilir:
    //
    //   a) Hiçbir şey
    //   b) Varsa a'nın fazla elemanları kaybolur
    //   c) a'ya .init değerinde yeni elemanlar eklenir
  }

  foreach(i; 0 .. b.length - 1) {
    a[i] = elemanYap(b[i], b[i+1]);
  }

  a[$-1] = elemanYap(b[$-1], 42);

  writeln("a: ", a);
}

auto elemanYap(int x, int y) {
  return Dizi(x, y);
}

Ali

6 days ago
Hocam cevaplarınız için çok teşekkür ederim. Sorunu yanlış yerde aramışım. Gece vakti uykulu olduğum için kafam karışmış. Cevaplarınızdan çok faydalandım. Tekrardan teşekkürler.