PDA

Tam Sürümünü Görmek İçin : Basit-Hangi for?


utdemir
02/06/2008, 19:43
Arkadaşlar, bu sorum belirli bir kod için değil ama çok karşıma çıktı:

Diyelim ki iç içe iki döngüm var:

for(....)
{
....
for(....)
{
......
if(......) break;
}
}İçteki for'daki break'ın sadece onu değil de dıştaki for'u da bitirmesini istiyorum... Bunun için de break'ın yanına a=1; gibi bir komut ekleyip, dıştaki for'a da if(a==1) break; gibi bir kod ekliyorum. Ama bu kodun karışık ve düzensiz görünmesine sebep oluyor. Bunun başka bir yöntemi var mıdır, yoksa tek yol bu mu?


mustafa
02/06/2008, 20:19
yine temiz çözüm değil ama, dıştaki for'un iterasyon değişkeninin döngü bitiş şartını sağlamak işe yarayabilir.

for (i=1;i<b;i++) {
for (...) {
if (...) {i=b;break;}
}
// bu kısımdaki kodun bir kere daha çalışmasına engel olamıyor tabii bu çözüm.
}

acehreli
02/06/2008, 21:39
Aslinda bu sorun icin goto'yu kabul edenler bile oluyor. :)

mustafa, for dongusunun en guzel ozelliklerinden birisi dongu denetiminin tek bir satirda goruluyor olmasi oldugu icin, dongu degiskenini iceride degistirmek hos karsilanmaz. Onun yerine ek bir degisken tanimlayip ona bakmak da ayni isi gorur:


for (i = 0; !bulundu && i < b; ++i) {
for (...) {
if (...) {bulundu = true; break;}
}

Benim en sevdigim yontem ise ic ice dongu kullanmamak. :) Icerdeki donguyu baska bir fonksiyona tasiyinca cok guzel oluyor:

int islem_yap(int sayi)
{
int i = 0;
int buldum = 0;

for (i = 0; i != sayi; ++i) {
if (bir_sey) {
buldum = 1;
break;
}
}

return buldum;
}

void foo()
{
int i = 0;
int bulundu = 0;

for (i = 0; !bulundu && (i != 10); ++i) {
bulundu = islem_yap(i);
}
}

Ali

mustafa
27/08/2008, 03:02
bu arada doğru cevabı ben yeni öğrendim.

break 2;

acehreli
27/08/2008, 03:12
Belirli bir derleyicinin ek bir olanagi olmali. C'de veya C++'ta yasal degil.

Ali

mustafa
27/08/2008, 03:14
aa pardon başlığın c/c++ olduğu dikkatimden kaçmış. php için geçerli bu:)

Coldplay
27/08/2008, 10:23
Aslinda bu sorun icin goto'yu kabul edenler bile oluyor.
Hocam goto'nun döngülerde kullanilminin yasak oldugunu duymu$ veya okumu$tum, yaniliyor muyum?

acehreli
27/08/2008, 12:34
Kural olarak yasak degil ama tavsiye (guideline) olarak yasak. Buna ragmen, ic ice dOngUlerden cikarken goto'nun kullanilmasinin bazi durumlarda kolaylik sagladigini duydum.

Yoksa goto ozellikle C++'ta nesnelerin kurulmadan kullanilmalarina da neden olur:

if (bir_durum) goto bir_yer;

BirTur nesne(42, "abc");

bir_yer:

/* 'bir_durum' dogruysa, 'nesne' burada kurulmadan kullaniliyor olabilir; ama hic olmazsa g++ bu konuda uyariyor */
cout << nesne;


C'de ise goto'yu bir fonksiyonun en sonunda temizlik icin kullanilmasinin yararli oldugunu da biliyorum. Simdi calistigim yerdeki her C fonksiyonunun sonunda boyle bir temizlik bolgesi var:

int foo()
{
int hata = 0;

/* ... */

finally:

/* her seyi geri ver */
return hata;
}

Yani goto'nun yararli oldugu yerler de var, onerenler de var, zararlari da var; ama ozellikle C++'ta, kullanilmasinin gerekli oldugu hicbir durum yok. Baska sekillerde de cozebiliyoruz.

Ornegin ic ice dOngulerde boyle bir sorunla karsilasiyorsak, fazla ic ice dOngu var demektir. Ictekileri kendi fonksiyonlarina tasimak gerek.

Ali

Coldplay
27/08/2008, 12:53
Tamamdir, dedigin gibi yasak oldugu degil de tavsiye edilmedigini okumu$tum. Dolayisiyla bu tavsiyeye uyup o günden beri goto kullanmadigim icin de unutmu$um. Te$ekkürler!