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

Funkcja sort nie sortuje wektora.

Ostatnio zmodyfikowano 2011-03-30 15:46
Autor Wiadomość
xrtwo
Temat założony przez niniejszego użytkownika
Funkcja sort nie sortuje wektora.
» 2011-03-30 13:44:51
C/C++
for( int i = 0; i < n; i++ )
{
    cout << "Wektor nr " << i << ": " << wektor[ i ] << '\n';
}

sort( wektor.begin(), wektor.end() );
cout << '\n';

for( int j = 0; j < n; j++ )
{
    cout << "Wektor nr " << j << ": " << wektor[ j ] << '\n';
}

W pierwszej petli wypisuje:

C/C++
1.4
1.4
4.5
4.9
5.4
5.1
a w drugiej:
C/C++
1.4
1.4
4.5
4.9
5.1
5.1

Czyli 5.4 gdzies znika w przestrzen... Nie rozumiem o co chodzi.
P-29970
McAffey
» 2011-03-30 14:26:13
Musisz mieć coś źle w części kodu którą się z nami nie podzieliłeś. Ja zrobiłem po prostu (nic nie zmieniając w tym co ty wrzuciłeś) :

C/C++
#include <iostream>
#include <conio.h>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n = 6;
    std::vector < double > wektor;
   
    wektor.push_back( 1.4 );
    wektor.push_back( 1.4 );
    wektor.push_back( 4.5 );
    wektor.push_back( 4.9 );
    wektor.push_back( 5.4 );
    wektor.push_back( 5.1 );
   
    for( int i = 0; i < n; i++ )
    {
        cout << "Wektor nr " << i << ": " << wektor[ i ] << '\n';
    }
   
    sort( wektor.begin(), wektor.end() );
    cout << '\n';
   
    for( int j = 0; j < n; j++ )
    {
        cout << "Wektor nr " << j << ": " << wektor[ j ] << '\n';
    }
   
    getch();
}

I poprawnie wypisuje.

W pierwszej pętli :
Wektor nr 0: 1.4
Wektor nr 1: 1.4
Wektor nr 2: 4.5
Wektor nr 3: 4.9
Wektor nr 4: 5.4
Wektor nr 5: 5.1

W drugiej pętli :
Wektor nr 0: 1.4
Wektor nr 1: 1.4
Wektor nr 2: 4.5
Wektor nr 3: 4.9
Wektor nr 4: 5.1
Wektor nr 5: 5.4
P-29971
xrtwo
Temat założony przez niniejszego użytkownika
» 2011-03-30 14:38:41
.
P-29973
McAffey
» 2011-03-30 14:45:37
Podrzuć też od razu ten
test.data
.
P-29974
xrtwo
Temat założony przez niniejszego użytkownika
» 2011-03-30 14:47:11
C/C++
5.1, 3.5, 1.4, 0.2, honda
4.9, 3.0, 1.4, 0.2, honda
6.4, 3.2, 4.5, 1.5, mazda
6.9, 3.1, 4.9, 1.5, mazda
6.2, 3.4, 5.4, 2.3, nissan
5.9, 3.0, 5.1, 1.8, nissan
P-29975
McAffey
» 2011-03-30 15:03:30
(tak dla ścisłości logi programu i tego typu rzeczy wstawiaj w tagi log /log)

Masz w tym wektorze jeszcze jedną wartość. Jak zrobisz w pierwszej pętli
i < n + 1
 i w drugiej pętli
j < n + 1
 to już się poprawnie sortuje :

Wektor nr 0: 5.1
Wektor nr 1: 4.9
Wektor nr 2: 6.4
Wektor nr 3: 6.9
Wektor nr 4: 6.2
Wektor nr 5: 5.9

Wektor nr 0: 4.9
Wektor nr 1: 5.1
Wektor nr 2: 5.9
Wektor nr 3: 6.2
Wektor nr 4: 6.4
Wektor nr 5: 6.9

edit: Poprawnie tzn wliczając też tą niechcianą wartość.
P-29978
xrtwo
Temat założony przez niniejszego użytkownika
» 2011-03-30 15:08:44
Nie zgadza się.

Wektor nr 0: 1.4
Wektor nr 1: 1.4
Wektor nr 2: 4.5
Wektor nr 3: 4.9
Wektor nr 4: 5.4
Wektor nr 5: 5.1
Wektor nr 6: 5.1

Wektor nr 0: 1.4
Wektor nr 1: 1.4
Wektor nr 2: 4.5
Wektor nr 3: 4.9
Wektor nr 4: 5.1
Wektor nr 5: 5.1
Wektor nr 6: 5.4

Po dodaniu 1 do n w obu petlach.

Co to znaczy że mam dodatkową wartośc w wektorze? do wektora jest wpisywana cała kolumna czyli 6 liczb. wektor 0 -5
P-29980
McAffey
» 2011-03-30 15:14:18
Nie wiem na co ty patrzysz (masz inne wartości niż ja), ja patrzę na to co jest pod
cout << "TEST" << '\n';
. Dla rozwiania niepewności kod mam :

C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <conio.h>

using namespace std;

double arytmetyczna( vector < double >& x ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    double suma = 0;
    for( int j = 0; j < n; j++ ) {
        suma += tmp[ j ];
    }
    return suma / n;
}

double harmoniczna( vector < double >& x ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    double suma = 0;
    for( int i = 0; i < n; i++ ) {
        tmp[ i ] = 1.0 *( 1 / tmp[ i ] );
        suma = suma + tmp[ i ];
    }
    return n / suma;
}

double geometryczna( vector < double >& x ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    double iloczyn = 1;
    for( int i = 0; i < n; i++ ) {
        iloczyn *= tmp[ i ];
    }
    return pow( iloczyn,( 1./ n ) );
}


double mediana( vector < double >& x ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    sort( tmp.begin(), tmp.end() );
    if( n % 2 )
         return tmp[( n + 1 ) / 2 - 1 ];
    else
         return 0.5 *( tmp[ n / 2 - 1 ] + tmp[ n / 2 ] );
   
}

// ZROBIC GDY DOMINANTA NIE ISTNIEJE
double dominanta( vector < double >& x ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    sort( tmp.begin(), tmp.end() );
    double maxc = 0;
    double maxw = tmp[ 0 ] - 1;
    int c;
    double w;
    for( int i = 0; i < n - maxc; i++ )
    {
        w = tmp[ i ];
        if( w != maxw )
        {
            c = 1;
            for( int j = i + 1; j < n; j++ ) if( w == tmp[ j ] ) c++;
           
            if( c > maxc )
            {
                maxc = c;
                maxw = w;
            }
        }
    }
    return maxw;
}

double centralne( vector < double >& x, int s ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    sort( tmp.begin(), tmp.end() );
    double suma = 0;
    for( int i = 0; i < n; i++ )
         suma += pow(( tmp[ i ] - arytmetyczna( tmp ) ), s );
   
    return( suma / n );
}

double odchylenie( vector < double >& x ) {
    vector < double > tmp( x );
    int n = tmp.size() - 1;
    sort( tmp.begin(), tmp.end() );
    double suma = 0;
    for( int i = 0; i < n; i++ )
         suma += pow(( tmp[ i ] - arytmetyczna( tmp ) ), 2 ); // Podnies do drugiej potegi
   
    return sqrt( suma / n );
}


int main() {
    cout.precision( 4 );
    double liczba1, liczba2, liczba3, liczba4;
    ifstream plik;
    vector < double > wektor;
    plik.open( "test.data", ios::in );
   
    if( plik.is_open() == false )
    {
        cerr << "Nie mozna otworzyc pliku." << endl;
        return 1;
    }
   
    cout << "Plik otwarty." << endl;
   
   
    while( plik.good() )
    {
        char znak;
        plik >> liczba1 >> znak;
        plik >> liczba2 >> znak;
        plik >> liczba3 >> znak;
        plik >> liczba4 >> znak;
        string linia;
        getline( plik, linia );
        wektor.push_back( liczba1 );
    }
    int n = wektor.size() - 1;
   
   
    // SREDNIA ARYTMETYCZNA //
    cout << "Srednia arytmetyczna: " << arytmetyczna( wektor ) << '\n';
   
    // SREDNIA HARMONICZNA //
    cout << "Srednia harmoniczna: " << harmoniczna( wektor ) << '\n';
   
    // SREDNIA GEOMETRYCZNA //
    cout << "Srednia geometryczna: " << geometryczna( wektor ) << '\n';
   
    // MEDIANA //
    cout << "Mediana: " << mediana( wektor ) << '\n';
   
    // DOMINANTA //
    cout << "Dominanta: " << dominanta( wektor ) << '\n';
   
    // MOMENTY CENTRALNE //
    cout << "Moment k=1: " << centralne( wektor, 1 ) << '\n';
    cout << "Moment k=2: " << centralne( wektor, 2 ) << '\n'; // Wariancja
    cout << "Moment k=3: " << centralne( wektor, 3 ) << '\n';
   
    // ODCHYLENIE STABDARDOWE //
    cout << "Odchylenie: " << odchylenie( wektor ) << '\n' << '\n' << '\n';
   
   
    cout << "TEST" << '\n';
    for( int i = 0; i < n + 1; i++ )
    {
        cout << "Wektor nr " << i << ": " << wektor[ i ] << '\n';
    }
    sort( wektor.begin(), wektor.end() );
    cout << '\n';
    for( int j = 0; j < n + 1; j++ )
    {
        cout << "Wektor nr " << j << ": " << wektor[ j ] << '\n';
    }
   
   
   
    plik.close();
    getch();
    return 0;
}

W pliku
test.data
 mam wartości :

5.1, 3.5, 1.4, 0.2, honda
4.9, 3.0, 1.4, 0.2, honda
6.4, 3.2, 4.5, 1.5, mazda
6.9, 3.1, 4.9, 1.5, mazda
6.2, 3.4, 5.4, 2.3, nissan
5.9, 3.0, 5.1, 1.8, nissan

I to daje rezultat

Plik otwarty.
Srednia arytmetyczna: 5.9
Srednia harmoniczna: 5.796
Srednia geometryczna: 5.848
Mediana: 5.9
Dominanta: 4.9
Moment k=1: 0
Moment k=2: 0.356
Moment k=3: -0.0504
Odchylenie: 0.5967


TEST
Wektor nr 0: 5.1
Wektor nr 1: 4.9
Wektor nr 2: 6.4
Wektor nr 3: 6.9
Wektor nr 4: 6.2
Wektor nr 5: 5.9

Wektor nr 0: 4.9
Wektor nr 1: 5.1
Wektor nr 2: 5.9
Wektor nr 3: 6.2
Wektor nr 4: 6.4
Wektor nr 5: 6.9

A ja patrzę tylko na część zatytułowaną TEST.
P-29981
« 1 » 2
  Strona 1 z 2 Następna strona