Problem z konwersją typów danych w zadaniu o kalkulatorze

0

Witam, mam problem z zadaniem w którym mam utworzyć kalkulator. Chodzi o to że ma dodawać, odejmować, mnożyć i dzielić ale tak by działania odbywały sie na liczbach binarnych.Nie można używać tablic czy kolekcji.
W wyniku ma to mnie więcej tak wyglądać:

Podaj pierwsza liczbe: 5
Podaj druga liczbe: 2
Podaj operacje: +

5 - 00...0000 0101
2 - 00...0000 0010
7 - 00...0000 0111

Wydaje mi się że konwersja i dodawanie jest u mnie dobrze napisane bo starałem się wzorować na przykładach ale w dodawaniu jako argumenty mam używać stringów i tutaj właśnie mam problem, jak to napisać by działało poprawnie z argumentami jako string?

 public static void main(String[] args) {


        int val1 ;
        int val2;
        int val3;

        Scanner scanner = new Scanner(System.in);

        do {
            System.out.println("Podaj pierwszą liczbę: ");
            val1 = scanner.nextInt();
            System.out.println("Podaj drugą liczbę: ");
            val2 = scanner.nextInt();
            System.out.println("Podaj operacje: ");
            String option1 = scanner.next().toString();
            if (option1.equals("+")) {
                val3 = val1 + val2;
                convertToBinary(val1);
                convertToBinary(val2);
                addBinary(val1, val2);
            }
            if (option1.equals("-")) {
                val3 = val1 - val2;
            }
            if (option1.equals("*")) {
                val3 = val1 * val2;
            }
            if (option1.equals("/")) {
                val3 = val1 / val2;
            }
        }
            while (val1 != 0 && val2 != 0) ;
        }


    public static void convertToBinary(int number1){
        String binary = "";
        while (number1 > 0) {
            int d = number1 & 1;
            binary = d + binary;
            number1 = number1 >> 1;
        }
        System.out.println(binary);
    }

    static String addBinary(String a, String b)
    {
        String result = "";
        int s = 0;
        int i = a.length() - 1, j = b.length() - 1;
        while (i >= 0 || j >= 0 || s == 1)
        {
            s += ((i >= 0)? a.charAt(i) - '0': 0);
            s += ((j >= 0)? b.charAt(j) - '0': 0);
            result = (char)(s % 2 + '0') + result;
            s /= 2;
            i--; j--;
        }
        return result;
    }




0

w dodawaniu jako argumenty mam używać stringów i tutaj właśnie mam problem, jak to napisać by działało poprawnie z argumentami jako string?

Przecież Twoja funkcja addBinary() wykorzystuje już stringi.
Jeśli nie działa prawidłowo, podaj więcej szczegółów.

0

Mam błąd gdy próbuję wykorzystać tę funkcję, ponieważ pisze mi że wykrywa typ int a nie string gdy podaję mu argumenty, i nie wiem jak to przekształcić by poprawnie działało.

0

Znowu ...

Nie ma liczb binarnych czy trzynastkowych. Jest ich zewnętrza (znakowa) reprezentacja.

0

Sposoby które widziałem na dodawanie dwóch liczb binarnych, czy ich reprezentacji jak mowisz, polegały w większości na dodawaniu dwóch stringów nie licząc tablic, w takim razie jak to napisać żeby działało?

2

wykrywa typ int a nie string

I słusznie - sam przecież napisałeś:

int val1 ;
int val2;
int val3;

... czyli kompilator Cię nie okłamuje: Twoje zmienne faktycznie typu int.

Spróbuj zmodyfikować Twój kod tak, abyś mógł napisać:

if (option1.equals("+")) {
    String val1_bin = convertToBinary(val1);
    String val2_bin = convertToBinary(val2);
    String val3_bin = addBinary(val1_bin, val2_bin);

    System.out.println("  " + val1_bin);
    System.out.println("+ " + val2_bin);
    System.out.println("= " + val3_bin);
}
0

Dzięki zdołałem to teraz poprawić po twoich wskazówkach i już działa, ale czy mógłbyś mi wyjaśnić jak powinno się napisać resztę działań najlepiej na przykładzie tego dodawania, bo siedzę już nad tym z debugerem i rozpisałem se to na kartce, ale nie wiem jak to powinno wyglądać kiedy mam to liczyć binarnie.

0

Prosz - w pseudokodzie dodawanie będzie wyglądało mniej-więcej tak:

string add(string a, string b) {
  if a.length() != b.length() {
    throw "to jest ciekawy przypadek - zostawiam tobie do ogrania";
  }

  string output = "";

  int len = a.length() - 1;
  bool carry = false;

  while len >= 0 {
    bool digit_a = a[len] == '1';
    bool digit_b = (b[len] == '1') || carry;

    if digit_a || digit_b {
      output += "1";
    } else {
      output += "0";
    }

    carry = digit_a && digit_b;

    len -= 1;
  }

  if carry {
    output += "1";
  }

  return output.reverse();
}

:-)

0

Prubuję zrozumieć to co napisałeś i mam pewne problemy. Na kartce wychodzi mi już jak powinno wyglądać dodawanie, mnożenie i dzielenie, ale mam problem z odejmowaniem. Nie do końca rozumiem o co chodzi z pożyczaniem. Czy mógłbyś napisać jak powinno wyglądać takie odejmowanie jeśli się da to na przykładzie mojego dodawania, chyba że umiesz to jakoś prościej zrobić, i opisać co robisz w głównych miejscach?

0

chyba że umiesz to jakoś prościej zrobić, i opisać co robisz w głównych miejscach?

Pewnie bym potrafił, z tym że to nie jest moje zadanie domowe, a Twoje - mogę Ci z nim pomóc, nie odwalić za Ciebie :-)

Wrzuć proszę to, co udało Ci się wykombinować (odnośnie odejmowania) i pomyślimy co z tym dalej zrobić.

0

No ja właśnie prubuję zmienić to dodawanie na odejmowanie. Główna różnica jaka jest to fakt że muszę uwzględnić tą pożyszkę i odejmować, a nie dodawać tylko nie wiem jak to zrobić, ponieważ nie w pełni rozumiem zasadę działania pożyczki. Wydaje mi się ze zmiany muszą zajść w liniach ze znakiem zapytania tylko nie do końca wiem jakie.


static String SubtractBinary(String a, String b)
    {
        String result = "";

        int s = 0;

        int i = a.length() - 1, j = b.length() - 1;
        while (i >= 0 || j >= 0 || s == 1)
        {

            s += ((i >= 0)? a.charAt(i) + '0': 0); // ?
            s += ((j >= 0)? b.charAt(j) + '0': 0); // ?

            result = (char)(s % 2 + '0') + result; // ?

            s /= 2;

            i--; j--;
        }
        return result;

0

Prawdę mówiąc nie do końca rozumiem co Twój kod robi, lecz mniej-więcej chodzi o coś takiego:

bool borrow = false;

while (...) {
  bool bit_a = (i >= 0) ? (a.charAt(i) == '1') : false;
  bool bit_b = (j >= 0) ? (b.charAt(j) == '1') : false;

  // zastąpienie tych ifów zwięzłym wyrażeniem pozostawiam czytelnikowi
  if (borrow) {
    if (bit_a) {
      bit_a = false;
      borrow = false;
    } else if (bit_b) {
      bit_b = false;
      borrow = false;
    }
  } else {
    borrow = !bit_a && bit_b; // https://www.math-only-math.com/binary-subtraction.html :-)
  }

  bool new_bit = bit_a ^ bit_b; // https://www.math-only-math.com/binary-subtraction.html :-)

  if (new_bit) {
    result += "1";
  } else {
    result += "0";
  }

  i -= 1;
  j -= 1;
}

if (borrow) {
  throw "oj oj";
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1