Kolik malých kruhů se vejde do velkého? – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kolik malých kruhů se vejde do velkého? – .NET – Fórum – Programujte.comKolik malých kruhů se vejde do velkého? – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
davous2670
Newbie
18. 3. 2012   #1
-
0
-

Zdravím,

včera jsem dostal chuť udělat si prográmek, který mi určí, kolik malých kruhů se vejde do velkého.

Bohužel jsem se trochu zasekl - mám neblahý pocit, že můj algoritmus je chybný.

float PI=3.14159265358979323846264338327950288419716939937510f;
double VelkyPol;
double MalyPol;
string Jednotky;

Console.WriteLine("----- KOLIK MALÝCH KRUHŮ SE VEJDE DO VELKÉHO? -----");
Console.WriteLine();
Console.Write("Zadejte poloměr velkého kruhu (číslem): ");

VelkyPol=Convert.ToDouble(Console.ReadLine());

Console.Write("Zadejte poloměr malého kruhu (číslem): ");

MalyPol=Convert.ToDouble(Console.ReadLine());

Console.Write("Zadejte jednotky (zkratkou): ");
Jednotky=Convert.ToString(Console.ReadLine());

double VelkyObs=(double)PI*(VelkyPol*VelkyPol);
double MalyObs=(double)PI*(MalyPol*MalyPol);
double PocetKruhu=(double)VelkyObs/MalyObs;
double NonRoundPocetKruhu=PocetKruhu;
PocetKruhu=(int)PocetKruhu;
double PrebytekKruhu=NonRoundPocetKruhu-PocetKruhu;
double PrebytekObsahu=PrebytekKruhu*MalyObs;

Console.WriteLine();
Console.WriteLine("Do kruhu s poloměrem "+VelkyPol+" "+Jednotky+" se vejde "+PocetKruhu+" kruhů s polomerem "+MalyPol+" "+Jednotky+".");
Console.WriteLine("Zůstane "+PrebytekObsahu+" "+Jednotky+"2 volného místa.");

Pracovat to má takto:

1. Uživatel zadá poloměr velkého kruhu a následně i malého

2. Program vypočítá obsahy obou kruhů a dalšími operacemi řekne:

a) kolik malých kruhů se vejde do velkého

b) kolik zbude volného místa

Když ale zadám např. jako poloměr velkého 40 a poloměr malého 2, tak mi vyjde, že nezbude žádné volné místo. To mi však přijde jako nesmysl.

Díky za rady.

Nahlásit jako SPAM
IP: 109.108.119.–
zlz
~ Anonymní uživatel
634 příspěvků
18. 3. 2012   #2
-
0
-

40 / 2 = 20
(40*40) / (2*2) = (20*20)
3,14(40*40) / 3,14(2*2) = 1(20*20)

Kde by se tam ten zbytek vzal?

Nahlásit jako SPAM
IP: 213.211.51.–
davous2670
Newbie
18. 3. 2012   #3
-
0
-

Já vím, ale když se nad tím zamyslíš, tak je chyba spíš v tom způsobu počítání.

Představ si kruh a v něm malé.

A tento program nepočítá s mezerami mezi kruhy, které tam jsou.

Zajímalo by mě, jak to lze vyřešit.

Nahlásit jako SPAM
IP: 109.108.119.–
zlz
~ Anonymní uživatel
634 příspěvků
18. 3. 2012   #4
-
0
-

To nevím. Co jsem tak googlil, tak jednoduché řešení prostě není.

Nahlásit jako SPAM
IP: 213.211.51.–
davous2670
Newbie
19. 3. 2012   #5
-
0
-

Hmm, tak to asi zůstane nevyřešené.

Taky jsem googlil a vypadá to jako téměř nemožná úloha.

No, budu si muset příště dávat větší pozor na to, jaký algoritmus si chci udělat :D

EDIT: Sry, omylem jsem to označil jako odpověď a nevím jak to zrušit :-)

Nahlásit jako SPAM
IP: 109.108.119.–
JoDiK
~ Anonymní uživatel
987 příspěvků
19. 3. 2012   #6
-
+1
-
Zajímavé

Podle mně to řešitelné je...

Spočítám celočíselný poměr poloměrů. Je-li výsledek lichý a větší jak 1, bude navíc jedna malá kružnice ve středu velké. Sudá část výsledku děleno dvěma udává počet okruží tvořené z malých kružnic kolem obvodu. Průměr malé kružnice představuje minimální stranu mnohoúhelníku, jehož vepsaná kružnice má poloměr odvozený z velké kružnice bez lichého násobku poloměru malé kružnice. Z toho spočítám počet malých kružnic každého okruží případně plus jedna navíc ve středu a jejich plochu odečtu od plochy velké kružnice.

Viz obrázky...

 

Nahlásit jako SPAM
IP: 88.103.236.–
davous2670
Newbie
19. 3. 2012   #7
-
0
-

Tak tohle je solidní.

Vcelku složité, ale mohlo by fungovat.

Nahlásit jako SPAM
IP: 109.108.119.–
Řešení
JoDiK
~ Anonymní uživatel
987 příspěvků
19. 3. 2012   #8
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

Tak jsem si to v rámci procvičení naprogramoval a takhle to funguje:

PS: byl tam jeden drobný zádrhel - když to zrovna vycházelo na dvě kružnice - neboli poloměr vepsané kružnice byl stejný jako poloměr malé kružnice, tak se to muselo ošetřit zvlášť a nepočítat úhel mnohoúhelníka - například 100/25

Nahlásit jako SPAM
IP: 88.103.233.–
davous2670
Newbie
20. 3. 2012   #9
-
0
-

 Nice work 

Na mě zatím dost složitý, ale aspo'n vím, že existuje řešení.

Nahlásit jako SPAM
IP: 109.108.108.–
JoDiK
~ Anonymní uživatel
987 příspěvků
20. 3. 2012   #10
-
+1
-
Zajímavé

#9 davous267
Složitý? Matematika a geometrie základní školy (aspoň myslím...)

Tak jestli se ti tak líbí kruhy, zkus jednodušší zadání, třeba kolik kruhů se vejde do obdélníka (čtverce) a jaký bude odpad.

PS: víš, že z kružnic jde kreslit i jiné velmi zajímavé útvary?

Nahlásit jako SPAM
IP: 88.103.236.–
davous2670
Newbie
24. 3. 2012   #11
-
0
-

Tak jsem se pokusil o "Kolik kruhů se vejde do obdélníku"?

float PI = 3.14159265358979323846264338327950288419716939937510f;
                double Kruh, ObdSirka, ObdVyska;
                int Pocet, pocSir, pocVys;
                double ObsahKruh;
                double ObsahObd, ObsahKruhU, Zbytek;
                string Jednotky;
                Console.Write("Zadejte jednotky: ");
                Jednotky = Convert.ToString(Console.ReadLine());
                Console.Write("Zadejte poloměr kruhu: ");
                Kruh = Convert.ToDouble(Console.ReadLine());
                Console.Write("Zadejte šířku obdélníku: ");
                ObdSirka = Convert.ToDouble(Console.ReadLine());
                Console.Write("Zadejte výšku obdélníku: ");
                ObdVyska = Convert.ToDouble(Console.ReadLine());
                pocSir = (int)ObdSirka / (2 * (int)Kruh);
                pocVys = (int)ObdVyska / (2 * (int)Kruh);
                Pocet = pocSir * pocVys;
                ObsahObd = ObdSirka * ObdVyska;
                ObsahKruh=PI*(Kruh*Kruh);
                ObsahKruhU = Pocet * ObsahKruh;
                Zbytek = ObsahObd - ObsahKruhU;
                Zbytek = Math.Round(Zbytek, 2);
                Console.WriteLine();
                Console.WriteLine("Do obdélníku se stranami " + ObdSirka + Jednotky + " a " + ObdVyska + Jednotky + " se vejde " + Pocet + " kruhů s poloměrem " + Kruh + Jednotky+".");
                Console.WriteLine("Zbude "+Zbytek+Jednotky+"2 volného místa.");
                Console.ReadLine();
Nahlásit jako SPAM
IP: 109.108.119.–
JoDiK
~ Anonymní uživatel
987 příspěvků
25. 3. 2012   #12
-
0
-

#11 davous267
A co ještě varianta, kde se budou kružnice do sebe skládat? Za určitých poměrů to vyjde lépe - takže vyhodnotit a použít tu lepší variantu!

Nahlásit jako SPAM
IP: 88.100.43.–
Foltas
~ Anonymní uživatel
1 příspěvek
22. 5. 2012   #13
-
0
-

#8 JoDiK
Ahoj,

bylo by možné hodit sem zdrojak, nebo alespon algoritmus vypoctu, abych z toho mohl vyjit pro moji aplikaci?

 Můj cíl je zadat průměr malé kružnice (d) + počet (n) a ziskat minimální průměr velké kružnice (D), aby se to do ní vešlo.

Jako další krok je možnost zadat různé průměry malé kružnice (d1, d2, atd) + počet dané velikosti kružnice (n1, n2, atd) a ziskat minimální průměr velké kružnice (R).

Předem moc díky za každou pomoc.

Nahlásit jako SPAM
IP: 91.208.112.–
JoDiK
~ Anonymní uživatel
987 příspěvků
22. 5. 2012   #14
-
0
-

#13 Foltas
algoritmus máš přece popsaný zde...
 

Nahlásit jako SPAM
IP: 88.103.233.–
davous2670
Newbie
23. 5. 2012   #15
-
0
-

#12 JoDiK
Nevím, jak s tou lepší variantou.

Nahlásit jako SPAM
IP: 109.108.119.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 5. 2012   #16
-
0
-

#15 davous267
Tak si to nakresli a matematicky vyjádři (malá nápověda - pythagorova věta). Navíc jak se zdá, jsou  možné dvě varianty úspory:

Nahlásit jako SPAM
IP: 88.103.236.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý