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í.
ohodnoťte nejlepší odpověď symbolem palce
Zajímavá 0 před 3584 dny |
Sledovat
Nahlásit
|
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 |
Jestli jsem tě správně pochopil tak Tvůj problém je to pole.
Prohlédni si toto:
http://www.w3schools.com/jsref/jsref_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.itnetwork.cz/java-tutorial-list-pridavani-mazani-polozek
Upravil/a: jpau
0 Nominace Nahlásit |
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 |
Několik možností (jo a v javě jsem už moc dlouho nic nedělal, tak to bude trochu obecné):
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 |
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;
}
}
}
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ř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>.
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)
Bedy | 1528 | |
Michal Kole | 1199 | |
led | 1156 | |
Hlada | 1131 | |
mosoj | 1124 | |
gecco | 904 | |
www | 828 | |
badisko | 817 | |
cochee | 814 | |
Dochy | 725 |
Software |
Hardware |
Internet |
Programování a webdesign |
Sítě |
Bezpečnost |
Ostatní počítače a internet |