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

[C++] Pobieranie elementów większych od średniej z tablicy statycznej do tablicy dynamicznej.

VPS Starter Arubacloud
0 głosów
1,031 wizyt
pytanie zadane 12 stycznia 2017 w C i C++ przez joshmx Nowicjusz (120 p.)

Witam,

Mam problem z ustaleniem ile elementów z wcześniej stworzonej tablicy statycznej jest większych od ich średniej arytmetycznej oraz przesłaniem ich do tablicy dynamicznej.

Fragment kodu:

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
    const int N = 10;
    const int G = 50;
    const int D = 1;
    const int K = 2;
    int srednia;
    int suma = 0;
    int q;
    
    
    srand( time( 0 ) );
    int tab[ N ];
    for( int i = 0; i < N; i++ )
    {
        tab[ i ] = D + rand() %( G - D + 1 );
    }
    
    for( int i = 0; i < N; i++ )
    {
        if( i % K == 0 )
        {
            cout << tab[ i ] << ' ';
        }
        else
        {
            cout << tab[ i ] << '\n';
        }
    }
    suma = suma + tab[ i ];
    srednia = suma / N;
    cout << "srednia wynosi " << srednia << endl;
    
    for( i = 0; i > srednia; i++ )
    {
        int * tablica = new int[ 10 ];
        
        
        
        
        
        
        
        
        delete[] tablica;
    }

Prosiłbym o wskazówki i porady do rozwiązania problemu.

Z góry dziękuje i pozdrawiam,

joshmx

1 odpowiedź

+1 głos
odpowiedź 12 stycznia 2017 przez Dexterim Dyskutant (8,370 p.)

Po pierwsze po co dublowac importowanie bibliotek i dwa razy main. Po drugie

for( i = 0; i > srednia; i++ )
    {
        int * tablica = new int[ 10 ];
         
         
         
         
         
         
         
         
        delete[] tablica;
    }

za kazdym razem tworzysz i niszczysz tablice. Lepiej zrob sobie osobna petle która CI policzy ile masz wartosci większych od średniej. A następnie tą liczbą poza pętla tworzysz tablice dynamiczna. I zostaje tylko wypelnic tablice zaalokowana tymi wartoścami które chcesz

komentarz 12 stycznia 2017 przez joshmx Nowicjusz (120 p.)
Właśnie o to chodzi, nie mam pojęcia jak napisać ten fragment kodu, który ma liczyć ile liczb jest większych od średniej :/
komentarz 12 stycznia 2017 przez Dexterim Dyskutant (8,370 p.)

Możesz np.

int licznik=0;

for(int i = 0 ; i < 10 ; i++)
     if(tab[i]>srednia)
           licznik++;

 

komentarz 12 stycznia 2017 przez joshmx Nowicjusz (120 p.)

Dziekuje, działa zacnie :) 

Teraz mam pytanie dotyczące wypelnieniem tabeli dynamicznej w.w. elementami

Kod programu ma mniej wiecej wygladac tak?

for (int i=0; i<licznik; i++)
{
    int *tablica = new int [licznik];
    for (int i=0; i<licznik; i++)
    {
        if (licznik%K==0)
        {
            cout<<tablica[licznik]<<' ';
        }
        else
        {
            cout<<tablica[licznik]<<'\n';
        }
    }
    delete [] tablica;
}

 

komentarz 12 stycznia 2017 przez Dexterim Dyskutant (8,370 p.)

Nie wiem dlaczego próbujesz cały czas alokować tablice w pętli

int licznik=0;
 
for(int i = 0 ; i < 10 ; i++)
     if(tab[i]>srednia)
           licznik++;


int *tablica = new int [licznik];

int licznik2=0 ; // potrzebny do poruszania sie po nowej tablicy

for (int i=0; i<10; i++) //lecimy znow po calej tablicy
{
        if(tab[i]>srednia)
        {
           tablica[licznik2]=tab[i];
           licznik2++;
        }

}
//przed usunieciem tablicy mozemy ja ewentualnie wyprintowac

delete [] tablica;

 

komentarz 12 stycznia 2017 przez joshmx Nowicjusz (120 p.)

Chcąc zobaczyć jak będzie twój kod działać, po zwyklym kopiuj wklej  oraz dodaniu drukowania, program działa, ale drukuje tylko pierwszą liczbę, która jest większa od średniej. 

tutaj cały kod programu:

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
    const int N = 10;
    const int G = 50;
    const int D = 1;
    const int K = 2;
    int srednia;
    int suma=0;
    int licznik=0;




    srand( time( 0 ) );
    int tab[ N ];
    for( int i = 0; i < N; i++ )
    {
        tab[ i ] = D + rand() %( G - D + 1 );


    }
    for( int i = 0; i < N; i++ )
    {
        if( i%K==0 )
        {
            cout << tab[ i ] << ' ';
        }
        else
        {
            cout << tab[ i ] << '\n';
        }

    }
    for (int i=0; i<N; i++)
    {
        suma+=tab[i];
        srednia=suma/N;
    }
    for(int i = 0 ; i < N ; i++)
    {
        if(tab[i]>srednia)
           licznik++;

    }


    cout<<"suma wynosi "<<suma<<endl;
    cout<<"srednia wynosi "<<srednia<<endl;
    cout<<"ilosc wyrazow wiekszych od sredniej wynosi "<<licznik<<endl;


int *tablica = new int [licznik];

int licznik2=0 ;

for (int i=0; i<N; i++)
{
        if(tab[i]>srednia)
        {
           tablica[licznik2]=tab[i];
           licznik2++;
        }

}
cout<<*tablica<<endl;

delete [] tablica;


system("pause");
return 0;
}

 

komentarz 12 stycznia 2017 przez Dexterim Dyskutant (8,370 p.)

Dając kod

cout<<*tablica<<endl;

wyrzucac tylko pierwszy elemet z tej tablicy. Chcąc zobaczyć cała tablice musisz po niej przejść w takim wypadku :

for (int i=0; i<licznik2; i++)
{
       cout<< tab[i] << endl;
 
}

 

komentarz 12 stycznia 2017 przez joshmx Nowicjusz (120 p.)
Super, wszystko działa jak należy. Na samym początku nie chciało działać ale tylko dlatego, że obydwoje pracowaliśmy na innych zmiennych (m.in tab oraz tablica). Bardzo dziękuje za poświęcony czas i wytłumaczenie problemu :)

Pozdrawiam,

joshmx
komentarz 12 stycznia 2017 przez joshmx Nowicjusz (120 p.)

Próbując zrozumieć dokładniej ten program staram się go modyfikować lub dodawać inne elementy. Chciałbym posortować otrzymana przeze mnie tablice stosując sortowanie przez wybieranie. Patrząc w internecie wydaje się to całkiem proste aczkolwiek wysypują się błędy..

staram się przerobić wzór z internetu tak aby pasował do mojego kodu. 

Kod:

void Sortowanie( int tab[], int size )
{
    int k;
    for( int i = 0; i < size; i++ )
    {
        k = i;
        for( int j = i + 1; j < size; j++ )
        if( tab[ j ] < tab[ k ] )
             k = j;
        
        swap( tab[ k ], tab[ i ] );
    }
}

// przerobiony jest ponizej

void Sortowanie( int tablica[], int licznik2 )
{
    int q;
    for( int i = 0; i < licznik2; i++ )
    {
        q = i;
        for( int j = i + 1; j < licznik2; j++ )
        if( tablica[ j ] < tablica[ q ] )
             q = j;
        
        swap( tablica[ q ], tablica[ i ] );
cout<<tablica[q]<<endl;
    }
}

gdzie w kodzie wystepuje blad?

komentarz 19 stycznia 2017 przez Dexterim Dyskutant (8,370 p.)
po pierwsze bedac w petli mozesz korzystac z jej iteratorow nie uzywajac kolejnej zmiennej niepotrzebnie po drugie w if brakuje klamr i to pewnie blad. Dodatkowo zle przekazujesz tablice do funkcji

Podobne pytania

0 głosów
2 odpowiedzi 597 wizyt
0 głosów
2 odpowiedzi 1,454 wizyt
+1 głos
1 odpowiedź 646 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez niezalogowany

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...