[C/C++] Tablice


(Rdrfear) #1

Witam.

Mam do napisania program, który będzie wczytywał dwie tablice liczb. Ma on wyświetlać pod koniec tablicę z liczbami, które znajdują się w obydwu poprzednich tablicach, nie mogą się przy tym powtarzać i wyświetlane mają być w kolejności z pierwszego ciągu.

Napisałem taki kod:

#include 

using namespace std;


int main()

{

	int m;

	cin >> m;

	int tab1[m];

	for(int j=0;j
	{

		cin >> tab1[j];

	}


	int n;

	cin >> n;

	int tab2[n];

	for(int k=0;k
	{

		cin >> tab2[k];

	}


	int tab3[m];

	int p=0;

	for(int i=0;i
	{

		for(int o=0;o
		{

			if(tab1[i]==tab2[o] && tab1[i]!=tab3[o])

			{

				tab3[p]=tab1[i];

				p++;

			}

		}

	}



	cout << p << endl;


	for(int t=0;t

	{

		cout << tab3[t] <
	}


	return 0;

}

Problem mam z powtarzaniem się elementów. Główkowałem nad tym trochę, ale żadnych efektów mi to nie przynosi. Proszę o porady/podpowiedzi. Dzięki.


(Trance) #2

polecam poczytać trochę o "new"


(Kruchy Jr) #3

posortuj obie tablice


(Enterbios) #4

O co chodzi że mają być wyświetlane w kolejności z pierwszego ciągu? Bo nie czaje tego. Chcesz żeby była zachowana kolejność liczb wprowadzanych do programu, ale żeby usunąć liczby powtarzające się?


(Rdrfear) #5

Tak, mają być wyświetlane w kolejności z pierwszego ciągu i tak, chcę usunąć liczby powtarzające się. Zapomniałem dodać, że ciągi mają mieć możliwość przechowywania od 0 do 140 000 elementów, a same elementy mieszczą się w przedziale od 0 do 3 000 000 000.

Np. 1 ciąg : [1,3,4,5,1] 2 ciąg: [1,3,5] Ciąg wyjściowy: [1,3,5].

1 ciąg: [11,11,11] 2 ciąg:[11,11] Ciąg wyjściowy: [11].

Poczytałem o new, teraz dynamicznie przydzielam miejsce na ciągi.

Zdecydowałem się posortować ciągi. Stwierdziłem, że będę wtedy mógł porównywać ze sobą kolejne liczby tego samego ciągu i jeśli okażą się one takie same, to przechodzę do kolejnej liczby zamiast sprawdzać czy w drugim jest taka sama.

To nowy kod. Byłbym wdzięczny, jeżeli ktoś sprawdziłby jego działanie i wytknął mi błędy.

#include 

using namespace std;


void sort(unsigned int tab[], int roz);


int main()

{

	int m;

	cin >> m;

	unsigned int *tab1=new unsigned int[m];

	for(int j=0;j
	{

		cin >> tab1[j];

	}


	sort(tab1,m);


	int n;

	cin >> n;

	unsigned int *tab2=new unsigned int[n];

	for(int k=0;k
	{

		cin >> tab2[k];

	}


	sort(tab2,n);


	unsigned int *tab3=new unsigned int[m];

	int p=0;

	for(int i=0;i
	{

		for(int o=0;o
		{

			if(tab1[i]!=tab1[i+1] && tab2[o]!=tab2[o+1] && tab1[i]==tab2[o])

			{

					tab3[p]=tab1[i]; 

					p++;

			}

		}

	}


	delete[] tab1;

	tab1=0;

	delete[] tab2;

	tab2=0;


	cout << p << endl;


	for(int t=0;t

	{

		cout << tab3[t] <
	}


	delete[] tab3;

	tab3=0;


	return 0;

}


void sort(unsigned int tab[], int roz)

{

	 int i, j, temp;

        for (i = 0; i
        for (j=0; j
			{

				if (tab[j] > tab[j+1])

                {

					temp = tab[j+1];

                    tab[j+1] = tab[j];

                    tab[j] = temp;

                }

			}

}

(Enterbios) #6

Kod działa poprawnie. Nie ma błędów. Jedynie mogę dać Ci radę abyś nie duplikował kodu, i starał się go pisać bardziej czytelnie.

@edit: upsss sory nie działa poprawnie, nie zauważyłem że musisz mieć zachowaną kolejność z pierwszego ciągu.

Kod można napisać o wiele czytelniej, ale nie wiem na jakim poziomie znajomości języka jesteś, po problemie wnioskuje że dopiero zaczynasz, więc starałem się zedytować jak najmniej linijek z twojego kodu.

#include 

    using namespace std;


    void sort(int tab[], int roz);

	bool arrayContainsElement(int element, int tab[], int size);


    int main()

    {

       int m;

	   cout<<"Podaj rozmiar 1 tab: ";

       cin >> m;

       int *tab1=new int[m];

       for(int j=0;j
       {

          cin >> tab1[j];

       }


       int n;

	   cout<<"Podaj rozmiar drugiej tab: ";

       cin >> n;

       int *tab2=new int[n];

       for(int k=0;k
       {

          cin >> tab2[k];

       }


       int *tab3=new int[m];

       int p=0;

       for(int i=0;i
       {

          if(!arrayContainsElement(tab1[i], tab3, p) && arrayContainsElement(tab1[i], tab2, n))

		  {

			  tab3[p] = tab1[i];

			  p++;

		  }

       }


       delete[] tab1;

       tab1=0;

       delete[] tab2;

       tab2=0;


       cout << p << endl;


       for(int t=0;t

       {

          cout << tab3[t] <<" ";

       }


       delete[] tab3;

       tab3=0;


	   system("pause");

       return 0;

    }


	bool arrayContainsElement(int element, int tab[], int size)

	{

		int howMany = 0;

		for(int i=0; i
		{

			if(tab[i] == element)

				return true;

		}

		return false;

	}

Nie zauważyłem że liczby mają być z przedziału od 0 do 3 000 000 000, w takim razie int tutaj nie wystarczy. Musisz zamienić typ tablic na unsigned int. Chyba że w ciągach mogą się znajdować wartości zmiennoprzecinkowe, wtedy na double.


(Rdrfear) #7

Dzięki za porady i poprawienie kodu. Bardzo mi to pomogło. Program spisuje się bardzo dobrze, a przy okazji ja się czegoś nauczyłem.