Wyszukiwanie i zliczanie par takich samych liczb z tablicy

0

Witam

Napisałem program, banalny, który robi różne rzeczy z tablicą. Jednak mam problem ze zliczaniem par takich samych liczb.
Z tego co wiem to program bierze po kolei każdą wartość z tablicy i porównuje ją do kolejnej czyt.
mamy A B C D E
A czy = B? A czy = C? A czy = D? A czy = E?
B czy = C? B czy = D? B czy = E?
C czy = D? C czy = E?
D czy = E?

Przy np
2 2 2 3 3
zliczy mi, 4 pary wg mojego algorytmu, a tak nie jest :/

niby można podzielić przez 2 na szybko patrząc ale to też nie działa :P

możecie pomóc jak rozwiązać ten problem? ostatni komentarz na dole programu za to odpowiada...

z góry dzięki za pomoc.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 20

int main()
{
    int tab[N],i,K,k,min,max,parz=0,nparz=0,para,a,wynik;

    do
    {
    printf("Ile liczb chcesz wprowadzic??\n");
    scanf("%d",&K);
        if(N<K)
        {
            printf("Za mala tablica! Podaj mniej liczb!\n\n");
        }
    }
    while(N<K);

    for(i=0; i<K; i++)
    {
        printf("Podaj dana do tablicy:   ");
        scanf("%d",&tab[i]);
    }

    printf("\n\nWprowadzone wartosci: \n\n");

    for(i=0; i<K; i++)
    {
        printf("%d   ",tab[i]);
    }


// wartosci min i max
    min=tab[0];
    max=tab[0];


    for (i=0; i<K; i++)
    {
        if (tab[i]>max)
        {
        max=tab[i];
        }
        if (tab[i]<min)
        {
        min=tab[i];
        }
    }

    printf("\n\nWartosc max:   %d",max);
    printf("\n\nWartosc min:   %d",min);



// wartosci parzyste i nieparzyste
    printf("\n\nWartosc parzyste:   ");
    for (i=0; i<K; i++)
    {
        if (tab[i]%2==0)
        {
            parz++;
            printf("%d  ",tab[i]);
        }
    }
    printf("  -- ilosc wartosci parzystych:  %d",parz);

    printf("\n\nWartosc nieparzyste:   ");
    for (i=0; i<K; i++)
    {
        if (tab[i]%2!=0)
        {
            nparz++;
            printf("%d  ",tab[i]);
        }
    }
    printf("  -- ilosc wartosci nieparzystych:  %d",nparz);



// liczby parzyste z zakresu
    printf("\n\n\nLiczby parzyste z zakresu <10 i >300 to:   ");
    for (i=0; i<K; i++)
    {
        if (tab[i]>10 && tab[i]<300)
            {
                if (tab[i]%2==0)
                {
                    printf("%d  ",tab[i]);
                }
            }
    }



// para liczb ...... problem ze zliczaniem i wyswietlaniem par liczb!


    para=0;
    k=0;
    wynik=0;
    for (i=0; i<K-1; i++)
    {
        for (k=i+1; k<K; k++)
            {
                if(tab[i]=tab[k])
                    {
                        para++;

                    }
            }

    }
    para=para/2;
    printf("\n\nTakich samych par liczb jest:   %d",para);


    printf("\n\n");




    return 0;
}
1
if (tab[i] == tab[k])
0
  1. Nie używaj i++ tam gdzie można użyć ++i - ten brzydki nawyk się zemści.
    for(i=0;i<K;++i) for(k=i+1;k<K;++k) if(tab[i]==tab[k]) { ++para; break; }
    //para=para/2;
0

Dopiero zaczynam coś ogarniać. Gdzie znajdę informacje czemu używać ++i zamiast odwrotnie?

18

Ni należy używać i++ tam gdzie można użyć ++i ponieważ:

  1. i++ tworzy tymczasową kopie starej wartości. Jeżeli kompilator nie ma optymizacji lub jest wyłączona to może to powodujesz niepotrzebne zwiększenie czasu działania programu owszem małe. P przeciwnym przypadku powodujesz niepotrzebne zwiększenie czasu kompilacji znowu małe.
  2. Dopiero jak przejdzie ci zastąpić to iteratorem lub większą liczbą lub obiektem np streampos http://www.cplusplus.com/reference/istream/istream/tellg/ wtedy kompilator nawet nie ma prawa nic optymalizować i będziesz mieć bezsensowne "wycieki czasu".
  3. Dla mądrali z argumentami typu: - "Każdy współczesny kompilator ma optymalizacje" - Każda współczesna firma zatrudnia sprzątaczkę, ale to nie jest powodem stawiania kloców pośrodku korytarza.
  4. Lepiej wyrobić sobie nawyk używania ++foo, a postinkrementacji tylko wtedy gdy jest faktycznie używana niż odwrotnie. Dla nowicjusza jedno i drugie to czarna magia, więc po co uczyć go (potencjalnie) źle? - @kq
0

dzięki.

Program niestety nadal ma problem.... wystarczy podać np kilka takich samych liczb:
dla tablicy: 7 7 7 3 7 7 10 10 234 234 podał, że takich samych par liczb jest 12? :-)

0

Odpowiedz na cztery pytania:

  1. 9 9 9
  2. 9 9 9 9
  3. 9 9 9 9 9
  4. 9 9 9 9 9 9
    to może będę w stanie ci pomóc,
0

3
6
10
15

0

No to:

para=0;
for(i=0;i<K;++i) for(k=i+1;k<K;++k) para+=(tab[i]==tab[k]);

http://ideone.com/RpfF3l

0

Mogę jakoś program tutaj zamieścić, nadal nic :-) wystarczy podać więcej niż dwie te same liczby w różnych miejscach :-)

0

Wg mnie działa: http://ideone.com/a1kIMd
Podaj przykład dla którego ci się nie zgadza.

0

Ok, jeszcze nie wszystko w tym programie rozumiem.. chwilę, muszę ogarnąć ;-)

a no i jeszcze jakby niedostrzegam różnic w c a c++, a to na moje oko jest c++ a ja muszę i chcę mieć póki co C :P ;-)

0

Sama pętla zliczająca jest poprawna w obu językach.

0

właśnie dojrzałem do tego ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1