Çö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.
Katılım
21 Ocak 2014
Mesajlar
1.564
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.
 
Uyarı! Bu konu 4 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı