printf - format sorunu( C programlama )

Başlatan efder, 17 Ekim 2015 - 12:22:38

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

efder

Merhaba arkadaşlar,
Aslında sorum oldukça basit. Bugün printf için sonucu noktalı  sayı olarak çıkan ancak string içerisinde tam sayı şeklinde formatlamak istediğim iki durum yazdım:

1)    printf( "%d", 1.0 / 2 ); 

Bu ilk durumda sonuç beklediğim gibi 1.0 / 2 = 0.5 değil formati tam sayı olarak ayarladığım için virgülden sonraki kısmı atılmış şekilde 0 olarak aldım ancak:

2)   printf( "%d", 2.2 / 2 );   

bu durumu denediğimde  2004318072 gibi anlamsız bir sonuç alıyorum. Bunun sebebi nedir ve bu hatayı nasıl düzeltebilirim ? (Comp > g++, IDE > CodeBlocks, İşletim Sistemi > Ubuntu)

İlginiz için şimdiden teşekkürler

Sh4oTT

Tur uyumsuzlugu, sonucunu kestiremedigimiz burcok soruna yol acabilir cunku uyumsuz tipler veri kaybina yol acabilir. Bu tur durumlarda uyumsuzlugun olumsuz sonuclarini bilemeyiz. Ornegin:
double b=2.44;
int a=b;


Burada a degiskenin icindeki sayi ondalikli gercek sayi oldugu icin int turunde bir degisken olan b degiskenin icine yerlestirilemez. Bu durumda 2. Satirda derleyici otomatik bir cevrim yaparak 2.44 degerini 2 ye cevirir. Boylece veri kaybi yasanmis olur ve programlarimiza ciddi zararlar verir. Boyle sorunlarin debug edilerek ortaya cikarilmasi da zordur.

Kisacasi 1 de yazabilir, sacma sacma sayilarda verebilir :)

efder

@ ShaoTT öncelikle ilginiz için teşekkürler :) Aslında benim de istediğim bir bakıma veri kaybı  :)) Sayıların ondalıklı bölümlerinden ondalık kısımlarını atıp sadece tam sayı kısmının kalmasını istiyorum. Kodu şu şekilde değiştirince  istediğim sonuçları almaya başladım ancak bu kodun da amacım için  güvenli olup olmadığı konusunda kuşkularım var :)


#include <stdio.h>

int main( void )
{
  int a;
   a = 2.2 / 2;

   printf("%d", a);

   return 0;
}



Şimdi 1 çıktısını almaya başladım, negatif sayılar için de denedim onlarda da işliyor. Acaba az önceki durum formatted printle mi alakalı bir sorundur? :)

Sh4oTT

Formatted print derken ne dedigini anlamadim :( Boyle yazmak guvenli degildir, derleyici sonucu kesinlestirilemeyen sonuclar verebilir(Okudugum kitap da boyle yaziyordu) Noktali kisimlari gostermek istemiyorsaniz (%.1f) gibi kullanabilirsin noktadan sonra kac basamagin gosterilecegini ayarlayabilirsin.

alquirel

printf fonksiyonunu şu şekilde yazmak da çözüm olabilir.


printf("%d", 2.2/1.0);


Denemedim.

-DıLgEş-

Tür çevrimi yapabilirsiniz. Aşağışekilde bir :


printf("%d", int(2.2))


Bu kodu denemedim ancak herhalde çalışacaktır.
Aşkın; gözü kör, kulağı sağır, dili tutuk, aklı kıttır..! Hayır yani bu halde nasıl herkesi madara ediyor onu çözemedim..

Amenofis

printf( "%d", 2.2 / 2 );
2.2 -> double

Sayılardan biri double olursa diğeri de double a çevrilir ve sonuç yine double olur. Fakat sen 1.1' in binary formunu %d ile int olarak yazdırmaya çalışıyorsun, o yüzden saçma sayılar görüyorsun. Çözüm basit, sonucu int'e çevirmek.

-DıLgEş-

Alıntı yapılan: Amenofisprintf( "%d", 2.2 / 2 );
2.2 -> double

Sayılardan biri double olursa diğeri de double a çevrilir ve sonuç yine double olur. Fakat sen 1.1' in binary formunu %d ile int olarak yazdırmaya çalışıyorsun, o yüzden saçma sayılar görüyorsun. Çözüm basit, sonucu int'e çevirmek.
Hocam, tür dönüşümü yapılsa daha güvenli olmaz mı?

printf("%d", (int)(2.2));
Aşkın; gözü kör, kulağı sağır, dili tutuk, aklı kıttır..! Hayır yani bu halde nasıl herkesi madara ediyor onu çözemedim..

Amenofis

@nurullahisrgan

Ben de onu diyorum ama tür dönüşümü o şekilde olmaz, sonuç neyse onu dönüştüreceksin.