Funkcja do przepisywania elementów z ciągu.

0

Witam, mam pewien problem z napisaniem programu. Treść wygląda następująco: //Napisz w dowolnym języku programowania funkcję (nagłówek i ciało), która dla danych liczbowych:
n, a1, a2,...,an
zwraca
m,b1,b2,...,bm
złożonych z elementów, które w ciągu {a1,a2,...,an} występują dokładnie dwa razy.//

Mam takie coś, ale nie przepisuję nic do drugiej tablicy:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
   const int n=10;
   int tabn[n]={0,1,2,3,2,4,5,4,6,2};
   int tabm[n];
   //znajdz min
   //znajdz max
   int max = tabn[0];
   int min = tabn[0];
   
for(int i = 1; i < n; i++)
{
   if(tabn[i] > max)
       max = tabn[i];
   if(tabn[i] < min)
       min = tabn[i];
}    

   
   //##############
   int k=0;
   for(int i=min;i<max;i++)
   {
   int temp=0;
   for(int j=0;j<n;j++)
   {
    if(tabn[j]=i)
    temp++;
    if(temp=2)
    {
    tabm[k]=i;
    k++;           
    }             
   }
}

for(int i=0;i<10;i++)
cout<<tabm[i]<<" "; 
  
   system("PAUSE");
   return EXIT_SUCCESS;
}

Jest ktoś w stanie napisać gdzie jest błąd?

0

if(tabn[j]=i)
temp++;
Odróżniaj = od ==.
= to operator przypisania - zwraca zawsze wartosć (w tym wypadku) i!
== to operator porównania - jeśli obie strony są równe - zwraca true(prawda lub 1), a jeśli nie - false(fałsz, 0).
Skorzystaj z tego!

0

po co liczysz jakieś min i max, skoro potrzebujesz tylko ilości wystąpień?

0
Azarien napisał(a)

po co liczysz jakieś min i max, skoro potrzebujesz tylko ilości wystąpień?

W tablicy mogą być liczby ujemne przez to zastosowałem min.

A jak będzie wyglądał warunek dla pętli, który sprawdza ilość powtórzeń elementów w tablicy?

0

Witam,
jeśli dobrze zrozumiałem to twoje zadanie ma znaleźć wszystkie elementy, których liczba wystąpień będzie równa 2. Z kodu który zamieściłeś wnioskuję, że używasz C++ do rozwiązania problemu zamiast C ( chodź trochę te języki i podejścia pomieszałeś ). Mam propozycję abyś przeanalizował poniższy kod, który rozwiązuje ten problem, jak i całą rodzinę problemu znalezienia grupy liczb o zadanej ilości wystąpień, może to pomoże ci troszkę inaczej spojrzeć na pisanie kodu w C++ .

 
#include <iostream>
#include <cstdlib>

#include <iterator>
#include <vector>
#include <algorithm>
#include <map>

class Counter
{
public:
    typedef std::map<int, size_t>::iterator Iterator;

    Counter(){};
    ~Counter(){};

    void equal( std::vector< int >& lRet, size_t lC )
    {
        Iterator lF = lRes.begin();
        while( lF!= lRes.end() )
        {
            if( lF->second == lC )
                lRet.push_back( lF->first );
            ++lF;
        }
    }

    void operator()( int lNum )
    {
        Iterator lF = lRes.find( lNum );
        if( lF!= lRes.end())
            ++lF->second;
        else
        {
            lRes.insert( std::make_pair( lNum, 1));
        }
    }

private:
    static std::map< int, size_t > lRes;
};

std::map< int, size_t > Counter::lRes;

int main()
{
    int tabn[]={0,1,2,3,2,4,5,4,6,2};
    std::vector< int > lVec( tabn,tabn+sizeof(tabn)/sizeof(int));
    std::vector< int > lRet;
    Counter lC;

    std::for_each( lVec.begin(), lVec.end(), lC);
    lC.equal(lRet, 2);

    std::cerr << "Input table: " << std::endl;
    std::cerr << "Number of elements: " << lVec.size() << std::endl;
    std::copy( lVec.begin(), lVec.end(), std::ostream_iterator< int >( std::cerr," "));
    std::cerr << std::endl;

    std::cerr << "Result: " << std::endl;
    std::cerr << "Number of elements: " << lRet.size() << std::endl;
    std::copy( lRet.begin(), lRet.end(), std::ostream_iterator< int >( std::cerr," "));
    std::cerr << std::endl;


    std::cerr << "Push enter to exit" << std::endl;
    char lCharacter = char();
    std::cin.get( lCharacter );
    return EXIT_SUCCESS;
}

Pozdrawiam,
Marcin

0

Dzięki Marcin za pomoc, poradziłem już sobie z tym zadaniem aczkolwiek przeanalizuję to co podesłałeś.

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