Nejste přihlášen/a.

Přihlásit se do poradny

 

Jak na tento úkol z programování?

Od: anm odpovědí: 5 změna:

Dobrý den,

chtěl bych se zeptat, jakým způsobem by to šlo v Javě řešit bez použití pole? Nejsem si jistý, jestli to zadání chápu, má se udělat for cyklus, který bude tvořit tu řadu a pak zjistit, jestli se tam nějaké číslo neopakuje? ... to ale nejde bez pole, že? a když to bude for cyklem, tak se tam opakovat nebudou nebo se mají zadávat na vstupu od uživatele, ale to bych zase musel mít 100 proměných k porovnávání, ne?

zadání: ctrlv.cz/...

Mimochodem, jak probíhaly hodiny programování u Vás, my dostanem zadání, většinou nikdo nic nevymyslí, občas dostanem řešení a jde se dál :/ Většinou dostáváme úlohy matematický nebo nějak změřený na logiku, takže nikdo neví :D Myslíte, že se takhle dá něco naučit a jak jste se to učili vy, taky na takových úlohách?

Děkuji za radu.

PS. Takhle jsem to udělal v tom poli: http://ctrlv.cz/QdTF

 

 

5 odpovědí na otázku
Řazeno dle hodnocení

 

 

qwert
hodnocení

1x
1) Vždycky si budete muset ukládat informaci, která čísla už byla použita. Můžete je dávat do pole, můžete je dávat do jiné struktury, ale na celkovém pojetí se tím mnoho nezmění.

2) Vaše řešení mi přijde v pořádku, ale nezávisle na použitém algoritmu bych doporučil:

a) Na nulu testovat ještě před hledáním duplicit, ne až potom.

b) Ověřovat, že skutečně přišlo kladné číslo.

c) Nevypisovat před každým číslem hlášku "Číslo: " (není chyba, že to děláte, ale já bych to nedělal, vypsal bych jednu hlášku na začátku a pak už jen četl).

d) Měl byste testovat, že vám opravdu přišla nějaká nula. Pokud ne, měl byste vypsat chybovou hlášku, že data neodpovídají zadání. Váš současný program po 100 číslech tiše skončí a uživatel se nedozví, že udělal chybu v zadání.

3) K efektivitě algoritmu:

a) Doporučoval bych použít vhodnější datovou strukturu, např. mapu (Map<...>).

b) Pokud trváte na poli, doporučoval bych spíš načíst všechna čísla, pak pole seřadit a jedním lineárním průchodem otestovat, jestli obsahuje duplicity. Bude to mít lepší složitost (n*log n namísto n^2). Ale pro max. 100 čísel je to jedno.

4) Ano, chcete používat cyklus a nějaké jedno úložiště. Vytvářet si sto samostatných proměnných by byl nesmysl.

5) Nepíšete nic o tom, na jakém typu školy jste. Můj osobní názor je, že pokud nejste škola vysloveně zaměřená na IT, tak programování nemá moc smysl, protože velká většina ze studentů stejně nikdy programovat nebude. Přišlo by mi užitečnější, kdybyste se učili např. pořádně pracovat s textovým procesorem nebo s tabulkovým kalkulátorem. Ale pokud dostáváte úlohy zhruba toho charakteru, jako ukazujete v otázce, a zároveň se u vás moc nehrotí, jestli to dotáhnete do konce, tak není špatné, když si takovéhle základy algoritmizace vyzkoušíte - ty se hodí i jindy než při programování.

6) Proč dostáváte "úlohy matematický nebo nějak změřený na logiku"? Protože takové úlohy jsou osekané na úplnou dřeň a nezůstává v nich nic, co by vás rozptylovalo právě od té algoritmizace. Jakmile byste měli řešit praktičtější úlohy, tak budete muset pracovat s množstvím věcí okolo, které s problémem vlastně nesouvisí. Pro ty byste pak muslei mít znalosti, které se nedají očekávat, že všichni máte, zatímco v nějakou základní inteligenci a v pochopení principu "když mám složitý úkol, tak ho rozdělím na posloupnost jednodušších" se dá doufat u všech. Nepochybuji, že byste to také všichni zvládli, kdybyste ovšem většinově nepřijali přístup "je to matematika nebo logika, tak nad tím nebudu ani přemýšlet" - že se ty úlohy vyřešit dají ukazuje už to, že jste s řešením přišel.
anm
hodnocení

Dobrý den, děkuji za rady, jdu to opravit :) Je divné, že jsme dostali úkol na pole, které jsme ještě neuměli, aspoň jsem se ho naučil: :D Já myslím, že ta škola je zaměřená na IT a na elektrotechniku a strojírenství.

Jako nějaké řešení se třeba vymyslí, ale není úplně optimální, i když je dobře. Třeba: měli jsme udělat program, který bude převracet číslo (vstup - 321 => výstup 123) já jsem udělal tohle, což je sice funkční, ale oproti tomu správnému řešení je o dost složitější a řekl bych, že i pomalejší. moje: ctrlv.cz/... a správné řešení: ctrlv.cz/...

Ještě jednou děkuji za pomoc

 

hodnocení

1x

Me prijde ze delate neco jineho nez je v zadani. Jsou nejaka cisla, nerika se odkud se vezmou, tudiz bych je klidne hardcodoval a nenacital je z klavesnice. A ma se zjistit jestli se nejake cislo se opakuje. Ani neni uvedeno ze to opakujici se cislo se ma vypsat (pokud by bylo nutne, asi bych to upravil na pouziti Collectos.groupingBy).

Treba neco takoveho:

------------------------------------------------------------

import java.util.stream.IntStream;

public class DuplicatedNumbersDemo {

public static void main(String[] args) {
System.out.println("duplicated number found?: " + (isAnyNumberDuplicated());
System.out.println("duplicated number found?: " + (isAnyNumberDuplicated(1,2,3));
System.out.println("duplicated number found?: " + (isAnyNumberDuplicated(1,2,3,4,4,5));
}

private static boolean isAnyNumberDuplicated(int... numbers) {
long countOfDintinctNumbers = IntStream.of(numbers)
.distinct()
.count();
return !(numbers.length == countOfDintinctNumbers);
}

}

-------------------------------------------

Vystup:

duplicated number found?: false
duplicated number found?: false
duplicated number found?: true

anm
hodnocení

Děkuji, ale my jsme se ještě neučily metody :) jenom základy, maximálně to pole :)

 

hodnocení

0x
avatar db47

Pole sice použít nesmíte, ale o použití množiny neboli HashSetu není žádná zmínka. Tudíž lze toho využít. Set je takový objekt, funguje de facto jako pole, ale každá hodnota v něm může být právě jen jednou. Takže i kdybych se pokusil do množiny dát 50x číslo "1", bude mít množina délku 1 a obsahovat jediný prvek a to číslo "1".

Pokud tedy stačí jen odpověď, že na vstupu je nějaký duplikát, ale není třeba vědět jaký, pak množina naprosto stačí. Nechám zapsat všechny hodnoty ze vstupu do množiny a pak jen porovnám délku vstupního pole a množiny. Pokud budou různé, tak množina zahodila nějaký duplikát a je jasné, že tam nějaký musel být, pokud bude množina stejně velká jako vstupní pole, pak všechny hodnoty musely být unikátní. Samozřejmě mohl jsem tam přidat validaci, že pole nad 100 prvků vyhodí výjimku nebo vypíše do konzole chybovou hlášku.

------------------------------------------

public static void main(String[] args) {

int[] test = {0, 1, 1, 3, 4};

if (containsDuplicate(test)) {
System.out.println("Pole obsahuje duplikáty");
} else {
System.out.println("Pole NEOBSAHUJE duplikáty");
}

}

public static boolean containsDuplicate(int[] inputArray) {

Set uniqueNumbers = new HashSet();

for (int i = 0; i < inputArray.length; i++) {
uniqueNumbers.add(inputArray[i]);
}

if (uniqueNumbers.size() == inputArray.length) {
return false;
} else {
return true;
}

}

------------------------------------------

Výstup: Pole obsahuje duplikáty

------------------------------------------

Pokud je cílem udělat kompletní výpis výskytů, pak je vhodné řešení HashMap

public static void main(String[] args) {

int[] test = {0, 1, 1, 3, 4};

Map<Integer,Integer> occurenciesList = countOccurencies(test);

for (Map.Entry<Integer, Integer> entry : occurenciesList.entrySet()) {
Integer number = entry.getKey();
Integer occurencies = entry.getValue();
System.out.println("Číslo " + number + " se vyskytuje v poli celkem: " + occurencies + "x");
}

}

public static Map<Integer, Integer> countOccurencies(int[] inputArray) {

Map<Integer, Integer> occurencies = new HashMap<>();

for (int i = 0; i < inputArray.length; i++) {
if (occurencies.containsKey(inputArray[i])) {
occurencies.put(inputArray[i], occurencies.get(inputArray[i]) + 1);
} else {
occurencies.put(inputArray[i], 1);
}
}
return occurencies;
}

------------------------------------------

Výstup:

Číslo 0 se vyskytuje v poli celkem: 1x
Číslo 1 se vyskytuje v poli celkem: 2x
Číslo 3 se vyskytuje v poli celkem: 1x
Číslo 4 se vyskytuje v poli celkem: 1x

 

 


 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.

Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.

Copyright © 2004-2025 Poradna Poradte.cz. Všechna práva vyhrazena. Prohlášení o ochraně osobních údajů. | [tmavý motiv]