[Çözüldü] İç içe birden fazla döngüyü en içtekinden nasıl kırarım?

Başlatan edge35, 07 Mayıs 2017 - 23:18:37

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

edge35

İç içe olan döngülerde break yaptığımız zaman sadece içinde bulunduğu döngüyü kırıyor. Ama ben belli bir durum için en dışa çıkmasını istiyorum. Var mıdır bunun bir yolu? Örnek olarak:
while (/* condition */) {
    switch (/* expression */) {
        case /* value */:
                /*code*/
                break;
        case /* value */:
                /*code*/
                /*İşte burada while döngüsünden de çıkmak istiyorum.*/
        case /* value */:
                /*code*/
                break;
    }
}


Not: goto ile çok rahat bir şekilde istediğim şey gerçekleşebilir, fakan goto kullanımı yasak :)


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

FireSwords

Goto kullanımı döngüden çıkmak için kullanılabilir aslında. Evet, goto nefret edilir, ben de nefret ediyorum çünkü gerçekten spagetti kod oluşmasına sebep oluyor. Ama ben hiç döngü dışına çıkmak için goto kullanımına karşı çıkıldığını görmedim, döngüler istisna bir durum.

edge35

[mention=624971]@FireSwords[/mention] yukarıda bahsettiğim şeyi daha önce de düşünmüş fakat goto cebimde olduğu için pek önemsememiştim. Bu sefer ödev de işi uzatmamak için ihtiyacım oldu fakat bizim ödevlerde goto kullanmamız yasak. O yüzden goto yerine başka bir yol var mı diye bakıyorum. İnternete yazınca bir şey çıkmadı. Fakat eğer bilinen bir kısa yolu alan yoksa aklımda şöyle bir şey de var.


while (/* condition */) {
    switch (/* expression */) {
        case /* value */:
                kontrolDegiskeni = 1;
                break;
    }
if (kontrolDegiskeni == 1) break;
}

Sanırsam bu da gayet mantıklı :)


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

mhmtkrktr

Şu şekilde dene.
FuncReturnUse() {
while (/* condition */) {
    switch (/* expression */) {
        case /* value */:
                /*code*/
                break;
        case /* value */:
                /*code*/
                return 1   /*İşte burada while döngüsünden de çıkmak istiyorum.*/
        case /* value */:
                /*code*/
                break;
    }
}
}
FuncReturnUse

edge35

[mention=624974]@mhmtkrktr[/mention] hocam demek istediğinizi tam anlayamadım. Bir de bu kullanımı da pek yi bilmiyorum sanırsam. Kullnımı açıklayıp şu kodda uygulayabilir misiniz zahmaet olmazsa.
#include <stdio.h>
int main() {
    int islem, durum;
    printf("Başla\n");
    scanf("%d\n",&islem );
    while (islem!=1) {
        printf("while içi\n");
        scanf("%d\n",&durum );
        switch (durum) {
            case 1:
                printf("Durum 1\n");
                break;
            case 2:
                printf("Durum 2\n");
                break;   /*İşte burada while döngüsünden de çıkmak istiyorum.*/
            case 3:
                printf("Durum 3\n");
                break;
        }
    }
    printf("Dışarısı\n");
    return 0;
}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 08 Mayıs 2017 - 00:27:38

[mention=624974]@mhmtkrktr[/mention] Acaba demek istediğiniz döngüyü main dışında bir fonksiyon olarak tanımlayıp main içinde de fonksiyonu çağırmak mı?


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

mhmtkrktr

Karalama şeklinde görünce dikkat etmedim, bash betiği sandım. :-)

Python konusunda ancak yazılanı yorumlamaya yetecek kadar bilgim var. O da yeterli oranda değil. Fakat mantık aynı olacaktır diye düşünüyorum.
Yukarı da verdiğim örnek şu, normalde bir döngünün içinden aynı uygulama içinde bulunan farklı bir komutun işleyişini durduramazsın. (benim bildiğim kadarıyla). Sadece, exit komutu verir tüm süreci durdurabilirsin. Bu da doğal olarak uygulamanın sonlanması demek olur.   

Burada istenilen zaten bu değil. Bize özel olarak durdurabileceğimiz ayrı bir alan gerekiyor. Bu durumda ihtiyacımız olan şey, uygulama içinde durdurmak istediğimiz alanı ayırmak. Bunu da programlama dillerinde fonksiyon tanımlaması yaparak sağlayabiliyoruz. Fonksiyon tanımlamanın tek işlevi bu değil tabii.

İstediğimiz komut kümesini ayırdık diyelim. Peki gerekli veriyi aldığımız zaman fonksiyonu nasıl sonlandırabiliriz. Bunu da return komutu yerine getirecek.
Return 'ün python için daha farklı kullanım şekilleri olabilir. (return true/false/none vb) Bu konuda yetkin olanlar gerekli yönlendirmeyi yapacaktır. (hatta konunun tamamı için ayrı bir yöntem olabilir.)

İşin özeti mantık şu ; Komutun altını üstünü durdurmaya çalışmak yerine, ayrı bir blok halinde tutup, bulunduğu alanı sonlandırmak.


Alıntı Yap@mhmtkrktr Acaba demek istediğiniz döngüyü main dışında bir fonksiyon olarak tanımlayıp main içinde de fonksiyonu çağırmak mı?
Şimdi farkettim. Aynen bu. Çıkmak istediğin yerde de fonksiyonu sonlandıracaksın.

edge35

Anlatmak istediğinizi anladım, istediğim şeyi de yapabilir gibi. Düzen konusunda da güzel dursa da pratiklik fonksiyonları karıştırmak pek isteyeceğim bir şey değil, çok yetkin olmadığım için. Farklı bir yöntem işte. Açıklama için teşekkür ederim. Bu arada dil C idi :)


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

mhmtkrktr


edge35

Çözüldü etiketi de koyayım, çözüm için 3 farklı yol konuşuldu sonuçta, gayet yeterli :)


Sorunlarımı çözerken her şeyiyle öğrenmeye çalışıyorum. Bana balık verenden Allah razı olsun, ama bana balık tutmayı öğretenden Allah daha çok razı olsun :)

Amenofis

goto nun yasak olması saçma. break, continue ve return de birer goto'dur. Tabi en iyi yol mümkünse döngüyü başka bir fonksiyon içinde alıp return ile çıkmak.