Ošetření stejných hodnot - cyklus – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ošetření stejných hodnot - cyklus – C / C++ – Fórum – Programujte.comOšetření stejných hodnot - cyklus – C / C++ – Fórum – Programujte.com

 

Jan Beránek
~ Anonymní uživatel
7 příspěvků
18. 11. 2017   #1
-
0
-

Zdravím, 
potřeboval bych poradit. 
Mám úlohu, kdy dostanu kvádr o minimálním a maximálním objemu a já mám určit kolik takových kvádrů lze sestrojit s celočíselnými rozměry a,b,c. Do řešení ale nemám započítávat kvádry, které se pouze "otočí", tzn. kvádr 1x2x3 je stejný jako kvádr 2x3x1.

A v tom je onen problém, nevím jak ošetřit, aby se nevypisoval (nezapočítával) kvádr se stejnými rozměry. 
Na vypsání všech možných kvádrů používám do sebe vnořené cykly FOR:

int main(int argc, char** argv) {

    int x,y,a,b,c,i;

    scanf ("%d%d", &x,&y);
      
    for (a = x; a <= y; a++)
    { for (b = x; b <= y; b++)
        { for (c = x; c <= y; c++)
            {
             }
        }
    }    
                             
    
    return (EXIT_SUCCESS);

Budu rád za každou radu nebo myšlenku, jak na to alespoň jít. Děkuji předem! :)

Nahlásit jako SPAM
IP: 81.90.168.–
gna
~ Anonymní uživatel
1853 příspěvků
19. 11. 2017   #2
-
0
-

a: min..max
b: a..max
c: b..max

Ale pozor na ty jednotky -- 4(m3) je 1x1x4 nebo 1x2x2, ne 4x4x4. Celkově to asi není očekávané řešení.

Nahlásit jako SPAM
IP: 213.211.51.–
Jan Beránek
~ Anonymní uživatel
7 příspěvků
19. 11. 2017   #3
-
0
-

#2 gna
Děkuji za odpověď!
To a:, b:, c: je myšleno jako pole nebo jako cykly ?

To s těmi jednotkami vím, povedlo se mi dojít do stádia, kde mi program vypíše např.:

Interval - <1,2> (minimální a maximální objem)

Možné kvádry: 1x1x1
                         1x1x2
                         1x2x1
                         2x1x1

Já z toho ale potřebuji dostat ty "duplikáty" a nechat tam např. jen 1x1x2. Edit. takto mi to vypisuje pouze pokud jsou minimální a maximální obsah o 1 ... takže špatně :(

Nahlásit jako SPAM
IP: 81.90.168.–
gna
~ Anonymní uživatel
1853 příspěvků
19. 11. 2017   #4
-
0
-

   

for (a = x; a <= y; a++)
    { for (b = a/*tady*/; b <= y; b++)
        { for (c = b/*tady*/; c <= y; c++)
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1853 příspěvků
19. 11. 2017   #5
-
0
-

Ještě k tomu editu. Ano, pro objem 4 nemůžeš začít na 4x4x4.

Nahlásit jako SPAM
IP: 213.211.51.–
Jan Beránek
~ Anonymní uživatel
7 příspěvků
19. 11. 2017   #6
-
0
-

Bohužel nefunguje, program vypisuje pro interval <1,2> :
1x1x1
1x1x2
1x2x2
2x2x2

Ale pro 1x2x2 nebo 2x2x2 objem <1,2> nesedí. Ale jinak děkuji za snahu.

Nahlásit jako SPAM
IP: 81.90.168.–
Jan Beránek
~ Anonymní uživatel
7 příspěvků
19. 11. 2017   #7
-
0
-

V zadání je napsáno:

"Základní řešení úlohy vyžaduje použití cyklů a podmínek. Není potřeba používat pole. Rozhodně není dobrý nápad vygenerovat všechny možnosti a z nich odstraňovat duplicity - takové řešení by bylo těžkopádné, pomalé a pravděpodobně by selhalo na časovém nebo paměťovém limitu. V základní verzi je cílem získat zkušenosti s cykly s vhodně nastavenými mezemi."

To s tím b = a, c = b bude nejspíš správně, jen to buď špatně zapisuji nebo by to chtělo ještě drobet poupravit.

Nahlásit jako SPAM
IP: 81.90.168.–
Jan Beránek
~ Anonymní uživatel
7 příspěvků
19. 11. 2017   #8
-
0
-

Už to asi mám, jak jsem se s tím trápil tak jsem úplně vypustil podmínku if, že a*b*c se musí rovnat některému z těch objemů.

Nahlásit jako SPAM
IP: 81.90.168.–
Jan Beránek
~ Anonymní uživatel
7 příspěvků
19. 11. 2017   #9
-
0
-

Oprava: program stále není plně funkční.
Můj kód:

int main(int argc, char** argv) {

    int x,y,a,b,c,i;

    scanf ("%d%d", &x,&y);
    
    for (i = x; i <= y; i++) {
    for (a = x; a <= y; a++) 
    { for (b = a; b <= y; b++)
        { for (c = b; c <= y; ++c)
            {
            if (a*b*c != i) continue;
            printf ("%dx%dx%d\n", a,b,c);
            }
           
        }
    }    
    }                      
    
    return (EXIT_SUCCESS);
}

Přidal jsem cyklus for (i) a podmínku. A program správně vypíše rozměry pouze pokud napíšu interval ve tvaru <1,y>. Pokud místo 1 dám jakékoliv jiné číslo, program nic nevypíše.

Nahlásit jako SPAM
IP: 81.90.168.–
gna
~ Anonymní uživatel
1853 příspěvků
19. 11. 2017   #10
-
0
-

Proto píšu, že 4x4x4 není 4. Používáš minimální objem jako minimální rozměr.

int min, max;

scanf("%d %d", &min, &max);

for (int a = 1; a <= max; a++) {
    for (int b = a; b <= max; b++) {
        for (int c = b; c <= max; ++c) {
            int objem = a * b * c;
            if (objem >= min && objem <= max)
                printf ("%dx%dx%d\n", a, b, c);
        }
    }
}

Ještě by to šlo vylepšit ať se to vůbec nepokouší o cykly, ve kterých nemůže nic najít, ale na to kašlu.

Nahlásit jako SPAM
IP: 213.211.51.–
Jan Beránek
~ Anonymní uživatel
7 příspěvků
19. 11. 2017   #11
-
0
-

#10 gna
Jojo, to už šlape, v tom mým původním programu jsem použil ještě navíc ten cyklus for (i) a áčku jsem na začátku přiřadil 1 a fungovalo mi to pak taky! 
Ale tento tvůj program je přehlednější a srozumitelnější, tak ho s dovolením použiji :)

Teď už jen potřebuji místo vypsání daných rozměrů spočítat kolik jich je, ale to už (snad) zvládnu sám! 

Nahlásit jako SPAM
IP: 81.90.168.–
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, 7 hostů

Moderátoři diskuze

 

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