Çö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;
}
For döngüsü i < 5 şartı sağlanmayana kadar çalışıyor. Kendisi bir sefer bitince i'nin değerini bir artırıyor.
Ama while döngüsü gidiyor i = 0 olana kadar çalışıyor. Bu da for döngüsünün son satırında her zaman i = 0 durumu olduğu anlamına gelir. For döngüsü diğer turuna başlarken i'yi artırıp 1 yapıyor, sonra tekrar while'a girip 0 oluyor.
 
while yerine if kullanırsanız döngü doğru çalışacaktır.

Çünkü while döngüsüne i 0'dan büyükse çalış diyorsunuz. For içinde tanımladığınız i 0'dan büyük olduğu an while döngüsü hiç durmadan çalışıyor ve for tamamlanamıyor.
 
Son düzenleme:
For döngüsü i < 5 şartı sağlanmayana kadar çalışıyor. Kendisi bir sefer bitince i'nin değerini bir artırıyor.
Ama while döngüsü gidiyor i = 0 olana kadar çalışıyor. Bu da for döngüsünün son satırında her zaman i = 0 durumu olduğu anlamına gelir. For döngüsü diğer turuna başlarken i'yi artırıp 1 yapıyor, sonra tekrar while'a girip 0 oluyor.
Bunu düşündüm ve for döngüsünden hemen sonraki satıra if (i==5) break; dedim ama yine olmadı.
 
Bunu düşündüm ve for döngüsünden hemen sonraki satıra if (i==5) break; dedim ama yine olmadı.
Yanlış düşünmüşsünüz veya dediğimi anlamamışsınız. i sadece sıfır ve bir değerlerini alıyor. Siz gelmiş 5 diyorsunuz. Bu, zıplayarak aya ulaştığınızda sizi dünyanın kralı yapacağım dememle aynı şey. Hiç gerçekleşmeyecek bir koşula vaatte bulunmak.
 
Döngü içindeki işlemleri i ile değilde başka bir variable ile yapın. Yani while ve while içindeki i'leri temp ile değiştirin, en sonda print ederken temp yerine i print edin.
 
Yanlış düşünmüşsünüz veya dediğimi anlamamışsınız. i sadece sıfır ve bir değerlerini alıyor. Siz gelmiş 5 diyorsunuz. Bu, zıplayarak aya ulaştığınızda sizi dünyanın kralı yapacağım dememle aynı şey. Hiç gerçekleşmeyecek bir koşula vaatte bulunmak.
Şimdi ben nasıl düşündüğümü söyleyim:
for döngüsü 5'e kadar i değerini 1'er 1'er artıracak, i=1 ile döngüye giriyorum while döngüsüne de giriyorum ve while döngüsü için de i=0 oluyor. Dolayısıyla while döngüsünden çıkıp diğer satıra geçer. Koşulu sağlıyorsa içine girer sağlamıyorsa i değerini artırır. Eğer burada yanlış bir düşüncem varsa söyleyin. Kodlama da çok yeniyim.

Ve işin özüne inersek bu problemi nasıl çözebileceğimi anlatırsanız ona da çok sevinirim.
Programın amacı ne?
Amacım C dilinde 1-99 arası sayılardan haneleri toplamı tek olan sayıları bulup ekrana yazdırmak.
 

Geri
Yukarı