KameleonW Temat założony przez niniejszego użytkownika |
Ile razy wystąpiła dana liczba w tekście? » 2016-03-08 12:24:55 Witam. Otóż chciałbym policzyć ile razy wystąpiła dana liczba z przedziału <1,49> w tekście txt. Program wygląda następująco jednak nie działa poprawnie... #include <iostream> #include <fstream> #include <conio.h>
using namespace std;
int main() { fstream plik; plik.open( "tekst.txt", ios::in ); if( plik.good() ) { int tab[ 50 ]; for( int i = 0; i < 50; i++ ) tab[ i ] = 0; char licznik = '0'; string napis; while( !plik.eof() ) { getline( plik, napis ); licznik++; if( napis.find( 'licznik' ) != string::npos ) { tab[ licznik ] ++; } } for( int i = 1; i < 50; i++ ) cout << "Liczba " << i << " wystapila w tekscie " << tab[ i ] << " x" << endl; plik.close(); } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl; getch(); return( 0 ); }
|
|
carlosmay |
» 2016-03-08 12:39:47 Przekonwertuj zmienną licznik na string. std::to_string. 'licznik' - w apostrofy bierze się pojedynczy znak, a nie łańcuch. Poza tym, gdyby to była zmienna jednoznakowa 'i' to szukałoby literki a nie wartości liczby spod 'i'. |
|
michal11 |
» 2016-03-08 13:01:01 Pokaż fragment wczytywanego pliku. |
|
KameleonW Temat założony przez niniejszego użytkownika |
» 2016-03-08 13:25:50 13,1,3,4,5,5,5 2,3,4,5,6,7,8 1,2,2,2,3,33 |
|
carlosmay |
» 2016-03-08 13:54:19 Po co kombinować z std::getline()Łatwiej użyć operator strumienia >> . ifstream fin;
int liczba; char znak; while( fin >> liczba >> znak ) { } |
|
Kaikso |
» 2016-03-08 14:38:16 Wystarczy dobrze przemyśleć kolejne kroki jakie ma wykonać kod: #include <iostream> #include <fstream> #include <string>
inline bool is_digit( char c ) { return c >= '0' && c <= '9'; }
int main() { std::ifstream input( "plik.txt" ); if( input.fail() ) { std::cerr << "Błąd: Nie udało się otworzyć pliku." << std::endl; return - 1; } size_t liczba[ 50 ] = { 0 }; std::string line; while( !input.eof() ) { std::getline( input, line ); for( size_t i = 0; line[ i ] != '\0'; i++ ) if( is_digit( line[ i ] ) ) { unsigned char val = line[ i ] - '0'; if( !is_digit( line[ ++i ] ) ) { liczba[ val ] ++; continue; } val = val * 10 + line[ i ] - '0'; if( !is_digit( line[ ++i ] ) && val < 50 ) liczba[ val ] ++; else while( is_digit( line[ i ] ) ) i++; } } for( size_t i = 0; i < 50; i++ ) if( liczba[ i ] > 0 ) std::cout << "Liczba " << i << " występuje " << liczba[ i ] << " w pliku." << std::endl; return 0; }
|
|
michal11 |
» 2016-03-08 16:05:26 @up is_digit serio ? isdigit()@carlosmay z twoim kodem jest problem ponieważ na końcu linii nie ma przecinka. Wczytuj getlinem (no chyba, że możesz zmoedyfikowac plik tak aby na końcu tez były przecinki - wtedy skorzystaj z tego co napisał carlosmay jeżeli nie to możesz jeszcze zrobić tak jak w moim przykladzie), parsuj wczytanego stringa i dodawaj liczby najlepiej do vektora. #include <iostream> #include <string> #include <fstream> #include <vector> #include <sstream> #include <numeric>
ifstream file( "file.txt" );
string str; vector < int > numbers;
while( getline( file, str ) ) { str += ','; istringstream iss( str ); int num; char comma; while( iss >> num >> comma ) { numbers.push_back( num ); } }
cout << accumulate( numbers.begin(), numbers.end(), 0,[]( int sum, int val ) { return sum +( val >= 1 && val <= 49 ? 1: 0 ); } );
Oczywiście brakuje sprawdzania błędów itp. rzeczy, ale ogólnie działa. |
|
Kaikso |
» 2016-03-08 19:59:06 @up: To nawyk z pisania biblioteki standardowej C. A po za tym to jest o wiele szybsze bo typy są takie same (brak zbędnej operacji rzutowania z char na int co się przekłada na alokacji i deklarację miejsca na stosie) i dodatkowo jest inline co eliminuje kolejne zbędne operacje skoków i tworzenia zbędnej ramki stos. |
|
« 1 » 2 3 4 |