Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[C++] Usuwanie duplikatów

Moderatorzy: Jacek Bogusz, Moderatorzy

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

[C++] Usuwanie duplikatów

Postautor: Darlington » 8 kwie 2009, o 21:40

Dla niektórych konfiguracji liczb nie działa poprawnie, np dla n= 11 i liczb 32,3,2,5,2,4,2,3,12,2,2
Ma ktoś jakiś pomysł, dlaczego? Z góry dzięki za pomoc.

Kod: Zaznacz cały

#include <iostream> using namespace std; int main() { long int tablica[100]; int n,e=0,licznik=0; cout << "Ile liczb? "; cin >> n; int ile=0; for(int i=0; i<n; i++) { cout << "Podaj liczbe numer " << i+1 << ": "; cin >> e; tablica[i]=e; } cout << endl << "Tablica przed usunieciem duplikatow: "; for(int j=0; j<n; j++) { cout << tablica[j] << ","; } cout << endl; for(int k=0; k<n; k++) { for(int l=0; l<n; l++) { if((tablica[k]==tablica[l]) && (l<=n) && (k!=l)) { tablica[k]=tablica[k-1]; licznik++; } } } cout << endl << "Tablica po usunieciu duplikatow: "; for(int o=licznik; o<n; o++) { cout << tablica[o] << ","; } cout << endl; return 0; }

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 8 kwie 2009, o 22:33

Udało mi się zrobić ale dla elementów niezerowych:

Kod: Zaznacz cały

#include <iostream> using namespace std; int main() { long int tablica[100]; int n,e=0,licznik=0; cout << "Ile liczb? "; cin >> n; int ile=0; for(int i=0; i<n; i++) { cout << "Podaj liczbe numer " << i+1 << ": "; cin >> e; tablica[i]=e; } cout << endl << "Tablica przed usunieciem duplikatow: "; for(int j=0; j<n; j++) { cout << tablica[j] << ","; } cout << endl; for(int k=0; k<n; k++) { for(int l=0; l<n; l++) { if((tablica[k]==tablica[l]) && (l<=n) && (k!=l)) { tablica[k]=0; licznik++; } } } cout << endl << "Tablica po usunieciu duplikatow: "; for(int o=0; o<n; o++) { if(tablica[o]!=0) cout << tablica[o] << ","; } cout << endl; return 0; }

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 8 kwie 2009, o 22:59

Ok już mam, zastosowałem swoją metodę z tablicą pomocniczą :)

Kod: Zaznacz cały

#include <iostream> using namespace std; int main() { long int tablica[100], duplikaty[100]; int n,e=0; cout << "Ile liczb? "; cin >> n; int ile=0; for(int i=0; i<n; i++) { cout << "Podaj liczbe numer " << i+1 << ": "; cin >> e; tablica[i]=e; } cout << endl << "Tablica przed usunieciem duplikatow: "; for(int j=0; j<n; j++) { cout << tablica[j] << ","; } cout << endl; for(int k=0; k<n; k++) { for(int l=k; l<n; l++) { if((tablica[k]==tablica[l]) && (l<=n) && (k!=l)) { if(tablica[k]==tablica[l]) { duplikaty[k]=0; } } } } cout << endl << "Tablica po usunieciu duplikatow: "; for(int o=0; o<n; o++) { if(duplikaty[o]!=0) cout << tablica[o] << ","; } cout << endl; system("pause"); return 0; }

Markuss
-
-
Posty: 1
Rejestracja: 7 cze 2009, o 00:16
Lokalizacja: Malbork

Postautor: Markuss » 7 cze 2009, o 00:27

Bardzo fajny program, na jego podstawie starałem się przerobić go na usuwanie duplikatów liter w wyrazie, pozmieniałem deklaracje na char, starałem się zmienić "ciało" programu, usunąłem ilość liczb, ale niestety nie rozumie jeszcze do końca pętli, czy ktoś może naprowadzić początkującego na co powinienem zwrócić uwagę i zaproponować rozwiązanie "bezstresowego" przejścia z tego programu liczbowego na znakowy ??

Pozdrawiam i z góry dziękuje

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 7 cze 2009, o 13:04

Chodzi Ci o tą pętlę??

Kod: Zaznacz cały

for(int k=0; k<n; k++) { for(int l=k; l<n; l++) { if((tablica[k]==tablica[l]) && (l<=n) && (k!=l)) { if(tablica[k]==tablica[l]) { duplikaty[k]=0; } } } }
Taka uwaga do Darlingtona, choć już pewnie zapomniał o tym zadanku ;) :
- Zamiast "(k != l)" w warunku, ładniej jest użyć "for (int l = k+1; ..."
- Następne, "(l<=n)" zawsze będzie prawdą, bo "; l<n;" masz ujęte jako warunek wyjścia z for, a w ciele fora nigdzie nie zmieniasz wartości l ani n (dopiero ostatnia instrukcja inkrementuje).

Markuss, W Twoim przypadku nie będzie tak ładnie, domyślam się, że chcesz po wykonanej robocie wyświetlić wyraz jako string? Pamiętaj, że znak ASCII "0" oznacza koniec stringu, a w tym kodzie duplikat podmieniasz właśnie na "0". Tak więc Twoje wyświetlenie stringu po zakończeniu spowoduje zwykłe ucięcie przy pierwszym duplikacie litery.

Btw. Do zabawy na stringach, język C przewiduje fajne funkcje "strcpy" "strcmp"... ale to tak poza konkurencją, możesz sobie podejrzeć jak są napisane to nauczysz się czegoś nowego.

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 65 gości