IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Enigma
Člen
Avatar
Enigma:19.3.2021 18:10

Dobrý den, chci poradit ohledně úkolu do Javy, který jsem dostal od učitele.
Úkol je o tom, že na začátku programu uživatel zvolí libovolné číslo a toto číslo se rozdělí na cifry tak, že jedna cifra = jedna buňka pole, tak, aby byl přesný počet buňek. Zkoušel jsem už tento program vytvořit, ale bohužel neúspěšně. Pomocí jiných příkazů bych to zvládl vytvořit, ale já mám za úkol to vytvořit právě podle polí.
Vstup programu: 562
Výstup programu: 5,6,2
Předem děkuji za odpověď.

Zkusil jsem: import java.util.Scanner;

public class Poledomaciukol
{
public static void main(String[] args)
{
int[] pole;
pole = new int[x]

int x,y;
int cislo;
Scanner sc = new Scanner(System.in);
System.out.prin­t("Zadej číslo: ");
x=sc.nextInt();
for(y =0;x>1;y++)

String[] cislo = {};
Char[] cislo = number.toCharA­rray();

while(x>0)
{
x = x/10;

x++;
for(int i = 0; i<cislo.length; i++)

System.out.prin­t(cislo[i] + ",");

}
}
}

 
Odpovědět
19.3.2021 18:10
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Enigma
Alesh:19.3.2021 19:51

Předně kód zadávej pomocí tlačítka </> na horní liště.
Vypadat by to mohlo třeba nějak takto:

// Načti číslo rovnou jako text
Scanner sc = new Scanner(System.in);
System.out.print("Zadej číslo: ");
String vstup = sc.nextLine();

// Vytvoření pole pro jednotlivé znaky a jeho naplnění
String[] cisla = new String[vstup.length()];
for (int i = 0; i < vstup.length(); i++)
    cisla[i] = vstup.substring(i, i + 1);

// Výpis pole znaků
for (String cislo : cisla)
    System.out.print(cislo + ",");
 
Nahoru Odpovědět
19.3.2021 19:51
Avatar
Odpovídá na Enigma
Matúš Olejník:19.3.2021 20:06

Ahoj priamo zo Stringu to môžeš vytiahnuť najľahšie, do kódu som dal vysvetlenie a jednotlivé metódy hovoria sami za seba, keď tak sa pýtaj :)

public static void main(String[] args) {
    int[] resultArray;
    String inputNumber;
    Scanner sc = new Scanner(System.in);

    System.out.print("Zadej číslo: ");
    //nacitam cislo ako String
    //do pola mas dat len cifry tak zapornej hotnoty sa mozes zbavit
    inputNumber = String.valueOf(Math.abs(Integer.parseInt(sc.nextLine())))

    //ked uz poznam vstupne cislo mozem alokovat pole na zaklade dlzky cisla
    resultArray = new int[inputNumber.length()];

    //zacnem prechadzat jednotlive cifry (pismena)
    for(int i = 0; i < resultArray.length; i++){
        resultArray[i] = Character.getNumericValue(inputNumber.charAt(i));
        //alebo
        //resultArray[i] = Integer.parseInt(String.valueOf(inputNumber.charAt(i)));
    }

    System.out.println(Arrays.toString(resultArray));
}

Vídím však, že ty chceš načítať rovno číslo a potom cez delenie dostať jednotlivé cifry. Ideš na to celkom fajn len treba modulom 10 získať cifru a potom vydelením 10 zmenšiť dané číslo o jeden rád.

public static void main(String[] args) {
    int[] resultArray;
    int inputNumber;
    Scanner sc = new Scanner(System.in);

    System.out.print("Zadej číslo: ");
    //do pola mas dat len cifry tak zapornej hotnoty sa mozes zbavit
    inputNumber = Math.abs(Integer.parseInt(sc.nextLine()));

    //ked uz poznam vstupne cislo mozem alokovat pole na zaklade poctu cifier cisla
    resultArray = new int[getCountOfDigitsOfNumber(inputNumber)];
    //alebo
    //resultArray = new int[String.valueOf(inputNumber).length()];

    //ked uz poznam pocet cifier tak mozem pouzit for cyklus
    //obratis cyklus nech mas cifry tak ako su v poradi v cisle
    for(int i = resultArray.length - 1; i >= 0; i--){
        resultArray[i] = inputNumber % 10; //ziskam cifru
        inputNumber = inputNumber / 10; //zmensim cislo o jeden rad
    }

    System.out.println(Arrays.toString(resultArray));
}

/**
 *
 * @param number to get count of digits
 * @return count of digits in input number
 */
private static int getCountOfDigitsOfNumber(int number){
    int digitCount = 0;
    int tmpNumber;

    while(true){
        digitCount++;

        tmpNumber = number / 10;
        if(tmpNumber == 0){
            break;
        }
        number = tmpNumber;
    }

    return digitCount;
}
Nahoru Odpovědět
19.3.2021 20:06
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Petr Štechmüller:19.3.2021 22:08

Ahoj, jenom pro zajímavost, ta tvoje první verze se dá napsat na 3 řádky:

public static void main(String[] args) {
    try (Scanner scanner = new Scanner(System.in)) {
        // načtu číslo
        final String s = Long.toString(Math.round(Double.parseDouble(scanner.nextLine())));
        // největší magii tu udělá metoda split, která přijímá jako parametr prázdný řetězec
        System.out.println(Arrays.toString(s.split("")));
    }
}
Nahoru Odpovědět
19.3.2021 22:08
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Matúš Olejník:19.3.2021 22:24

Rozmýšľal som či pôjde tak ten split použiť a zabudol som skúsiť :D Mohol si dať to parsovanie a vypisovanie rovno do jedného riadku :D Chcel som to podľa zadania napasovať do int pola :)

int[] ints = Arrays.stream(String.valueOf(Math.abs(Integer.parseInt(scanner.nextLine()))).split("")).mapToInt(Integer::parseInt).toArray();
Nahoru Odpovědět
19.3.2021 22:24
/* I am not sure why this works but it fixes the problem */
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Matúš Olejník
Alesh:19.3.2021 23:06

To umím taky, napsat to na jeden řádek! :-D :-D :-D

Scanner sc = new Scanner(System.in); System.out.print("Zadej číslo: "); String vstup = sc.nextLine(); String[] cisla = new String[vstup.length()]; for (int i = 0; i < vstup.length(); i++) cisla[i] = vstup.substring(i, i + 1); for (String cislo : cisla) System.out.print(cislo + ",");
Editováno 19.3.2021 23:07
 
Nahoru Odpovědět
19.3.2021 23:06
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Matúš Olejník
Lubor Pešek:24.3.2021 9:05

A nebylo by jednodušší tohle? (a máš to také na 3 řádky)

String text = new Scanner(System.in, "UTF-8").nextLine();
String[] result = text.matches("\\d+") ? text.split("") : null;
System.out.println(Arrays.toString(result));
Nahoru Odpovědět
24.3.2021 9:05
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Enigma
Lubor Pešek:24.3.2021 9:20

Tak řešení bys sice možná měl, ale mě popravdě hodně zaráží ten tvůj "výtvor".
Prosím tě, na které škole učí takhle programovat? To je katastrofa na každém řádku...
Bez urážky, ale jde vidět, že nechápeš smysl pole, nechápeš cykly a hlavně je šílenství jak to zapisuješ.
Třeba hned ten začátek - nejdřív si deklaruješ pole, ve kterém provoláváš neexistující proměnnou, kterou si deklaruješ o řádek níž.
Buď vás to "učitel" nutí psát v texťáku, nebo nechápeš, co to znamená, když ti IDE podtrhne příkaz, ale vždyť takhle jak to máš, tak ti musí každé IDEčko minimálně podtrhnout hned první řádek, protože vytváříš pole o velikosti neexistující proměnné x.

Další na co koukám, tak ty tvoje cykly. For ve whilu ve foru, kde první for je závislý na whilu.

Potom tady tohle:

String[] cislo = {};
Char[] cislo = number.toCharArray();

Vždyť ti opět musí IDEčko křičet, že se jednak snažíš použít stejnojmennou proměnnou a hlavně že používáš nějakou proměnnou number, která neexistuje.

Pak se snažíš dělit ta čísla jenom deseti (také netuším proč, když v zadání nic takového nemáš)

Jako je to paskvil a slátanina náhodně použitých příkazů na různých místech a naprosto nedává smysl jediný řádek. Možná tak ty dva - pro scanner a výpis textu.

Buď si projdi zdejší tutoriály, vykašli se na to, co ti říká ten "taky učitel" a nebo si domluv někoho, kdo tě to doučí (jestli chceš, rád ti s tím pomůžu), každopádně toto jsou naprosto šílené nedostatky a přiznám se, že jsem za celý život nikdy neviděl takovou hrůzu, co jsi tu předvedl.

Nahoru Odpovědět
24.3.2021 9:20
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.