Programı çalıştırınca sonsuza kadar devam etmesi

Aykan5498

Hectopat
Katılım
6 Ocak 2019
Mesajlar
188
Merhabalar, birkaç aydır C öğrenmeye çalışıyorum. Öğrenmek için C programming: A modern approach kitabını kullanıyorum. Kitabın Basic types kısmını bitirdim ve kısımın sonundaki program alıştırmalarında bir alıştırmada takıldım. Alıştırmada harfleri telefon numaralarına döndürülmesini istiyor. Lakin ben programa 1-800-COL-lect yazıp çalıştırınca 800-800-800.. Diye gidiyor. Sorun nedir? Sayıları ve harfleri tek girince bir sıkıntı çıkartmıyor else kısımında. İkisini de aynı anda girince bu sorunu alıyorum.

C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])
{
int i, phoneDigit;
char c;

printf("If you want to just alphabetic phone number press 1 unless press 2: ");
scanf("%d", &i);

if (i == 1)
{
printf("Enter alphabetic phone number : ");
c = getchar();
for (;;)
{
switch (c)
{
case 'A': case 'B': case 'C': printf("2"); break;
case 'D': case 'E': case 'F': printf("3"); break;
case 'G': case 'H': case 'I': printf("4"); break;
case 'J': case 'K': case 'L': printf("5"); break;
case 'M': case 'N': case 'O': printf("6"); break;
case 'P': case 'R': case 'S': printf("7"); break;
case 'T': case 'U': case 'V': printf("8"); break;
case 'W': case 'Y': case 'X': printf("9"); break;
}
c = getchar();
}
}
else.
{
printf("Enter a phone number : ");
scanf("%d", &phoneDigit);

for (;;)
{
if (phoneDigit == 0)
{
c = getchar();
c = toupper(c);
i = c;
switch (i)
{
case 'A': case 'B': case 'C': printf("2"); break;
case 'D': case 'E': case 'F': printf("3"); break;
case 'G': case 'H': case 'I': printf("4"); break;
case 'J': case 'K': case 'L': printf("5"); break;
case 'M': case 'N': case 'O': printf("6"); break;
case 'P': case 'R': case 'S': printf("7"); break;
case 'T': case 'U': case 'V': printf("8"); break;
case 'W': case 'Y': case 'X': printf("9"); break;
default: printf("0"); break;
}
scanf("%d", &phoneDigit);
}
else.
{
printf("%d", phoneDigit);
}
scanf("%d", &phoneDigit);
}
}
return 0;
}

 
getchar tek bir karakter okuyor

C:
if (i == 1)
{
    printf("Enter alphabetic phone number : ");
    c= getchar();
for(;;)
{
switch (c)
        {
        case 'A': case 'B': case 'C': printf("2"); break;
        case 'D': case 'E': case 'F': printf("3"); break;
        case 'G': case 'H': case 'I': printf("4"); break;
        case 'J': case 'K': case 'L': printf("5"); break;
        case 'M': case 'N': case 'O': printf("6"); break;
        case 'P': case 'R': case 'S': printf("7"); break;
        case 'T': case 'U': case 'V': printf("8"); break;
        case 'W': case 'Y': case 'X': printf("9"); break;
        }
    c = getchar();
    }
}

Kodunun if kısmına bakacak olursak, seni sonsuz döngünden çıkaracak hiçbir şey yok. Girdiğin alfabetik karaktere uygun case'deki sayıyı yazdırıp bloktan çıkıyorsun, fakat daha sonra tekrar getchar() ile tekrar karakter alıp tekrar switche sokuyorsun. If kısmında döngüden çıkamıyorsun yani.

Şu an bir C derleyicim yok, diğer laptopa geçince bir bakayım koduna. Detaylı bakamadım.
 
