Avatar
Patrick
Neregistrovaný
Avatar
Patrick:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Patrick
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Patrick
Neregistrovaný
Avatar
Patrick:

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:

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:

Jo to by bylo good :)

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

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
Odpovídá na Patrick
Martin Gabriel:

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:

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
<img src="http://w­ww.nahraj-obrazek.cz/dm-0138494387411.png" alt="Bez názvu" />

Editováno 20.11.2013 11:39
 
Nahoru Odpovědět 20.11.2013 11:38
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na pateka111
David Čápka:

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

Nahoru Odpovědět 20.11.2013 12:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
coells
Redaktor
Avatar
coells:

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 Čápka
pateka111:
#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:

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
Redaktor
Avatar
Odpovídá na pateka111
coells:

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:

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
Redaktor
Avatar
Odpovídá na pateka111
coells:

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:

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

 
Nahoru Odpovědět 23.11.2013 12:29
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na pateka111
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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.