Wczytanie liczby bez importu żadnej z bibliotek

0

Witam!

Zbliża mi się wielkimi krokami sesja i osoba która układa nam egzaminy uwielbia utrudniać maksymalnie życie.

W związku z tym nie mogę sobie poradzić z prostą rzeczą:
Jak wczytać liczbę, potem zrobić na niej działanie, ale przy tym nie importować żadnej z bibliotek. Czyli Scanner automatycznie odpada.
System.in.read(); ma to do siebie że wywołuje mi liczby w ASCII, a na to nie mogę pozwolić.

Zna ktoś jakiś fajny sposób? Z góry dziękuje!

0

wywołuje mi liczby w ASCII

co masz na myśli?

a na to nie mogę pozwolić

dlaczego?

0

Ponieważ jak mam taki kod:

public static void main(String[] args) throws IOException 
    {
        int a;
        System.out.println("Wpisz a: ");
        a = (int) System.in.read();
        System.out.println(a);
    }
    
}

to do bufora wyjściowego po wpisaniu "1" trafia mi 49, po wpisaniu "2" trafia mi 50.

1

No to tylko siąść i płakać.
http://www.asciitable.com/index/asciifull.gif

0

Być może jest to trywialne, ale proszę was o nakierowanie mnie.
Jak przerobic ten kod aby działanie było prawidłowe:

 public static void main(String[] args) throws IOException 
    {
        int a;
        int b;
        int reset;
        System.out.println("Wpisz a: ");
        a = (int) System.in.read();
        do
        {
            reset = System.in.read();
        }
        while(reset != '\n');
        System.out.println("Wpisz b: ");
        b = (int) System.in.read();
        System.out.println(a-b);
    }
    
}

a wynosi 22
b wynosi 19

3
    public static void main(String[] args) throws IOException {
        System.out.println("Wpisz a: ");
        int character;
        int a = 0;
        while((character=System.in.read())!=-1 && character!='\n'){
            a*=10;
            a+=(character-'0');
        }
        System.out.println(a);
    }

Tak mniej więcej wygląda funkcja wczytująca jedną liczbę przy założeniu że podawanie liczby zakończone jest enterem albo EOFem.
Dostajesz znaki w postaci numerów ASCII więc najpierw przerabiamy znak na jego "wartość " przez odjęcie '0' (jak zauważyłeś 1 to 49, 2 to 50 itd, więc aby z tych 49 zrobić 1 odejmujemy '0' czyli 48). Następnie składamy liczbę z kolejnych cyfr które w ten sposób uzyskujemy. Mnożymy całość przez 10 (przesuwając sobie przecinek) a potem dodajemy nową cyferkę. W efekcie składa nam sie cała liczba. Pętle przerywamy jak dostaniemy znak '\n' albo -1 (czyli koniec wejścia).

0

Dziękuje Ci bardzo - co prawda nie bardzo to rozumiem, ale postaram się. Czy jest jeszcze jakiś prostszy sposób, ew. potrafisz to jeszcze bardziej łopatologicznie wytłumaczyć? _

1

A której części nie rozumiesz?

0

"Dostajesz znaki w postaci numerów ASCII więc najpierw przerabiamy znak na jego "wartość " przez odjęcie '0' (jak zauważyłeś 1 to 49, 2 to 50 itd, więc aby z tych 49 zrobić 1 odejmujemy '0' czyli 48)."

Najpierw liczba a jest zwiększana razy dziesięć, a potem odejmowana od zera. Tego nie rozumiem - bo na moja logike to powinno być na odwrót, no ale wtedy jest źle..
Czy mógłbyś zrobić ten sam warunek z użyciem pętli for albo do while?

3

Z użyciem pętli for? Nie, bo przecież nie wiem ile będzie cyfr do wczytania. I nie bardzo rozumiem co tu zmieni użycie innej pętli skoro ty nie widzisz że to '0' odejmuje od zupełnie czego innego niż to co mnożę przez 10. Może rozpiszę ci przykład bo będzie ciężko...
Podajesz na wejście 1234
1.
Na początku int a = 0
wczytujemy pierwszy znak więc character = '1' (czyli 49)
Mnożymy sobie aktualny wynik przez 10 więc a = 0
Odejmujemy sobie '0' (czyli 48) żeby sprowadzić nasze character do wartości liczbowej więc mamy 49-48 = 1 i to dodajemy do a -> a = 0+1 = 1
2.
a = 1
wczytujemy drugi znak więc character = '2' (czyli 50)
Mnożymy sobie aktualny wynik przez 10 więc a = 110 = 10
Odejmujemy sobie '0' (czyli 48) żeby sprowadzić nasze character do wartości liczbowej więc mamy 50-48 = 2 i to dodajemy do a -> a = 10+2 = 12
3.
a = 12
wczytujemy trzeci znak więc character = '3' (czyli 51)
Mnożymy sobie aktualny wynik przez 10 więc a = 12
10 = 120
Odejmujemy sobie '0' (czyli 48) żeby sprowadzić nasze character do wartości liczbowej więc mamy 51-48 = 3 i to dodajemy do a -> a = 120+3 = 123
4.
a = 123
wczytujemy czwarty znak więc character = '4' (czyli 52)
Mnożymy sobie aktualny wynik przez 10 więc a = 123*10 = 1230
Odejmujemy sobie '0' (czyli 48) żeby sprowadzić nasze character do wartości liczbowej więc mamy 52-48 = 4 i to dodajemy do a -> a = 1230+4 = 1234
5.
a = 1234
wczytujemy piąty znak więc character = -1 albo '\n' bo znaku nie ma, pętla sie kończy

0

O już zaczęło mi coś świtać! Dziękuje Ci bardzo za poświęcenie mi czasu na pomoc! Doceniam ludzi którzy mimo nerwów i sily wciąż poświęcają czas takim przysłowiowym "kretom" jak ja :D

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