Linux'taki Ödevim Hakkında Öneri

zhil

Üyecik
Yaklaşık 50 satırlık bir kod ödevim var. Mantığını anladım fakat yapamıyorum. Girilen input dosyasındaki aritmetik işlemlerin (toplama, çıkarma, çarpma, bölme, mod alma) ve 2, 10, 16 tabanındaki sayıları birbirine dönüştürme işleminin yapılması gerekiyor. Yardım edebilecek biri var mı ?

INPUT FILE:
0b10101010 + 0b101010
0b10101010 – 0b101010
0b10101010 – 0b1010101010
0b10101010 * 0b101010
0b10101010 / 0b101010
0b10101010 % 0b101010


OUTPUT FILE:
0b11010100 (POSITIVE)
0b10000000 (POSITIVE)
0b1000000000 (NEGATIVE)
0b1101111100100 (POSITIVE)
0b100 (POSITIVE)
0b10 (POSITIVE)
 
Linux ile bu kodlamanın pek bir alakası yok, Linux kendi mantığında yazılım işi ve çoğunlukla Python gibi daha rahat programlama dilleri ile yazılır. Burada makine dili söz konusu sanırım. Bu forumdan bunu cevaplayacak bir baba yiğit de kolay kolay çıkmaz.
 

zhil

Üyecik
Linux ile bu kodlamanın pek bir alakası yok, Linux kendi mantığında yazılım işi ve çoğunlukla Python gibi daha rahat programlama dilleri ile yazılır. Burada makine dili söz konusu sanırım. Bu forumdan bunu cevaplayacak bir baba yiğit de kolay kolay çıkmaz.
terminalden yazılacak aslında if else ve while döngüsünden başka bir şeye gerek yok bi kaç tane de komut tam olarak komut yapılarını anlayamadığım için yazamadım belki az çok bilen, yardımcı olabilecek birileri çıkar :(
 

caglarturali

Üyecik
Pek detay vermemişsin ama ben bu sorunu JavaScript ile şöyle çözerdim.

JavaScript:
function binaryOp(a, b, op, resultBase = 2) {
  resultBase = Number(resultBase);
  let baseA, baseB;
  if (a.includes('0b') && b.includes('0b')) {
    // Input is binary
    baseA = parseInt(a.substring(a.indexOf('0b') + 2), 2);
    baseB = parseInt(b.substring(b.indexOf('0b') + 2), 2);
  } else if (a.includes('0x') && b.includes('0x')) {
    // Input is hexadecimal
    baseA = parseInt(a.substring(a.indexOf('0x') + 2), 16);
    baseB = parseInt(b.substring(b.indexOf('0x') + 2), 16);
  } else {
    // Assume that input is decimal
    baseA = parseInt(a, 10);
    baseB = parseInt(b, 10);
  }

  // Perform operation and convert to destination based string.
  let rawResultStr;
  switch (op) {
    case '+':
      rawResultStr = (baseA + baseB).toString(resultBase);
      break;
    case '-':
      rawResultStr = (baseA - baseB).toString(resultBase);
      break;
    case '*':
      rawResultStr = (baseA * baseB).toString(resultBase);
      break;
    case '/':
      rawResultStr = (baseA / baseB).toString(resultBase);
      break;
    case '%':
      rawResultStr = (baseA % baseB).toString(resultBase);
      break;
  }

  // Build result string
  let prepend;
  switch (resultBase) {
    case 2:
      prepend = '0b';
      break;
    case 16:
      prepend = '0x';
      break;
    default:
      prepend = '';
      break;
  }

  let append;
  if (rawResultStr.includes('-')) {
    // Remove negative sign and show the sign in parantheses
    rawResultStr = rawResultStr.substring(1);
    append = '(NEGATIVE)';
  } else {
    append = '(POSITIVE)';
  }

  // Remove floating point part
  if (rawResultStr.includes('.')) {
    rawResultStr = rawResultStr.substring(0, rawResultStr.indexOf('.'));
  }

  // Build final string
  return `${prepend}${rawResultStr} ${append}`;
}

console.log('\nBINARY RESULTS');
console.log(binaryOp('0b10101010', '0b101010', '+'));
console.log(binaryOp('0b10101010', '0b101010', '-'));
console.log(binaryOp('0b10101010', '0b1010101010', '-'));
console.log(binaryOp('0b10101010', '0b101010', '*'));
console.log(binaryOp('0b10101010', '0b101010', '/'));
console.log(binaryOp('0b10101010', '0b101010', '%'));

console.log('\nHEXADECIMAL RESULTS');
console.log(binaryOp('0b10101010', '0b101010', '+', 16));
console.log(binaryOp('0b10101010', '0b101010', '-', 16));
console.log(binaryOp('0b10101010', '0b1010101010', '-', 16));
console.log(binaryOp('0b10101010', '0b101010', '*', 16));
console.log(binaryOp('0b10101010', '0b101010', '/', 16));
console.log(binaryOp('0b10101010', '0b101010', '%', 16));

console.log('\nDECIMAL RESULTS');
console.log(binaryOp('0b10101010', '0b101010', '+', 10));
console.log(binaryOp('0b10101010', '0b101010', '-', 10));
console.log(binaryOp('0b10101010', '0b1010101010', '-', 10));
console.log(binaryOp('0b10101010', '0b101010', '*', 10));
console.log(binaryOp('0b10101010', '0b101010', '/', 10));
console.log(binaryOp('0b10101010', '0b101010', '%', 10));

Bu kodları geliştirici konsolunda çalıştırırsan, yukarda verdiğin örneklerin çıktısını istediğin formatta verdiğini görebilirsin. binaryOp fonksiyonuna ikilik, onluk, onaltılık sistemde sayılar verebilirsin. Sonucu varsayılan olarak ikilik düzende hesaplıyorum, istersen 4. argüman olarak hedef sayı sistemini girebilirsin. Ayrıca unutma ki bu kodlar küçük sayılarda doğru sonuç vermesine rağmen, JavaScript'in sayı veritipinin kısıtlamaları yüzünden 53 bitten büyük sayıların durumunda sonuç doğru olmayacaktır! Daha sofistike bir çözüm için bitshifting kullanmak daha doğru olacaktır. Yine de fikir vermesi açısından faydası olur umarım. ?

---- Mesajlar birleştirildi ----

Pardon terminal demişsin zaten, görmemişim. :) Bash scripting konusunda pek fikrim yok ne yazık ki. Yine de bakıştırayım biraz, yukardaki kodları bashe tercüme edebilirsem yazarım.
 
