Diskuze: Rekurzivní výpočet Cantorova Diskontinua
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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
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. =)
Podívej se co je to rekurze, ta se Ti bude určitě hodit, pak už by to
měla být hračka.
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://www.nahraj-obrazek.cz/dm-0138494387411.png"
alt="Bez názvu" /></a>
Až sem dáš svůj zdrojobý kód, tak ti možná někdo poradí.
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);
}
#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;
}
Tohle teda mam udělané a děla to co je na tom obrazku..myslím že tam mam někde chybu.
Dvě chyby:
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.
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 ?
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.
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é.
Zobrazeno 17 zpráv z 17.