Son düzenleme:
Kodu biraz değiştirdim bir sorun da karakteri int tipine çevirip switchte karakterlere karşılık gelen tam sayı değerini yazmamışım onu da değiştirdim. Dediğin gibi eğer new line karakter ise return yapmasını da yazdım ama tekrardan aynı sorunu aldım. Karakterleri tamsayıya çevirip yazdırmadı.
C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])
{
    int i, phoneDigit;
    char c;
   
    printf("If you want to just alphabetic phone number press 1 unless press 2: ");
    scanf("%d", &i);
   
    if (i == 1)
    {
        printf("Enter alphabetic phone number : ");
        c = getchar();
        for (;;)
        {
            switch (c)
            {                  
                    case 'A': case 'B': case 'C': printf("2"); break;
                    case 'D': case 'E': case 'F': printf("3"); break;
                    case 'G': case 'H': case 'I': printf("4"); break;
                    case 'J': case 'K': case 'L': printf("5"); break;
                    case 'M': case 'N': case 'O': printf("6"); break;
                    case 'P': case 'R': case 'S': printf("7"); break;
                    case 'T': case 'U': case 'V': printf("8"); break;
                    case 'W': case 'Y': case 'X': printf("9"); break;
            }
            c = getchar();
        }
    }
    else
    {
        printf("Enter a phone number : ");
        scanf("%d", &phoneDigit);
       
        for (;;)
        {
            if (phoneDigit == 0)
            {
                c = getchar();
                if (c == '\n')
                    return;
                c = toupper(c);
                i = c;
                switch (i)
                {
                case 65: case 66: case 67: printf("2"); break;
                case 68: case 69: case 70: printf("3"); break;
                case 71: case 72: case 73: printf("4"); break;
                case 74: case 75: case 76: printf("5"); break;
                case 77: case 78: case 79: printf("6"); break;
                case 80: case 81: case 82: printf("7"); break;
                case 83: case 84: case 85: printf("8"); break;
                case 86: case 87: case 88: printf("9"); break;
                default: printf("0"); break;
                }
            }
            else
            {
                printf("%d", phoneDigit);
            }
            scanf("%d", &phoneDigit);
        }
    }
   
    return 0;
}
İşte yeni kod. Sorun bu arada else kısmında oluşuyor. İf kısmında bir sorun yaşamadım.
 
Kodu biraz değiştirdim bir sorun da karakteri int tipine çevirip switchte karakterlere karşılık gelen tam sayı değerini yazmamışım onu da değiştirdim. Dediğin gibi eğer new line karakter ise return yapmasını da yazdım ama tekrardan aynı sorunu aldım. Karakterleri tamsayıya çevirip yazdırmadı.
C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])
{
    int i, phoneDigit;
    char c;
  
    printf("If you want to just alphabetic phone number press 1 unless press 2: ");
    scanf("%d", &i);
  
    if (i == 1)
    {
        printf("Enter alphabetic phone number : ");
        c = getchar();
        for (;;)
        {
            switch (c)
            {                 
                    case 'A': case 'B': case 'C': printf("2"); break;
                    case 'D': case 'E': case 'F': printf("3"); break;
                    case 'G': case 'H': case 'I': printf("4"); break;
                    case 'J': case 'K': case 'L': printf("5"); break;
                    case 'M': case 'N': case 'O': printf("6"); break;
                    case 'P': case 'R': case 'S': printf("7"); break;
                    case 'T': case 'U': case 'V': printf("8"); break;
                    case 'W': case 'Y': case 'X': printf("9"); break;
            }
            c = getchar();
        }
    }
    else
    {
        printf("Enter a phone number : ");
        scanf("%d", &phoneDigit);
      
        for (;;)
        {
            if (phoneDigit == 0)
            {
                c = getchar();
                if (c == '\n')
                    return;
                c = toupper(c);
                i = c;
                switch (i)
                {
                case 65: case 66: case 67: printf("2"); break;
                case 68: case 69: case 70: printf("3"); break;
                case 71: case 72: case 73: printf("4"); break;
                case 74: case 75: case 76: printf("5"); break;
                case 77: case 78: case 79: printf("6"); break;
                case 80: case 81: case 82: printf("7"); break;
                case 83: case 84: case 85: printf("8"); break;
                case 86: case 87: case 88: printf("9"); break;
                default: printf("0"); break;
                }
            }
            else
            {
                printf("%d", phoneDigit);
            }
            scanf("%d", &phoneDigit);
        }
    }
  
    return 0;
}
İşte yeni kod. Sorun bu arada else kısmında oluşuyor. İf kısmında bir sorun yaşamadım.
Inputta 1 diye başlamışsın diye öyle anladım. Şu an bilgisayarımda değilim, geçince mesajı düzenlerim. Yardımcı olacağım.
 
C:
for (;;)

        {

            if (phoneDigit == 0)

            {

                c = getchar();

                if (c == '\n')

                    return;

                c = toupper(c);

                i = c;

                switch (i)

                {

                case 65: case 66: case 67: printf("2"); break;

                case 68: case 69: case 70: printf("3"); break;

                case 71: case 72: case 73: printf("4"); break;

                case 74: case 75: case 76: printf("5"); break;

                case 77: case 78: case 79: printf("6"); break;

                case 80: case 81: case 82: printf("7"); break;

                case 83: case 84: case 85: printf("8"); break;

                case 86: case 87: case 88: printf("9"); break;

                default: printf("0"); break;

                }

            }

            else

            {

                printf("%d", phoneDigit);

            }

            scanf("%d", &phoneDigit);

        }