Son düzenleme:

zhil

Üyecik
Tam olarak bu iş neyin üstüne? En azından belge arayabiliriz.
2lik 10luk ve 16lık tabanında sayılar ve işlemleri veriliyor outputta bu işlemlerin sonucu isteniyor

---- Mesajlar birleştirildi ----

Pek detay vermemişsin ama ben bu sorunu JavaScript ile şöyle çözerdim.

JavaScript:
function binaryOp(a, b, op, resultBase = 2) {
  resultBase = Number(resultBase);
  let baseA, baseB;
  if (a.includes('0b') && b.includes('0b')) {
    // Input is binary
    baseA = parseInt(a.substring(a.indexOf('0b') + 2), 2);
    baseB = parseInt(b.substring(b.indexOf('0b') + 2), 2);
  } else if (a.includes('0x') && b.includes('0x')) {
    // Input is hexadecimal
    baseA = parseInt(a.substring(a.indexOf('0x') + 2), 16);
    baseB = parseInt(b.substring(b.indexOf('0x') + 2), 16);
  } else {
    // Assume that input is decimal
    baseA = parseInt(a, 10);
    baseB = parseInt(b, 10);
  }

  // Perform operation and convert to destination based string.
  let rawResultStr;
  switch (op) {
    case '+':
      rawResultStr = (baseA + baseB).toString(resultBase);
      break;
    case '-':
      rawResultStr = (baseA - baseB).toString(resultBase);
      break;
    case '*':
      rawResultStr = (baseA * baseB).toString(resultBase);
      break;
    case '/':
      rawResultStr = (baseA / baseB).toString(resultBase);
      break;
    case '%':
      rawResultStr = (baseA % baseB).toString(resultBase);
      break;
  }

  // Build result string
  let prepend;
  switch (resultBase) {
    case 2:
      prepend = '0b';
      break;
    case 16:
      prepend = '0x';
      break;
    default:
      prepend = '';
      break;
  }

  let append;
  if (rawResultStr.includes('-')) {
    // Remove negative sign and show the sign in parantheses
    rawResultStr = rawResultStr.substring(1);
    append = '(NEGATIVE)';
  } else {
    append = '(POSITIVE)';
  }

  // Remove floating point part
  if (rawResultStr.includes('.')) {
    rawResultStr = rawResultStr.substring(0, rawResultStr.indexOf('.'));
  }

  // Build final string
  return `${prepend}${rawResultStr} ${append}`;
}

console.log('\nBINARY RESULTS');
console.log(binaryOp('0b10101010', '0b101010', '+'));
console.log(binaryOp('0b10101010', '0b101010', '-'));
console.log(binaryOp('0b10101010', '0b1010101010', '-'));
console.log(binaryOp('0b10101010', '0b101010', '*'));
console.log(binaryOp('0b10101010', '0b101010', '/'));
console.log(binaryOp('0b10101010', '0b101010', '%'));

console.log('\nHEXADECIMAL RESULTS');
console.log(binaryOp('0b10101010', '0b101010', '+', 16));
console.log(binaryOp('0b10101010', '0b101010', '-', 16));
console.log(binaryOp('0b10101010', '0b1010101010', '-', 16));
console.log(binaryOp('0b10101010', '0b101010', '*', 16));
console.log(binaryOp('0b10101010', '0b101010', '/', 16));
console.log(binaryOp('0b10101010', '0b101010', '%', 16));

console.log('\nDECIMAL RESULTS');
console.log(binaryOp('0b10101010', '0b101010', '+', 10));
console.log(binaryOp('0b10101010', '0b101010', '-', 10));
console.log(binaryOp('0b10101010', '0b1010101010', '-', 10));
console.log(binaryOp('0b10101010', '0b101010', '*', 10));
console.log(binaryOp('0b10101010', '0b101010', '/', 10));
console.log(binaryOp('0b10101010', '0b101010', '%', 10));

Bu kodları geliştirici konsolunda çalıştırırsan, yukarda verdiğin örneklerin çıktısını istediğin formatta verdiğini görebilirsin. binaryOp fonksiyonuna ikilik, onluk, onaltılık sistemde sayılar verebilirsin. Sonucu varsayılan olarak ikilik düzende hesaplıyorum, istersen 4. argüman olarak hedef sayı sistemini girebilirsin. Ayrıca unutma ki bu kodlar küçük sayılarda doğru sonuç vermesine rağmen, JavaScript'in sayı veritipinin kısıtlamaları yüzünden 53 bitten büyük sayıların durumunda sonuç doğru olmayacaktır! Daha sofistike bir çözüm için bitshifting kullanmak daha doğru olacaktır. Yine de fikir vermesi açısından faydası olur umarım. ?

---- Mesajlar birleştirildi ----

Pardon terminal demişsin zaten, görmemişim. :) Bash scripting konusunda pek fikrim yok ne yazık ki. Yine de bakıştırayım biraz, yukardaki kodları bashe tercüme edebilirsem yazarım.
yaaa çok teşekkür ederim baya uğraşmışsın baya güzel çözmüşsün
 
Son düzenleme:

efec

Üyecik
Şu mantıkla yapabilirsin:
  • İşlem alınacak
  • İşlenenlerin ilk iki harfine bakılıp hangi türden olduğu anlaşılacak
  • İşlenenler üzerinde verilen sisteme göre işlem yapılacak

C:
/**
  *    İşlem numaralandırma:
  */
enum oper {
    OPER_ADD = 1,
    OPER_SUB,
    OPER_MULT,
    OPER_DIVD
};
enum operation_types {
    OPER_OCTAL,
    OPER_BINARY,
    OPER_HEXADECIMAL
};
/**
  *    Her bir işlem için yapı:
  */
struct operation {
    int operationType;
    int firstOperand; /* İlk işlenen */
    int operator; /* OPER_ADD, OPER_SUB, OPER_MULT, OPER_DIVD */
    int secondOperand; /* İkinci işlenen */
};

/**
  * Fonksiyon prototipleri:
  */
int convertBinary ( const char *p ); /* Verileni ikili sisteme dönüştür */
int convertHexadecimal ( const char *p ); /* Verileni 16'lık sisteme dönüştür */
int convertOctal ( const char *p ); /* Verileni 8'lik sisteme dönüştür */
/*----------------------------------*/
int operate ( struct islem *op ); /* işlemi yap */
 

Son mesajlar

Üst