Hledání libovolných pocet maxim – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hledání libovolných pocet maxim – C / C++ – Fórum – Programujte.comHledání libovolných pocet maxim – C / C++ – Fórum – Programujte.com

 

cheeester0
Stálý člen
8. 12. 2008   #1
-
0
-

Hoj, mám problém. Potřebuji pomoci s řešením.

Mám číselnou posloupnost v poli (5, 1, 2, 4, 3, 8, 11, 4)

a potřebuji najít zvolený počet maxim (největších prvků) ale bez toho abych použil například třídící algoritmus quicksort a setřídil je všechny a pak vzal třeba 4 největší prvky. Osobně bych to řešil asi quicksortem ale zadání je zadání.

Nahlásit jako SPAM
IP: 88.146.167.–
Bald3rr0
Super člen
8. 12. 2008   #2
-
0
-

Jedno z možných řešení:
Nechat uživatele, aby zadal počet hledaných maxim, vytvořit pole a do toho pole ukládat pozice maximální hodnoty, která ještě není zapsána v poli. A poté výsledné pole vypsat.

Nahlásit jako SPAM
IP: 82.100.0.–
KIIV
~ Moderátor
+43
God of flame
8. 12. 2008   #3
-
0
-

To Bald3rr : ono by stacilo brat v uvahu vsechny cisla mensi nez naposledy vlozene maximum.... nemusel by pak kontrolovat i ty dalsi maxima ... proste by jen ty prvky ktery by byly nad tim nejmensim nalezenym maximem a vcetne nej nesrovnaval(vynechal by je)

vlastne by mu stacilo pokazdy to maximum vypsat a pamatovat si jen to posledni ...

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
cheeester0
Stálý člen
8. 12. 2008   #4
-
0
-

Ano na tomto principu mám celý kód založen. Pomocí cyklu procházim pole cisla[5] a porovnávám takto



for(i=0; i<5;i++)
{
if(cisla[i] > cisla[i+1])
zapisi do druheho pole jeho index
else
asi musim projet od zacatku pole s indexi a porovnat je s porovnavanym cislem - NEVIM

}


problem je ale to ze i kdyz cislo neni vetsi jak to druhe , neznamena to ze jiz v kontrolovaných cislech takové cislo vetsi neni. Tady prve nevim co s tim.

Nahlásit jako SPAM
IP: 88.146.167.–
cheeester0
Stálý člen
8. 12. 2008   #5
-
0
-

To KIIV : bohuzel potrebuji treba 5 maixim, 2 maxima ... jak zvoli uzivatel

Nahlásit jako SPAM
IP: 88.146.167.–
cheeester0
Stálý člen
8. 12. 2008   #6
-
0
-

neni problem porovnat cislo s nasledujicim a vetsi zapsat do druheho pole (index) ale co dal kdyz hledame treba 4 maxima? nemohu zaposovat jen ty nasledujici vetsi ale musim brat v uvahu i ty mensi protoze mohou patrit do intrevalu pole s indexy (vysledky)

Nahlásit jako SPAM
IP: 88.146.167.–
Bald3rr0
Super člen
8. 12. 2008   #7
-
0
-

To KIIV : Ano, ten tvůj způsob je lepší :)
To cheeester : Už to mám skoro napsané, jen musim něco ošetřit, pak to sem hodim i s komentářem, jinak si zatím ještě přečti, co psal KIIV, je to opravdu lepší řešení.

Nahlásit jako SPAM
IP: 82.100.0.–
Bald3rr0
Super člen
8. 12. 2008   #8
-
0
-

To cheeester : Akorát mi to nefunguje v případě, že v poli jsou stejná čísla. Ale na to snad již přijdeš :)

#include <iostream>


using std::cout; using std::cin;

int main()
{
// Deklarace
int pocet_maxim; // Počet maxim, které chce uživatel najít
int maximum, minimum; // Pomocné proměnné
int * max; // Pole, do kterého se budou ukládat maxima
int cisla[] = {5, 1, 2, 4, 3, 8, 11, 4}; // Pole, z kterého se hledá

cout << "Pocet maxim: ";
cin >> pocet_maxim;

max = new int[pocet_maxim]; // Aokace pole

// Najde největší číslo a zároveň minimum
maximum = cisla[0]; // Největší číslo z pole
minimum = cisla[0]; // Nejmenší číslo z pole
for(int i = 0; i < 8; i++) { // 8 = počet prvků v poli
if(cisla[i] > maximum) // Tohle je snad jasné :)
maximum = cisla[i];
if(cisla[i] < minimum)
minimum = cisla[i];
}

// Uloží do pole
max[0] = maximum;

// Najde největší číslo, ale menší než předchozí
for(int i = 1; i < pocet_maxim; i++) {
maximum = minimum; // Jako největší možné číslo bere ze zezačátku to nejmenší, aby kdyby bylo větší, mohla se hodnota přepsat
// Jinak by mohlo dojít k tomu, pokud by bylo za maximum zvolené příliš velké číslo, opakovalo by se

int n = 0;
for(; n < 8; n++) {
if(cisla[n] > maximum && cisla[n] < max[i-1]) // Pokud bude číslo větší než maximum a zároveň menší než poslední uložené maximum
maximum = cisla[n];
}
max[i] = maximum; // Uloží největší z maximum z doposud nevypsaných maxim
}

// Výpis na obrazovku
for(int i = 0; i < pocet_maxim; i++)
cout << max[i] << " ";

cin.get();
cin.get();

delete(max); // Uvolnění paměti
return 0;
}

Nahlásit jako SPAM
IP: 82.100.0.–
cheeester0
Stálý člen
8. 12. 2008   #9
-
0
-

ty jo. No jsi trosku na jinem levelu nez ja :smile2:

moc nevim jakou roli tam hraje

using std::cout; using std::cin;

cin.get();

cin.get();


jiank je to tedy paradni a klobouk dolu. S tim minimem by me to asi nenapadlo. Jdu to poredne prostudovat at to pochopim. Urcite jsi mi ale moc pomohl a moc ti dekuji

Nahlásit jako SPAM
IP: 88.146.167.–
g
~ Anonymní uživatel
4 příspěvky
8. 12. 2008   #10
-
0
-

zajímavé zadání, vyřešil jsem to v Pythonu, postup snad pochopíš a předěláš si na C

data = [5, 1, 2, 4, 3, 8, 11, 4]

pocetMaxim=3
maxima=[]

for i in data:
if len(maxima) < pocetMaxim:
maxima.append(i)
continue
for maximum in maxima:
if i > maximum and i not in maxima:
if len(maxima)== pocetMaxim:
maxima.remove(min(maxima))
maxima.append(i)
break

print maxima

Nahlásit jako SPAM
IP: 217.117.216.–
Bald3rr0
Super člen
8. 12. 2008   #11
-
0
-

To cheeester : using std::cout a using std::cin je to samé jako using namespace std, akorát, že zpřístupní pouze cout a cin, krásně je to vysvětlené tady http://programujte.com/index.php?akce=clanek&cl=2005041402-c++-1-lekce.
To cin.get(); na konci je tam proto, aby se program neukončil hned po provedení příkazů. Je to něco jako getchar() v C.
Kdyby jsi měl ohledně mého kódu jakkékoliv dotazy, rád zodpovím :).

Nahlásit jako SPAM
IP: 82.100.0.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý