C de piramit yapmanin mantigi nedir for dongusuyle? Mesela dik ucgen seklinde piramit. Tanimladigimiz i ve j jin satir sutun olup olmadigini nasil anlicam iyicene kafam karisti.. ![]() |
Nasıl kullandığına bağlı hangisi satır hangisi sütun ? Kodun nerede ? Dik üçgen çizdirmek içinde her zaman i,j gerekmiyor. Hele iç-içe for döngüsü de gerekmiyebilir. Burada düşünce mantığın önemli "Nasıl ekrana dik üçgen bastırırım ?" Aşağıda 4 dik üçgen var. Ne iç-içe for döngüsü ne j var. pyramid_floor değerini değiştirdikçe dik üçgenleri büyütüp küçültebilirsin. pyramid_floordan büyük olmamak kaydıyla, pyramid_top büyütürsen dik yamuk elde edersin. Mantık senin mantığın ve düşünce tarzın. Ben bir şeyi sadece bir yolla yaparım diye bir şey çoğu zaman yok. Aşağıdaki kod i ve j ile yine tek for üzerinde de dönebilir ama daha kompleks olur. Kodunu göster ona göre nere satır nere sütün söyliyelim. (Evet direk kullanma diye C++ ![]() /* DH GaRUi */
Ekleme: Nasıl normal piramit yapmışlar diye baktığımda 3 for iç-içe görmüştüm. Kodun kompleks yapısı iyice artıyor. Aşağıda 3 for ve 3 normal piramit var. Birinde j bile yok.
|
Birinci sorunun cevabı evet tam olarak aynı. Diziliş sadece const işaretçilerde fark eder. float ve double ın unsigned olmasının bir mantığı yok. Tamsayılarda sayıya 1 bit ilave etmek 2 kat büyütürken kayar noktalı sayılarda neredeyse hiç etki etmez. C' ye yeni başlayanlar özellikle double ı büyük sayıları tutmak için kullanırlar. Bu külliyen yanlış. Kayar noktalı sayılarda bit artışı özellikle sayının hassasiyetini arttırmak için yapılır. Diyelim ki double ı parametre olarak alan bir fonksiyonumuz var ve bu parametrenin mümkün olan en yüksek genişlikle değer almasını istiyoruz. Böylece işlem daha doğru ve hassas şekilde gerçekleşecek. Bunu yapmanın en basit ve etkili yolu parametreye 0 ile 1 arasında bir değer vermektir. Kullanım amacını doğru anlayınca floating türlerin signed veya unsigned olmasının bir farkı olmadığı anlaşılıyor. |
Esasında çok basit. Arkadaşımız yardımcı olacak çok güzel bir örnek vermiş. Ben de pratik bir yöntem söyleyeyim. Kareli bir defterin varsa, eğer yoksa kendin çizebilirsin, çizmek istediğin üçgeni çiz. Sonra köşe noktalarını(köşeden kastım üçgenin kenarlarının karelerin kesişim noktasından geçtiği yerler) belirle. Orijini sol üst olarak belirleyerek(çünkü çıktı bu noktadan başlıyor) noktaların koordinatlarını yaz fakat pozitif değerlerle yaz. Noktaları belirledikten sonra aralarında matematiksel bir bağlantı olduğunu göreceksin. Bu sana kullanmak gereken algoritmanın en basit şekilde mantığını verir. Kolay gelsin. |
Merhaba abiler. Bugün programlamadan sınavımız varda takıldığımız bir kaç problem var. Onların kodlarını öğrenebilirsek süper olur. Sınav saat 3te, o zamana kadar birde deneme şansımız olsa süper olacak. Şimdi bize 1-4 işlemin kodu(if'li olacak falan) 2-ax^2+bx+c denkleminin köklerini veren kod. delta>0 ise iki kökü vardır kökler -(kök içinde delta -b/2a) ve -(kök içinde delta+b/2a) delta<0 ise kökü yoktur, delta=0 ise bir kökü vardır. 3-notları girilip ortalaması hesaplandıktan sonra ortalaması 0<x<25 ise f, 25<x<50 ise d, 50<x<75 ise c, 75<x<85 ise b 85<x<100 ise a olan kod Bunları yazabilirseniz çok sevineceğim. Sorular belki vardır ama acelem olduğundan bakacak vakit yoktu kusura bakmayın. Kolay gelsin. :) |
Ben bilgisayar mühendisliği okumadım, ama kendi başıma kitabını alıp okuduğumda kitabın sonundaki bu tarz soruları kolaylıkla çözebiliyordum. Şimdi, 1) Vakit vardı, vaktini değerlendirememiş son zamana sıkıştırmışsın 2) Kodlar okuyarak değil, yazarak öğrenilir(diğer türlü ezberlersin ve unutursun) 3) Doğru bölüm tercihi yapıp yapmadığınızı bir daha düşünün. 4) Sorunlarına odaklanmaya çalış, yaptırır gibi değil, belirtir gibi isteyin. Ben şahsen bundan çok rahatsız oluyorum. Cevap verenler de pratik yapmak için veriyor biliyorum. Ama siz yarın bir gün diploma sahibi olacaksınız. Allah aşkına şu basit kodları çıkarmaya bile üşendiniz mi, gidin çalışın. Nedir bu olay? Nasılsa yazan var. Şu kodları yazmam inan daha kısa sürerdi bu mesajı yazmaktan. Düşüne düşüne yazmaya gayret gösterdim. 5) Bunları bir google'da aratsan ne kadar standart sorular olduğunu görecektin fakat ona dahi üşenmişsin. Fakat ne mantıksa yazıp cevabını beklemek daha kolay geliyor. Çünkü armut pişecek ağıza düşecek illa ki. Bu kadar yazdıktan sonra üzüldüm de yazayım dedim. Yazmaya başladıktan sonra yine vazgeçtim kodları görünce. Çalışın, öğrenci değil misiniz. Yardım almak tamam da kodu istemek nedir? Şu noktada kitlendik deyin, hemen yardımcı olayım. |
2.kez sorucam ama aşağıda neyin yazdırılabileceği bilinebilir mi? İlk 2 si tamam sadece 3.printf önemli int i; float b=8.1,c=0.7; i=b/c; printf("%d\n",i); c=c*c; printf("%f\n",c); i=i+b; printf("%f\n",i); |
Yine mi ![]() 11 0.490000 0.490000 Yani 19 değil. Yine yanlış bir printf denemesi. printf("%d\n",i); //olursa 19 printf("%f\n",(float)i); // olursa 19.000000 printf("%f\n",i); // olursa 0.490000 -> Direk böyle kullanırsan diğerlerini print etmezsen başka bi değer çıkacaktır. Koddaki ilk iki printf silinir ise printf("%f\n",i); // 2.168831 In function 'int main()': Line 10: warning: converting to 'int' from 'float' Line 14: warning: converting to 'int' from 'float' |
beyler burda ++ i ve j nin sonundalar
Burda da önündeler. Şimdi ++ önce olunca sayıları artırıp öyle işleme girmesi gerekmiyor mu? Ben ikisini de yazdırdım ikisi de aynı şeyi yazıyor |
For için farketmez. Bu assignment işlemleri sırasında önem taşır. Birde performans farkını unutmamak lazım tabi. ++i daha performanslıdır diyebiliriz doğru kullanırsan. #include <stdio.h>
|
Hoca bugün sınavda sordu da , ilk olarak bilinemez yazdım , bilinemezi nasıl gösteriyim diye sorunca orada öyle bir şey yok dedi bu sefer de 19.000000 yazdım , o da olmadı anlaşılan. 0.490000 yazmak hiç aklıma gelmezdi, nedenini de çözebilmiş değilim. |
Çok açıklayıcı bir örnek teşekkürler ![]() |
Merak etme senin cevabın doğru görünüyor. Yani hocanın istediği cevap 19.000000 olarak görünüyor. Ama o bir kodun içine koyulur compile edilirse daha önceden gösterdeiğimiz gibi abuk subuk şeyler çıkıcak. Hocan bu konudaki hatasının farkında değil. Böyle şeyler çıktığını farketse sormazdı gibime geliyor. Şimdi int i; float b=8.1,c=0.7; i=b/c; printf("%d\n",i); c=c*c; printf("%f\n",b); // Burada c yerine b bastırıyoruz. i=i+b; printf("%f\n",i); //Şimdi sonuç 8.099998 çıktı compile sonrası. Bunu ezberlemenizi bekliyor olduğunu düşünmüyorum. Sadece explicit casting kullanması gerektiğini bilmiyor veya bufferda float sonrası integer değeri basarsanız bir önceki floatun buffer değeri ekrana basılır gibi bir kural var benim haberim yok. (Kod çıktısı böyle bir sonuç veriyorda :) ) Benim düşüncem, o kodun printf("%f\n",(float)i); //şeklinde olması lazım veya printf("%d\n",i); Ayrıca, iyi bunu sormamış :) Gerçi ödev gibi sormuştu. int i = 2.1f/0.3f; printf("%d\n",i); //6 i = 2.1/0.3; printf("%d\n",i); //7 float a=2.1,b=0.3; i=a/b; printf("%d\n",i); //6 Bu farkdan da haberi yok. |
Teşekkürler hocam , bakalım ne diyecek merak ediyorum. ![]() |
Rica ederim ![]() |
Ortama biraz heyecan katıp, biraz da biz soralım mı? Belki arkadaşlar da merak edip çözme gayreti içerisine düşerler ![]() Çözüm verilmediği takdirde, bir gün sonra ben veririm. Daha çok örnek olmuş olur arayanlar için. Soru : Kesir sadeleştirme. Kullanıcının gireceği x/y değerini eğer sadeleşebiliyorsa sadeleştirilmiş haliyle ekrana yazan, sadeleşmiyorsa "Girdiğiniz oran en sade halidir." yazan program yazınız. Ek: x,y tamsayı olsun. |
Beyler burda nerde yanlış var? #include<stdio.h> |
printf("x üzeri y = %d",pow(x.y)); x.y değil x,y olacak. |
Yardımcı olabilirim. Siz bir yazmaya başlayın, takıldığınız noktada yardım ederiz. |
Naçizane Ekleme yapmak istedim
Bir default: tanımlaması da yapılabilir.