Çözüldü Döngü neden sonsuz kez çalışıyor?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

KralYolu

Kilopat
Katılım
21 Ocak 2014
Mesajlar
1.541
Makaleler
19
Çözümler
5
Yer
Karabük
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar amacım C dilinde 1-99 arası sayılardan haneleri toplamı tek olan sayıları bulup ekrana yazdırmak. Denemek için skalayı daraltıp kod içinde 99 yerine 5 yazdım. Lakin şöyle bir sorun var benim kafamdaki mantıkta gayet güzel çalıştığını düşündüğüm bu kod sonsuz döngüye giriyor. Ne yapacağımı bulamadım. Sizce bunu nasıl düzeltirim?

Beklediğim çıktı (99 yerine 5 düşünün): "Haneleri toplami tek: 1 Haneleri toplami tek: 3"

Edit: Neden sonsuz döngüye giriyor?

Öğrendiklerimi benim gibi yeni yeni bu işlere başlayan arkadaşlar için aktarmak istiyorum. Aşağıda @Vavien. 'in yaptığı çözüme bakabilirsiniz. Peki çözümde olup benim kodlarda olmayan ne?

Şimdi ben i adlı değişken ile for döngüsü oluşturuyorum ve aşağıda while döngüsüne'de i ile giriyorum. While döngüsü içinde i=0 oluyor ve diğer koşula geçiyor. Lakin for döngüsü i'yi artırırken son değeri üzerinden gidiyor. Yani son i=0 olduğundan 1 artırıp i=1 yapıyor. Bu durumda aslında en başa dönmüş oluyoruz. Çünkü for döngüm zaten i=1'den başlamıştı. Bu böyle sonsuz kere tekrar ediyor. Bunu önlemek için i değişkenimi başka bir değişkene atıyoruz ve while döngüsüne o değişken ile giriyoruz. -ki i değerimiz değişmesin. Ve düzenli şekilde artabilsin.

1639249609201.png

int main() { int n, m, toplam, temp; for(int i=1; i<5; i++){ temp = i; while(i>0){ m = i%10; toplam += m; i = i/10; } if (toplam %2!=0){ printf("Haneleri toplami tek: %d", temp); } } }
 
Son düzenleme:
Çözüm
Kod:
#include <stdio.h>

int main() {
    int cur = 0;
    int sum = 0;
    
    for (int i = 1; i < 100; ++i) {
        cur = i;
        
        while (cur > 0) {
            sum += cur % 10;
            cur /= 10;
        }
        
        if (sum % 2) {
            printf("Tek: %d\n", i);
        }
        
        sum = 0;
    }

    return 0;
}
Kod:
#include <stdio.h>

int main() {
    int cur = 0;
    int sum = 0;
   
    for (int i = 1; i < 100; ++i) {
        cur = i;
       
        while (cur > 0) {
            sum += cur % 10;
            cur /= 10;
        }
       
        if (sum % 2) {
            printf("Tek: %d\n", i);
        }
       
        sum = 0;
    }

    return 0;
}
Çok teşekkür ederim, kodu biraz düzenleyip i yerine temp kullanmıştım ama son aşamada sum=0; olayını yapmadığım için patlıyormuş.
 
Şimdi bu yaptığınız ne işe yarıyor tam olarak.
Salak gibi "i" değerini while döngüsüne sokuyorum ve while değerinin içinde i=0 oluyor. Ve for döngüsü i'yi tekrar 1 yapıyor. Sonra tekrar. Sonra tekrar. Bu böyle devam ediyor. Yani i değeri 1'de stuck oluyor.

Eğer sum=0; (benim kodumda bu sum değişkeninin adı result) olayını soruyorsan. While döngüsü içinde yaptığım hesabı sıfırlamazsam. Önceki result değerinin üzerine biniyor. Garip garip şeyler oluyor. O yüzden onu 0 yaparak döngüye girmemiz lazım.

Aslında ilk etapta temp=i; yaparak ben çözümü bulmuşum ama bazen ne kadar bakarsan bak o çözüm aklına gelmiyor. Technopat, Stackoverflow gibi platformlarda bu durumlarda hayat kurtarıyor.
 
Salak gibi "i" değerini while döngüsüne sokuyorum ve while değerinin içinde i=0 oluyor. Ve for döngüsü i'yi tekrar 1 yapıyor. Sonra tekrar. Sonra tekrar. Bu böyle devam ediyor. Yani i değeri 1'de stuck oluyor.

Eğer sum=0; (benim kodumda bu sum değişkeninin adı result) olayını soruyorsan. While döngüsü içinde yaptığım hesabı sıfırlamazsam. Önceki result değerinin üzerine biniyor. Garip garip şeyler oluyor. O yüzden onu 0 yaparak döngüye girmemiz lazım.

Aslında ilk etapta temp=i; yaparak ben çözümü bulmuşum ama bazen ne kadar bakarsan bak o çözüm aklına gelmiyor. Technopat, Stackoverflow gibi platformlarda bu durumlarda hayat kurtarıyor.
Salak gibi değil bu gayet normal. Herkes hata yapar. Önemli olan hatanın farkına varmak. Şunu da belirteyim. Günlük yaşantımızda hatamızı tekrarlarsak bu genelde hatalarımızdan ders çıkarmadığımız anlamına gelir ancak yazılımda bazı durumlarda böyle olmaz. Çünkü bir sistem kurarken bazı detayları atlamamız muhtemel. Çok fazla detay düşünürken bazıları arada kaynayabiliyor.
 

Yeni konular

Geri
Yukarı