Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przesuniecie elementow tablicy dynamicznej

Ostatnio zmodyfikowano 2016-12-07 11:50
Autor Wiadomość
dakruzz
Temat założony przez niniejszego użytkownika
[C++] Przesuniecie elementow tablicy dynamicznej
» 2016-12-05 22:20:56
Założenie: przesunąć najmniejsze elementy tablicy dynamicznej na początek.
Gdzieś jest błąd i od paru godzin nie wiem gdzie. Może czas kupić sobie kaczuszkę?

Fragment, który nie działa
C/C++
mini = tablica[ 0 ]; //szuka elementu najmniejszego
for( int i = 0; i < 20; i++ )
{
    if( tablica[ i ] < mini )
         mini = tablica[ i ];
   
    if( i == 0 ) continue;
    else
    {
        for( int j = i; j > 0; j-- ) //przesuwa elementy najmniejsze
        {
            tablica[ j ] = tablica[ j - 1 ];
            tablica[ 0 ] = mini;
           
        }
    }
}
Przed przesunięciem najmniejszych elementów(czyli 0):
2 6 1 0 9 0 0 5 6 3 2 4 5 2 7 7 9 1 1 4
Po:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2

Cały kod:
http://pastebin.com/aKPF6WKB
P-154561
mateczek
» 2016-12-06 06:33:24
chcesz sortować (poukładać liczby) czy znaleźć minimum?? czy znaleźć minimum i policzyć ile razy wystąpiło ?? tak czy siak:

C/C++
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
    int dane[ 9 ] = { 9, 1, 1, 2, 5, 2, 3, 1, 3 };
    // wyświetl zwykłą
    int minimum = dane[ 0 ];
    int licznik = 0;
    //pętla szuka najmniejszej liczby i liczy ile razy wystąpiła
    for( int i = 0; i < 9; i++ ) {
        if( dane[ i ] < minimum ) {
            minimum = dane[ i ];
            licznik = 1;
        } else if( dane[ i ] == minimum ) licznik++;
       
    }
    cout << "najmniejsz liczba to: " << minimum << " i wystapila: " << licznik << " razy" << endl;
    //sortowanie
    sort( dane, dane + 9 );
    //wyświetlenie posortowanej
    for( int i = 0; i < 9; i++ ) {
        cout << dane[ i ] << " ";
    }
}
P-154576
dakruzz
Temat założony przez niniejszego użytkownika
» 2016-12-06 11:40:39
znaleźć minimum i przesunąć je na początek

czyli:    3 6 1 9 7 1 7
Po:       1 1 3 6 9 7 7

i raczej bez ten nowej biblioteki, chociaż jeśli możesz, to weź wytłumacz działanie, może da się przerobić ją, żeby tylko przesortowała minimalne wartości
P-154578
czaffik
» 2016-12-06 13:27:07
Ładnie żeś nakombinował z tym "przesuwaniem najmniejszych elementów" xD Nadpisujesz sobie elementy tablicy tymi samymi wartościami stąd masz ciąg zer. Czyli normalnie chcesz posortować, ale jak już chcesz sortować w ten sposób że znajdujesz najmniejszy element i przesuwasz go na początek i tak dalej to proponowałbym taki kod:

C/C++
for( int a = 0; a < 20; a++ )
{
    int min = tab[ a ];
    int n = a;
   
    for( int i = a + 1; i < size; i++ )
    {
        if( tab[ i ] < min )
        {
            min = tab[ i ];
            n = i;
        }
    }
   
    int tmp = tab[ a ];
    tab[ a ] = tab[ n ];
    tab[ n ] = tmp;
}

Jak się nie mylę to będzie sortowanie przez wstawianie.
P-154581
dakruzz
Temat założony przez niniejszego użytkownika
» 2016-12-06 13:54:14
nie wiem jak u Ciebie, ale u mnie ten kod sortuje całą zawartość tablicy, a powinien przesunąć tylko najmniejszy element(tak jak opisałem na górze)
P-154582
mokrowski
» 2016-12-06 15:18:56
C/C++
#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

int main() {
    auto vec = vector < int > { 5, 6, 4, 3, 7, 100, 1 };
    nth_element( vec.begin(), vec.begin(), vec.end() );
    cout << *( vec.begin() ) << endl;
}
https://en.wikipedia.org/wiki/Selection_algorithm
P-154584
mateczek
» 2016-12-06 17:34:40
C/C++
#include <vector>
#include <iostream>

using namespace std;

int main() {
    vector < int > tablica { 5, 6, 4, 0, 3, 7, 0, 100, 1 };
    vector < int > wynikowa;
   
    //szukanie minimum
    int min = tablica[ 0 ];
    for( int element: tablica ) {
        if( element < min ) {
            min = element;
        }
    }
   
    //przebudówka tablicy
    for( int element: tablica ) {
        if( element == min )
             wynikowa.insert( wynikowa.begin(), element ); //minimum wstawiam na początek
        else
             wynikowa.push_back( element ); //inne na koniec
       
    }
    //wyświetlanie
    for( int element: wynikowa ) {
        cout << element << " ";
    }
   
}
P-154590
czaffik
» 2016-12-07 11:50:39
To chodziło ci o przesunięcie wszystkich wystąpień minimalnej wartości na początek tablicy.
Nie korzystając ze standardu c++11, który wykorzystali poprzednicy, można zrobić tak (nie wiem jaki kompilator wykorzystujesz, ale MinGW domyślnie ma wyłączoną obsługę tego standardu):

C/C++
// inicjalizacja tablicy:
const int size = 7;
int tab[ size ] = { 3, 6, 1, 9, 7, 1, 7 };
// szukanie najmmniejszego elementu:
int min = tab[ 0 ];
for( int i = 1; i < size; i++ )
{
    if( tab[ i ] < min ) min = tab[ i ];
   
}
// przesuwanie elementów najmniejszych na początek tablicy
int tmp;
for( int i = 1, j = 0; i < size; i++ )
{
    if( tab[ i ] == min )
    {
        for( int j = i; j > 0; j-- )
        {
            tmp = tab[ j ];
            tab[ j ] = tab[ j - 1 ];
            tab[ j - 1 ] = tmp;
        }
    }
}
// wypisanie tablicy:
for( int i = 0; i < size; i++ ) cout << tab[ i ] << " ";

cout << endl;

lub lepiej wykorzystać zamiast zwykłej tablic klasę vector:

C/C++
// inicjalizacja tablicy:
vector < int > tab;
tab.push_back( 3 );
tab.push_back( 6 );
tab.push_back( 1 );
tab.push_back( 9 );
tab.push_back( 7 );
tab.push_back( 1 );
tab.push_back( 7 );
// szukanie elementu najmniejszego:
int min = tab[ 0 ];
for( int i = 1; i < tab.size(); i++ )
{
    if( tab[ i ] < min ) min = tab[ i ];
   
}
// przestawianie elementów najmniejszych na początek tablicy:
for( int i = 1; i < tab.size(); i++ )
{
    if( tab[ i ] == min )
    {
        tab.insert( tab.begin(), tab[ i ] );
        tab.erase( tab.begin() + i + 1 );
    }
}
// wypisanie tablicy:
for( int i = 0; i < tab.size(); i++ )
{
    cout << tab[ i ] << " ";
}
cout << endl;
P-154607
« 1 »
  Strona 1 z 1