Wątek przeniesiony 2017-10-16 22:24 z C/C++ przez kq.

porównywanie elementów z JEDNEJ tablicy

0

Dzień dobry, mam zadanie "Należy wypisać wszystkie wartości kart, które występują nieparzyście wiele razy w talii w kolejności rosnącej". Pytanie, jak porównać elementy w tablicy?
Probowałem sposobu t[i] != t[i+1], ale nie dziła on prawidłowo.

#include <iostream>

using namespace std;

int main()

{
   int N;
   cin>>N;
   int t[N];
   int t2[N];

   int licznik =0;
   int i;


cout<<N;

   for (i=0; i<N; ++i)

   std::cin>>t[i];

   for(i=0; i<N; i++)

     if(t[i] != t[i+1]){
         licznik++;
         cout<<t[i];
     }



cout<<licznik<<"\n";


}
1

Przy ostatnim elemencie tablicy wychodzi ci poza nią (bo próbuje porównać z następnym którego NIE MA), dałbym raczej for(i=1; i<N; i++) oraz if(t[i] != t[i - 1]){

0

@sig: przypatrz się tym pętlom...

Dla jednego i drugiego fora do iteracji używa i. Powinien korzystać z dwóch różnych zmiennych do tego.

0

Dziękuje, działa lepiej, lecz pojawił się jeden problem, mianowicie przy porównaniu następnych elementów, porównuje także te sąsiednie i uważa że nie są równe, czyli

input 5
13 2 2 3 3

porównuje 13 z 2, 2 z 2 oraz 2 z 3 i to także uważa jakoby dwójka nie miała pary.

0

Obecny kod (lub jego fragment, tj. owa porównująca pętla) by nie zaszkodził. Z fusów ciężko cokolwiek wywróżyć.

0

Jasne, przepraszam.

#include <iostream>

using namespace std;
int ile(int N, int *t, int *t2, int licznik){
   for(int j=0; j<N-1; j++){
         if(t[j] != t[j-1]){
             licznik++;
             t2[j] = t[j];
             cout<<t2[j];
         }
      }

}
int main()

{
   int N;
   cin>>N;
   int t[N];
   int t2[N];
   int a = 0;

   int licznik =0;
   int i;
   int j;

   for (i=0; i<N; ++i) std::cin>>t[i];

   ile(N, t, t2, licznik);
    //cout<<licznik<<"\n";

}

0

Myślę że błąd jest w

if(t[j] != t[j-1]){
t2[licznik] = t[j];
cout<<t2[licznik];
}
0

Tak "na chama" zmiana if(t[j] != t[j-1]) na if(t[j] != t[j-1] && t[j] != t[j+1] ) spowoduje, że z podanego przykładu zostanie wypisane tylko 13. Ale patrząc na polecenie, jest to rozwiązanie złe.

"Należy wypisać wszystkie wartości kart, które występują nieparzyście wiele razy w talii w kolejności rosnącej"

Coś mi się wydaje, że podkreślony fragment oznacza "wartości kart występujące 3,5,7,9 itd razy".

0
Serechiel napisał(a):

Tak "na chama" zmiana if(t[j] != t[j-1]) na if(t[j] != t[j-1] && t[j] != t[j+1] ) spowoduje, że z podanego przykładu zostanie wypisane tylko 13. Ale patrząc na polecenie, jest to rozwiązanie złe.

"Należy wypisać wszystkie wartości kart, które występują nieparzyście wiele razy w talii w kolejności rosnącej"

Coś mi się wydaje, że podkreślony fragment oznacza "wartości kart występujące 3,5,7,9 itd razy".

Dokładnie o to chodzi i tutaj właśnie jest problem.

0

Dobrze to zrozumialem? Na wejsciu: [5,6,5,5,2,2,2,9,9], wyjscie: [2,5].

0
lion137 napisał(a):

Dobrze to zrozumialem? Na wejsciu: [5,6,5,5,2,2,2,9,9], wyjscie: [2,5].

Dokładnie.

1

wrzuc to do std::map<int,int> gdzie key jest wartoscia a value jest ile razy wystepowalo

wyrzucasz wszystko z key co jest parzyste

Wtedy masz kolekcje, mozesz ja przefliltrowac do wszystkiego co value ma najwieksze (wystapienie najwiecej razy)

zrobione

a jak koniecznie ma byc na tablicy to zrob tablice obiektow gdzie masz Key i Value w obiekcie i zrob to samo co napisalem wyzej (tylko pare rzeczy recznie bedziesz musial dopisac)

0

Mam sumę każdej liczby w map, ale jak teraz wyciągnąć te liczby, których ilość występowania jest nieparzysta? Muszę to zrobić poza pętlą for, w jaki sposób mogę się odwołać klucza w map poza ową pętlą?

#include <iostream>
#include <map>

using namespace std;
int ile(int N, int *t, int *t2, map<int, int> pairs){
   int licznik =0;
   for(int j=0; j<N; ++j){
    int a = 0;
    a = t[j];
    pairs[a] +=1;
   }
    for(int x=0; x<N; ++x){
        if(pairs[t[x]]%2 != 0){
          cout<<t[x];
        }
    }
}

0
#include <iostream>
#include <map>
using namespace std;
 
int main() {
	std::map<int, int> map;
	for (int i = 0 ; i < 10 ; i++)
	{
		map[i]++;
	}
 
	for (int i = 0 ; i < 10 ; i+=2)
	{
		map[i]++;
	}
 
	for(auto item : map)
	{
		if (item.second % 2 == 1)
		{
			cout << item.first;
		}
	}
	return 0;
}

https://ideone.com/XqXSIS
tutaj masz przykladowy jakj uzupelniac i jak wyswietlac

0
fasadin napisał(a):
#include <iostream>
#include <map>
using namespace std;
 
int main() {
	std::map<int, int> map;
	for (int i = 0 ; i < 10 ; i++)
	{
		map[i]++;
	}
 
	for (int i = 0 ; i < 10 ; i+=2)
	{
		map[i]++;
	}
 
	for(auto item : map)
	{
		if (item.second % 2 == 1)
		{
			cout << item.first;
		}
	}
	return 0;
}

https://ideone.com/XqXSIS
tutaj masz przykladowy jakj uzupelniac i jak wyswietlac

Jest pewien problem, musze to zrobić na wersji c++ < 11;

0

To jak jest w kocu z treścią. Przykład jest dobry czy treść zadania. Występujące nieparzyscie wiele razy, rozumiem jako wielokrotne nieparzyste wystąpienie określonej liczby. Czy jeszcze inaczej należy to czytać?

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