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

Ile razy wystąpiła dana liczba w tekście?

Ostatnio zmodyfikowano 2016-03-11 16:41
Autor Wiadomość
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...
C/C++
#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 ) // gdzies tutaj przydaloby
            // się jakies rzutowanie albo coś ale nie mam pomysłu co jak gdzie :/
            {
                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 );
}
P-145712
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'.
P-145713
michal11
» 2016-03-08 13:01:01
Pokaż fragment wczytywanego pliku.
P-145714
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
P-145716
carlosmay
» 2016-03-08 13:54:19
13,1,3,4,5,5,5
Po co kombinować z std::getline()
Łatwiej użyć operator strumienia
>>
.

C/C++
ifstream fin;
//...
int liczba;
char znak;
while( fin >> liczba >> znak ) {
    // algorytm sprawdzajacy wystepowanie liczb
}
P-145718
Kaikso
» 2016-03-08 14:38:16
Wystarczy dobrze przemyśleć kolejne kroki jakie ma wykonać kod:

C/C++
#include <iostream>
#include <fstream>
#include <string>

// using namespace std; // zło w czystej postaci

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 ); // wczytaj linie z pliku
        for( size_t i = 0; line[ i ] != '\0'; i++ ) if( is_digit( line[ i ] ) )
        // ta pętla przewija znak po znaku, a if sprawia że gdy dany znak jest cyfrą to rozpoczyna się procedyra
        {
            unsigned char val = line[ i ] - '0'; // przetwarzamy pierwszą cyfrę do postaci liczbowej
            if( !is_digit( line[ ++i ] ) ) { liczba[ val ] ++; continue; } // jeśli liczba nie jest dwu-cyfrowa to zwiększ jej ilość wystąpień i rozpocznij procedurę pętli od nowa dla kolejnych znaków
           
            val = val * 10 + line[ i ] - '0'; // liczba ma dwa lub więcej znaków więc zapisz jej wartość
            if( !is_digit( line[ ++i ] ) && val < 50 ) liczba[ val ] ++; // jeśli liczba nie jest więcej niż dwu-cyfrowa i jest mniejsza od 50 to zwiększ jej licznik
            else while( is_digit( line[ i ] ) ) i++; // jeśli liczba ma więcej niż trzy cyfry to pomiń wszystkie
           
        }
       
    }
   
    for( size_t i = 0; i < 50; i++ ) if( liczba[ i ] > 0 ) // wyświetl ilość wystąpień danej liczby tylko gdy wystąpiła co najmniej jeden raz
         std::cout << "Liczba " << i << " występuje " << liczba[ i ] << " w pliku." << std::endl;
   
    return 0;
}
P-145721
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.

C/C++
#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.
P-145729
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.
P-145749
« 1 » 2 3 4
  Strona 1 z 4 Następna strona