Forum: Diğer Konular RSS
Kısıtlı imkanlarla decimal to hex
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kısıtlı imkanlarla decimal to hex
Okulda Ansi C dilinde decimal bir sayıyı hex e çevirmemiz için ödev verildi :)

"Converting a decimal integer to hexadecimal/octal representation."

Ama problem şu ki bir çok imkanımız kısıtlı aşağıdan anlayacağınız üzere.

Constraints: Write conversion using an algorithm which uses only a set of arithmetic expressions, and
conditional statements, repetitive statements (if necessary) or functions (if you like).
-You are not allowed to use printf function with hexadecimal/octal printing format specifier!

Hexe çevirip ekrana basmak için (anladığım kadarıyla) char* bile kullanmayacağız :) Bu da haliyle işleri biraz zorlaştırıyor.

Herhangi bir kütüphaneye bağlı fonksiyon kullanmadan ( printf haricinde ) bir şekilde çözdüm.

Acaba farklı nasıl çözümler yapılabilir merak ediyorum. Kafanızı karıştırmaması açısından çözümümü sonradan paylaşacağım.

Görüşlerinizi alabilir miyim?

Bu arada not olarak sayının 16 ya bölümünden kalanını alıp ekrana yazmak sonra 16 ya bölmek tam olarak çözüm olmuyor. Gelen hex çıktısı tersten yazılmış oluyor :)

Zekeriya
Bilgi meraktan gelir...
Bu mesaj zekeriyadurmus tarafından değiştirildi; zaman: 2015-10-27, 15:46.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Umarım burada sordun diye kopya çektin sanılmaz. (Hiç sanmıyorum çünkü öğretmenlerin senin iyi bildiğini biliyorlar. :) )

zekeriyadurmus:
sayının 16 ya bölümünden kalanını alıp ekrana yazmak sonra 16 ya bölmek tam olarak çözüm olmuyor.

İki satırın yerlerini değiştirsek olur. ;)

Ali
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ödev zaten :) Yani birisine sorulmasında problem olacağını sanmam :)

İki satırın yerlerini değiştirsek olur. ;)
Bunu tam olarak anlayamadım.

Biraz saçma gibi dursa da aşağıdaki kod işimi görüyor ama farklı ne yapılabilir merak ettim.

void toHex(int n){
  int linb = 0, rem, cn = n, i;
  while (cn > 0){
    cn /= 16;
    linb++;
  }
  for(;linb > 0;linb--){
    cn = n;
    for(i = 1; i < linb; i++){
      cn /= 16;
    }
    rem = cn % 16;
    if(rem == 10) printf("A");
    else if(rem == 11) printf("B");
    else if(rem == 12) printf("C");
    else if(rem == 13) printf("D");
    else if(rem == 14) printf("E");
    else if(rem == 15) printf("F");
    else printf("%d", rem);
  }
  printf("\n");
}

linb = 16 tabanındaki uzunluğu
rem = bölümden kalan
cn = sayının kopyası
Bilgi meraktan gelir...
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
Ödev zaten :) Yani birisine sorulmasında problem olacağını sanmam :)

Ceviz.net'te forum yöneticiliği yaptığım zamanlarda "Eyvah! Öğretmenim de bu forumu izliyormuş. Lütfen açtığım konuyu silin!" gibi istekler alıyordum. ;)

(Konu dışına taşmak pahasına, ben kesinlikle silmiyordum ve başka yöneticilere yöneltiyordum. Benim anlayışımda konu konuyu açana ait değildir. Laf ağızdan çıktığı an genele ait hale gelmiştir. Dolayısıyla, ben konu silmem. :))

İki satırın yerlerini değiştirsek olur. ;)
Bunu tam olarak anlayamadım.

Sen "sayının 16 ya bölümünden kalanını alıp ekrana yazmak sonra 16 ya bölmek tam olarak çözüm olmuyor" dedin. Şöyle yaparsan olur: "... sonra sayının 16 ya bölümünden kalanını alıp ekrana yazmak."

Ali
Avatar
zekeriyadurmus #5
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
void toHex2(int n){
  int rem;
  while (n!=0){
    n /= 16; //bu
    rem = n % 16; // ve bu satır yer değiştirdi
    if(rem == 10) printf("A");
    else if(rem == 11) printf("B");
    else if(rem == 12) printf("C");
    else if(rem == 13) printf("D");
    else if(rem == 14) printf("E");
    else if(rem == 15) printf("F");
    else printf("%d", rem);
  }
  printf("\n");
}

Short sınırındaki bütün sayıları hexe çevirebilmemiz gerek ve

161 i A0 olarak çeviriyor bu kod. (A1) olması gerekiyor.

yanlış anlamadıysam bunu diyorsunuz Ali hocam.

Ceviz.net'te forum yöneticiliği yaptığım zamanlarda "Eyvah! Öğretmenim de bu forumu izliyormuş. Lütfen açtığım konuyu silin!" gibi istekler alıyordum. ;)

(Konu dışına taşmak pahasına, ben kesinlikle silmiyordum ve başka yöneticilere yöneltiyordum. Benim anlayışımda konu konuyu açana ait değildir. Laf ağızdan çıktığı an genele ait hale gelmiştir. Dolayısıyla, ben konu silmem. :))

Kesinlike böyle bir isteğim olmayacağından emin olabilirsiniz :) Ayrıca buradaki yazıların bir bakıma hayatımı kurtardığını dahi düşünüyorum.

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #6
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yalnız şu an fark ettim aslında bizden döngü bile kullanmamız istenmiyor.

  int rem1, rem2, rem3, rem4;
  n /= 16;
  rem1 = n % 16;
  n /= 16;
  rem2 = n % 16;
  n /= 16;
  rem3 = n % 16;
  n /= 16;
  rem4 = n % 16;

şeklinde kodu yazmamız isteniyor. Normalde bu tarz kullanımlar yapmak yerine her türlü yolu denerim.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
zekeriyadurmus:
yanlış anlamadıysam bunu diyorsunuz Ali hocam.

Bu problem özyineleme örneği olarak bilinir. İlk mesajında bölen ve kalan konusunu okuyunca onu kastediyorsun sandım. Özyilenemeli işlevdeki iki satırın yerine göre çıktı ya ters olur ya düz.

Kesinlike böyle bir isteğim olmayacağından emin olabilirsiniz :)

Şüphem yok zaten. :) Ben seni ve başka arkadaşları düşünerek hatırlattım: Ödevi forumlara sorarsanız tabii ki tartışması olacak ve bir çok kod geçecek. Orada görülen kodlar sizin kendi yazdığınız kodun aynısı bile olsa öğretmenin kafasında şüphe uyandıracak.

(Öte yandan, internet hayatın bir parçası olduğuna göre, öğretmenler bu tür forumlara çok açıktırlar da.)

Ali
Avatar
zekeriyadurmus #8
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Özyineleme (recursive) olayını henüz derste işlemedikleri için (öğretmediği şeyi kullanmamızı da kabul etmeyeceğini düşündüğüm için) hiç aklıma bile getirmedim.

Ama evet recursive gayet mantıklı bir çözüm.

char toChar(int rem){
  if(rem >= 10) return 'A' + (rem - 10);
  else return '0' + rem;
}
void toHex3(int n){
  if(n!=0){
    int rem = n % 16;
    toHex3(n / 16);
    printf("%c", toChar(rem));
  }
}

Teşekkür ederim Ali hocam :)

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sıfır değerini de yazdırmak için özyinelemeyi başlatan başka bir işlev kullanışlı oluyor:
import std.stdio;
 
void haneYaz(int hane) {
    const char görünüm = cast(char)(hane < 10 ? '0' + hane : 'a' + hane - 10);
    write(görünüm);
}
 
void hexYaz_R(int sayı) {
    if (!sayı) {
        return;
    }
 
    hexYaz_R(sayı / 16);
    haneYaz(sayı % 16);
}
 
void hexYaz(int sayı) {
    if (sayı) {
        hexYaz_R(sayı);
 
    } else {
        haneYaz(0);
    }
}
 
void main() {
    hexYaz(0xe3cd);
    writeln();
}
Ali
Avatar
zekeriyadurmus #10
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
0 ihtimalini düşünmemiştim. Bu durumda bizden istenilen çıktı ne olacağını.

Belki de 0 ı da eklemek ödev açısından doğru olacaktır.

Teşekkür ederim :)

Zekeriya
Bilgi meraktan gelir...
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 19:35:44 (UTC -08:00)