Białe znaki(enter)- sortowanie
Ostatnio zmodyfikowano 2016-02-15 16:30
heheszek Temat założony przez niniejszego użytkownika |
Białe znaki(enter)- sortowanie » 2016-02-15 15:34:10 Witam. Mam problem z sortowaniem bąbelkowym i białym znakiem w postaci Entera pod koniec pliku. Nie wiem, czemu ale na końcu sortowania występują mi dwa zera, których nie ma w pliku. Co zrobić by ich nie było? Opcja 3 #include<iostream> #include<fstream> #include<cstdlib> #include<cstdio> #include <conio.h>
using namespace std;
int main()
{ int o; int i = 0; cout << "Autor: xxx\n"; cout << "Program wykonuje osobno kolejne operacje z podpunktow a-c z zadania\n\n"; cout << "Prosze wybrac numer operacji\n"; cout << "1 - a) Wyznacza ilosc liczb parzystych i nieparzystych ,a nastepnie zapisuje te liczby do osobnych plikow\n"; cout << "2 - b) Wskazuje najwieksza i najmniejsza liczbe \n"; cout << "3 - c) Sortuje malejaco wszystkie liczby,a nastepnie je zapisuje do pliku \n"; cin >> o; if( o == 1 ) { int n; char nazwa[ 100 ]; cout << "Podaj z jakiego pliku chcesz odczytac wyrazy." << endl; cin >> nazwa; ifstream we( nazwa ); ofstream parz( "parzyste.txt" ); ofstream nieparz( "nieparzyste.txt" ); if( !we ) { cout << "Nie mozna otworzyc pliku"; getchar(); return 1; } while( !we.eof() ) { we >> n; if( n % 2 == 0 ) { parz << n << endl; i++; } else nieparz << n << endl; } we.close(); cout << "\nJest " << i << " liczb parzystych.\n"; cout << "Jest " << 1000 - i << " liczb nieparzystych.\n"; } if( o == 2 ) { int liczba, min, max; min = INT_MAX; max = INT_MIN; ofstream werdykt( "werdykt.txt" ); char nazwa[ 100 ]; cout << "Podaj z jakiego pliku chcesz odczytac wyrazy." << endl; cin >> nazwa; ifstream we( nazwa ); if( !we ) { cout << "Nie mozna otworzyc pliku"; getchar(); return 1; } while( !we.eof() ) { we >> liczba; if( liczba < min ) { min = liczba; } if( liczba > max ) { max = liczba; } } werdykt << "Najwieksza liczba w pliku jest liczba: " << max << endl << "Najmniejsza liczba w pliku jest liczba: " << min << endl; we.close(); cout << "Najwieksza liczba w pliku jest liczba: " << max << endl; cout << "Najmniejsza liczba w pliku jest liczba: " << min << endl; } if( o == 3 ) { int tab[ 1000 ] = { 0 }; int temp = 0; int schowek, zamiana; ofstream sort( "posortowane.txt" ); char nazwa[ 100 ]; cout << "Podaj z jakiego pliku chcesz odczytac wyrazy." << endl; cin >> nazwa; ifstream we( nazwa ); if( !we ) { cout << "Nie mozna otworzyc pliku"; getchar(); return 1; } while( !we.eof() ) we >> tab[ temp++ ]; do { zamiana = 0; for( int i = 0; i < 1001; i++ ) { if( tab[ i ] > tab[ i - 1 ] ) { zamiana = zamiana + 1; schowek = tab[ i ]; tab[ i ] = tab[ i - 1 ]; tab[ i - 1 ] = schowek; } } } while( zamiana != 0 ); for( int j = 0; j <= 1001; j++ ) { sort << tab[ j ] << " " << endl; we.close(); } } system( "PAUSE" ); return 0; } Plik: http://sendfile.es/pokaz/700519---hc0y.html |
|
Monika90 |
» 2016-02-15 15:53:57 Nieprawidłowo wczytujesz liczby, zamiast while( !we.eof() ) { we >> n; }
zrób |
|
heheszek Temat założony przez niniejszego użytkownika |
» 2016-02-15 16:01:45 Chodzi mi tylko o opcję numer 3
Nawet pomimo tej zmiany i tak mam te dwa zera na samym końcu sortowania |
|
Monika90 |
» 2016-02-15 16:11:09 Tablica tab ma 1000 elementów, więc w tej pętli for( int i = 0; i < 1001; i++ ) { if( tab[ i ] > tab[ i - 1 ] ) { zamiana = zamiana + 1; schowek = tab[ i ]; tab[ i ] = tab[ i - 1 ]; tab[ i - 1 ] = schowek; } }
wychodzisz poza dopuszczalny indeks. W następnej pętli jest nawet gorzej for( int j = 0; j <= 1001; j++ ) { sort << tab[ j ] << " " << endl; we.close(); }
aż o dwa elementy za daleko. |
|
heheszek Temat założony przez niniejszego użytkownika |
» 2016-02-15 16:21:51 Teraz mam tylko jedno 0, więc jest progres. Jest to pewnie ten biały znak(ENTER) na końcu pliku. int tab[ 1000 ] = { 0 }; int temp = 0; int schowek, zamiana; ofstream sort( "posortowane.txt" ); char nazwa[ 100 ]; cout << "Podaj z jakiego pliku chcesz odczytac wyrazy." << endl; cin >> nazwa; ifstream we( nazwa ); if( !we ) { cout << "Nie mozna otworzyc pliku"; getchar(); return 1; }
while( !we.eof() ) we >> tab[ temp++ ];
do { zamiana = 0; for( int i = 0; i < 1000; i++ ) { if( tab[ i ] > tab[ i - 1 ] ) { zamiana = zamiana + 1; schowek = tab[ i ]; tab[ i ] = tab[ i - 1 ]; tab[ i - 1 ] = schowek; } } } while( zamiana != 0 );
for( int j = 0; j <= 999; j++ ) { sort << tab[ j ] << " " << endl; we.close(); } } |
|
Monika90 |
» 2016-02-15 16:30:16 Sortowanie jest wciąż źle, w pierwszej iteracji kiedy i jest równe 0 używasz ujemnego indeksu, bo i - 1 jest wtedy równe -1.
|
|
« 1 » |