Avatar uživatele
Pokročilý

Jak uložit čísla do proměnné v Javě ?

Dobrý den,
řeším z nudy jeden příklad z programování (zdál se mi na první pohled jednoduchý, ale sekla jsem se hned na začátku).

Potřebuji nějakým způsobem ukládat kladná sudá čísla zadávaná uživatel do proměnné tak dlouho, dokud uživatel nezadá číslo 0.

Jako vstup mají být zadávány pouze sudá čísla potřebná k dalšímu výpočtu (nic jiného).

Chtěla jsem to zkusit uložit do pole, ale to by vyžadovalo vědět, kolik čísel mi uživatel zadá a to já nevím.

Nevíte prosím někdo, jak na to ? Sedím u toho už od rána a nic už mě nenapadá. Děkuji za pomoc.
Doplňuji:
Můj problém je ten, že nevím kam a jak ty čísla co zadává uživatel uložit.

Zadání příkladu vypadá nějak takto:
Na vstupu je několik čísel. Každý případ se skládá z jediného přirozeného čísla na samostatné řádce. Vstup je ukončen číslem 0 na samostatné řádce. Tak že vstup by měl vypadat nějak takto:
10
18
44
0

A já potřebuji čísla 10, 18 a 44 někam uložit v průběhu toho, co je uživatel zadává, ale já nevím jak ani kam.

Vždy jsem plnila pole tak, že mi uživatel zadal velikost pole a pole jsem potom naplnila v cyklu, ale to u tohoto příkladu (nejspíš) nejde, protože mi uživatel nemůže zadat velikost pole, ale pouze čísla, která mi to pole naplní.

Uzamčená otázka – ohodnoťte nejlepší odpověď symbolem palce.

Nejlepší odpověď

Avatar uživatele
Zlatý

musíte deklarovať pole, do ktorého sa budú čísla ukladať:

Integer[] MenoPola = new Integer[128];

miesto 128 aj iné číslo, možno dklarovať i premennou:

int pocetPoloziek;
pocetPoloziek = 8;
int[] Pole = new int[ pocetPoloziek ];

;-Q
Doplňuji:
aha, po prečítaní celej otázka (no, som to odflákol):

pred zadávaním vstupu radu čísiel zadajte otázku pre počet vkladaných čísiel .

prakticky ide o potrebu nekonečného poľa, čo nie je riešiteľné (číslo 0 nemusá byť vložené nikdy), pole i jeho veľkosť musí byť deklarované pred jeho použitím.

potom sa už ponúka riešenie pomocou zípisu do súboru (ale aj ten nesmie byť nekonečne veľký).

treba riešiť podmienkou, že do istého počtu (veľkosť poľa či súboru) číslo 0 vložené byť MUSÍ.

;-Q

 

Další odpovědi:

Avatar uživatele
Bronzový

Jestli jsem tě správně pochopil tak Tvůj problém je to pole.

Prohlédni si toto:
http://www.w3schools.com/…
Doplňuji:
Sry. blbě jsem si doplnil Java (+ Script) :-O. Použil bych list, typ si vyber podle toho s jakým číslem (velikost) chceš dělat. Do detailů se pouštět nebudu, Javu nepíšu, nechci uvádět nepřenosti, podíval bych se na článek níže...

http://www.itnetwork.cz/…


Avatar uživatele
Stříbrný

Vytvorsi pole o libovolne pocatecni velikosti (optimalni je jedna). Po zadani cisla uzivatelem zkontroluj velikost pole a pocet prvku v nem. Pokud je pocet prvku rovny velikosti pole, vytvor pole nove o velikosti [puvodnivelikost+1] a stare do nej prekopiruj. Pokud bude vysledna veliost pole vetsi nez pocet prvku (napr. das prilis velkou pocatecni hodnotu), muzes analogicky pole zmensit, abys "na konci" nemela "nullove" hodnoty.
Doplňuji:
Arygnoce nesmis brat vazne, je to takovy mistni exot a jediny soutezici v soutezi o nejvice kontraproduktivni odpoved.


Avatar uživatele
Stříbrný

Několik možností (jo a v javě jsem už moc dlouho nic nedělal, tak to bude trochu obecné):
1. Uvědomíš si, jaká je naximální možná délka toho seznamu čísel a podle toho pole nadeklaruješ
2. Java by měla znát "dynamické pole" kde si délku mění podle toho jak o plníš
3. Místo pole použiješ spojový seznam. Je to konstrukce, kde každý prvek nese svou hodnotu a adresu dalšího prvku. V programu musíš mít poznamenánu adresu prvního prvku a pokud s polem pracuješ tak i adresu pro tebe aktuálního (při přidávání obvykle posledního) prvku. Pro každé další číslo vytvoříš novou buňku, její adresu zapíšeš do dosud poslední buňky, poznamenáš si, že aktuální poslední buňka je ta nová....
Ve spojovém seznamu se snadno postupně prochází číslo po čísle dopředu, pokud uděláš oboustraně zřetězený seznam tak i zpět. (čtení další/předchozí buňky, přidání/odstranění buňky). Je ale na rozdíl od pole problematické zjistit hodnotu třeba stopadesátedruhé buňky (musíš postupně načíst všech 152 buněk aby ses k té správné dostal)

Moc se mi nelíbí ta možnost pro každé další číslo založit nové pole o 1 větší. Pro ručně zadávaná čísla je to řešení, ale v principu se zbytečně velkou složitostí. A pokud se toto naučíš dělat a pak použješ v jiném případu kdy těch čísel bude moct být opravdu hodně, máš zaděláno na problém.

 

Diskuze k otázce

Avatar uživatele
Stříbrný

setapouch

Priklad v C#

using System;

namespace nikolqao
{
class MainClass
{
public static void Main (string[] args)
{
int[] vsechnaCisla = new int[0];

int vstupUzivatele = 0;
do
{
int i = 0;
string vstup = Console.ReadLine();
if(int.TryParse(vstup, out i))
{
vstupUzivatele = i;
vsechnaCisla = Add(vsechnaCisla, i);
}
}
while (vstupUzivatele !=0);

for (int i = 0; i < vsechnaCisla.Length; i++)
Console.WriteLine ("{0}", vsechnaCisla[i]);
}

private static int[] Add(int[] starePole, int vlozit)
{
int[] novePole = new int[starePole.Length + 1];
for(int i = 0; i < starePole.Length;i++)
{
novePole [i] = starePole [i];
}
novePole [novePole.Length - 1] = vlozit;

return novePole;
}
}
}

Avatar uživatele
Zlatý

arygnoc

nápad je dobrý, len si neviem predstaviť načítanie starého poľa do nového pri astronomických rozmeroch poľa (nezabúdajme na alokáciu priestoru pri tvorbe poľa nového počas existencie starého - dvojnádobný nárok na vyhradený priestor pri požiadavku vytvorenia nova poľa [staré pole+1], a to nhovorím o 'strojovom čase' - ako dlho to potrvá, ako dlho bude musieť užívateľ čakať na možnosť vloženia nového údaju/čísla).

ako hovorím, nápad je to dobrý (palec hore), ale má svoje hranice.

efektívnejšie sa mi v tomto prípade zdá ukladanie dát do súboru - netreba ich stále načítať, iba ich pripisovať a pri potrebe rekonštrukcie zadávania súbor načítať.
nehovoriac o nárokoch na pamäť.

;-Q

Avatar uživatele
Stříbrný

setapouch

Při sto milionu prvků v poli se dostávám na cca 790 MB RAM, které si bere aplikace podle Task Manageru (vlastní kopírování pole si bere cca 38 MB a trvá cca 0,8 s.

Takže pokud je možné se domnívat, že počet prvků v poli může narůstat do stovek miliónů (generovaný vstup, u manuálního je to téměř vyloučené - i kdyby zadání trvalo desetinu sekundy, pak se bavíme o stovce let), kdy by mohlo dojít k vyčerpání volné paměti, pak by bylo nutné volit jiné řešení. Osobně bych doporučil databázi kvůli škálovatelnosti (přijde požadavek na kontrolu vložených čísel...), ale vcelku je to jedno, při ukládání po sto tisících už jde o slušné množství dat, které člověk těžko manuálně zadá a je to stále dostatečně rychlé, na mém klasickém disku 0:00.020 - 0:00.050 s. Pro zajímavost, zápis (na jedno otevření souboru) deseti milionů prvků do souboru trval 3,4 s. Sto milionů prvků najednou mi padalo na OutOfMemory při přípravě zápisu :)

Mimochodem, stále mluvím o C#. Javu moc neznám a vůbec v ní nedělám. A na kopírování polí vnitřně pracuje List<T>.

Avatar uživatele
Bronzový

jpau

VYKOPÍROVAL JSEM z odkazu co jsem uvedl (ten druhý) následující kus kódu:

ArrayList<String> l = new ArrayList<String>();
l.add("První");

Tak teď první otázka. Uživatel to asi zadává jako string, chceš to jako string zadávat? Pokud jo, tak je to co jsem VYKOPÍROVAL přesně to co potřebuješ. Pokud ne, tak bych zkusil třeba něco takového:

ArrayList<int> l = new ArrayList<int>();
l.add(10);
l.add(18);
l.add(44);
l.add(0);

List není pole. Přečti si ten článek z itnetwork.

(ještě jednou opakuji, nepíšu Javu, tzn. to nemám v čem zkusit a dělám jen to co máš udělat ty - podívám se jak se to píše a přiohnu to podle toho, co potřebuji)

 

Přihlásit se

Položte otázku, odpovězte, zapojte se, …

začněte zde

Reklama

Kvalitní odpovědi v: Počítače a internet

Zlatý Bedy 1525
Zlatý Michal Kole 1198
Zlatý mosoj 1028
Zlatý Hlada 949
Zlatý ge0rge 894
Zlatý www 829
Zlatý led 819
Zlatý badisko 818
Zlatý gecco 795
Zlatý arygnoc 674

Zobrazit celkový žebříček

Facebook

 

Váš požadavek se vyřizuje, počkejte prosím.