Problem z programem przeliczającym liczby binarne na dziesiętne

0

Witam wszystkich na forum.
Niestety mój pierwszy post będzie dotyczył problemu, a nie radosnego powitania na forum.
Rozumiem, że zapewne zrobiłam wiele nieetycznych błędów podczas pisania kodu, ale już nie mogę sobie z nim poradzić a jedyny komunikat jaki dostaję od Eclipse'a to, że nie odnajduje main Class.
Nad programem siedzę od kilku dni i kompletnie nie umiem go przegryźć. Mam problem z przypisywaniem danych do tablicy w pętli i liczniku. Kompletnie nie potrafię skorygować swojej niewiedzy i znaleźć odpowiedzi na sto pytań które tworzą mi się w głowie. (do nauki programowania dostałam bardzo słabe materiały, które dosyć niezrozumiałym językiem pochopnie oceniając zdolności poznawcze czytelnika, gnie przez zadania. Nie ma w nim opisanych bibliotek itd. Materiałów szukam na youtube, i na forach, ale poległam.)
Metoda prób i błędów zmusiła mnie do napisania tego poniżej i ostatecznego, dosyć niechętnego zwrócenia się o pomoc do was.

 import java.util.Scanner;

public class SystemDziesietnyNaDwojkowy {



	static void  konwersja(String liczba, int tablica[], int i,int x,int y, int j, int length, int binarna){
		// na podstawie długości liczby ustawiam licznik
	for (i=0; i == length -1;i++){
			//pozycja w Stringu, będzie pozycją w tabeli		
		tablica[i] =  Integer.parseInt(liczba.substring(i));;
		}
		System.out.println(tablica[i]);
	// przeliczam kolejno z systemu binarnego na dziesietny i dodaje do siebie liczby
		for(j=length;j==0;j--){
		 binarna += tablica[i] * Math.pow(2, i);
		 }
		 	
	System.out.println(binarna);
		}
	

	
			
	
	public static void main(String[] args) {
		// tutaj wartosci zmiennych maja zera bo.... bo eclipse się na to uparł i w sumie to chyba z głupoty je zmieniłam. Ogólnie i bez zmiany program nie akceptował wywołania metody
		int tablica[] = null;
		int i = 0,j = 0,x = 0 ,y = 0, binarna = 0;
		
		Scanner in = new Scanner(System.in);
		System.out.println("Podaj dodatnią liczbę binarną");
		String liczba  = in.next();
		int length = liczba.length();
		
	konwersja(liczba, tablica, length, j, binarna, y, x, i);
		}
	}

Mam nadzieję, że wkleiłam dobrze kod, w razie czego poprawię się!

Pozdrawiam

1

Nie potrzebujesz tyle parametrów, metode konwersji można napisać np. tak :)

 	public static int konwersja(String liczba)
	{
		int bin = 0;
		int j = liczba.length();
		for(int i = 0; i < liczba.length(); i++)
		{
			int temp = (int) liczba.charAt(i) - 48;
			bin = (int) (bin + temp * Math.pow(2, j - 1));
			j--;
		}
		return bin;
	}
1

metodę main masz więc jaki dokładnie błąd masz (tym bardziej że kod się kompiluje). Gorzej z działaniem bo wywala np. NullPointerException ale to nic dziwnego ponieważ masz takiego stworka:

 int tablica[] = null;

a po chwili:

  konwersja(liczba, tablica, length, j, binarna, y, x, i);

i fajnie tylko że ta tablica nie ma zadeklarowanej wielkości... czyli jest nulem...

po co Ci w metodzie konwersja parametry takie jak int i,int x,int y, int j skoro z nich w metodzie nie korzystasz?

1

Sprobuj jeszce prościej, pseudokod:

 
  def toStr(n: integer, base: integer):
    convertString = "0123456789ABCDEF"
    if n < base:
        return convertString[n]
    else:
        return toStr(n // base, base) + convertString[n % base]

Operator // to dzielenie w integerach, 5 // 2 = 2, 3 // 4 = 0, czyli ścina resztę. W returnie "+" to string concatenation, w javie trzeba będzie znaleźć odpowiednia metodę. Oczywiście funkcja toStr będzie zwracać string: String toStr(int n, int base){ /* kod */} . Jak to działa, jak liczba jest mnijesza niż baza to zwraca odpowiednią cyfrę, to oczywiste; jak nie to rekurencyjnie wywołuje toStr od intdiv n przez bazę i dodaje odpowiedni convertString. Prześledź to sobie dla jakiejś prostej konwersji np od 10, 2. Nauka rekurencji w bonusie:)0-
0
rafal20-1988 napisał(a):

metodę main masz więc jaki dokładnie błąd masz (tym bardziej że kod się kompiluje). Gorzej z działaniem bo wywala np. NullPointerException ale to nic dziwnego ponieważ masz takiego stworka:

 int tablica[] = null;

a po chwili:

  konwersja(liczba, tablica, length, j, binarna, y, x, i);

i fajnie tylko że ta tablica nie ma zadeklarowanej wielkości... czyli jest nulem...

po co Ci w metodzie konwersja parametry takie jak int i,int x,int y, int j skoro z nich w metodzie nie korzystasz?

Wyrzuciłam nulla, usunęłam zbędne zmienne... A program dalej nie chce się obudzić. :/

import java.util.Scanner;

public class SystemDziesietnyNaDwojkowy {






	public static int konwersja(String liczba)
    {
        int bin = 0;
        int j = liczba.length();
        for(int i = 0; i < liczba.length(); i++)
        {
            int temp = (int) liczba.charAt(i) - 48;
            bin = (int) (bin + temp * Math.pow(2, j - 1));
            j--;
        }
        return bin;
    }

	
			
	
	public static void main(String[] args) {
		
		int tablica[] ;
		int binarna;
		
		Scanner in = new Scanner(System.in);
		System.out.println("Podaj dodatnią liczbę binarną");
		String liczba  = in.next();
		int length = liczba.length();
		
	konwersja(liczba);
		}
	}
 
1

Co znaczy "nie chce się obudzić"? bo u mnie się kompiluje i uruchamia (pomijam kwestie poprawnego działania). Może w Eclipse wywaliłeś przypadkiem/specjalnie jakieś pliki z projektu i dlatego nie możesz odpalić go?

2

Jeśli chodzi o "Error: Could not find or load main class SystemDziesietnyNaDwojkowy" to prawdopodobnie spowodowane jest to tym że nazwa klasy w której znajduję się funkcja main jest różna od nazwy pliku.

0
rafal20-1988 napisał(a):

Co znaczy "nie chce się obudzić"? bo u mnie się kompiluje i uruchamia (pomijam kwestie poprawnego działania). Może w Eclipse wywaliłeś przypadkiem/specjalnie jakieś pliki z projektu i dlatego nie możesz odpalić go?

Rzeczywiście coś wywaliłam przez przypadek. Już przepisałam na nowo i się odpala. dziękuję.

0
7wojok7 napisał(a):

Jeśli chodzi o "Error: Could not find or load main class SystemDziesietnyNaDwojkowy" to prawdopodobnie spowodowane jest to tym że nazwa klasy w której znajduję się funkcja main jest różna od nazwy pliku.

Nazwa klasy się zgadzała, ale i tak już przepisałam od nowa. Dziękuję za pomoc!

0
7wojok7 napisał(a):

Nie potrzebujesz tyle parametrów, metode konwersji można napisać np. tak :)

 	public static int konwersja(String liczba)
	{
		int bin = 0;
		int j = liczba.length();
		for(int i = 0; i < liczba.length(); i++)
		{
			int temp = (int) liczba.charAt(i) - 48;
			bin = (int) (bin + temp * Math.pow(2, j - 1));
			j--;
		}
		return bin;
	}

A jednak taka metoda nie działa poprawnie. Liczby do 6 przelicza prawidłowo. Powyżej już nie.Możesz mi wytłumaczyć jeszcze czemu odejmujesz tam w metodzie liczbę 48?

0

Ostatecznie kod udało mi się skończyć za waszą pomocą i główny problem za pomocą pomysłu @7wojok7 wygląda tak:

(Może ktoś będzie kiedyś podobnego rozwiązania szukał, więc wrzucam)

 	public static int konwersja(String liczba)
    {
        int bin = 0;
        int j = liczba.length();
        for(int i = 0; i < j; i++)
        {
            if(liczba.charAt(i)== '1')
            {
                bin =(int) (bin+ Math.pow(2,liczba.length()-1-i));
        }
            }
        return bin;
    }

Dziękuję raz jeszcze za pomoc wszystkim i przepraszam za chaotyczne odpowiedzi na forum. Następnym razem mam nadzieję, że już nie będzie trzeba mnie odsyłać do zasad pisania postów.

Pozdrawiam

0

Jakby ktoś jeszcze szukał, to podaję krótsze rozwiązanie:

int bin = Integer.parseInt(liczba,2);

W przypadku błędnego argumentu liczba moje rozwiązanie rzuci wyjątek NumberFormarException,
rozwiązanie z poprzedniego postu zwróci błędny wynik:

konwersja("abc105") = 4
konwersja("10001111111111111111111111111111111111111111111111111111111111111") = 2147483647
0

@SahneMild 48 odejmuje gdyż wartość dla zero w tablicy to 48, analogicznie dla 9 to 57. Link do tablicy https://unicode-table.com/en/

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