[ milkinizz @ 11.08.2009. 18:09 ] @
Cao drustvo, ne bih vas davila da mi nije hitno. Spremam ispit i zakocila sam,citala sam skripte,knjige ali i dalje mi neke stvari nisu jasne. Ovaj zadatak je bio na ispitu i data je okosnica klase niz kao i deo main funkcije. Metodom slucajnog izbora bira se niz, koji se zatim sortira i na njega se primeni marge-metoda ciji je princip takodje dat. Problem mi pravi funkcija void Sort koju sam ja dodala jer nisam znala kako drugacije da uradim.
Zna li neko kako da ispravim ovaj deo koda ili kako drugacije da uradim.
Unapred hvala i MOLIM VAS DA MI NEKO POMOGNE jer vec 5 dana se vracam na ovaj zadatak ali nista novo ne mogu da smislim. :-(


Code:

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

class niz;

void ShowRandom(niz x);
void ShowSorted(niz x);

class niz{
public:
       niz(int n=10);
       niz &Merged(niz &x);
private:
       int n;
       int *Random;
       int *Sorted;
       friend void ShowRandom(niz);
       friend void ShowSorted(niz);
       void Sort();
}


niz::void Sort()
{
  int i,j,t;
  for (i=0;i<(this->n -1);i++)
    for (j=i+1;j<this->n;j++)
    if (this->Sorted[i]>this->Sorted[j])
    {
       t=this->Sorted[i];
       this->Sorted[i]=this->Sorted[j];
       this->Sorted[j]=t;
    }
  return;
}

niz &niz::Merged(niz &x)
{
  int i=0;
  int j=0;
  int k=0;
  niz *novi=new niz(this->n+x.n);
  for (i=0;i<this->n;i++)
    novi->Random[i]=this->Random[i];
  for (j=0;j<x.n;j++)
    novi->Random[i+j]=x.Random[j];
  i=0;
  j=0;
  k=0;
  while ((i<this->n)||(j<x.n))
  {
     if ((i<this->n)&&(j<x.n))

     {
    if (this->Sorted[i]<x.Sorted[j])
    {
       novi->Sorted[k]=this->Sorted[i];
       i++;
       k++;
    }
    else
    {
       novi->Sorted[k]=x.Sorted[j];
       j++;
       k++;
    }
     }

     else
     {
    if (i==this->n)
    {
      while (j<x.n)
      {
         novi->Sorted[k]=x.Sorted[j];
         j++;
         k++;
      }
      break;
    }
    else
    {
      while (i<this->n)
      {
         novi->Sorted[k]=this->Sorted[i];
         i++;
         k++;
      }
      break;
    }
     }
  }
  return *novi;
}

niz::niz(int n)
{
  int i,j,t;
  this->n=n;
  Random=new int[10];
  for(i=0;i<n;i++)
  Random[i]=random[10];
  Sorted=new int[10];
  for(i=0;i<n;i++)
  Sorted[i]=Random[i];
  this->Sort();
}
void ShowRandom(niz x)
{
   printf("\n");
   for(int i=0;i<x.n;i++)
   printf("%d ",x.Random[i]);
   return;
}

void ShowSorted(niz x)
{
   printf("\n");
   for(int i=0;i<x.n;i++)
   printf("%d ",x.Sorted[i]);
   return;
}

int main(int argc,char *argv[])
{
   randomize;
   niz x=(!strcmp(argv[1],"0")?0:atoi(argv[1])),y=atoi(argv[2]);
   niz z;

   printf("\nX==========================================================\n");
   ShowRandom(x);
   printf("\n\nSortirani je :\n");
   ShowSorted(x);  //elemente x.Sorted prikazati na ekranu

   printf("\nY==========================================================\n");
   ShowRandom(y);
   printf("\n\nSortirani je :\n");
   ShowSorted(y);  //elemente y.Sorted prikazati na ekranu

   printf("\nZ==========================================================\n");
   z=x.Merged(y);
   ShowRandom(z);
   printf("\n\nSortirani je :\n");
   ShowSorted(z);  //elemente z.Sorted prikazati na ekranu
   printf("\n==========================================================\n");
   system("PAUSE");
   return 0;
}
[ Goran Arandjelovic @ 12.08.2009. 00:22 ] @
Nisam se osvrtao na ostatak koda, ali definicija funkcije Sort treba da počne ovako..:

Code:

void niz::Sort()
{
  // tvoj kod...
}


Čitaj šta ti za početak kompajler javlja, a i pošto si već imala f-ju Merged, tamo si mogla da primetiš kako treba da se definiše funkcija.
[ Eurora3D Team @ 12.08.2009. 10:06 ] @
Ovako ce da radi (na GNU GCC kompajleru) ... promenio sam nekoliko linija
Code:

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

class niz;

void ShowRandom(niz x);
void ShowSorted(niz x);

class niz
{
public:
    niz(int n=10);
    ~niz(); //destuktor
    niz &Merged(niz &x);

private:
    int n;
    int *Random;
    int *Sorted;
    friend void ShowRandom(niz);
    friend void ShowSorted(niz);
    void Sort();
};


void niz::Sort()
{
    int i,j,t;
    for (i=0;i<(this->n -1);i++)
        for (j=i+1;j<this->n;j++)
            if (this->Sorted[i]>this->Sorted[j])
            {
                t = this->Sorted[i];
                this->Sorted[i] = this->Sorted[j];
                this->Sorted[j] = t;
            }
    return;
}

niz& niz::Merged(niz &x)
{
    int i=0;
    int j=0;
    int k=0;
    niz *novi = new niz(this->n+x.n);
    for (i=0;i<this->n;i++)
        novi->Random[i] = this->Random[i];
    for (j=0;j<x.n;j++)
        novi->Random[i+j] = x.Random[j];
    i=0;
    j=0;
    k=0;

    while ((i<this->n)||(j<x.n))
    {
        if ((i<this->n)&&(j<x.n))

        {
            if (this->Sorted[i]<x.Sorted[j])
            {
                novi->Sorted[k]=this->Sorted[i];
                i++;
                k++;
            }
            else
            {
                novi->Sorted[k]=x.Sorted[j];
                j++;
                k++;
            }
        }

        else
        {
            if (i==this->n)
            {
                while (j<x.n)
                {
                    novi->Sorted[k]=x.Sorted[j];
                    j++;
                    k++;
                }
                break;
            }
            else
            {
                while (i<this->n)
                {
                    novi->Sorted[k]=this->Sorted[i];
                    i++;
                    k++;
                }
                break;
            }
        }
    }
    return *novi;
}

niz::niz(int n)
{
    int i,j,t;
    if (n < 1)  //
        n =20;
    this->n=n;
    Random = new int[n]; //
    for(i=0;i<n;i++)
        Random[i] = rand();// rand() funkcija
    Sorted = new int[n]; //
    for(i=0;i<n;i++)
        Sorted[i] = Random[i];
    this->Sort();
}

niz::~niz() //destuktor
{
    delete[] Random;
    delete[] Sorted;
}

void ShowRandom(niz x)
{
    printf("\n");
    for(int i=0;i<x.n;i++)
        printf("%d ",x.Random[i]);
    return;
}

void ShowSorted(niz x)
{
    printf("\n");
    for(int i=0;i<x.n;i++)
        printf("%d ",x.Sorted[i]);
    return;
}

int main(int argc,char *argv[])
{
    //    randomize;
    //    niz x= (!strcmp(argv[1],"0")?0:atoi(argv[1])),y=atoi(argv[2]);

    int a = 0, b = 0;
    while(a < 1 || a > 10)
    {
        printf ("Unesite broj elemenata prvog niza (1 - 10): ");
        scanf("%d",&a);
    }
    while(b < 1 || b > 10)
    {
        printf ("\nUnesite broj elemenata drugog niza (1 - 10): ");
        scanf("%d",&b);
        printf("\n");
    }

    srand( (unsigned)time( NULL ) ); // inicijalizujemo random number generator
    niz x = a;
    niz y = b;
    // niz z; // = 10

    printf("\nX==========================================================\n");
    ShowRandom(x);
    printf("\n\nSortirani je :\n");
    ShowSorted(x);  //elemente x.Sorted prikazati na ekranu

    printf("\nY==========================================================\n");
    ShowRandom(y);
    printf("\n\nSortirani je :\n");
    ShowSorted(y);  //elemente y.Sorted prikazati na ekranu

    printf("\nZ==========================================================\n");
    niz z = x.Merged(y); // objekat z
    ShowRandom(z);
    printf("\n\nSortirani je :\n");
    ShowSorted(z);  //elemente z.Sorted prikazati na ekranu
    printf("\n==========================================================\n");

    system("PAUSE");
    return 0;
}


[Ovu poruku je menjao Eurora3D Team dana 12.08.2009. u 23:16 GMT+1]
[ Mihajlo Cvetanović @ 12.08.2009. 10:17 ] @
Šta znači "randomize;", bez "()"? I gde se inicijalizuje objekat niz? Pretpostavljam da su neke stvari ovde izostavljene ali da kod tebe postoje, jer ga ovde nema ni destruktor ni kopi konstruktor. Takođe, funkcija Merged vraća referencu na objekat niz, ali taj objekat kreira sa new. To nije dobra ideja, jer tu negde sad nedostaje jedno delete. Uzgred, funkcija Merged može elegantije da se napravi, jer imaš ponavljanje koda. Dovoljna je samo jedna while petlja i jedan if unutra:

Code:

  ...
  while (i < this->n || j < x.n)
  {
    if (j == x.n || this->Sorted[i] < x.Sorted[j])
    {
      novi->Sorted[k] = this->Sorted[i];
      i++;
      k++;
    }
    else
    {
      novi->Sorted[k] = x.Sorted[j];
      j++;
      k++;
    }
  }
[ milkinizz @ 14.08.2009. 20:00 ] @
Hvala svima na odgovorima ali ja opet imama jedno pitanjce :-) .

I kod mene radi ovako s tim da zadatak zahteva da se dimenzija niza n i elementi niza Random biraju metodom slucajnog izbora. Probala sam na 2-3 nacina i nece.
Code:

int a = 0, b = 0;
    while(a < 1 || a > 10)
    {
        printf ("Unesite broj elemenata prvog niza (1 - 10): ");
        scanf("%d",&a);
    }
    while(b < 1 || b > 10)
    {
        printf ("\nUnesite broj elemenata drugog niza (1 - 10): ");
        scanf("%d",&b);
        printf("\n");
    }


Imate li neku ideju? I da sta to znaci kada u main f-ji stavimo (sto je u mom zadatku slucaj)
Code:
... niz y=20;

Da li to znaci da je njegova dimenzija 20 ili nesto drugo?
Hvala unapred
Pozdrav Milka
[ Mihajlo Cvetanović @ 15.08.2009. 18:43 ] @
"niz y=20;" je isto što i "niz y(20);" to jest stvara se objekat y klase niz pomoću konstruktora koji prima jedan parametar int. Taj parametar je dimenzija niza jer u konstruktoru imamo this->n=n; a posle i stvaranje dva elementarna niza s tim 'n'.

Ako i dimenzija treba da bude slučajan broj onda možeš da staviš "niz y=rand();". Druga opcija bi bila da konstruktor nema ni jedan parametar, ali da imaš liniju "this->n=rand();".
[ Eurora3D Team @ 16.08.2009. 00:21 ] @

Kao sto je @Mihajlo Cvetanović vec objasnio dimenzije nizova se odredjuju brojem koji se prosledjuje kontruktor funkciji.
Ja bi naglasio da klasa niz nije niz (samo se tako zove)... ona u sebi sadrzi 2 niza ... posto se iz pitanje stice utisak da ne razlikujes klasu niz od c++ niza
Ako ti treba slucajan (random) broj elemenata stavi ovako na pocetku main umesto dve while petlje
Code:

srand( (unsigned)time( NULL ) ); // inicijalizujemo random number generator
niz x = rand();
niz y = rand();

ali imaj u vidu da rand() daje sve vrednosti int sto znaci da mozes da imas nizove od npr. 10000 elemenata
Drugo, elementi Random niza sa biraju metodom slucajnog izbora
Code:

for(i=0;i<n;i++)
        Random[i] = rand(); // rand() funkcija

Pozdrav
[ milkinizz @ 17.08.2009. 10:01 ] @
Hvala svima.
Mnogo ste mi pomogli.
Veliki pozdrav svima