[ StratOS @ 22.01.2004. 10:12 ] @
Posto ne programishem u c-u - pitalica :

Code:

/* Process the data */
int processData(int *dat) {
    int loop;
    int res = 0;

    for(loop = 0; loop < 30; loop++) {
        res += (dat[loop] ? (dat[loop] - 50) : 69) ? dat[loop] : 69;
        while (res > 300000) {
            res -= dat[loop] ? dat[loop] : 169;
        }
    }
    
    return *res;
}

Imam jedan problem, radi se o jednom puzzle site-u, molio bi da mi netko malo pomogne kod ove stvari, naime malo matematicki.

processData funkcija citha 30 linija iz jednog file-a (numerickih)
dat[loop]

znaci res se povecava odnosno smanjuje ako je vechi od 300000
- je minus
+ je plus
: je podeljeno (celibroji ili float ?)
? je operacija, koju treba da nadjem !

Pomoc je potrebna za ':', dali je rezultat celi broji (rounded) ili float ?

[ alex @ 22.01.2004. 10:56 ] @
Citat:
StratOS:
Posto ne programishem u c-u - pitalica :

Code:

res += (dat[loop] ? (dat[loop] - 50) : 69) ? dat[loop] : 69;
...
res -= dat[loop] ? dat[loop] : 169;



Nisam siguran da sam bas shvatio sta konkretno hoces. Elem, a ? b : c je konstrukcija koja oznacava: ako je a tacno, vrati b, u suprotnom vrati c.

U kôdu koji si poslao u petlji se proverava da li je dat[loop] tacno, pri cemu se vraca dat[loop] - 50, u protivnom 69, zatim se proverava da li je cela ta konstrukcija tacna, pri cemu se vraca dat[loop] u protivnom 69, gde se sve to na kraju dodaje varijabli res.

Zatim, ukoliko je res vece od 30000, proverava se da li je dat[loop] tacno, pri cemu se vraca dat[loop], u suprotnom se vraca 169 i rezultat se oduzima od varijable res.

Dalje je poprilicno jasno.

Poz,
alex.
[ leka @ 22.01.2004. 11:07 ] @
: nije podeljeno, a ? je tercijerni operator i u C-u i u C++-u sa
sledecom sintaksom:
(uslov) ? (izraz1) : (izraz2)

veoma cesto ces naci ovako nesto:

var1 = (uslov) ? (izraz1) : (izraz2)

Uslov je takodje izraz. Ako je uslov tacan, onda se evaluira izraz1, ako
nije onda se evaluira izraz2

U jezicima koji nemaju ovo gore programeri prosto pisu:

if (uslov)
var1 = izraz1;
else
var1 = izraz2;
[ yooyo @ 22.01.2004. 15:07 ] @
Citat:
StratOS:
Posto ne programishem u c-u - pitalica :

Code:

/* Process the data */
int processData(int *dat) {
    int loop;
    int res = 0;

    for(loop = 0; loop < 30; loop++) {
        res += (dat[loop] ? (dat[loop] - 50) : 69) ? dat[loop] : 69;
        while (res > 300000) {
            res -= dat[loop] ? dat[loop] : 169;
        }
    }
    
    return *res;
}



Klasicno bombardovanje memorije...

Program ce puci jer je res int a ne pointer, a processData kao rezultat vraca sadrzaj
lokacije na koju pokazuje res. Obizrom na ludu petlju, res moze dobiti ko zna kakvu vrednost, pa ce return *res sigurno prouzrokovati pad programa.


yooyo
[ blaza @ 22.01.2004. 18:21 ] @
Na stranu return *res, ovo je analogan kod datom:
Code:

int loop;
int res = 0;
for(loop = 0; loop <30; loop++)
{
    res += dat[loop];
    if(dat[loop] == 50)
        res +=19;
    while (res > 300000)
        res -= dat[loop];
    }
}


Sirina int tipa (16 ili 32 bita) utice na rezultat.
Ako su int varijable 16-bitne moze se pisati : while (res > -27680)...