[ icobh @ 20.04.2006. 20:57 ] @
Hi,

ja ću sad kao onaj kepa početi da se jadam i ono Hilfe,Hilfe,Gur,Gur itd... Imam neke zadatke za domaći ali su mi tekstovi tih zadataka toliko nejasni, da pojma nemam šta trebam uraditi. Znači molim nekog ko je navikao na ovakve tipove nerazumnih problema, samo da mi drugačije formuliše zadatke ili samo da ideju, kako, šta, gdje...

[Ovu poruku je menjao icobh dana 20.04.2006. u 21:58 GMT+1]
[ del-boy @ 20.04.2006. 22:15 ] @
Prvi zadatak treba da izmeni jedan broj! Kroz primer ću najlakše objasniti!
Recimo, ako ti pozoveš funkciju sa x=set_ones(256, 2, 5), funkcija treba da vrati 28610, odnosno 1000111102! Ono što funkcija radi je da broj 25610 (1000000002) pretvara u 28610 (1000111102), odnosno da sve binarne cifre broja 256 između 2. i 5. pozicije postavi na jednice!
Ovo ćeš najlakše uraditi pomoću maske, odnosno pravljenja broja koji ima između m i n sve jedinice i ostalo nule, pa uradiš |, odnosno binarno ili sa početnom vrednpošću i maskom!


Drugi zadatak je dosta jednostavan i tu ne znam šta ne razumeš pošto imaš i primer! Funkciji prosleđuješ dva broja (jedan realan, drugi ceo) i funkcija treba da vrati prvi broj na drugi! Na primer ako pozoveš funkciju sa x=pow(3.14, 3), x treba da dobije vrednost 30.959144, odnosno 3.14*3.14*3.14!
Ovo najjednostanije napravi for petlju koja prvi parametar množi sam sa sobom drugi parametar puta!


Što se trećeg zadatka tiče mogu ti dati savet da pogledaš u knjigu o rekurzivnim funkcijama! Po pravilu je u knjigama prvi primer za rekurzivnu funkciju faktorijel broja, a drugi Fibonačijev niz! Tvoj zadatak je jako sličan Fibojačijevom nizu, samo što imaš drugu formulu!
Primer za ovaj zadatak: x=f(3) treba da vrati 0, a f(4)=1, ako sam ovako na brzinu dobro izračunao!


Što se četvrte funkcije tiče ne znam šta imate u knjizi, pošto se na tome bazira i ova funkcija, ali mogu da pokušam!
Ono što ova funkcija treba da ti uradi je da kad joj proslediš broj (kao prvi parametar) u adresu na koju pokazuje drugi parametar upiše cifre broja u ASCII obliku, odnosno kao string! Na primer ako joj proslediš broj 25, na prosleđenoj adresi treba da se nalazi 5010 (001100102) i 5310 (001101012), odnosno ASCII kodovi cifara od kojih je sastavljen broj!
Kod ove funkcije je fazon da kad izvojiš broj (sa %10) na dobijenu vrednost dodaš ASCII kod nule, odnosno 4810! Kad završiš ubacivanje u niz dobićeš obrnut poredak brojeva, pa je potrebno da obrneš niz da bi dobio šta ti treba! Tako bih ja to uradio!

Nadam se da sam ti pomogao! Ako mi baš bude dosadno večeras, možda ti postavim i neki kod :D!
[ del-boy @ 20.04.2006. 23:57 ] @
Evo, uradio sam ti neki kod!

Što se tiče prvog zadatka, verovatno postoji bolji način da se napravi maska, ali sličan kod sam već imao urađen (kao jedan od starih domaćih) pa sam njega iskoristio uz male prepravke! Evo koda:
Code:

#include <stdio.h>


//podrazumeva se da se cifre broja od manje znacajnih
int set_ones(int x, int m, int n) {
    //lokalne promenljive
    int maska=0, r, i, broj_jedinica;
    
    broj_jedinica = n - m + 1;
    
    //provera
    if (m>n) return 0;
    
    //kreiranje maske
    for (i=0;i<n-m+1; i++) {
        maska <<= 1;
        maska +=1;
    }
    for(i=0; i<n-(n-m+1); i++) {
        maska <<= 1;
    }

    //modifikovanje broja x
    r = x | maska;
    
    //vracanje vrednosti
    return r;

}

int main () {
    //promenljive
    int x, m, n;
    printf("x, m, n=?\n");
    scanf("%d%d%d", &x, &m, &n);
    printf("\nRezultat je: %d\n\n", set_ones(x, m, n));
    return 0;
}




Za drugi nemam posebno šta da ti objašnjavam. Kod je kratat i jednostavan:
Code:

#include <stdio.h>

double pow(double x, int n) {
    //lokalne promenljive
    int i;
    double s=1;
    for (i=0; i<n; i++) {
        s *= x;
    }
    return s;
}

int main() {
    //promenljive
    double x;
    int n;
    printf("\nx, n=?\n");
    scanf("%lf%d", &x, &n);
    printf("\nRezultat je: %.2lf\n", pow(x, n));
    return 0;
}


Evo i četvrtog! Samo jedna napomena! Ja sam koristio niz od 10 članova, što znači da u njega možeš da smestiš 9 znakova! Ovo sam uradio jer je na mom računaru sizeof(int)=4, pa ne može da dođe veći broj od 5 cifara! Najbolje bi bilo da izračunaš veličinu niza na osnovu sizeof(int), pa da toliki niz i napraviš, s tim da paziš da zadnji znak mora da bude NUL, kao oznaka za kraj niza!
Code:

#include <stdio.h>
void itoa(int n, char *s) {
    //lokalne promenljive
    int i=0, k;
    char a, b;
    
    while (n!=0) {
        k = n%10;
        n /=10;
        k+=48;
        s[i++]=k;

    }
        //kraj stringa
    s[i]=0;
    
    //obrtanje niza
    k=0;
    i--;
    while (k<=i) {
        a = s[k];
        b = s[i];
        s[k++] = b;
        s[i--] = a;
    }
}

int main() {
    //promenljive
     int n;
    char s[10];
    
    printf("\t\t%d\n", sizeof(n));
    printf("\nn=?\n");
    scanf("%d", &n);
    itoa(n, s);
    printf("\n%s\n", s);
        return 0;
}



Što se tiče trećeg zadatka, morao bih malo da se prelistam knjigu, pošto dugo nisam petljao ništa sa rekurzijom, pa bi mi oduzelo dosta vremena dok ga ne uradim!
Možda neko drugi može da ti pomogne oko tog trećeg!
[ icobh @ 21.04.2006. 10:14 ] @
Vauuuuu. Ljudi puno hvala. Ja ću sam pokušati da uradim ove zadatke, uz vaše ideje naravno. Zaboravio sam da kažem da sam drugi uradio, mislio sam da sam ga izbrisao iz ovog dokumenta, pa se izvinjavam. U svakom slučaju, hvala još jednom.

Što se tiče literature, dobili smo jednu knjigu, koja je na engleskom a ja ovamo još sa nemačkim se borim kojeg sam učio 8 godina, pa opet ima mnogo toga što ne znam, a on meni knjigu na engleskom. Još kad dodam da predavač ima 70 godina a asistent 21-22, znate na šta vam liči to moje programiranje. Nikad nisam bio programer veliki, ali u srednjoj školi sam bio najbolji iz C-a, ali samo zato što nam je profa bio legenda. On je i tolike duduke znao naučiti programiranju, ne da imaju 2 za prolaz već 3, pa čak i 4.

P.S. Kako ovi profesori samo zadaju ove zadatke, bruka neviđena. Neki dan na ispitu iz Fizike sam 7 puta pročitao zadatak da skontam o čemu se radi, pošto je onaj ko je kucao, izgleda da je kursor nekako pomjerio, zadatak nema veze sa vezom a ispit je. Ja sam tek prva godina ali ću se izgleda čuda nagledati samo u ovog godini.

[Ovu poruku je menjao icobh dana 21.04.2006. u 11:23 GMT+1]
[ z@re @ 21.04.2006. 21:22 ] @
Ma nemoj nista govorit...sjecam se dobro ispita i kolokvija iz "Struktura podataka i Algoritama", i iz assemblera. Trebalo ti je minimalno 25 minuti za rjesit zadatak. 5 minuta za smislit u glavi kako ces rjesit, 5 minuta za iskodirat, a onih prvih 15 za shvatit "sta je pjesnik htio reci".

[ icobh @ 01.05.2006. 22:22 ] @
Da li je neko raspoložen za 2. i 4.? Prvi sam uradio a 3., zaboli me za njim. Valjda će neko od kolega nešto da napiše.
[ del-boy @ 02.05.2006. 02:04 ] @
Evo, reimo, drugog :D!

Code:

#include <stdio.h>

/*funkcija koja pretvara heksadecimalni broj (string) i int*/
int htoi ( char *hex) {
    int R=0, i=0;
    char k, minus;
    
    //provera znaka
    if (hex[i] == '-') {
        minus = 1;
        i++;
    }
    
    //provera da li je heksadecimalni broj unesen ispravno
    if (hex[i++] != '0') exit(1);
    if (hex[i] != 'x' && hex[i] != 'X') exit(2);
        else i++;
    
    while (hex[i] != 0) {
        R *= 16;
        
        if (hex[i]>='0' && hex[i]<='9') 
            R+= (hex[i]-'0');    
        else 
            if (hex[i]>='A' && hex[i]<='F')
                R+= ((hex[i]-'A')+10);    
            else 
                if (hex[i]>='a' && hex[i]<='f')
                    R+= ((hex[i]-'a')+10);    
            else exit(3);
            
        i++;
    }
    if (minus) R = -R;
    return R;
}

main () {

    //testiranje funkcije
    printf("Broj je: %d\n\n", htoi("-0xA10"));

    return 0;
}


