Zdravim.
Riešim zadanie. Mám spraviť pole s 50 nahodnymi prvakami. To som spravil.
V druhej časti treba vybrať prvok, ktorý sa v poli nachadza aspoň dvakrát.
Ako by ste riešili vy tuto druhu časť? Dajte navrhy.
/*
Zadanie:
Vygenerujte 50 prvkov pola a vyberte prvok, ktorý sa v poli nachádza aspon dvakrat.
*/
//Pouzite hlavickove subory
#include <stdio.h>
#include <stdlib.h>
#include <time.h> //Hlavickovy subor pouzity na nahodne generovanie cisel z casu
#define M 50 //Definovany nazov polia a rozsah polia
int main()
{
int prvky; //Zadefinovanie typ premennej pre prvky
int i; //Zadefinovanie typ premmenej pre i pouzitej v cykle for
prvky=0; //Premenna prvky nastavena na nulu
srand(time(NULL)); //Vynulovanie casu
printf("Vygenerovane cisla:\n" //Vypise pouzivatelovi na monitor: Vygenerove cisla
"\n"); //Vytvori medzeru
for(i=0; i<M; i++) { //Cyklus pre vygenerovanie 50 nahodnych cisel
prvky=100+rand()%(1000-100+1); //Prikaz na generovanie nahodnych cisel od 100 do 1000
printf("%d\t", prvky); //Zobrazi uzivatelovi 50 vygenerovanych cisel
}
return 0;
}
//Pouzite hlavickove subory
#include <stdio.h>
#include <stdlib.h>
#include <time.h> //Hlavickovy subor pouzity na nahodne generovanie cisel z casu
#define M 50 //Definovana velkost poli
int main()
{ int prvky[M]; //Zadefinovanie typ premennej pre prvky
int i; //Zadefinovanie typ premmenej pre i pouzitej v cykle for
srand(time(NULL)); //Vynulovanie casu
printf("Vygenerovane cisla:\n" //Vypise pouzivatelovi na monitor: Vygenerove cisla
"\n" //Vyvori medzeru
);
for(i=0; i<M; i++) { //Cyklus pre vygenerovanie 50 nahodnych cisel
prvky[i]=100+rand()%(1000-100+1); //Prikaz na generovanie nahodnych cisel od 100 do 1000
printf("%d\t", prvky[i]); //Zobrazi uzivatelovi vybenerovane cisla
}
return 0;
}
Veľmi dobre
No a teraz ako nájsť prvky, ktoré sú tam aspoň dva krát? Vieš si vymyslieť aspoň slovný popis riešenia?
Predstav si, že pracuješ v knižnici a dostaneš na starosť regál plný kníh. Tvoja úloha je nájsť knihy, ktoré sú tam viac krát. Ako to urobíš?
Možno zbytočne dlhe riešenie, ale prve čo mi prišlo na rozum bolo, že knihy by som si abacedne zoradil.
Po abedecnom zoradeni by som sa pozrel na názvy knih.
Názvy knih, ktore by sa nachadzali viackrát by som zobral, aby tam bola iba jeden krat.
Podobne by som to spravil asi s číslami. Zoradil by som ich napr.od najmenšie po najväčšie.
Potom prechadzal každe číslo rad radom. Číslo, ktore by sa nachadzalo dva a viackrát by som vypisal uživatelovi na monitor,
pokiaľ by sa žiadne číslo nevyskytovalo 2 a viackrat, vypisal by som užvatelovi, že žiadne taketo číslo v poli sa nenachadza.
Ďalšie riešenia:
1) Prejdem celý regál knihu za knihou. U každej knihy sa zastavím a pozriem sa, či ďalej v regále je kniha s rovnakým názvom. Ak nájdem duplicity, vyhodím ich.
2) Prejdem celý regál knihu za knihou a každú si 1) skontrolujem v zozname, 2) ak ju už v zozname mám, je tam viac krát, ak nie, napíšem ju do zoznamu a pokračujem.
Vynimocne nesuhlasim s BX-om, bouble-sort a nasledne porovnavnie v poli je podla mna aj na zlozitost, pochopenie a implementaciu zlozitejsie, ako hlupe hladanie zhod v poli (ktore ide spravit v kvadratickej zlozitosti).
To tvoje riešenie je z tých troch asi tak stredné. Najjednoduchšie je moja jednotka
BX napísal:1) Prejdem celý regál knihu za knihou. U každej knihy sa zastavím a pozriem sa, či ďalej v regále je kniha s rovnakým názvom. Ak nájdem duplicity, vyhodím ich.