Matematické Fórum

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

#1 28. 01. 2010 13:20

XOR
Zelenáč
Příspěvky: 10
Reputace:   
 

Práce s polem v Céčku

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

  • (téma jako vyřešené označil(a) musixx)

#2 28. 01. 2010 13:45

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Práce s polem v Céčku

Jen pro ujasnění:

pole A: 11223334445
pole B: 1234446

Výsledek má být pole obsahující čtyři prvky, a to 1234, a to nejspíš v libovoném pořadí, ne?

Offline

 

#3 28. 01. 2010 14:01

XOR
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Práce s polem v Céčku

↑ musixx: jestli to má být opravdu průnik, řekl bych, že by v tom novém poli měly být všechny ty tři čtyřky. samozřejmě v libovolném pořadí.

Offline

 

#4 28. 01. 2010 15:11

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Práce s polem v Céčku

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

 

#5 28. 01. 2010 15:21

XOR
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Práce s polem v Céčku

↑ XOR: to vůbec. Stačí "hrubá síla".

Offline

 

#6 28. 01. 2010 16:58 — Editoval musixx (28. 01. 2010 17:16)

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Práce s polem v Céčku

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...

Code:

#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

 

#7 30. 01. 2010 11:09

XOR
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Práce s polem v Céčku

↑ musixx:Děkuju mockrát!

Offline

 

#8 02. 02. 2010 18:22

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Práce s polem v Céčku

Jenom nechápu, než přejdeš k programování, proč máš množiny, kde se opakují prvky?

Porušuješ matematické zákony...


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#9 03. 02. 2010 07:17

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Práce s polem v Céčku

↑ RePRO: Byl bych smířlivější. Po provedeném upřesnění zadání má i to, co žádá XOR, smysl. Akorát tomu raději říkejme třeba průnik polí, kde teda nemáme na mysli zrovna algebraické struktury...

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson