Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Dobrý den,
prosím Vás, mám problém s touto úlohou:
Napište funkci, která bude mít jako vstupní parametry dvě pole se známou velikostí (vždy pole a velikost) a bude vracet pole, které bude obsahovat vždy ty prvky, které obsahuje prvky zároveň prvního a druhého pole (tedy průnik množin).
Dělá mi problém přijít na to, jak to napsat, když potřebuji i zajistit například dvojici (trojici apod) za sebou opakujících stejných čísel.
Předem děkuji.
Offline
Já mám teda jiné představy o průniku množin, ale budiž.
Teď záleží na tom, jak efektivně to chceš naprogramovat. Zajímá tě vůbec, jestli výsledný algoritmus bude kvadratický, kubický či nějaký jiný? A jakým způsobem se alokuje paměť pro to výstupní pole?
Offline
V tom případě třeba něco takového jako níže. Pokud by se mělo hrát aspoň trochu na efektivitu, pak bych uvažoval o setřízení obou vstupních polí a vůbec o úplně jiném přístupu.
Netestoval jsem, takže tam můžou být nějaké překlepy. A také nepíšu žádné parádičky typu for(;--length;) atd...
#define min(a,b) ((a)<(b) ? (a) : (b))
int is_member(int element, int *array, int array_length)
{
int i;
for (i = 0; i < array_length; i++) if (array[i] == element) return 1;
return 0;
}
int nr_of_occur(int element, int *array, int array_length)
{
int i, nr;
nr = 0;
for (i = 0; i < array_length; i++) if (array[i] == element) nr += 1;
return nr;
}
void array_intersection(int *a1, int length_a1, int *a2, int length_a2, int *intersection, int *intersection_length)
{
int i, j, nr;
*intersection_length = 0;
for (i = 0; i < length_a1; i++)
{
/* go through array a1 */
if (!is_member(a1[i], intersection, *intersection_length))
{
/* a1[i] is not in the output array - compute a number of its occurance in input arrays */
nr = min(nr_of_occur(a1[i], a1, length_a1), nr_of_occur(a1[i], a2, length_a2));
/* add nr copies of a1[i] into the output array, and update its length */
for (j = 0; j < nr; j++) intersection[*intersection_length++] = a1[i];
}
}
}
void main(void)
{
int a1[100], length_a1;
int a2[100], length_a2;
int a3[100], length_a3;
/* fill in a1, a2, length_a1, length_a2 */
array_intersection(a1, length_a1, a2, length_a2, a3, &length_a3);
/* work with a3 - valid length is length_a3 */
}EDIT: Zvlášť na efektivitu dbám při těch funkcích coby argumentech makra. :-)
Offline
Jenom nechápu, než přejdeš k programování, proč máš množiny, kde se opakují prvky?
Porušuješ matematické zákony...
Offline