Stavění elektrárny v C :) Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
JayCube
Level 1.5
Level 1.5
Příspěvky: 106
Registrován: srpen 11
Bydliště: Sedlec-Prčice
Pohlaví: Muž
Stav:
Offline

Stavění elektrárny v C :)

Příspěvekod JayCube » 30 lis 2012 13:10

Zdravim, už zase potřebuji poradit s domácím úkolem. Je to trochu složitější, tak radši přikládám zadání:
Zadání úkolu
► Zobrazit spoiler


Ukázka práce programu:
Zadejte pocty sroubu pro jednotlive priruby:
30 20 25 10
Cena: 545

Program by měl nejprve vypočítat (30*25+20)+(30*10+20) což je 1090 a pak (20*10+25)+(30*10+20) a to je 545. Druhý výsledek je menší, takže ho zobrazí. jenže těch hodnot může být víc než čtyři a já nevím, jak to udělat, aby vyzkoušel všechny možnosti. Neví někdo jak na to?
CPU: Intel Core i5-4460 + GELID Tranquillo MB: MSI B85-G43 RAM: Crucial Ballistix Sport 8GB GK: Palit GTX 1060 JetStream SSD: Crucial MX100 128GB HDD: WD Caviar Blue 250GB ZDROJ: Seasonic SS-500ET-F3 500W CASE: Zalman R1 OS: Windows 7 Home Premium MONITOR: Iiyama ProLite X2483HSU

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Stavění elektrárny v C :)

Příspěvekod faraon » 30 lis 2012 17:32

Technický dotaz, ty vstupní údaje budou vždy na jednom řádku, nebo na několika?
Jde o to čím bude ten vstup ukončený, jestli znakem \n, tak není problém napsat si vlastní načítání ;-)

Pak už si "jen" uděláš pole spojů sousedních dílů, projdeš ho ve všech permutacích, a budeš si pamatovat nejmenší vypočítanou cenu.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
JayCube
Level 1.5
Level 1.5
Příspěvky: 106
Registrován: srpen 11
Bydliště: Sedlec-Prčice
Pohlaví: Muž
Stav:
Offline

Re: Stavění elektrárny v C :)

Příspěvekod JayCube » 30 lis 2012 19:35

Vstupní údaje budou na jedné řádce. Načítání už mám:

Kód: Vybrat vše

    if( !(srouby = (int *) malloc( velikost * sizeof(int) )) )
    {
        printf("Málo paměti\n");
        return 1;
    }

    while( (ok = scanf( "%d", &srouby[pocet])) != EOF )
    {
        if( ok!=1 || srouby[pocet]<=0 )
        {
            printf("Nespravny vstup.\n");
            return 1;
        }

        pocet++;

        if( pocet==velikost )
        {
            velikost = velikost * 2;
            if( !(srouby = (int *)realloc( srouby, (velikost) * sizeof(int) )) )
            {
                printf("Málo paměti\n");
                return 1;
            }
        }
    }


V poli "srouby" jsou uložené spoje dílů. Problém je vyzkoušet všechny možnosti. Na vstupu může být mnohem víc hodnot a já nevím jak to zapsat, aby to otestovalo všechny varianty.
CPU: Intel Core i5-4460 + GELID Tranquillo MB: MSI B85-G43 RAM: Crucial Ballistix Sport 8GB GK: Palit GTX 1060 JetStream SSD: Crucial MX100 128GB HDD: WD Caviar Blue 250GB ZDROJ: Seasonic SS-500ET-F3 500W CASE: Zalman R1 OS: Windows 7 Home Premium MONITOR: Iiyama ProLite X2483HSU

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Stavění elektrárny v C :)  Vyřešeno

Příspěvekod faraon » 30 lis 2012 19:57

V podstatě máš na vybranou jen ze dvou možností, buď se do toho pustit elegantně rekurzí, nebo brutálně pomocí vnořených cyklů.

V obou případech to má ale smysl jen do určitého počtu dílů, protože je to klasický problém obchodního cestujícího, navíc zhoršený o to, že se každým krokem některé hodnoty mění. Každopádně už při nějakých dvaceti dílech nemáš šanci dojít k zaručenému výsledku dřív, než ukončíš tuhle školu :lol:

Takže by stálo za to zkusit i třetí cestu, problém si nejdřív důkladně logicky rozebrat a zkusit najít nějaký háček.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
JayCube
Level 1.5
Level 1.5
Příspěvky: 106
Registrován: srpen 11
Bydliště: Sedlec-Prčice
Pohlaví: Muž
Stav:
Offline

Re: Stavění elektrárny v C :)

Příspěvekod JayCube » 22 pro 2012 01:48

Nakonec se mi to povedlo vyřešit. Použil jsem k tomu Matrix chain multiplication (samozřejmě jsem si to musel trochu poupravit):

Kód: Vybrat vše

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


int vypocet( int *p, int i, int j )
{
    if( i==j ) return 0;

    int k, min=INT_MAX, cena;

    for( k=i; k<j; k++ )
    {
        cena = vypocet( p, i, k ) + vypocet( p, k+1, j ) + p[i-1]*p[j]+p[k];
        if (cena < min) min = cena;
    }

    return min;
}


int main( void )
{
    int *srouby, pocet=0, ok=0, velikost=4;


    printf("Zadejte pocty sroubu pro jednotlive priruby:\n");

    srouby = (int *) malloc( velikost * sizeof(int) );

    while( (ok = scanf( "%d", &srouby[pocet])) != EOF )
    {
        if( ok!=1 || srouby[pocet]<=0 )
        {
            printf("Nespravny vstup.\n");
            return 1;
        }

        pocet++;

        if( pocet==velikost )
        {
            velikost = velikost * 2;
            srouby = (int *)realloc( srouby, (velikost) * sizeof(int) );
        }
    }

    if( pocet<2 )
    {
        printf("Nespravny vstup.\n");
        return 1;
    }


    printf("Cena: %d\n", vypocet( srouby, 1, pocet-1 ));

    return 0;
}


Termín pro odevzdání už zkončil (já to naštěstí stihl), takže už asi nemá smysl se v tom dál hrabat - téma zamykám. Děkuji za pomoc, díky tomuhle fóru mám zápočet. :D
CPU: Intel Core i5-4460 + GELID Tranquillo MB: MSI B85-G43 RAM: Crucial Ballistix Sport 8GB GK: Palit GTX 1060 JetStream SSD: Crucial MX100 128GB HDD: WD Caviar Blue 250GB ZDROJ: Seasonic SS-500ET-F3 500W CASE: Zalman R1 OS: Windows 7 Home Premium MONITOR: Iiyama ProLite X2483HSU


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů