Presjek dva skupa - C++

poruka: 26
|
čitano: 8.874
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
12 godina
protjeran
offline
Presjek dva skupa - C++

Prije svega pozdrav!
Znam da ima ultimativna tema, ali ipak nepregledna je, ali u drugom slučaju izvinjavam se za otvaranje nove, a ne pisanja u staru.

 

Znači imam problem sa zadatkom koji glasi:


Omogućiti korisniku unos dva niza cijelih brojeva željene veličine. Nakon toga program treba da formira treći niz koji se sastoji od zajedničkih elemenata unesenih nizova (formira njihov presjek). Elementi u rezultujućem nizu se ne smiju duplirati, te moraju biti poredani u rastućem redoslijedu.

 

Ja sam uradio dosta, ali imam puno grešaka u run-time-u, a zadatak je tako zbunjujući da ne znam odakle da tražim problem.
Ja uradim da se unesu dva niza i provjeri postojanost zajedničkih članova, što mi je pomogao captain_soap_Mc_Tawish, hvala mu, ali sve mi je to zbunjujuće.
Ako bi mi neko mogao objasniti kako da popravim ovaj zadnji dio koda ispod gdje provjeravam i ispisujem zajednički niz. i ne znam dokle vrtiti petlju koja će to provjeravati ako su nizovi nejednaki po broju članova.
Moj kod:
#include<iostream>
#include<cstdlib>
#define MAX 100
using namespace std;
int main()
{
 int polje_prvo[MAX];
 int polje_drugo[MAX];
 int polje_zajednicki[MAX];
 int velicina_prvi, velicina_drugi;
        cout<<"Velicina prvog polja:"<<endl;
 cin>>velicina_prvi;
 for(int i=0; i<velicina_prvi; i++)
 {
  cin>>polje_prvo[i];
 }
 cout<<"\nVelicina drugog polja:"<<endl;
 cin>>velicina_drugi;
 for(int i=0; i<velicina_drugi; i++)
 {
  cin>>polje_drugo[i];
 }
 int pom=0;
 cout<<endl;
 for(int i=0; i<velicina_drugi; i++)
 {
  for(int j=0; i<velicina_drugi; j++)
  {
   if(polje_prvo[i]==polje_drugo[j])
   {
    polje_zajednicki[pom]=polje_prvo[i];
    pom++;
    break;
   }
  }
 }
 for(int i=0; i<pom; i++)
 {
  cout<<polje_zajednicki[i]<<endl;
 }
 system("PAUSE");
 return 0;
}

Transact-SQL
 
0 0 hvala 0
12 godina
neaktivan
offline
Re: Presjek dva skupa - C++

Pa u obe for petlje si stavio velicina_drugi kao grornje ogranicenje for petlje, moras za prvi niz koristiti velicina_prvi varijablu

a ostala logika mi se cini ok 

vlastoručni potpis
12 godina
protjeran
offline
Re: Presjek dva skupa - C++
karaandrijan kaže...

Pa u obe for petlje si stavio velicina_drugi kao grornje ogranicenje for petlje, moras za prvi niz koristiti velicina_prvi varijablu

a ostala logika mi se cini ok 

 Taj dio je ok i sad mi je jasan, ali kako mogu da ignoriram postojeće članove?

Transact-SQL
12 godina
neaktivan
offline
Re: Presjek dva skupa - C++

ovako rijesi to! napravi jos jedan niz d i u njega upisuj clanove rez niza ali tako da for petlje provjeravaju nalazi li se taj clan vec u tom novom nizu

evo kod koji sam nabrzinu naklepa

 

d[0]=c[0];// c je rez polje koje ti dobijes  a d polje u kojem nema duplikata, postavi vrij. 1. clana d polja kao vrij. 1. clana c polja da ne radimo sa //praznim poljem u prvoj iteraciji
    pom1=1; //pomocna varijabla kojom pratimo koliko ima clanova
    for(int i=1;i<pom;i++ )
    {k=0;// varijabla koju koristimo kao boolean
       for(int j=0;j<pom1;j++)
       {
          if(c[i]==d[j])
          {
             k=1;
             break;
          }
       
            
         

       }
       if(k==0)
       {
          d[pom1]=c[i];
          pom1++;
       }
    }
ovaj dio ti izbacuje duplikate jos samo sortiras  niz koji dobijes u ovom slucaju d i gotovo

edit:

evo ti i kod koji sortira od veceg ka manjem clanove

