Skocz do zawartości


Zdjęcie

Eliminacja powtarzających sie liczb w tablicy


  • Zaloguj się, aby dodać odpowiedź
6 odpowiedzi w tym temacie

#1 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 09 05 2012 - 12:29

Opracowałem program do usuwania tych samych liczb z tablicy.
Program napisałem w języku C++ i kompilowałem w IDE Dev-Cpp.
Program został skompilowany bez błędu, ale nie eliminuje wszystkich powtarzających się liczb.
Aby łatwiej było dyskutować kod programu przedstawia się następująco:

// Usuwanie elementu z tablicy
//------------------------
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;

int N = 10; // liczba komórek tablicy
int poz;
int v=0;

int main()
{
int a[]={1,4,8,2,8,1,13,7,1,5,6};
int a1=1;
cout <<"\n\n Usuwanie elementu z tablicy "<<endl<<endl;
int i;

// wypełniamy tablicę kolejnymi liczbami

cout <<" Wypelnienie tablicy liczbami"<<endl<<endl;
for(i = 0; i < N; i++)
{
cout <<" Przebieg "<< setw(2)<<i+1 <<". a["<<i<<"]="<<a[i]<<endl;
}
cout <<"\n\n Porownywanie liczb"<<endl<<endl;

//int v=0;
for(i = 0; i < N; i++)
{
cout <<" Przebieg "<< setw(2)<<i+1 <<". a["<<i<<"]="<<a[i]<<endl;
if (a[i]==a1)
{
v=v+1; //licznik występowania tej samej liczby
if (v>1)
{
poz=i;
cout <<"\n\n Usuwamy z tablicy pozycje oznaczona indeksem poz="<<poz<<" Licznik wystepowania liczby v="<<v<<endl<<endl;
cout <<" Przesuwamy komorki od a[poz+1] do a[N-1] o jedna pozycie do dolu "<<endl<<endl;

for (int u = poz; u < N - 1; u++)
{
a[u] = a[u + 1];
cout << " a["<<u<<"]="<<a[u]<<endl;
}
cout <<"\n\n Zbior liczb w tablicy po przesunieciu liczb "<<endl<<endl;
for (i = 0; i < N-1; i++)
{
cout <<" a["<<i<<"]="<<a[i]<<endl;
}

}
}
}

cout <<endl<<endl;
/*
// przesuwamy komórki od a[P+1] do a[N-1] o jedną w dół
cout <<" Usuwamy z tablicy pozycje oznaczona indeksem poz="<<poz<<endl<<endl;
cout <<" Przesuwamy komorki od a[p+1] do a[N-1] o jedna pozycie do dolu "<<endl<<endl;

for(i = poz; i < N - 2; i++)
{
a[i] = a[i + 1];
cout << " a["<<i<<"]="<<a[i]<<endl;
}
cout <<endl<<endl;
*/
// wyświetlamy zawartość tablicy
cout <<"\n\n Wyswietlamy zawartosc tablicy "<<endl<<endl;
for(i = 0; i < N-1; i++) cout << " a[" << i << "] = " << a[i] << endl;
cout<<endl<<endl;

system("PAUSE");
return 0;
}

Wydruk programu wygląda następująco:


Widać że pętla for ma 6-ść przebiegów. Na pierwszej powtarzającej się liczbie wykonuje przesuniecia indeksów tablicy, pokazuje jak wygląda tablica po przesunięciu indeksow i powinna kontynuować dalsze przebiegi aż do końca.
Ale tak się nie dzieje i nie wiem dlaczego. Pętla kończy działanie po 6-tym przebiegu.
Czy mógłby mi to ktoś wyjaśnić i zwrócić uwagę gdzie jest błąd.

  • 0

#2 fernandez

fernandez

    150% normy

  • 1 866 postów

Napisano 09 05 2012 - 19:53

przekombinowales i masz bledy w kodzie to na pewno

zacznijmy od tego zebys zwrocil uwage jak uzywasz licznika "i"
druga sprawa to uzycie licznika "v"? dlaczego chcesz przesuwac liczby dopiero po drugim znalezieniu (bo tka wynika z tego co napisales)?
po trzecie podziel sobie to wszystko na osobne funkcje, to bedzie Ci latwiej to sprawdzac, bo widze ze wypisywanie masz tzw. Ctrl+C Ctrl+V
poza tym ustal sobie w koncu ile ma byc tych liczb, bo N = 10 a elementow w tablicy masz 11, chyba ze to ma sluzyc jako zmienna pomocnicza w algorytmie, to wtedy rozumiem - choc sam algorytm dziwny :D

i na koniec powiedzmy sobie jedno, nie usuwasz danych z tablicy tylko przesuwasz inne liczby na miejsce znalezionej liczby, a tu z kolei trzeba zmniejszyc N, zeby nie wlazilo na elementy ktorych juz teoretycznie nie ma
tylko pamietaj ze liczb znalezionych moze byc wiecej niz 1 i o tyle trzeba mzniejsyzc N przy wyswietlaniu..

Użytkownik fernandez edytował ten post 09 05 2012 - 19:54

  • 0

#3 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 09 05 2012 - 20:47

Ten algorytm można znaleźć w internecie np. kurs programowania w C++.
Licznik v służy do ustalenia że ta sama liczba występuje więcej niż jeden raz i gdy warunek if(v>1) jest spełniony
to należy wykonać dalsze linjki kodu tz. poprzesuwać indeksy liczb tablicy.
Ilość liczb tablicy jest nie poprawna. Ale poprawienie tego nic nie daje.
  • 0

#4 fernandez

fernandez

    150% normy

  • 1 866 postów

Napisano 09 05 2012 - 21:30

a jak v = 1 to juz nie trzeba?
zastanow sie...

IMHO lepiej i szybciej bedzie zamienianie znalezionej liczby z ostatnimi elementami tablicy niz przesuwanie calej - chyba ze komus zalezy na kolejnosci tych liczb

takie prawdziwe usuniecie elementow tablicy wymagaloby juz uzycia wskaznikow i napenwo nie da sie tego zrobic na jednej tablicy co innego listy albo w ogole obiekty STLowe, ale z tego co widze do tego jeszcze daleka droga :D

a na koniec, to Ci powiem, ze poprawilem to co Ci napisalem w tym kodzie i skompilowalem u siebie i wszystko dziala :D
czyli dalej masz gdzies blad...
  • 0

#5 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 10 05 2012 - 08:05

Jeśli v=1 to w zbiorze liczb tablicy nie ma powtarzających się liczb.
Błąd w kodzie wystąpił w poleceniu for przy zmiennych sterujących.
Pętle są zagnieżdzone, te same nazwy zmiennych sterujących powodują wysypanie się programu.
Poprawiłem to i już działa.
Jeśli chodzi o wskaźniki to jest to bardziej kłopotliwe bo trzeba obliczać adresy komórek pamięci.
  • 0

#6 fernandez

fernandez

    150% normy

  • 1 866 postów

Napisano 10 05 2012 - 08:39

wiesz, no teraz dopiero zrozumialem o co dokladnie chodzilo w tym programie

dla mnie usun potwarzajce sie liczby to usuniecie wszystkich, ale z tego co tu piszesz wychodzi, ze ma usuwac tylko dupkikaty..
wtedy musi byc spelniony ten warunek :D

co do wskaznikow to nie trzeba nic obliczac, tworzysz tablice dynamicznie, przepisujesz odopwiednie elementy do drugiej i pierwsza usuwasz, a nastepnie przekierowujesz wskaznik na ta druga tablice..
  • 0

#7 Pakrys

Pakrys

    Początkujący

  • 31 postów

Napisano 10 05 2012 - 09:11

Problem z tym kodem rozwiązałem. Pętle for są zagnieżdzone i miały te same zmienne sterujące.
Zmiana ich na inne, spowodowało wykonanie wszystkich przebiegów pętli i wyeliminowania powtarzających się liczb.
Problem ten można uznać za rozwiązany.

  • 0

Zobacz więcej tematów z tagiem: język C++ Dev-Cpp tablice C++ macierze C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych