Avatar uživatele
nikolqa.o

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

Zajímavá 0 před 3374 dny Sledovat Nahlásit



Nejlepší odpověď
Avatar uživatele
arygnoc

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

Upravil/a: arygnoc

0 Nominace Nahlásit

Další odpovědi
Avatar uživatele
jpau

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

Prohlédni si toto:
http://www.w3scho­ols.com/jsref/j­sref_push.asp
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.it­network.cz/ja­va-tutorial-list-pridavani-mazani-polozek

Upravil/a: jpau

0 Nominace Nahlásit


Avatar uživatele
setapouch

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.

Upravil/a: setapouch

0 Nominace Nahlásit

Avatar uživatele
Dochy

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.

0 Nominace Nahlásit


Diskuze k otázce
Avatar uživatele
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.TryPar­se(vstup, out i))
{
vstupUzivatele = i;
vsechnaCisla = Add(vsechnaCisla, i);
}
}
while (vstupUzivate­le !=0);

for (int i = 0; i < vsechnaCisla.Len­gth; 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.Len­gth;i++)
{
novePole [i] = starePole [i];
}
novePole [novePole.Length – 1] = vlozit;

return novePole;
}
}
}

před 3374 dny Odpovědět Nahlásit
Avatar uživatele
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

před 3374 dny Odpovědět Nahlásit
Avatar uživatele
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>.

před 3374 dny Odpovědět Nahlásit
Avatar uživatele
jpau

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

ArrayList<String> l = new ArrayList<Strin­g>();
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řed 3374 dny Odpovědět Nahlásit
Nový příspěvek
Zajímavé otázky v kategorii Počítače a internet