2.domaća zadaća
Select messages from
# through # FAQ
[/[Print]\]
Idite na Prethodno  1, 2, 3, 4, 5, 6, 7, 8  Sljedeće  :| |:
Forum@DeGiorgi -> Strukture podataka i algoritmi

#121: nejasnoća u zadatku Autor/ica: white_butterfly PostPostano: 22:40 pon, 27. 1. 2014
    —
Pozdrav!
Moj zadatak kaže da trebam kao provjeru ispisati znakove čvorova uređenog stabla u postorder redoslijedu, međutim na kraju teksta kao izlazni podatak moram ispisati oznake čvorova u preorder redoslijedu. Kao primjer piše da moj program mora ispisati ovo: JFBAGZHEDQPCA (to je postorder zadanog stabla).
Dakle, meni nije jasno da li moj program mora ispisati postorder ili preorder oznake čvorova, i zašto je u danom primjeru dva puta ispisan A? A je korijen stabla u primjeru, ali zar ne bi bio postorder ovakav: JFBGZHEDQPCA, tj. bez ovog prvog A??

#122:  Autor/ica: frutabella PostPostano: 18:15 uto, 28. 1. 2014
    —
Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S

#123:  Autor/ica: beuler PostPostano: 19:56 uto, 28. 1. 2014
    —
frutabella (napisa):
Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S



npr vezanu listu pointera na liste pa ubacujes u next pointer iducu na listu
ili jos bolje polje pointera na liste duljine m, pa samo for petljom ispunis liste

#124:  Autor/ica: frutabella PostPostano: 20:23 uto, 28. 1. 2014
    —
Embarassed mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.
Kod:

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


typedef struct celltag{

      char c;
      struct celltag *next;

}celltype;


     typedef celltype *List;
     typedef celltype *position;


     position LiMakeNull(List *Lp){

        *Lp=(celltype*)malloc(sizeof(celltype));
        (*Lp)->next=NULL;
        return (*Lp);
   }


     void LiInsert (char x, position p, List *Lp)
   {
       position temp;
       temp=p->next;
       p->next=(celltype*)malloc(sizeof(celltype));
       p->next=x;
       p->next->next=temp;
   }

     position LiNext(position p, List Lp)
     {
       if (p->next == NULL)
       {
       printf("NEXT: Kriva pozicija.");
       exit(1);
       }

       return p->next;
    }




        int main (void){

             int m, i, j;
             char c;

             List L[10];
             position p[10];

             printf("Koliko listi zelimo sazeti?\n");
             scanf("%d", m);

             for(i=1; i<=m; ++i)
             p[i]=LiMakeNull(&L[i]);

           

            for(i=1; i<=m; ++i)
            {
             printf("U listu %d  ubaci sljedece charove:\n", i);
             for(j=0; j<20; ++j)
             {
                 scanf("%c", c);
                 if (isalpha('c')==0)
                 {   i++;
                     break;
                 }
                 else

                 LiInsert(c, p[i], &L[i]);
                 p[i]=LiNext(p[i], L[i]);
             }
            }

             return 0;
    }



Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. Embarassed
Ali nesto ne stima...

#125:  Autor/ica: beuler PostPostano: 5:40 čet, 30. 1. 2014
    —
frutabella (napisa):
Embarassed mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.

Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. Embarassed
Ali nesto ne stima...


i ja sam se pomucio Very Happy ali ovo radi

http://pastebin.com/VWmB2MdR

#126:  Autor/ica: Countess PostPostano: 9:45 čet, 30. 1. 2014
    —
Kod:

             scanf("%d", m);
.
.
.
             
             scanf("%c", c);


Zaboravila si "&" u oba učitavanja u glavnom programu. Ako ima još grešaka, ja ih ne vidim jer nisam kompetentna Embarassed

#127:  Autor/ica: frutabella PostPostano: 14:43 čet, 30. 1. 2014
    —
Hvala vam! Rijesila sam malo drukcije, prvo ucitala string, pa onda iz stringa znak po znak dodavala u listu.

#128:  Autor/ica: gljividus PostPostano: 22:41 uto, 27. 1. 2015
    —
molila bih nekoga za pomoć...imam dictionary pomoću BST, gdje je binarno stablo prikazano pomoću pointera..kao implementaciju koristila sam funkcije iz udžbenika: delete, delete-min,insert, member, makenull. program se sruši kad pozovem neke od tih glavnih funkcija.. zna li netko mora li se još neka implementacija ubaciti u program? tipa za binarno stablo pomoću pointera? stvarno sam više izgubljena Sad

#129:  Autor/ica: 01 PostPostano: 13:48 ned, 1. 2. 2015
    —
Program se rusi pa ako netko vidi zasto bila bih zahvalna na pomoci Smile .

Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika:X(r)=(x1(r),...,xn(r)), r=1,..,m. Kažemo da je vektor X(j) < X(k) ako postoji i, 1 ≤ i ≤n takav da vrijedi: xr(j) = xr(k) za sve 1 ≤ r < i i xi(j) <xi(k)(to jest, sortira se leksikografski). Nemojte uvoditi ograničenja na veličinu brojeva m i n.

#include <stdio.h>
#include <malloc.h>

struct cv
{
int *vektor;
struct cv *lijevi;
struct cv *desni;
};
int m, n;
int *noviVektor;
struct cv *korijen;

int usporedi(int *prvi, int *drugi, int index)
{
if (index == n)
return -1;
if (prvi[index] < drugi[index])
return -1;
if (prvi[index] > drugi[index])
return 1;
index++;
return usporedi(prvi, drugi, index);
}

void dodaj(struct cv *cvor, int *element)
{
int i;
if (cvor == NULL)
{
cvor = (struct cv *)malloc(sizeof(struct cv));
cvor→vektor = (int *)malloc(n);
for (i = 0; i < n; i++)
(cvor→vektor)[i] = element[i];
cvor→lijevi = NULL;
cvor→desni = NULL;
}
else if (usporedi(element, cvor→vektor, 0) == -1)
dodaj(cvor→lijevi, element);
else
dodaj(cvor→desni, element);
}

void ispisi(struct cv *cvor)
{
int i;
if (cvor→lijevi != NULL)
{
ispisi(cvor→lijevi);
free(cvor→lijevi);
}
for (i = 0; i < n; i++)
{
printf("%d", (cvor→vektor)[i]);
if (i != (n - 1))
printf(" ");
}
printf("\n");
free(cvor→vektor);
if (cvor→desni != NULL)
{
ispisi(cvor→desni);
free(cvor→desni);
}
}

int main(void)
{
int i, j;
korijen = NULL;
scanf("%d", &m);
scanf("%d", &n);
for (i = 0; i < m; i++)
{
noviVektor = (int *)malloc(n);
for (j = 0; j < n; j++)
scanf("%d", &noviVektor[j]);
dodaj(korijen, noviVektor);
free(noviVektor);
}
ispisi(korijen);
return 0;
}

#130:  Autor/ica: beeing PostPostano: 21:12 pet, 29. 1. 2016
    —
Pozdrav. Imam problem u vezi zadaće. Zadatak glasi ovako:

Detaljno razradite implementaciju binarne relacije pomocu multiliste (vidi pododjeljak 4.4.5 u knjizi). Dakle napisite u C-u sve potrebne de nicije tipova i sve potrebne funkcije. Napisite program koji koristi vasu implementaciju za evidentiranje veze izmedu studenata i izbornih kolegija. Program treba omoguciti:
 unosenje ili izbacivanje studenata ili kolegija
 biljezenje cinjenice da je zadani student upisao zadani kolegij ili ponistio takav upis.
Takoder, program treba davati odgovore na sljedeca pitanja:
 Koje sve kolegije je upisao zadani student?
 Koji sve studenti su upisali zadani kolegij?

Dvije domene su mi pokazivaci na char.
Funkcija main izgleda ovako (barem do dijela gdje mi program pada):

Kod:

int main () {
    int br, len;
    char p[100];
    Relation R;
    ReMakeNull (&R);
    domain1 student;
    domain2 kolegij;
   
   
    printf("Za unos studenta birajte 1. \n");
    // ovdje idu ostali printfovi za ostale unose
   
    while (1) {
        printf ("Unesite broj: ");
        scanf ("%d", &br);
        switch (br) {
        case 1: {
            printf("Ime studenta: \n");
            alociraj1 (&student);
            unesi_studenta (student, &R);
            break;
        }
     /* (...) */


Funkcije koje se pozivaju u case 1 su definirane ovako:


Kod:

void alociraj1 (domain1 *student) {
    char str[100];
    scanf(" %[^\n]", str);
    (*student) = (domain1)malloc((strlen(str)+1)*sizeof(char));
    strcpy(*student, str);
}

void unesi_studenta (domain1 student, Relation *Rp) {
    domain2 kolegij;
    int flag=1; // pretpostavljamo da ako se unosi student da je on upisao barem jedan kolegij
    while (flag) {
        printf ("Unesi kolegij koji je %s upisao/la: \n", student);
        alociraj2 (&kolegij);
        ReRelate ( Rp, student, kolegij);
        printf ("Ima li jos kolegija koje je upisao/la? (1/0)");
        scanf ("%d", &flag);
    }
}

void alociraj2 (domain2 *kolegij) {
    char str[100];
    scanf(" %[^\n]", str);
    (*kolegij) = (domain2)malloc((strlen(str)+1)*sizeof(char));
    strcpy(*kolegij, str);
}

void ReRelate (Relation *R, domain1 d1, domain2 d2) {
    rcelltype *poc1, *poc2, *p, *t;
    int ima1 = MaCompute1(R->M1, d1, &poc1);
    int ima2 = MaCompute2(R->M2, d2, &poc2);
    if (ima1)
        for (p = poc1; p; p = p->next1)
            if ( !strcmp (p->d1, d1) && !strcmp(p->d2, d2))
                return;
    t = (rcelltype*)malloc(sizeof(rcelltype));

    strcpy (t->d1, d1);
    strcpy (t->d2, d2);

    t->next1 = ima1 ? poc1 : NULL;
    t->next2 = ima2 ? poc2 : NULL;
    printf("rerelate\n");
    MaAssign1(&R->M1, d1, t);
    MaAssign2(&R->M2, d2, t);
}

void MaAssign1 (Mapping1 *Mp, domain1 d, range r) {
    if ((*Mp) == NULL) {
        printf("maassign1\n");
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));   // <- tu prestaje raditi
        printf("maassign1\n");
        strncpy ((*Mp)->d, d, strlen(d));
        (*Mp)->r = r;
        (*Mp)->left = (*Mp)->right = NULL;
        return;
    }
    // itd.
}


Program prestaje raditi kod alokacije memorije za *Mp u funkciji MaAssign1. Pojavi se onaj pravokutnik sa "Program (...).exe prestao je raditi; Windows traži rješenje problema na internetu...". Vidi li netko odmah u čemu je stvar? Stavit ću čitav kod u attachment ako netko ne vidi odmah, a voljan je podrobnije pogledati o čemu je riječ. Smile

#131:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 3:06 sub, 30. 1. 2016
    —
Ovdje je problem:

Kod:
    t = (rcelltype*)malloc(sizeof(rcelltype));

    strcpy (t->d1, d1);
    strcpy (t->d2, d2);


Varijable d1 i d2 su nealocirani pointeri koje strcpy treba dereferencirati i nesto zapisati tamo gdje oni pokazuju (sto je, ovisno o OSu, ili NULL ili neka bezvezna lokacija koja ne postoji ili barem ne pripada programu).

#132:  Autor/ica: beeing PostPostano: 8:02 sub, 30. 1. 2016
    —
Hvala na odgovoru. No, ne razumijem zašto strcpy treba zapisati nešto tamo gdje pokazuju d1 i d2, nije li da želi nešto zapisati tamo gdje pokazuju t->d1 i t->d2? Ako je ipak tako, onda alociram memorije za t->d1 i t->d2, ali ništa se ne mijenja po pitanju rada programa.

#133:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 12:34 sub, 30. 1. 2016
    —
Da, mislio sam na t→d1 i t→d2. Kad dodam alokaciju:
Kod:
    t->d1 = (domain1)malloc(strlen(d1)+1);
    t->d2 = (domain1)malloc(strlen(d2)+1);

ovaj dio programa prodje kako treba i ispise mi:
Kod:
rerelate
maassign1
maassign1

prije nego padne. To se desi ovdje:
Kod:
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
        printf("maassign1\n");
        strncpy ((*Mp)->d, d, strlen(d));

Ocito, problem je isti: (*Mp)→d je nealocirani pointer kojeg strncpy mora dereferencirati da pi pisao tamo gdje taj pointer pokazuje (sto je, kao i prije, ili NULL ili nesto besmisleno).

#134:  Autor/ica: beeing PostPostano: 16:55 sub, 30. 1. 2016
    —
Ups, hvala. Smile Nastavila bih gnjaviti ako smijem. U jednom trenutku program mi ulazi u
Kod:
void ReCompute2 (Relation R, domain1 d1, Set2 *S2p) {
    SeMakeNull2(S2p);
    rcelltype *p;
    if (R.M1) //R.M1 je pokazivac na strukturu
        printf("R.M1 nije null\n");
    int ima = MaCompute1(R.M1, d1, &p);
    if(!ima)
        return;
    (...)
}

a MaCompute1 je definirana sa
Kod:
int MaCompute1 (Mapping1 M, domain1 d, range *rp) {
    if(M == NULL){
        printf("M je null\n");
        return 0;
    }
    (...)
}

Program ispiše
Kod:
R.M1 nije null
M je null

i varijabla ima je nakon poziva MaCompute1 vrijednosti nula. Kako do toga dođe, da pokazivač R.M1 ipak ne pokazuje ni na što?

#135:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 17:42 sub, 30. 1. 2016
    —
To sto pointer negdje pokazuje, ne znaci da pokazuje gdje treba. Ako nije alociran i ako mu nisi direktno zadala da pokazuje na neku smislenu adresu, onda ce on ili biti NULL ili ce pokazivati negdje bezveze. Recimo, ovaj program:
Kod:
#include <stdio.h>

int main(void) {
    int *p;
    printf("%p\n", p);
    return 0;
}

na Linuxu ispise (nil), a na WinXP neku random adresu (konkretno, meni je ispisao 7FFDF000 i jednom izvrsavanju, a 7FFDE000 u drugom).

Stvar je ista kao s "obicnim" varijablama. Ako napravis:
Kod:
int x;
printf("%d\n", x);

racunaj da vrijednost x-a nije definirana jer nigdje nisi rekla x = nesto;, ili scanf("...", &x);, ili nesto slicno. Moze ti se desiti da je nula (npr. na Linuxu), a moze ispasti i neka skroz slucajna vrijednost koja se u trenutku stvaranja varijable zatekla na dijelu memorije koji je varijabli dodijeljen (npr. na Win).

Varijable tipa int u sebi drze cijele brojeve, a pointeri drze adrese, no i jedno i drugo su samo nekakvi podaci i nema razloga da se razlicito ponasaju kad ih kreiras bez inicijalizacije.

#136:  Autor/ica: beeing PostPostano: 0:35 ned, 31. 1. 2016
    —
No, komponente varijable R koju prima ReCompute2, R.M1 i R.M2, prije ovog dijela koda bile su proslijeđene redom funkcijama MaAssign1 i MaAssign2, gdje su memorije za njih bile uredno alocirane. Ali, kad provjeravam adrese pointera u ReCompute2, vidim zaista da jednom pokazuju na jednu stvar, a drugi put na drugu. Confused

#137:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 2:00 ned, 31. 1. 2016
    —
U MaAssign funkcijama to izgleda ovako:
Kod:
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
        strncpy ((*Mp)->d, d, strlen(d));

(*Mp)→d je, u osnovi, char*. Gdje se to alocira?

Preporucio bih setnju do demosa ili, ako oni ne postoje, do asistenta, pa debuggirajte zajedno. Ovakvo loptanje gdje svatko od nas napise nesto svakih nekoliko sati bi moglo potrajati.

#138:  Autor/ica: beeing PostPostano: 2:16 ned, 31. 1. 2016
    —
Isto u funkcijama MaAssign1 i MaAssign2 između tih dviju linija koje ste naveli sa
Kod:
        (*Mp)->d = (domain1)malloc(strlen(d)+1);
i
Kod:
        (*Mp)->d = (domain2)malloc(strlen(d)+1);

#139:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 11:13 ned, 31. 1. 2016
    —
Verzija koju ja imam (iz attachmenta od par postova gore) to nema, tako da mogu samo pricati napamet. Sad Kao sto rekoh, debugging je bolje raditi uzivo.

#140:  Autor/ica: beeing PostPostano: 11:31 ned, 31. 1. 2016
    —
Ovo je zadnja verzija. Pokušat ću se svakako još naći sa asistentom. Hvala na pomoći Smile



Forum@DeGiorgi -> Strukture podataka i algoritmi


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Idite na Prethodno  1, 2, 3, 4, 5, 6, 7, 8  Sljedeće  :| |:
Stranica 7 / 8.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin