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

tablica liczb bez powtórzeń

Mały hosting, OGROMNE możliwości
0 głosów
1,410 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 (195,220 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 (158,960 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 (155,140 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 16 kwietnia 2020 przez tangarr Mędrzec (155,140 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,800 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,800 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 (155,140 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,800 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 6,307 wizyt
pytanie zadane 14 sierpnia 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)
+1 głos
2 odpowiedzi 2,331 wizyt
+2 głosów
2 odpowiedzi 3,990 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)

93,715 zapytań

142,629 odpowiedzi

323,260 komentarzy

63,258 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...