![]() Elektro_gadget hocam yardım et bize ![]() |
Son olarak aşağıdaki şekilde yazarsan kodun çalışır , çalışmama nedenleri de yukarıda yazdığım sebepler. ![]() #include <stdio.h> |
Hocam ilk halı tipini üste aldım hata verdi neden hata verdi bilmiyorum. Sormak istediğim soru şu ben scanf ile bi karakter tanıttım diyelim araya başka scanf fonksiyonu girdiğinde (örnek olarak kaç metrekare halı falan filan) en başta tanıttığım karaktere göre if fonksiyonlarını dizersem program karakteri aklında tutup işlem yapar dimi? Anlatabildim mi bilmiyorum ![]() |
Hocam yazdığım kodlara tekrar baktığımda scanf'de %'den önce bosluğa denk gelmedim sizin yazdığınız son hali düzgün çalışıyor ama virgülü kaldırsam da benimki çalışmıyor. Açıkçası neden benim program çalışmıyor halen anlamadım ![]() |
Bende de hatalı çalışıyor dev c++ kullanıyorum. |
Birinci hatan alan,; orada virgülü silicen . İkincisi alan için 20 girdin diyelim enter a bastığında ikinci scanf e sen istemeden bir değer gönderiyor bunu önlemek için son kodda yazdığım gibi fflush(stdin); kullandım bu o gönderilen bilgiyi sıfırlıyor bu sayede senden düzgün şekilde karakter isteyebiliyor. |
C++ da 2dk da yazardın şunu. Amma ince nokta varmış C'De ![]() |
Tabiyki yapar , farklı yerlere atıyorsan tabi ![]() |
Hocam aslında demek istediğim ![]() 1 printf("Hali Tipini Seciniz:"); scanf("%c",&kod); printf("kac metrekare hali dosenecek:"); scanf("%f",&alan); 2 printf("kac metrekare hali dosenecek:"); scanf("%f",&alan); printf("Hali Tipini Seciniz:"); scanf("%c",&kod); Şu ikisinin arasında bi fark var mı. Yani 1.de halı tipini seçiyorum ondan sonra scanf'te bi float okutuyorum ya. İlk scanf'te okuttuğum karaktere göre (T,S,B) ifleri gidip dizdiğimde bi problem çıkar mı. Yani ifleri bağlıyacağım scanf hemen iflerin üstündemi olmalı 2. kod gibi? yoksa 1. koddaki gibi olursa bişey olmaz mı? |
İkisi arasında normalde hiç bir fark yok , çok ufak bir fark var oda senin programının çalışmamasına neden oluyor . scanf("%d",&sayi); scanf("%c",&a); Bu şekilde dediğimizi farz edelim , sen sayi için 2 girdin entera bastın , senin a için karakter girmeni beklemeyecek . Sen entera bastığında a ya \n değeri de biz istemeden atanmış olacak. scanf("%c",&a); scanf("%d",&sayi); Bu şekilde dersek ilk karakteri bekleyecek çünkü a ya giden bir veri yok , a yı girip entera bastığımızda int değerine \n değeri gidemediğinden sorun çıkmıyor. Aşağıdaki kodu çalıştırarak daha net anlarsın . Normalde yıldızlar nerede olmalıydı nereye gittiler. ![]() #include <stdio.h> |
Sorun getchar dan değil scanf den kaynaklanıyor. getchar oldukça basit ve ne yapıcağı kestirilebilen bir fonksiyon. Ancak scanf öyle değil. Mesela scanf int beklerken kullanıcı float girerse program sonsuz döngüye giriyor. Mümkün olduğunca scanf ve gets gibi fonksiyonlardan uzak durmak lazım. Edit: scanf in yaptığı her şeyi getchar la da yapabilirsiniz. |
İki şekilde de programı çalıştırdım dediğiniz gibi 1.de beklemiyor aynı benim halı programında yaşadığım sorun gibi. Ancak \n değeri neden otomatik atanıyor neden beklemiyor program onu bi türlü anlayamadım ![]() |
Ben getchar'ı program kapanmasın diye yazıyorum farklı bi kullanımı varsa bilmiyorum. |
Yok 2si arasında fark yok. Sonuçta tanımladığın değişken türlerin ve kullanıcıdan alınan verilerde değişikli olmuyor. |
Benim de bir sorum var c ++ için. Elimizde dynamic bir array var. Bu arraydan bir elemanı silmek istiyorum. Bunu delete komutunu kullanarak nasıl yapıcam ? Aklımda şöyle bir yol var: geçici bir dynamic array açıp o elemana kadar kopyalamak, o elemanı pas geçmek ve geri kalanını kopyalamaya devam etmek. Yani 2 tane for kullanarak. Başka ve kısa yolu yok mudur bunun? |
delete kullanırsan arrayın o sildiğin kısmı boş(0) kalır, array küçülmez. Eğer o kısmı silerek arrayı küçültmek istiyorsan array tanımlamak yerine std list veya vector kullanabilirsin. Mesela vector kullanırsan silme işlemini şunla yapacaksın;http://cplusplus.com/vector::erase |
vector konteyner'ı asm'de yazılmış ve hızlı. Tabiki taşıma söz konusu olduğunda yavaş kalıyo list ve deque'ye göre fakat hız sizin için aşırı derecede(**** repliği oldu) önemli değilse vector'ü kullanabilirsin. |
Şu şekilde yapılabiliyor diye hatırlıyorum. Ama normal dizilerde olmuyor. Normal dizilerde arkadaşların dediklerini kullanabilirsin. Örneğin ; string *kullanıcı_adi[50]; ...... ....... delete kullanici_adi[kullanıcıdan alınan değer veya silmek istediğin değer]; ya da internette görmüştüm diyelim baştaki elemanı silmek istiyorsun, diyelim elimizde ABC olsun. Şimdi A'yı silmek istiyorsun. Şöyle bir yöntem izleyebilirsin. Normalde A B C 'de A silinince Yeni hali B C şeklinde olacak. Bu olurken şu işlemi gerçekleştirebilirsin, B C C yap. Yani B'yi sola taşı, C'yi sola taşı. Ardından sondan C'yi sil. Bu şeiklde çıktı B C verecek ve A silinmiş olacak. |
Hocam delete list[index] tarzı yazınca hata veriyor. |
Bence virgül haricinde hata olmaması lazım hocam ama verdiğim linkte şurayı okuduktan sonra değişti kararım.
But lack of knowledge is what gets most programmers. They want to read a character from the keyboard so they very logically use the format string "%c". Then wonder why the next read is messed up. How are they supposed to know that after the character was read there was a \n left behind? I've rarely (never?) seen documentation explaining that fact, but through experimentation and logical thinking (and a good debugger), one can in fact figure out what's happening.