Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Patrick
Neregistrovaný
Avatar
Patrick:13.11.2013 12:08

Ahoj,

mám menší problém dostal jsem zadaný tehle úkol:
Vytvořte funkci pro rekurzivní výpočet Cantorova diskontinua, vypište souřadnice intervalů textově na terminál. Funkce bude mít na vstupu jeden interval (int min, int max), ze ktereho vytvori tri stejne intervaly a pro kazdy interval zavola zase sebe sama. Ukázku řešení s využitím knihovny glut (vám stačí jenom výpis na terminál) si můžete se svolením autora stáhnout zde: http://stalmach.wz.cz/fraktaly.zip

Potřeboval bych nějak navést jak to napsat v C... používám CodeLite.
nastavení-> gcc

 
Odpovědět
13.11.2013 12:08
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:13.11.2013 12:27

Kantorovo mračno si můžeš jednoduše představit jako čáru, kterou vždy rozdělíš na tři díly a ten prostřední vymažeš. Je to hezky popsané na wiki: http://cs.wikipedia.org/…diskontinuum

Ty asi nemáš udělat nic jiného, než vypsat ty 3 intervaly. V C to napíšeš prostě tak, že uděláš funkci cantor(int od, int do) a v této funkci si vstup rozdělíš na tři části a na každou část zavoláš znovu tuto funkci. Musíš tam dát také nějakou "zarážku", aby to někdy přestalo :)

Nahoru Odpovědět
13.11.2013 12:27
New kid back on the block with a R.I.P
Avatar
Patrick
Neregistrovaný
Avatar
Patrick:13.11.2013 12:42

jsem na to lama... neznas nějaky příklad jak bych k tomu došel jk to napsat?

#include <stdio.h>

void rekurzivni(float intmin, intmax, int i)

 
Nahoru Odpovědět
13.11.2013 12:42
Avatar
Martin Gabriel
Tvůrce
Avatar
Martin Gabriel:13.11.2013 12:45

Tenhle příklad mám doma hezky zpracovaný (ze školy), když si nebudeš vědět rady, tak mi napiš SZ. Ale myslím, že po nápovědě od sdraca by neměl být problém. =)

Nahoru Odpovědět
13.11.2013 12:45
"Be the change you want to see in the world" - Michael Scofield
Avatar
Patrick
Neregistrovaný
Avatar
Odpovídá na Martin Gabriel
Patrick:13.11.2013 12:46

Jo to by bylo good :)

 
Nahoru Odpovědět
13.11.2013 12:46
Avatar
Patrick
Neregistrovaný
Avatar
Patrick:13.11.2013 12:49

sdraco <- jako ja vím co to přibližně je i díky tobě :) , ale nevím si rady jak to napsat ... vím, že bych tam měl udělat nějakou podmínku

 
Nahoru Odpovědět
13.11.2013 12:49
Avatar
Martin Gabriel
Tvůrce
Avatar
Odpovídá na
Martin Gabriel:13.11.2013 12:55

Podívej se co je to rekurze, ta se Ti bude určitě hodit, pak už by to měla být hračka. ;)

Nahoru Odpovědět
13.11.2013 12:55
"Be the change you want to see in the world" - Michael Scofield
Avatar
pateka111
Člen
Avatar
pateka111:20.11.2013 11:38

Něco sem stvořil, ale nevím proč mi to děla to co to dělá... mělo to teda jak chápu vypsat krajní intervaly a ty uprostred vynechat..
jenze mi to trosku asi nefunguje
<a href="http://­www.nahraj-obrazek.cz/pm-0138494387411.png" title="Bez názvu" ><img src="http://w­ww.nahraj-obrazek.cz/dm-0138494387411.png" alt="Bez názvu" /></a>

Editováno 20.11.2013 11:39
 
Nahoru Odpovědět
20.11.2013 11:38
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na pateka111
David Hartinger:20.11.2013 12:17

Až sem dáš svůj zdrojobý kód, tak ti možná někdo poradí.

Nahoru Odpovědět
20.11.2013 12:17
New kid back on the block with a R.I.P
Avatar
coells
Tvůrce
Avatar
coells:20.11.2013 12:23

Můžeš najít inspiraci v tomhle kusu kódu:

#include <stdlib.h>
#include <stdio.h>

void cantor(float min, float max, int no_of_divisions)
{
    if (no_of_divisions > 0)
    {
        float one_third = (max - min) / 3;

        cantor(min, min + one_third, no_of_divisions - 1);
        cantor(max - one_third, max, no_of_divisions - 1);
    }
    else
    {
        printf("<%f;%f>\n", min, max);
    }
}

void main()
{
    printf("interval <0;1> - diskontinuum 1. stupne:\n");
    cantor(0, 1, 1);

    printf("interval <0;1> - diskontinuum 2. stupne:\n");
    cantor(0, 1, 2);

    printf("interval <0;1> - diskontinuum 4. stupne:\n");
    cantor(0, 1, 4);
}
 
Nahoru Odpovědět
20.11.2013 12:23
Avatar
pateka111
Člen
Avatar
Odpovídá na David Hartinger
pateka111:20.11.2013 12:27
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void cantor(int min, int max, int i)
{

        //int a,b;                                              /* a = prvni tretina , b = druha tretina */
        float third = ((max - min) / 3);        /* tretina */



        if (i >= 0)  // pocet interaci musi byt vetsi nez 0
        {
              // a = min, min + third, --iter; //vypocet prvního intervalu
                        //b = max,max - third, iter; // vypocet druheho intervalu


                cantor(min, min + third, --i);
                cantor(max - third,max, i);
        }
        else
        {
                printf("\n<%.5f  %.5f  %.5f  %.5f>\n",min, min+third, max-third, max);
        }

}

int main(int argc, char **argv)

{
        int min;
        int max;
        int i;

        printf("\tProgram pro vypocet Cantorova diskontinua\n");

        printf("\nZadejte minimum intervalu: ");
    scanf("%d",&min);

    printf("\nZadejte maximum intervalu: ");
    scanf("%d",&max);

    printf("\nKolik iteraci? \n");
    scanf("%d", &i);

        if ( i>0 && min<max )    //pocet interaci je vetsi nez jedna a minimum je mensi nez maximum muze zacit vypocet
    {
       printf("\nVysledne souradnice:\n");
       cantor(min,max,i);
    }
    else                  //pokud ne
    {
        printf("Nesmyslny pocet iteraci nebo minimum vetsi nez maximum.\n");
    }

        printf("\n");
        system("pause");

    return 0;
}
Editováno 20.11.2013 12:28
 
Nahoru Odpovědět
20.11.2013 12:27
Avatar
pateka111
Člen
Avatar
Odpovídá na pateka111
pateka111:20.11.2013 12:35

Tohle teda mam udělané a děla to co je na tom obrazku..myslím že tam mam někde chybu.

 
Nahoru Odpovědět
20.11.2013 12:35
Avatar
coells
Tvůrce
Avatar
Odpovídá na pateka111
coells:20.11.2013 12:52

Dvě chyby:

  1. mícháš float a int - v printf máš %f pro typy int i float. používej jenom jeden typ a toho se drž, %f pro float, %d pro int
  2. vypisuj jen interval <min;max>, pokud se bude dělit, postará se o to rekurzivní volání funkce

A ještě něco:

int min = 0, max = 1;
float third = ((max - min) / 3);

V tu chvíli bude third = 0.0, protože se počítá v celých číslech a 1/3=0 pro integer.

Editováno 20.11.2013 12:54
 
Nahoru Odpovědět
20.11.2013 12:52
Avatar
pateka111
Člen
Avatar
Odpovídá na coells
pateka111:20.11.2013 13:04

Takže jsem nahoře ve voidu změnil na "float" a v tom mainu dole kdyz sem definoval int tk teda tam musí být "d".
Jak to tam mam hodit aby mi to vypsalo jen ten interval ?

 
Nahoru Odpovědět
20.11.2013 13:04
Avatar
coells
Tvůrce
Avatar
Odpovídá na pateka111
coells:20.11.2013 14:11

Podívej se můj kód výše, obě řešení jsou skoro identické. Vypisuji tam jen interval min-max v aktuální hloubce rekurze.

 
Nahoru Odpovědět
20.11.2013 14:11
Avatar
pateka111
Člen
Avatar
pateka111:23.11.2013 12:29

Prosím o smazaní :) Funguje mi to :)
Všem děkuji za rady.

 
Nahoru Odpovědět
23.11.2013 12:29
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na pateka111
David Hartinger:23.11.2013 12:33

Proč bychom to měli mazat? Fórum je o tom, aby se tu lidé učili, až někdo dostane podobné zadání, bude mu to užitečné.

Nahoru Odpovědět
23.11.2013 12:33
New kid back on the block with a R.I.P
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.