• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

tablica liczb bez powtórzeń

Object Storage Arubacloud
0 głosów
709 wizyt
pytanie zadane 14 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

Moim zadaniem jest stworzenie programu który przepisze tablicę podaną na wejściu bez powtórzeń. 

#include <stdio.h>

int main()
{
    int tab[102] = {0};
    int tab2[1000] = {0};
    int tab3[1000] = {0};
    int zmienna = 0;
    int j = 0;
    int liczba = 0;
    int cyfra = 0;
    int w = 0;
    int x = 0;
    printf("Podaj liczby: ");
    for(int i = 0; i < 1001; i++)
    {   
        if(scanf("%d", &tab[i]) != 1)
        {
            printf("Incorrect input");
            return 1;
        }
        if(tab[i] == 0)
        {
            break;
        }
        zmienna++;
    }
    if(zmienna <= 1)
    {
        printf("Not enough data available");
        return 2;
    }
    for(int i = 0; i < zmienna; i++)
    {
        for(int j = 0; j < zmienna; j++)
        {
            if(tab[i] == tab[j] && i != j)
            {
                tab2[w] = tab[i];
                w++;
            }
            
        }
    }
    for(int i = 0; i < zmienna; i++)
    {
        for(int j = 0; j < zmienna; j++)
        {
            if(tab[i] != tab2[j])
            {
                tab3[x] = tab[i];
                x++;
                break;
            }
        }
    }
    for(int j = 0; j < 1000; j++)
    {
        if(tab3[j] == 0)
        {
            break;
        }
        printf("%d ", tab3[j]);
        
    }
    
    return 0;
}

 

komentarz 14 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

i < 1001

Nie, jeśli tablice są 1000-elementowe to i nie może osiągnąć wartości 1000

komentarz 14 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)

@ResCrove,
 a czy o tych liczbach coś jeszcze wiadomo? Np. z jakiego są zakresu, czy to pełen zakres int? No i patrz niżej... co oznacza "przepisać tablicę"? Rozumiem że należy zachować kolejność liczb?

1 odpowiedź

0 głosów
odpowiedź 14 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

1. Wczytaj od użytkownika długość tablicy/ilość liczb

2. Utwórz tablicę o podanym rozmiarze

3. Ustaw zmienną indeks=0

4. Napisz funkcję int dodajLiczbe(int *tablica, int indeks, int liczba) która będzie iterować po tablicy od 0 do indeks-1. Jeżeli znajdzie gdzieś podaną liczbę to zwróci błąd. Jeżeli w przeszukanym kawałku nie ma liczby to dopisze ją na miejscu indeks i zwróć sukces.

5. Po wczytaniu liczby wywołaj funkcję dodajLiczbe. Jeżeli funkcja zwróci sukces to zwiększ zmienną indeks o 1

6. Po wczytaniu wszystkich liczb zmienna indeks zawiera ilość unikalnych liczb. Wyświetl liczby z zakresu 0 do indeks-1

komentarz 14 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

Inna opcja, jeśli kolejność wyświetlania nie musi być taka jak wczytywania:

  1. załadować liczby do tablicy.
  2. posortować je (qsort).
  3. wyświetlić każdy element tablicy, jeśli jest różny od poprzedniego.
komentarz 14 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)

@j23,

...przepisze tablicę podaną na wejściu bez powtórzeń

sort więc raczej odpada :-|

@tangarr, rozwiązanie które podałeś, ma złożoność O(n^2).

komentarz 14 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
Zdaję sobie z tego sprawę. Jednak wydaje mi się że takie rozwiązanie jest najprostsze w implementacji. A na tym poziomie zaawansowania chyba nie potrzeba nic więcej.
komentarz 14 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

@mokrowski, patrz punkt 3.

komentarz 14 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)

@j23, chodziło mi o to że sortując zmienisz porządek liczb. A (jak mniemam) to nie zgadza się z pojęciem "przepisania". Oczywiście jeśli to słowo interpretować inaczej, to Twoje rozwiązanie będzie ok :)

komentarz 14 kwietnia 2020 przez ResCrove Obywatel (1,700 p.)

@tangarr, czy da się to zrobić jakoś bez funkcji tylko w mainie?

komentarz 14 kwietnia 2020 przez j23 Mędrzec (194,920 p.)

@mokrowski, a, o to Ci chodzi. No tak, dlatego zaznaczyłem, że propozycja ma zastosowanie tylko wtedy, gdy kolejność nie jest istotna.

komentarz 14 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
Oczywiście, że można, ale zmniejsza to czytelność kodu.
komentarz 14 kwietnia 2020 przez ResCrove Obywatel (1,700 p.)
Problem polega na tym że muszę zrobić to w mainie i sortowanie odpada :/

Jeśli podam ciąg liczb na przykład: 8 8 8 9 9 9 1 2 to musi mi wypisać 8 9 1 2
komentarz 16 kwietnia 2020 przez TOWaD Mądrala (6,000 p.)

@tangarr,

int dodajLiczbe(int tablica[], int indeks, int liczba) {
  for(int i=0; i<index;i++)
  if(tablica[i]==liczba)return 0;
else return 1;
}

i w manie

for (int i =index2; i<sizetabcin; i++) {
if (dodajLiczbe(tablicadata,index,tablicacin[i]) tablica[index++]=tablicacin[i];
}

tak sobie chciałem się pobawić i za groma nie rozumiem dlaczego, początek jak się po ustawia ok, ale na końcu dodaje mi dodatkowe powtórzenia?

 

komentarz 16 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
Masz jakiś efekt uboczny, W funkcji dodajLiczbe używasz zmiennej index zamiast indeks.

Pokaż cały kod
komentarz 16 kwietnia 2020 przez TOWaD Mądrala (6,000 p.)
To kompilator bo właśnie sprawdziłem online i ok. Tak mi się wydalało ze coś z nim nie tak.
komentarz 16 kwietnia 2020 przez TOWaD Mądrala (6,000 p.)
edycja 16 kwietnia 2020 przez TOWaD

@tangarr,
 

#include <iostream>

bool dodajLiczbe(int tablica[], int index, int liczba) {
  for(int i=0; i<index;i++)
  if(tablica[i]==liczba) return 0;
 return 1;
}

int main(){
    const int sizetabcin=8;
    
    int tablicacin[sizetabcin]={2,5,4,6,4,5,5,4};
    
    int tablicadata [sizetabcin]={2};
    int index=1;

    for (int i =index; i<sizetabcin; i++) 
        if (dodajLiczbe(tablicadata,index,tablicacin[i]))
        tablicadata[index++]=tablicacin[i];
        
    for (const auto &x:tablicadata)std::cout<<x<<'\t';
    return 0;
}

i tu dała poprawnie a próbowałem na kompie  i powtarzało ostatnią cyfrę tyle powtórzeń ile razy występowała, kombinowałem i na wskaźnikach i inne różne cuda i ciągle był ten sam efekt a czasem jeszcze gorszy. Oczywiście na początku był jeszcze cin i jedna pętla, ale zacząłem upraszczać w poszukiwaniu błędu i nadal źle było;

a właśnie jak to (cin) (wczytać dane)
   for(int i=index;index<sizetabcin && (std::cin>>tablicacin[i]);i++)

na stronie https://coliru.stacked-crooked.com/

komentarz 16 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Twój kompilator mógł inaczej zainicjalizować tablicę tablicadata (same dwójki lub śmieci które pozostały w tym miejscu pamięci po innych programach)

Błędna jest ostatnia iteracja. Wyświetlasz całą tablicę. Powinieneś tylko uzupełnioną część..

for (int i=0; i<index; i++)
        std::cout<<tablicadata[i]<<'\t';

 

komentarz 16 kwietnia 2020 przez TOWaD Mądrala (6,000 p.)
no ok taką sama pętlę można zrobić z while, ale chodzi mi czy da się na tej stronie coś wczytać, ewentualnie jak, ok już mam nie było tematu

Podobne pytania

0 głosów
2 odpowiedzi 5,772 wizyt
pytanie zadane 14 sierpnia 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)
+1 głos
2 odpowiedzi 2,013 wizyt
+2 głosów
2 odpowiedzi 3,410 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...