for(int i=0;i<pom1;i++)//pom1 pomocna koja nam pokazuje koliko nam clanova ima niz
    {
       for(int j=i+1;j<pom1;j++)
       {
          if(d[i]>d[j])
          {
             pom3=d[i];//pom3 pomocna koju nam pomaze kod zamjene mjesat clanovima
             d[i]=d[j];
             d[j]=pom3;
            
             
             



          }
          
       }

    
    }

vlastoručni potpis
Poruka je uređivana zadnji put sub 5.5.2012 23:49 (karaandrijan).
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Sve se svodi na to da provjeravamo nalazi li se neki clan u oba polja. To radimo na nacin, da za svaki clan jednoga polja, provjeravamo je li jednak ijednome clanu drugoga polja. Zato na ona prva for petlja sluzi, sa njom prolazimo sve clanove prvoga polja i gledamo je li taj clan presjek. Za svaki clan prvoga polja, provjeravamo drugom for petljom, je li jednak ijednome clanu drugoga polja. Dakle drugom for petljom prelazimo kroz clanove drugoga polja i onda gledamo je li ijedan jednak trenutno clanu provoga polja. To je provjeravamo if naredbom. I kad je ona tocna znaci da smo pronasli clan koji se nalazi u oba polja, tada to ubacimo u zajednicko polje i prekinemo petljanje za taj clan(naredba break) i onda nastavljamo dalje sa sljedecim clanom drugoga polja.

 

Zajednicke clanove dodajemo u polje_zajednicki. Uz njega imamo varijablu pom kojom pamtimo koliko smo do sada clanova u njega spremili, tako da znamo gdje cemo staviti sljedeci clan u njega. I kad stavimo clan u njega, pom povecamo samo za 1 da bi presli na sljedeci clan.

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Re: Presjek dva skupa - C++

A kako mogu znati postoji li taj član?

Transact-SQL
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

A kako mogu znati postoji li taj član?

Nisam bas shvatio pitanje. Na koji clan mislis?

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Presjek dva skupa - C++

Imam probem sa tim, da ako unesem različite veličine nizova zajednički ne bude uredu?

1 1
Transact-SQL
 
0 0 hvala 0
12 godina
protjeran
offline
Re: Presjek dva skupa - C++
captain_soap_McTawish kaže...
T-SQL kaže...

A kako mogu znati postoji li taj član?

Nisam bas shvatio pitanje. Na koji clan mislis?

 Ima li duplikata.

Transact-SQL
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Imam probem sa tim, da ako unesem različite veličine nizova zajednički ne bude uredu?

I logino da nije u redu. Naime ta bi to radilo moras samo kod provjere provoga niza, umjestno duzine drugoga niza staviti duzinu prvoga niza. I postoji sitna greska u kodu, gdje je umjesto j<velicina_drugi stavljeno i<velicina drugi.

 for(int i=0; i<velicina_prvi; i++)
 {
  for(int j=0; j<velicina_drugi; j++)
  {
   if(polje_prvo[i]==polje_drugo[j])
   {
    polje_zajednicki[pom]=polje_prvo[i];
    pom++;
    break;
   }
  }
 }

T-SQL kaže...

 Ima li duplikata.

Algoritam se svodi na to da uzmemo jedan clan iz prvoga skupa. I onda idemo u drugi skup, uzimamo svaki clan iz drugoga skupa i gledamo je li ijedan clan drugoga skupa jednak uzetome clanu prvoga skupa. Ako jest dodamo taj clan u zajednicko polje i uzmemo sljedeci clan prvoga skupa i ponavljamo postupak. Izvedi ovaj kod i sve ce ti biti jasnije:

 

#include<iostream>
#include<cstdlib>
#define MAX 100
using namespace std;
int main()
{
    int polje_prvo[MAX];
    int polje_drugo[MAX];
    int polje_zajednicki[MAX];
    int velicina_prvi, velicina_drugi;
    cout<<"Velicina prvog polja:"<<endl;
    cin>>velicina_prvi;
    for(int i=0; i<velicina_prvi; i++)
    {
        cin>>polje_prvo[i];
    }
    cout<<"\nVelicina drugog polja:"<<endl;
    cin>>velicina_drugi;
    for(int i=0; i<velicina_drugi; i++)
    {
        cin>>polje_drugo[i];
    }
    int pom=0;
    cout<<endl;
    for(int i=0; i<velicina_prvi; i++)
    {
        cout<<i<<". clan prvoga skupa"<<endl;
        for(int j=0; j<velicina_drugi; j++)
        {
            cout<<" "<<j<<". clan drugoga skupa"<<endl;
            if(polje_prvo[i]==polje_drugo[j])
            {
                cout<<"Jednaki su pa dodajemo u zajednicki niz"<<endl;
                polje_zajednicki[pom]=polje_prvo[i];
                pom++;
                break;
            }
        }
    }
    for(int i=0; i<pom; i++)
    {
        cout<<polje_zajednicki[i]<<endl;
    }
    system("PAUSE");
    return 0;
}

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Presjek dva skupa - C++

Ok, hvala, sve je sada uredu osim duplikata.
Ja to mislim ovako:
Još jedna petlja koja će provjeravati da li se taj član već nalazi u zajedničkom nizu, ako jeste tek onda se zapisuje.
Ta petlja bi bila u if-u?

Dosadašnji kod: BTW, kako napisati ono dugo o.

  1. #include<iostream>
  2. #include<cstdlib>
  3. #define MAX 100
  4. using namespace std;
  5. int main()
  6. {
  7.    int polje_prvo[MAX];
  8.    int polje_drugo[MAX];
  9.    int polje_zajednicki[MAX];
  10.    int velicina_prvi, velicina_drugi;
  11.    cout<<"Velicina prvog polja:"<<endl;
  12.    cin>>velicina_prvi;
  13.    for(int i=0; i<velicina_prvi; i++)
  14.    {
  15.      cin>>polje_prvo[i];
  16.    }
  17.    cout<<"\nVelicina drugog polja:"<<endl;
  18.    cin>>velicina_drugi;
  19.    for(int i=0; i<velicina_drugi; i++)
  20.    {
  21.      cin>>polje_drugo[i];
  22.    }
  23.    int pom=0;
  24.    cout<<endl;
  25.    for(int i=0; i<velicina_prvi; i++)
  26.    {
  27.      for(int j=0; j<velicina_drugi; j++)
  28.      {
  29.        if(polje_prvo[i]==polje_drugo[j])
  30.        {
  31.                 polje_zajednicki[pom]=polje_prvo[i];
  32.          pom++;
  33.          break;
  34.              }
  35.          }
  36.      }
  37.    for(int i=0; i<pom; i++)
  38.    {
  39.      cout<<polje_zajednicki[i]<<endl;
  40.    }
  41.    system("PAUSE");
  42.    return 0;
  43. }

 

Transact-SQL
 
0 0 hvala 0
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Ok, hvala, sve je sada uredu osim duplikata.
Ja to mislim ovako:
Još jedna petlja koja će provjeravati da li se taj član već nalazi u zajedničkom nizu, ako jeste tek onda se zapisuje.

Ovdje se provjerava da li se taj clan nalazi u drugome nizu, ako jest u tome drugome nizu onda se tek stavlja u zajednicko polje. Ovo sto si rekao nema smisla, jer onda bi zajednicki niz uvijek ostao prazan.Zajednicki niz je na pocetku prazan i onda se nijedan clan ne bi mogao vec naci u njemu pa ga ne bi mogli ni zapisati.

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Re: Presjek dva skupa - C++

Vidis da sam glup. ;)

Pa kako bih mogao to uraditi?

Transact-SQL
12 godina
neaktivan
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Vidis da sam glup. ;)

Nisi glup.
Došao si do rješenja problema u glavi, sad što to ne znaš iskodirati je problem za sebe. Vjerovatno slabo znanje iz C++-a...

14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Vidis da sam glup. ;)

Pa kako bih mogao to uraditi?

Pa ako sam shvatio zelis da kad pronades duplirani clan, provjeriti da li se on vec nalazi u zajednickim clanova i ako se nalazi dodati ga. Pa to napravis da dodas jos jednu for petlju unutar jednoga if-a i onda provjeravas da li se on vec tu nalazi:

  1. #include<iostream>
  2. #include<cstdlib>
  3. #define MAX 100
  4. using namespace std;
  5. int main()
  6. {
  7.    int polje_prvo[MAX];
  8.    int polje_drugo[MAX];
  9.    int polje_zajednicki[MAX];
  10.    int velicina_prvi, velicina_drugi;
  11.    cout<<"Velicina prvog polja:"<<endl;
  12.    cin>>velicina_prvi;
  13.    for(int i=0; i<velicina_prvi; i++)
  14.    {
  15.      cin>>polje_prvo[i];
  16.    }
  17.    cout<<"\nVelicina drugog polja:"<<endl;
  18.    cin>>velicina_drugi;
  19.    for(int i=0; i<velicina_drugi; i++)
  20.    {
  21.      cin>>polje_drugo[i];
  22.    }
  23.    int pom=0;
  24.    cout<<endl;
  25.    for(int i=0; i<velicina_prvi; i++)
  26.    {
  27.      for(int j=0; j<velicina_drugi; j++)
  28.      {
  29.        if(polje_prvo[i]==polje_drugo[j])
  30.        {
  31.         for(int k = 0; k< pom;k++)
  32.              if(polje_prvo[i] == polje_zajednicki[k]){
  33.                polje_zajednicki[pom]=polje_prvo[i];
  34.                pom++;
  35.                break;
  36.               }
  37.            }
  38.          }
  39.      }
  40.    for(int i=0; i<pom; i++)
  41.    {
  42.      cout<<polje_zajednicki[i]<<endl;
  43.    }
  44.    system("PAUSE");
  45.    return 0;
  46. }

To se ovako izvede no zajednicko polje ce ti uvijek biti prazno.

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Re: Presjek dva skupa - C++

Shvatio sam, znači ne mogu nikako postići da mi se ne pojavljuju duplikati u zajedničkom nizu?

Transact-SQL
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Shvatio sam, znači ne mogu nikako postići da mi se ne pojavljuju duplikati u zajedničkom nizu?

Naravno da mozes. No ti si me pitao kako postici da ti se pojavljuju samo duplikati u nizu. To mozes izvesti tako drugom for petljom provjeravas da li se nalazi taj clan u drugome nizu. Ako se ne nalazi dodas ga. I to moras napraviti 2 puta tj. po jednom za oba polja buduci da u prvome trzis clanove koji se nalaze u prvome polje, a ne u drugome. A drugom postupku obrnuto

 

#include<iostream>
#include<cstdlib>
#define MAX 100
using namespace std;
int main()
{
    int polje_prvo[MAX];
    int polje_drugo[MAX];
    int polje_zajednicki[MAX];
    int velicina_prvi, velicina_drugi;
    cout<<"Velicina prvog polja:"<<endl;
    cin>>velicina_prvi;
    for(int i=0; i<velicina_prvi; i++)
    {
        cin>>polje_prvo[i];
    }
    cout<<"\nVelicina drugog polja:"<<endl;
    cin>>velicina_drugi;
    for(int i=0; i<velicina_drugi; i++)
    {
        cin>>polje_drugo[i];
    }
    int pom=0;
    cout<<endl;
    for(int i=0; i<velicina_prvi; i++)
    {
        bool nema = true;
        for(int j=0; j<velicina_drugi; j++)
        {
            if(polje_prvo[i]==polje_drugo[j])
            {
                nema = false;
            }
        }
        if(nema)
        {
            polje_zajednicki[pom] = polje_prvo[i];
            pom++;
        }
    }
    for(int i=0; i<velicina_drugi; i++)
    {
        bool nema = true;
        for(int j=0; j<velicina_prvi; j++)
        {
            if(polje_drugo[i]==polje_prvo[j])
            {
                nema = false;
            }
        }
        if(nema)
        {
            polje_zajednicki[pom] = polje_drugo[i];
            pom++;
        }
    }
    for(int i=0; i<pom; i++)
    {
        cout<<polje_zajednicki[i]<<endl;
    }
    system("PAUSE");
    return 0;
}

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Re: Presjek dva skupa - C++

Ne radi kako treba

Transact-SQL
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

Ne radi kako treba

Mozes li mi malo pojasniti gdje je problem jer meni radi.

Twitter- @capttawish Linux/GNU live forever.
12 godina
protjeran
offline
Re: Presjek dva skupa - C++
captain_soap_McTawish kaže...
T-SQL kaže...

Ne radi kako treba

Mozes li mi malo pojasniti gdje je problem jer meni radi.

 Ispise bas one koje nema u oba niza...

Transact-SQL
14 godina
offline
Re: Presjek dva skupa - C++
T-SQL kaže...

 Ispise bas one koje nema u oba niza...

Pa zar nisi to trazio? Da ti se ispisuju oni koji se nedupliciraju u oba niza, dakle sam oni koji se nalaze u jednome nizu? Mislim da  sam te pogresno shvatio.

Twitter- @capttawish Linux/GNU live forever.
16 godina
neaktivan
offline
Presjek dva skupa - C++

Traži presjek skupova.
Opali trostruku petlju, nakon toga poredaj dobijeni niz i to je to.


for(int i=0; i<duljinaNiz1; i++)
{
    for(int j=0; j<duljinaNiz2; j++)
    {
       if(niz1[i] == niz2[j])
       {
          for(int k=0; k<pomocna; k++)
          {
             kontrolna = true;
             if(niz[i] == nizJednakih[k])
             {
                kontrolna = false;
             }
          }
          if(kontrolna)
          {
             nizJednakih[pomocna] = niz[i];
             pomocna++;
          }
       }
    }
}

Poruka je uređivana zadnji put ned 6.5.2012 19:20 (Floki).
 
3 0 hvala 2
12 godina
protjeran
offline
Re: Presjek dva skupa - C++

Hvala vam momci!

captain nismo se bili razumili, ali hvala puno

floki, radi, tako sam, slično, i ja mislio nego se nismo razumili.

Još puno linija koda vam želim. Pozdrav!

Transact-SQL
Poruka je uređivana zadnji put ned 6.5.2012 20:37 (T-SQL).
14 godina
offline
Presjek dva skupa - C++

Prije svega, onaj if u kojem provjeravas je li cont true, mora ti biti van one petlje kojom prolazis kroz clanove zajenickog polja. I varijabla cont ti mora odmah na pocetku kad je napravisi biti postavljena na true. Ako je postavljena false, kao sto je vjerojatno kod tebe jer je nisi ekspliciton inicijalizirao, onda se nikada u zajednicki niz nece dodati, i on ce uvijek ostati prazan. Ovaj ti kod radi:

int pom=0;
    cout<<endl;
    bool cont=true;
    for(int i=0; i<velicina_prvi; i++)
    {
        for(int j=0; j<velicina_drugi; j++)
        {
            if(polje_prvo[i]==polje_drugo[j])
            {
                cout<<polje_prvo[i]<<" "<<polje_drugo[j]<<endl;
                for(int k=0; k<pom; k++)
                {
                    cont=true;
                    if(polje_prvo[i]==polje_zajednicki[k])
                    {
                        cont=false;
                    }

                }
                if(cont)
                    {
                        polje_zajednicki[pom]=polje_prvo[i];
                        pom++;
                    }
            }
        }
    }

Twitter- @capttawish Linux/GNU live forever.
Poruka je uređivana zadnji put ned 6.5.2012 20:40 (captain_soap_McTawish).
 
1 0 hvala 0
12 godina
protjeran
offline
Presjek dva skupa - C++

Vidio sam, zato sa editovo.
sortirao selectionom: hvala jos jednom
 int pomocna; for(int i=0; i<pom; i++) {  min=i;  for(int j=i+1; j<pom; j++)  {   if(polje_zajednicki[i]<polje_zajednicki[min]) min=j;   pomocna=polje_zajednicki[i];   polje_zajednicki[i]=polje_zajednicki[min];  polje_zajednicki[min]=pomocna;

  }

Transact-SQL
 
2 0 hvala 0
16 godina
neaktivan
offline
Presjek dva skupa - C++

Ma radi kao švicarski sat, dao sam ti odokativni algoritam da po njemu napišeš kod, ali ajde, nek ti bude, inače, potrudi se malo pa razradi algoritam i izvrši testiranja sam.

BTW ja uvijek izbjegavam koristiti naredbu break u petlji, to je obično prvi znak da se algoritam može i uspješnije napisati, a treba inače pustiti kod da se odvrti bez takvih prekida ukoliko je moguće.

 

 

#include <iostream>
#define MAX 100
using namespace std;


int main()
{
    int nizPrvi[MAX],  nizDrugi[MAX], nizZajednicki[MAX];
    int pomocna = 0, velicinaPrvi, velicinaDrugi;
    bool kontrolna;

    cout<< "Velicina prvog polja: ";
    cin>> velicinaPrvi;
    cout<< "Velicina drugog polja: ";
    cin>> velicinaDrugi;

    for(int i=0; i<velicinaPrvi; i++)
    {
       cout<< "Unesi " << i+1 << ". clan prvog niza: ";
       cin>> nizPrvi[i];
    }
    for(int i=0; i<velicinaDrugi; i++)
    {
       cout<< "Unesi " << i+1 << ". clan drugog niza: ";
       cin>> nizDrugi[i];
    }

    for(int i=0; i<velicinaPrvi; i++)
    {
       for(int j=0; j<velicinaDrugi; j++)
       {
          if(nizPrvi[i] == nizDrugi[j])
          {
             kontrolna = true;
             for(int k=0; k<pomocna; k++)
             {
               
                if(nizPrvi[i] == nizZajednicki[k])
                {
                   kontrolna = false;
                }
             }
             if(kontrolna)
             {
                nizZajednicki[pomocna] = nizPrvi[i];
                pomocna++;
             }
          }
       }
    }
    for(int i=0; i<pomocna; i++)
    {
       cout<< nizZajednicki[i] << " ";
    }
   
   
    return 0;
}

Poruka je uređivana zadnji put ned 6.5.2012 21:36 (Floki).
 
2 0 hvala 1
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice