C programlama ad ve soyadı sırayla yazdırmak

Neden if kullandığınızı anlamadım ve neden kızgın attınız kod doğru çalışıyor.
1638658273319.png


Eğer if else kullanmak istiyorsanız daha iyi örnekler de var.
 
Arkadaşlar benim attığım kodu kopyala yapıştır yapıp Dev C++ ile çalıştırınca ilk scanf adı aldıktan sonra soyad için olan scanf çalışmıyor ve diğer 2 printf de çıktı veriyor. Görsel ile de göstereceğim ancak şu an evde değilim. En kısa zamanda cevaplayacağım. Herkese çok teşekkürler her mesajı uygulayıp yanıtlayacağım.

If else if kullanma sebebim de bundan ötürü. Yani printf'lerin aynı anda cıktı vermemesi için deneme yaptım ancak olmadı mantıksızlık olsu ilk koşulda.
 
Arkadaşlar benim attığım kodu kopyala yapıştır yapıp Dev C++ ile çalıştırınca ilk scanf adı aldıktan sonra soyad için olan scanf çalışmıyor ve diğer 2 printf de çıktı veriyor. Görsel ile de göstereceğim ancak şu an evde değilim. En kısa zamanda cevaplayacağım. Herkese çok teşekkürler her mesajı uygulayıp yanıtlayacağım.

If else if kullanma sebebim de bundan ötürü. Yani printf'lerin aynı anda cıktı vermemesi için deneme yaptım ancak olmadı mantıksızlık olsu ilk koşulda.
Ya canım kardeşim, kusura bakma lütfen technopatta 570. mesajımda ilk defa bu uslübü kullanıyorum; upp uzun bir şekilde makale gibi yazdım sana sebeplerini nedenleri ve sonucu nasıl düzelteceğini ve düzeltilmiş halini de, naiden kâileye almıyorsun, soyad için olan scanf çalışmıyor diyorsun çünkü ilk if true üretirse else iflere bakmaz, ilk if false üretirse else if'n en baştakine bakar o da false üretirse bi' altına ama bi' altında ki true üretirse onunda bi' altına bakmaz, daha kaç defa yazmam gerekiyor acaba?
 
Ya canım kardeşim, kusura bakma lütfen technopatta 570. mesajımda ilk defa bu uslübü kullanıyorum; upp uzun bir şekilde makale gibi yazdım sana sebeplerini nedenleri ve sonucu nasıl düzelteceğini ve düzeltilmiş halini de, naiden kâileye almıyorsun, soyad için olan scanf çalışmıyor diyorsun çünkü ilk if true üretirse else iflere bakmaz, ilk if false üretirse else if'n en baştakine bakar o da false üretirse bi' altına ama bi' altında ki true üretirse onunda bi' altına bakmaz, daha kaç defa yazmam gerekiyor acaba?
Dostum tüm mesajları okudum ama elimde PC yok şu an. Ne yazmışım üst mesajda ? Herkese cevap vereceğim PC'ye ulaştığımda. Okudum mesajları ama denemedim hiçbir şey. Çok açık yazdım halbuki sizin de anlamanız lazımdı kimseyi görmezden geldiğim yok.

Birçok kişi neden if else kullandığımı sormuş kısaca bunu açıkladım. Neyin eksik olduğunu bir kez daha belirttim bazı şeyler tam anlaşılmamışsa diye.
 
Birkaç tiyo vereyim, herhangi bir değişken veya dizi tanımladığında eğer bu dizi veya değişkene ilk değerlerini vermezsen rastgele değerler alırlar, bu da yazdığın kodun çalışma zamanında saçmalamasına neden olur (Ayrılan belleklerin heap veya stack farketmeksizin içinde veri saklanıyor olabileceğini aklından çıkarma, ek olarak "undefined behavior" kavramını araştır).

örnek:
C:
int x; (bad)
int x=0; (good)

C:
(bad)
char soyad[15];
scanf(" %s", soyad);

(good)
char soyad[15];
memset(soyad, 0, 15);
scanf(" %s", soyad);

Ayrıca "stack overflow" vs. gibi kavramları araştır, bu gibi durumlara nelerin sebep olduğunu iyice öğren, güvenli kodlama tekniklerini araştır. Fonksiyonların parantez içlerini boş bırakma, main() demek ben parametre almıyorum demek değil, bunun anlamı bir parametre de alabilirim birçok parametre de, main(void) şeklinde kullanabilirsin.

Eğer standart library'den bir fonksiyon kullanıyorsan, bunun manuel'ini oku, hangi parametreleri nasıl alıyormuş, hangi durumda ne döndürüyormuş?

Örneğin scanf() fonksiyonunun prototipi; int scanf ( const char * format, ... ); burada fonksiyon bir tamsayı döndürüyor, döndürdüğü sayıların ne olduğunu ve ne için kullanıldığını araştır. Fonksiyonun ilk parametresi format adında bir sabit karakter dize işaretçisi, bizden ne istediğini araştırmamız lazım. İkinci parametrede ise elipsis dediğimiz bir işaret var, bu ise fonksiyonun birçok parametre alabileceğini söyler (preprocessor, variadic macro kavramlarını araştır).

Gelelim senin sorununa, yukarıda da dediğim gibi format specifier'leri yanlış kullanıyorsun, eğer string yazdıracaksan veya alacaksan "%s" kullanırsın, eğer scanf fonksiyonunu arka arkaya kulanacaksan (spaces, newline and tab characters vs.) gibi önceki satırdan kalan artıkları esgeçmen lazım, aksi halde fonksiyon bunları da hesaba katıp saçmalayabilir, bunun için de format specifier'in başına bir boşluk ekliyoruz " %s", bu negated scanset formatı için de böyle.

Koşullu ifadeler vs için birşey söylememe gerek yok, arkadaşlar zaten yeterince izah etmiş ve sen de ne yağtığının farkındasın. Bu ve bunun gibi birçok ayrıntı var, bunları da zaten zamanla öğrenirsin, takıldığın yer olursa konusunu açarsın, yardımcı oluruz.
 
Herkes bir şeyler söylemiş söyledikleri kısmen doğru ama konuyla alakalı mı tartışılır; hadi benim senin kodlarını düzenlediğim haline bakalım.

[CODE lang="c" title="Kodlar"]#include <stdio.h>

int main() {

char ad[15];
char soyad[15];
int sayac=0;

if (sayac==0) {

printf("Adinizi giriniz: ");
scanf("%s",ad);
sayac++;

}

if (sayac==1) {

printf("Soyadinizi giriniz: ");
scanf("%s",soyad);
sayac++;

}

if(sayac==2) {

printf("Adiniz ve soyadiniz kaydedildi.\nAdiniz Soyadiniz: ");

printf("%s %s",ad,soyad);

}

return 0;
}[/CODE]

Şimdi öncelikle else ifleri' direkt olarak if'e çevirdim çünkü else kelime anlamı gibi "değilse" anlamına geliyor ve "değilse eğer" gibi bir anlam katıyor, baştaki if bloğu geçerli olduğu için yani if true sorgu ürettiği için diğer sorguları yapmadan geçiyor yani o satırları atlıyor. Direkt olarak if'e çevirmek gerekli. (İlle karar yapısı yapmak istiyorsan yoksa bunu kullanmadan da direkt olarak yapabiliriz.)

İkinci olarak senin değişkenlere atfetmiş olduğun yapı olan "%[^\n] " yapısı;

C'deki %[^\n] ifadesi genellikle tüm satırı okumak için kullanılır.
Diyelim ki scanf(“%[^\n]”, x);
Böylece yukarıdaki talimat, dosyanın (EOF) veya \n(sonraki satır) sonuna ulaşana kadar tüm karakterleri okuyacak ve x'e koyacaktır ama buna gerek var mı sence? Bence hayır onları da string ifadenin türünü belirten "s" ile değiştirdim.

En alta geldiğimizde sen printf ile ad soyadı yazdırmak isterken "%c" kullanmak istemişsin, c harfi char türünü sembolize eder char ise karakterleri yani 'A' bir chardir "A" ifadesi ise bir string değerdir, char tek bir değer alırken string değeri birden fazla karakter alabilir "aa" gibi bu yüzden %c yerine %s kullanmamız gerekli aksi halde %c ekrana veri yazdırmayacaktır.


Tüm bunlardan bağımsız aslında şu şekilde çalıştırabilirsin clean code mantığı burda devreye giriyor.

C:
#include <stdio.h>

int main() {
 
    char ad[15];
    char soyad[15];
 

    printf("Adinizi giriniz: ");
    scanf("%s",ad);
    printf("Soyadinizi giriniz: ");
    scanf("%s",soyad);
    printf("\n\nAdiniz ve soyadiniz kaydedildi.\nAdiniz Soyadiniz: ");
    printf("%s %s",ad,soyad);
 
    return 0;
}
Clean Code dediğiniz kısmı Dev C++ çalıştırmıyor hocam.

1638720668927.png

Birkaç tiyo vereyim, herhangi bir değişken veya dizi tanımladığında eğer bu dizi veya değişkene ilk değerlerini vermezsen rastgele değerler alırlar, bu da yazdığın kodun çalışma zamanında saçmalamasına neden olur (Ayrılan belleklerin heap veya stack farketmeksizin içinde veri saklanıyor olabileceğini aklından çıkarma, ek olarak "undefined behavior" kavramını araştır).

örnek:
C:
int x; (bad)
int x=0; (good)

C:
(bad)
char soyad[15];
scanf(" %s", soyad);

(good)
char soyad[15];
memset(soyad, 0, 15);
scanf(" %s", soyad);

Ayrıca "stack overflow" vs. gibi kavramları araştır, bu gibi durumlara nelerin sebep olduğunu iyice öğren, güvenli kodlama tekniklerini araştır. Fonksiyonların parantez içlerini boş bırakma, main() demek ben parametre almıyorum demek değil, bunun anlamı bir parametre de alabilirim birçok parametre de, main(void) şeklinde kullanabilirsin.

Eğer standart library'den bir fonksiyon kullanıyorsan, bunun manuel'ini oku, hangi parametreleri nasıl alıyormuş, hangi durumda ne döndürüyormuş?

Örneğin scanf() fonksiyonunun prototipi; int scanf ( const char * format, ... ); burada fonksiyon bir tamsayı döndürüyor, döndürdüğü sayıların ne olduğunu ve ne için kullanıldığını araştır. Fonksiyonun ilk parametresi format adında bir sabit karakter dize işaretçisi, bizden ne istediğini araştırmamız lazım. İkinci parametrede ise elipsis dediğimiz bir işaret var, bu ise fonksiyonun birçok parametre alabileceğini söyler (preprocessor, variadic macro kavramlarını araştır).

Gelelim senin sorununa, yukarıda da dediğim gibi format specifier'leri yanlış kullanıyorsun, eğer string yazdıracaksan veya alacaksan "%s" kullanırsın, eğer scanf fonksiyonunu arka arkaya kulanacaksan (spaces, newline and tab characters vs.) gibi önceki satırdan kalan artıkları esgeçmen lazım, aksi halde fonksiyon bunları da hesaba katıp saçmalayabilir, bunun için de format specifier'in başına bir boşluk ekliyoruz " %s", bu negated scanset formatı için de böyle.

Koşullu ifadeler vs için birşey söylememe gerek yok, arkadaşlar zaten yeterince izah etmiş ve sen de ne yağtığının farkındasın. Bu ve bunun gibi birçok ayrıntı var, bunları da zaten zamanla öğrenirsin, takıldığın yer olursa konusunu açarsın, yardımcı oluruz.
Hocam çok sağ olun dedikerinizi sindirerek deneyeceğim ve dikkate alacağım. Sorun da tüm koşulları ''if'' yaparak çözüldü @saliholoji dediği gibi.
Karar yapısı kurmana gerek yok. Önce printf ile ad isteyip scanf ile taratıp, ardından printf ile soyad isteyip scanf ile taratabilirsin.
Bu şekilde olunca ad girdikten sonra soyad ve ad-soyad hepsi aynı anda yazmış oluyor ancak.
Döngü olmadığı için sayacın değeri 0'dan başlayıp sadece ilk if'in içerisine giriyor. Main altındaki tüm kodun bir while veya for döngüsü içerisine alıp sonlandırma şartının ise sayacın 2 olmasına bağlayabilirsiniz.

Döngüsüz olması içinse if'leri kaldırabilirsiniz. O zaman sayaca da gerek kalmıyor haliyle.
If olmadan nasıl olacak hocam ? Yani bütün printf'ler bir anda çıktı veriyor bu şekilde.
Yapı yanlış. Karar yapısına gerek yok. Alt alta yazdırma işlemi yaparsan sorun olmaz.
Hocam alt altadan kasıt if vs. olmadan mı ? Yukarıdaki iki mesaj için de aynı şeyi yazdım. Tüm printf'ler aynı anda çıktı veriyor dediğiniz şekilde.
Arkadaş neden if kullanmış ben anlayamadım. Bilen birisi varsa söyleyebilir mi?
Birçok kez cevap verdim ama sebebi şu: tüm printf'ler aynı anda çıktı vermesin diye deneme yaptım sadece ve else if kullanmadan tüm koşulları if ile yapınca çözüme ulaştık.
Neden if kullandığınızı anlamadım ve neden kızgın attınız kod doğru çalışıyor.
Eki Görüntüle 1233712

Eğer if else kullanmak istiyorsanız daha iyi örnekler de var.
Hocam ben kızgın atmadım. If kullanma sebebim aynı anda printf'lerin çıktı vermemesini istemem.
 
Son düzenleme:
Birebir aynen kopyalayıp yapıştırırsan çalışıyor, tekrardan denedim bi' sorun yok.

Eki Görüntüle 1234313
Hocam son olarak bu kodda scanf'ler için sadece ''%s'' yerine ''%[^\n]'' kullanınca tüm printf'lerin aynı anda yazdırma sebebi nedir ? Bunun sebebini de anlarsam içim rahat edecek. Demek istediğim ve herkesin sorduğu aynı anda prinf'lerin yazması dediğim olay bu:

1638722639581.png
 

Yeni konular

Geri
Yukarı