Döngünün ikinci kısmı için konuşalım. if (phoneDigit == 0) bu bloğa girdik. Kullanıcıya hiçbir şey söylemeden bir char bekliyoruz ondan. Hadi diyelim anladı ve 'A' girdi. i = c; bu doğru bir kullanım mı? İstediğini yaptığından emin misin?

Inputunda else kısmı çalışmadığını belirtmişsin else'e girmen için ilk inputta 2 demen gerek sen
1-800-COL-lect kullanmışsın. Kodunun istediğin gibi çalışmadığını görüyorum. Ne yapmak istediğini tam söyleyebilirsen, detaylı bir şekilde sıfırdan yazalım.


Telefon numarası elde etmeye çalışıyorsun, telefon numaralarının boyutu belirlidir sonsuz döngüye hiç gerek yok. Bu sayıları kullanıcı girdikçe bir diziye aktarabilirsin, tutman daha kolaylaşır her seferinde ekrana yazdırmak biraz garip. Hem kullanıcı ne yapması gerektiğini bilemez hem de validasyonlar eksik gibi duruyor.
 
Son düzenleme:
Bu soruyu yapmak istiyorum. Aslında bunu 11 tane değişken tanımlayıp scanf("%d-%d%d%d-%c....") diye götürebilirim ama kolaya kaçmak istemiyorum(ikinci örnek için). Yazılan telefon numarasınındaki harf nerde olursa olsun onu tamsayıya çevirmesini ardından eğer harf varsa tamsayıya, tamsayı varsa tamsayı olarak devam etmesini istiyorum.
Maalesef henüz diziler kısmına gelmedim. Programlamanın daha çok başındayım.
 

Dosya Ekleri

  • Adsız.png
    Adsız.png
    227,8 KB · Görüntüleme: 28
Bu soruyu yapmak istiyorum. Aslında bunu 11 tane değişken tanımlayıp scanf("%d-%d%d%d-%c....") diye götürebilirim ama kolaya kaçmak istemiyorum(ikinci örnek için). Yazılan telefon numarasınındaki harf nerde olursa olsun onu tamsayıya çevirmesini ardından eğer harf varsa tamsayıya, tamsayı varsa tamsayı olarak devam etmesini istiyorum.
Maalesef henüz diziler kısmına gelmedim. Programlamanın daha çok başındayım.

Sorudaki alfabetik harfleri sayılara dönüştürmeyi switch-case yapısıyla kullanman doğru onda bir sorun yok. Sonrasında telefon numarasını kaydettiğin, döndürdüğün bir yer yok. Bunu bir stringe (String yapısı olmadığından char* dan bahsediyorum) eklemeyi de düşünebilirsin. Aldığın karakterleri bir diziye atman daha sağlıklı olur. En son döngüden çıkınca, kullanıcıdan aldığın bütün karakterler tamamlanınca ekrana yazdırman gerekir.

Kullanıcıdan aldığın karakter alfabetik ise sayıya çeviriyor, eğer bir sayıysa zaten sayı olarak yazılıyor. Kullanıcıdan aldığın karakteri de kontrol edip ona göre bir işlem uygulayabilirsin.

Biraz da uğraşman için cevabı/cevapları yazmak istemiyorum. Bir algoritmanın birden fazla çözümü vardır/olabilir. Sen gerekli yerleri düzeltip tekrar buraya yazabilirsin, takip ediyor olacağım. Yarın gün içinde müsait olamayabilirim iş dolayısıyla, boş bir zamanımda kontrol edeyim :) .

Soruyu birinci/ikinci örnek diye ayırdıklarını sanmıyorum, tek seferde istediklerini yapabileceğin yollar mevcut.

İyi geceler.
 
Sorunu çözdüm. Harf ve sayıyı beraber girince hep aynı sayıyı yazdırdığını fark ettim. Sayıdan sonra bir harf girince harfi okumuyordu. Sonsuz döngünün sonunda phoneDigit değişkenini 0 a atadım. Artık doğru bir şekilde çalışıyor. Çok teşekkür ederim geri dönüşleriniz için.
İyi geceler.
Merhaba bu arada size bir şey sormak istiyorum. C için bildiğiniz dili ingilizce olan güzel bir kitap tavsiye edebilir misiniz?
 
Son düzenleme:

Geri
Yukarı