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

Sprawdzenie czy dane w tablicy są takie same.

Object Storage Arubacloud
0 głosów
4,041 wizyt
pytanie zadane 14 października 2015 w C i C++ przez kobor Początkujący (270 p.)

Witam!

Otóż mam pewien problem. Mam zdefiniowaną tablicę: roznica[b] i chcę sprawdzić, czy wszystkie jej elementy są takie same, tzn:
 

            if (tutaj potrzebuję jakąś funkcję na sprawdzenie czy roznica[b]-roznica[b-1]=0 i roznica[b-1]-roznica[b-2]=0 itd.)

            {
                test[b] = true;
            }
            else
            {
                test[b] = false;
            }

 

3 odpowiedzi

+2 głosów
odpowiedź 14 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 14 października 2015 przez kobor
 
Najlepsza

Po co obliczać jakieś różnice? Użyj najprostszej pętli for i ifów:

int takie_same = 0;
for(int i = 0; i < wielkosc_tablicy - 1; i++)
{
	if(tablica[i] == tablica[i + 1])
		takie_same++;
}

if(takie_same == (wielkosc_tablicy - 1))
	std::cout << "Wszystkie elementy są takie same";
else
	std::cout << "Nie wszystkie elementy tablicy są takie same";

 

komentarz 14 października 2015 przez kobor Początkujący (270 p.)
edycja 14 października 2015 przez kobor

Dzięki wielkie!

Jakoś nie wpadłem na to, żeby pętle tutaj zastosować. Natomiast teraz mam inny problem, otóż program zaczął mi crashować, a nie wiem z jakiego powodu:

#include <iostream>

using namespace std;

int n, q, b, a, takie_same=0;

int main()
{
    cin>>n>>q;

    int elementy[n], iksy[q], igreki[q];
    bool test[q];
    for(int i=0; i<n; i++)
    {
        cin>>elementy[i];
    }
    int roznica[igreki[q]-iksy[q]];
    for(int k=0; k<q; k++)
    {
        cin>>iksy[k]>>igreki[k]; (w tej linijce crashuje program)
        for (b=0; b<igreki[q]-iksy[q]; b++);
        {
            roznica[b]=elementy[igreki[k]]-elementy[igreki[k-1]];
        }

        for(int i = 0; i<igreki[q]-iksy[q]; i++)
{
        if(roznica[b] == roznica[b+1])
        {takie_same++;}
}


            if(takie_same == (igreki[q]-iksy[q]))
            {
                test[b] = true;
            }
            else
            {
                test[b] = false;
            }
    }
    for(int m; m<igreki[q]-iksy[q]; m++)
    {
        if (test[m]==true)
        {
            cout<<"TAK";
        }
        else
        {
            cout<<"NIE";
        }
    }
    return 0;
}

#EDIT: Już znalazłem problem.

komentarz 14 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
Moźe podałbyś, co ten program robi? (uwierz mi, oglądanie kodu, o którym nic nie wiem, nie jest ani efektywne, ani przyjemne)
komentarz 14 października 2015 przez furas Maniak (53,800 p.)

Zamiast zapamiętywać `test[b] = true/false` wstawiłbym wypisywanie `cout` to by można było wyrzucić tablicę `test` i ostatnią pętlę `for`.

W tym całym kodzie najbardziej dziwi mnie 

igreki[q]-iksy[q]

Stworzyłeś tablice `igreki` i `iksy` o wymiarze `q`
czyli masz elementy od `igreki[0]` do `igreki[q-1]`
oraz od `iksy[0]` do `iksy[q-1]`.
Tak więc w powyższym odejmujesz elementy spoza tablic.

---

Najłatwiejszym sposobem będzie chyba nawstawianie więcej cout aby wypisywały zawartości zmiennych (i czytelne komunikaty) aby można było obserwować co dokładnie dzieje się w programie, czy zmienne mają takie wartości jakie powinny i czy wykonują się też rzeczy których oczekujemy.

komentarz 14 października 2015 przez kobor Początkujący (270 p.)
edycja 14 października 2015 przez kobor

Problem tkwi w tym, że (linijka 17) "int roznica[igreki[q]-iksy[q]];", podczas, gdy igreki[q] i iksy[q] są definiowane później, a nie mogę definiować inta w pętli.


#EDIT: Tutaj poprawiony kod, dalej wywala przy linijce 17.

#include <iostream>

using namespace std;

int n, q, b, takie_same=0;

int main()
{
    cin>>n>>q;

    int elementy[n-1], iksy[q-1], igreki[q-1];
    bool test[q-1];
    for(int i=0; i<n; i++)
    {
        cin>>elementy[i];
    }
    int roznica[igreki[q-1]-iksy[q-1]];
    for(int k=0; k<q; k++)
    {
        cin>>iksy[k]>>igreki[k];
        for (b=0; b<igreki[q-1]-iksy[q-1]; b++);
        {
            roznica[b]=elementy[igreki[k]]-elementy[igreki[k-1]];
        }

        for(int i = 0; i<igreki[q-1]-iksy[q-1]; i++)
            {
            if(roznica[b] == roznica[b+1])
            {takie_same++;}
            }
        if(takie_same == (igreki[q-1]-iksy[q-1]))
            {
                test[b] = true;
            }
        else
            {
                test[b] = false;
            }
    }
    for(int m; m<igreki[q-1]-iksy[q-1]; m++)
    {
        if (test[m]==true)
        {
            cout<<"TAK";
        }
        else
        {
            cout<<"NIE";
        }
    }
    return 0;
}

 

komentarz 14 października 2015 przez furas Maniak (53,800 p.)

proponuje abyś wypisywał `igreki[q-1]`,  `iksy[q-1]` oraz `igreki[q-1]-iksy[q-1]` bo to są pola w tablicy ale nic tam wcześniej nie wstawiałeś więc mogą być śmieci.

---

Widzę znowu ten sam błąd 

int iksy[q-1], igreki[q-1]

to tworzy tablice długości `q-1` a to oznacza, że poprawne indeksy są od 0 do `q-2` a ty próbujesz używać `q-1`

Zapominasz, że tablice są indeksowane od 0 a nie od 1 więc ostatnie pole w tablicy ma numer [wielkosc_tablicy-1] a nie [wielkosc_tablicy]

 

komentarz 14 października 2015 przez furas Maniak (53,800 p.)

Na moje oko to ta tablica `roznica` spokonie mogła by mieć stały rozmiar `n`

int roznica[n];

albo powinna być tworzona w innym miejscu

cin >> iksy[k] >> igreki[k];
int roznica[ igreki[k] - iksy[k] + 1];

 

komentarz 14 października 2015 przez kobor Początkujący (270 p.)
edycja 14 października 2015 przez kobor
#EDIT:

#include <iostream>

using namespace std;

int n, q, b, takie_same=0, roznica[1000000];

int main()
{
    cin>>n>>q;

    int elementy[n], iksy[q], igreki[q];
    bool test[q];
    for(int i=0; i<n; i++)
    {
        cin>>elementy[i];
    }
    for(int k=0; k<q; k++)
    {
        cin>>iksy[k]>>igreki[k];
        for (b=0; b<igreki[q-1]-iksy[q-1]; b++);
        {
            roznica[b]=elementy[igreki[k]]-elementy[igreki[k-1]];
        }

        for(int i = 0; i<igreki[q-1]-iksy[q-1]; i++)
            {
            if(roznica[b] == roznica[b+1])
            {takie_same++;}
            }
        if(takie_same == (igreki[q-1]-iksy[q-1]))
            {
                test[b] = true;
            }
        else
            {
                test[b] = false;
            }
    }
    for(int m; m<igreki[q-1]-iksy[q-1]; m++)
    {
        if (test[m]==true)
        {
            cout<<"TAK";
        }
        else
        {
            cout<<"NIE";
        }
    }
    return 0;
}

No i dalej coś nie działa ;/.

 

komentarz 14 października 2015 przez furas Maniak (53,800 p.)
edycja 14 października 2015 przez furas

Stwierdzenie "coś nie działa" jest g.... warte. :)

Jeśli jest jakiś komunikat o błędzie to go wklej w całości.

Jeśli jest jakiś inny problem to opisz go dokładnie aby dostarczyć jak najwięcej danych do analizy.

Przede wszystkim radzę dodać wypisywanie zmiennych abyś zobaczył co zawierają - bo może się okazać, że zawierają nie to co Ci się wydaje lub może wtedy zauważysz, że bierzesz dane nie z tego miejsca w tablicy co trzeba.

Wiele błędów wynikają z tego, że programy robią nie to co wydaje nam się że robią a zmienne nie zawierają tych wartości, które wydaje nam się, że zawierają. Wypisywanie zawartości zmiennych (i komenetarzy typu "jestem w if", "przed for") pozwalają dokładnie zobaczyć co się dzieje w programie i wyłapać gdzie zachodzi problem.

+1 głos
odpowiedź 14 października 2015 przez furas Maniak (53,800 p.)

To musisz użyć pętli 

for(int b=0 ; b < wielkosc_tablicy-1 ; b++) { ... }

 

komentarz 14 października 2015 przez kobor Początkujący (270 p.)

Zastosowałem pętle, ale dalej mi się to "gryzie":

            if (for (a=0; a<igreki[q]-iksy[q]; a++)
                {
                    roznica[a]-roznica[a+1]=0;
                })
            {
                test[b] = true;
            }
            else
            {
                test[b] = false;
            }

 

komentarz 14 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
A czy pętla zwraca wartość logiczną?
komentarz 14 października 2015 przez furas Maniak (53,800 p.)
@kobor
Pętli `for` musisz użyć w stylu jaki pokazał Patrycjerz.
Myślałem, że takie podstawy są Ci znane.
komentarz 14 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

@furas Patrycjusz? Nie, aż tak wysokiego poziomu społecznego nie posiadam. Ja to tylko Patrycjerz wink

komentarz 14 października 2015 przez furas Maniak (53,800 p.)

@Patrycjerz Sorry, już zdążyłem to poprawic :D

@kobor mialem na myśli coś w tym stylu
 

takie_same = true;

for(int a = 0; a < igreki[q]-iksy[q]; a++)
{
    if(roznica[a]-roznica[a+1] != 0) {
        takie_same = false;
        break;
    }
}

test[b] = takie_same;

---

EDIT: właściwie zamiast odejmowania można zastosować przyrównie jak u Patrycjerza - będzie to czytelniejsze 

 

takie_same = true;

for(int a = 0; a < igreki[q]-iksy[q]; a++)
{
    if(roznica[a] != roznica[a+1]) {
        takie_same = false;
        break;
    }
}

test[b] = takie_same;

 

+1 głos
odpowiedź 14 października 2015 przez Radfler VIP (101,030 p.)

Możesz użyć algorytmu std::all_of z biblioteki <algorithm>:

#include <algorithm>
std::all_of(tablica, tablica + rozmiar, [&](type_tablicy value) { return value == tablica[0]; })

Przykład:

#include <algorithm>
#include <iostream>

int main() {

  const std::size_t size = 8;

  int array[size] = {5, 5, 5, 5, 5, 5, 5, 5};

  if(std::all_of(array, array + size, [&](int value) { return value == array[0]; })) {
    std::cout << "Good";
  } else {
    std::cout << "Bad";
  }
  std::cout << "\n";

}

http://en.cppreference.com/w/cpp/algorithm/all_any_none_of

Podobne pytania

0 głosów
1 odpowiedź 237 wizyt
–2 głosów
1 odpowiedź 231 wizyt
pytanie zadane 3 lutego 2018 w C i C++ przez magmat Początkujący (390 p.)

92,617 zapytań

141,466 odpowiedzi

319,783 komentarzy

61,999 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!

...