Verovatno ovo sa exit nije najsrećnije rešenje, ali nisam znao šta da vratim ako naiđem na grešku, pošto svaka vrednost može da bude povratna! Možeš da žrtvuješ jednu vrednos (recimo nulu) pa da nju vraćaš u slučaju greške ili da ni ne vršiš proveru!
[ icobh @ 07.05.2006. 19:57 ] @
OK. Znači imam Prvi, Drugi i Treći ali nemam četvrtog, pretpostavljam da je ovo što treba napisati makro nije veliko ali džabe kad ne znam. Možda sam trebao sve što sam radio postovati ovdje, pošto će svejedno nekom sa ETF BL trebati.
[ icobh @ 28.05.2006. 10:41 ] @
Dobro, ovo što niko nije odgovorio, nema veze, snašao sam se! Evo tu sam zakačio sve zadatke koje sam uspio riješiti uz vašu pomoć, naravno, a ima i mog razvaljujućeg koda. A sada bi molio samo nekog da mi pomogne oko ovog zadatka (inače posljednji zadatak, posljednje vježbe!):
Code:
Napisati funkcije:
a) koja učitava matricu realnih (double) brojeva iz fajla koja je smješta u
prigodnu strukturu podataka
b) za množenje matrice. U slučaju neispravnih argumenata ispisati na
stderr poruku o grešci.
c) za ispisivanje matrice u fajl
d) napisati i mali program za testiranje rada ovih funkcija 
Napomena:
Možete na primjer da koristite slijedeću strukturu podataka
struct matrix 
{ int size_m,size_n; double *data;
};


Zanima me kako se radi sa ovom strukturom. Nekontam da li treba praviti niz neke promjenjive npr. M koja je definisana kao struct matrix ili šta već, i šta su parametri za M poslije tačke, ono M.??? Ja sam uvijek radio matrice sa onim fazonima kao M[4][5] ili M(4,5) ili M[4,5] i nesjećam se više kako u kojem programskom jeziku ide, ali ovo me definitivno zbunjuje.
[ rumpl @ 28.05.2006. 18:35 ] @
Cela matrica treba da ti bude u double *data;
Znaci, ako hoces, na primer da nadjes element koji se nalazi na liniji i, i koloni j;
treba da uradis ovako: matrica.data[i*matrica.size_m+matricasize_n];
znaci mozes da napravis funkciju koja ti to vraca:
Code:

double get_ij(struct matrix matrica, int i, int j)
{
    return(matrica.data[i*matrica.size_m+matricasize_n]);
}
[ icobh @ 28.05.2006. 22:48 ] @
Ili sam ja dovoljno glup ili ovdje ima nekih grešaka ili... ustvari na koji ovo fazon radi? Da možda ovo double *data nebi trebalo biti poslije vitičaste zagrade a prije ; u deklaraciji strukture?
[ rumpl @ 29.05.2006. 11:03 ] @
Ne razumeh tvoje pitanje.

Pazi ovako, struktura.... dobro, necu da ti odjasnjavam sta je to, nadam se ad shvatas cemu sluzi.

Deklaracija strukture:
Ima vise nacina:
Code:

struc s_char_int
{
    int moj_int;
    char *moj_neki_tamo_niz;
};

typedef  struct s_char_int t_char_int;

/* Sada mogu u main() da napisem nesto ovako: */

t_char_int my_var; /* Ovde deklarisem jednu varijablu tipa t_char_int */

/* Recimo da smo sada strpali nesto u strukturu */
printf("int: %d, char: %s\n", my_var.moj_int, my_var.moj_neki_tamo_niz);


Ok, ovo gore ti valjda nece sluziti nicemu, ali mrzi me da pisem vise.

Da predjem na matricu:
Code:

struct matrix 

    int size_m;
    int size_n; 
    double *data;
};


Znaci, u strukturi ces imati: broj redova, broj kolona matrice, i, najzad (double *data) u kojem ces imati koeficijente.

E sad, tebe valjda muci to sto ces imati samo jednu strukturu za matricu.

Gledaj:

Code:

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

struct matrix 

    int size_m;
    int size_n; 
    double *data;
};

typedef struct matrix t_matrix;

int main(void)
{
  int i;
  /* Nova matrica 2x2 */
  t_matrix moja_matrica = { 2, 2 }; 
  
  /* Alokacija memorije za koeficijente */
  moja_matrica.data = malloc(4*sizeof(double)); 
  
  /* Stavljamo neke koeficijente u matricu */
  for(i = 0; i < (moja_matrica.size_m*moja_matrica.size_n); i++)
    moja_matrica.data[i] = i;
  
  /* Ajd sad da to ispisemo */
  for(i = 0; i < (moja_matrica.size_m*moja_matrica.size_n); i++)
    {
      printf("%f ", moja_matrica.data[i]);
      
      if(i % moja_matrica.size_n)
    printf("\n");
    }

  free(moja_matrica.data);

  return(0);
}


U pocetku sam mislio da pisem puno, ali nista ne zamenjuje jedan dobar primer. :)
Srecno.