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

C++ Dynamiczna struktura

Ostatnio zmodyfikowano 2020-07-03 21:10
Autor Wiadomość
skupi967
Temat założony przez niniejszego użytkownika
C++ Dynamiczna struktura
» 2020-07-03 16:15:03
Witam.


Mam pytanie, w jaki sposob moge dynamicznie utworzyc strukture tak by moc ciagle do niej dodawac dwie dane, jeden string i jeden int a na koncu moc ja posortowac?

Caly kod zrodlowy programu

C/C++
#include <iostream>
#include <string>
#include <map>
#include <cmath>
#include <fstream>
#include <sstream>
#include <numeric>
#include <limits>

using namespace std;

struct Datas
{
    string text;
    int number;
};

void print( string::size_type n, string const & s )
{
    if( n == string::npos ) {
        cout << "not found\n";
    } else {
        cout << "found: " << s.substr( n ) << '\n';
    }
}

map < char, int > make_pythagorean_map()
{
    return {
        { 'A', 1 },
        { 'a', 1 },
        { 'B', 2 },
        { 'b', 2 },
        { 'C', 3 },
        { 'c', 3 },
        { 'D', 4 },
        { 'd', 4 },
        { 'E', 5 },
        { 'e', 5 },
        { 'F', 6 },
        { 'f', 6 },
        { 'G', 7 },
        { 'g', 7 },
        { 'H', 8 },
        { 'h', 8 },
        { 'I', 9 },
        { 'i', 9 },
        { 'J', 1 },
        { 'j', 1 },
        { 'K', 2 },
        { 'k', 2 },
        { 'L', 3 },
        { 'l', 3 },
        { 'M', 4 },
        { 'm', 4 },
        { 'N', 5 },
        { 'n', 5 },
        { 'O', 6 },
        { 'o', 6 },
        { 'P', 7 },
        { 'p', 7 },
        { 'Q', 8 },
        { 'q', 8 },
        { 'R', 9 },
        { 'r', 9 },
        { 'S', 1 },
        { 's', 1 },
        { 'T', 2 },
        { 't', 2 },
        { 'U', 3 },
        { 'u', 3 },
        { 'V', 4 },
        { 'v', 4 },
        { 'W', 5 },
        { 'w', 5 },
        { 'X', 6 },
        { 'x', 6 },
        { 'Y', 7 },
        { 'y', 7 },
        { 'Z', 8 },
        { 'z', 8 }
    };
}

map < char, int > make_simpleeng_map()
{
    return {
        { 'A', 1 },
        { 'a', 1 },
        { 'B', 2 },
        { 'b', 2 },
        { 'C', 3 },
        { 'c', 3 },
        { 'D', 4 },
        { 'd', 4 },
        { 'E', 5 },
        { 'e', 5 },
        { 'F', 6 },
        { 'f', 6 },
        { 'G', 7 },
        { 'g', 7 },
        { 'H', 8 },
        { 'h', 8 },
        { 'I', 9 },
        { 'i', 9 },
        { 'J', 10 },
        { 'j', 10 },
        { 'K', 11 },
        { 'k', 11 },
        { 'L', 12 },
        { 'l', 12 },
        { 'M', 13 },
        { 'm', 13 },
        { 'N', 14 },
        { 'n', 14 },
        { 'O', 15 },
        { 'o', 15 },
        { 'P', 16 },
        { 'p', 16 },
        { 'Q', 17 },
        { 'q', 17 },
        { 'R', 18 },
        { 'r', 18 },
        { 'S', 19 },
        { 's', 19 },
        { 'T', 20 },
        { 't', 20 },
        { 'U', 21 },
        { 'u', 21 },
        { 'V', 22 },
        { 'v', 22 },
        { 'W', 23 },
        { 'w', 23 },
        { 'X', 24 },
        { 'x', 24 },
        { 'Y', 25 },
        { 'y', 25 },
        { 'Z', 26 },
        { 'z', 26 }
    };
}

map < char, int > make_gfive_map()
{
    return {
        { 'A', 7 },
        { 'a', 7 },
        { 'B', 8 },
        { 'b', 8 },
        { 'C', 1 },
        { 'c', 1 },
        { 'D', 2 },
        { 'd', 2 },
        { 'E', 3 },
        { 'e', 3 },
        { 'F', 4 },
        { 'f', 4 },
        { 'G', 5 },
        { 'g', 5 },
        { 'H', 6 },
        { 'h', 6 },
        { 'I', 7 },
        { 'i', 7 },
        { 'J', 8 },
        { 'j', 8 },
        { 'K', 9 },
        { 'k', 9 },
        { 'L', 1 },
        { 'l', 1 },
        { 'M', 2 },
        { 'm', 2 },
        { 'N', 3 },
        { 'n', 3 },
        { 'O', 4 },
        { 'o', 4 },
        { 'P', 5 },
        { 'p', 5 },
        { 'Q', 6 },
        { 'q', 6 },
        { 'R', 7 },
        { 'r', 7 },
        { 'S', 8 },
        { 's', 8 },
        { 'T', 9 },
        { 't', 9 },
        { 'U', 1 },
        { 'u', 1 },
        { 'V', 2 },
        { 'v', 2 },
        { 'W', 3 },
        { 'w', 3 },
        { 'X', 4 },
        { 'x', 4 },
        { 'Y', 5 },
        { 'y', 5 },
        { 'Z', 6 },
        { 'z', 6 }
    };
}

map < char, int > select_map( int choice )
{
    switch( choice )
    {
    case 1:
        {
            return make_pythagorean_map();
        }
    case 2:
        {
            return make_simpleeng_map();
        }
    case 3:
        {
            return make_gfive_map();
        }
    }
}

int main()
{
    int cho = 0, d;
    char o;
    string phrasetwo;
   
    while( 1 )
    {
        system( "cls" );
        cout << "You want to use: " << endl << "1) Pythagorean Gematria" << endl << "2) English/Simple Gematria" << endl << "3) Extra: " << endl << "Gematria with G = 7" << endl << endl;
        cin >> phrasetwo;
        istringstream asd( phrasetwo );
       
        if( !( asd >> d ) || asd >> o )
        {
            system( "cls" );
            cout << "You want to use: " << endl << "1) Pythagorean Gematria" << endl << "2) English/Simple Gematria" << endl << "3) Extra: " << endl << "Gematria with G = 7" << endl << endl;
        }
        else
        {
            cho = stoi( phrasetwo );
            if( cho <= 3 && cho >= 1 )
            {
                break;
            }
        }
    }
   
    auto m = select_map( cho );
   
    string::size_type n;
    ifstream input( "words.txt" );
    ofstream output( "results.txt" );
    string str, phrase;
    int counter = 1, cnt = 0, choice = 0, chosennum = 0, asd = 0, f = 0, x;
    bool flag;
    char c;
   
    while( 1 )
    {
        system( "cls" );
        cout << "You want to check:" << '\n' << "1) Number" << '\n' << "2) Phrase" << endl;
        cin >> phrase;
        istringstream s( phrase );
       
        if( !( s >> x ) || s >> c )
        {
            system( "cls" );
            cout << "You want to check:" << '\n' << "1) Number" << '\n' << "2) Phrase" << endl;
        }
        else
        {
            choice = stoi( phrase );
            if( choice <= 2 && choice >= 1 )
            {
                break;
            }
        }
    }
   
    switch( choice )
    {
    case 1:
        {
            cout << "Which number do you want to check?: ";
            while( 1 )
            {
                cin >> phrase;
                istringstream s( phrase );
               
                if( !( s >> x ) || s >> c )
                {
                    cout << endl << "Which number do you want to check?: ";
                }
                else
                {
                    chosennum = stoi( phrase );
                    break;
                }
            }
            cout << endl << "All words found: " << endl;
            break;
        }
       
    case 2:
        {
            do
            {
                flag = false;
                cout << "Which phrase do you want to check?: ";
               
                cin.ignore( numeric_limits < streamsize >::max(), '\n' );
                getline( cin, phrase );
               
                for( int i = 0; i < phrase.length(); i++ )
                {
                    if( isdigit( phrase[ i ] ) )
                    {
                        flag = true;
                    }
                }
                cout << endl;
            } while( flag == true );
           
            for( char charr: phrase )
            {
                chosennum += m[ charr ];
            }
            cout << '\t' << phrase << " in gematria = " << chosennum << endl << endl << "All words found: " << endl;
            break;
        }
    }
   
    output << "All words found: " << endl;
   
    int tablica[ 4 ], b = 0; ////////////
    string str2; ////////////////////
    string::size_type G; ///////////////
    int kupa;
   
    while( getline( input, str ) )
    {
        int sum = 0;
       
        n = str.find( ',' );
        G = n;
       
        if( n != string::npos )
        {
            do ////////
            {
                tablica[ b ] = n;
                b++;
                n = str.find( ',', n + 1 );
            } while( n != string::npos ); //////////////
           
            str2 = str.substr( tablica[ 3 ] + 1 );
            kupa = stoi( str2 );
            str.resize( G );
        }
       
        for( int i = 0; i < str.length(); i++ )
        {
            if((( int ) str[ i ] ) > 127 ||(( int ) str[ i ] ) < 0 )
            {
                str.clear();
            }
        }
       
        for( char charr: str )
        {
            sum += m[ charr ];
        }
       
        if( sum == chosennum )
        {
            cout << "No[" << counter << "]: " << str << "(" << sum << ")" << '\n';
            output << "No[" << counter << "]: " << '\t' << str << " = " << sum << endl;
            cout << "TEST LICZBY: " << str2 << endl << kupa << endl;
            counter++;
        }
    }
    cout << "\n\n You have found: " <<( counter - 1 ) << " words" << '\n';
    output << "\n\n You have found: " <<( counter - 1 ) << " words" << '\n';
   
    return 0;
}

W tej czesci kodu
C/C++
if( sum == chosennum )
{
    cout << "No[" << counter << "]: " << str << "(" << sum << ")" << '\n';
    output << "No[" << counter << "]: " << '\t' << str << " = " << sum << endl;
    cout << "TEST LICZBY: " << str2 << endl << kupa << endl;
    counter++;
}
chcialbym dodawac do struktury
struct Datas
 zarowno string, w tym przypadku
string str
 oraz zmienna
int kupa
 tak wiele razy ile bedzie wynosic zmienna
int counter
. Counter caly czas bedzie roslo bo to nic innego jak ilosc znalezionych slow


Dziekuje za pomoc.

EDIT.
Zauwazylem ze program zle dziala, jesli mam w pliku words.txt np. napisane krab,123,432,12,4 oraz bark,123,432,12,4 to wypisuje/znajduje tylko ten pierwszy wyraz krab pomimo ze bark ma taka sama wartosc ale jest napisane wspak. O Co chodzi?
Zapewne namieszalem cos tutaj
C/C++
if( n != string::npos )
{
    do ////////
    {
        tablica[ b ] = n;
        b++;
        n = str.find( ',', n + 1 );
    } while( n != string::npos ); //////////////
   
    str2 = str.substr( tablica[ 3 ] + 1 );
    kupa = stoi( str2 );
    str.resize( G );
}
P-177271
pekfos
» 2020-07-03 16:26:30
Struktura ma stały rozmiar, więc się nie da. To o co tak na prawdę Ci chodzi, to kontener struktur. W tym wypadku najlepszy jest std::vector<>.
» Kurs C++ » Poziom 5Kontener std::vector<> lekcja
» Kurs C++ » Poziom 5Wprowadzenie do standardowych algorytmów lekcja
W ostatnim linku masz informacje przydatne by taki kontener posortować (ostatni przykład).

Zapewne namieszalem cos tutaj
Zmienna b nie jest zerowana.
P-177273
skupi967
Temat założony przez niniejszego użytkownika
» 2020-07-03 16:36:27
Dziekuje Pekfos. Prawie wszystko dziala... Otoz.

Tutaj caly kod programu

C/C++
#include <iostream>
#include <string>
#include <map>
#include <cmath>
#include <fstream>
#include <sstream>
#include <numeric>
#include <limits>
#include <utility>
#include <vector>
#include <algorithm>
#include <functional>
#include <array>

using namespace std;

void print( string::size_type n, string const & s )
{
    if( n == string::npos ) {
        cout << "not found\n";
    } else {
        cout << "found: " << s.substr( n ) << '\n';
    }
}

map < char, int > make_pythagorean_map()
{
    return {
        { 'A', 1 },
        { 'a', 1 },
        { 'B', 2 },
        { 'b', 2 },
        { 'C', 3 },
        { 'c', 3 },
        { 'D', 4 },
        { 'd', 4 },
        { 'E', 5 },
        { 'e', 5 },
        { 'F', 6 },
        { 'f', 6 },
        { 'G', 7 },
        { 'g', 7 },
        { 'H', 8 },
        { 'h', 8 },
        { 'I', 9 },
        { 'i', 9 },
        { 'J', 1 },
        { 'j', 1 },
        { 'K', 2 },
        { 'k', 2 },
        { 'L', 3 },
        { 'l', 3 },
        { 'M', 4 },
        { 'm', 4 },
        { 'N', 5 },
        { 'n', 5 },
        { 'O', 6 },
        { 'o', 6 },
        { 'P', 7 },
        { 'p', 7 },
        { 'Q', 8 },
        { 'q', 8 },
        { 'R', 9 },
        { 'r', 9 },
        { 'S', 1 },
        { 's', 1 },
        { 'T', 2 },
        { 't', 2 },
        { 'U', 3 },
        { 'u', 3 },
        { 'V', 4 },
        { 'v', 4 },
        { 'W', 5 },
        { 'w', 5 },
        { 'X', 6 },
        { 'x', 6 },
        { 'Y', 7 },
        { 'y', 7 },
        { 'Z', 8 },
        { 'z', 8 }
    };
}

map < char, int > make_simpleeng_map()
{
    return {
        { 'A', 1 },
        { 'a', 1 },
        { 'B', 2 },
        { 'b', 2 },
        { 'C', 3 },
        { 'c', 3 },
        { 'D', 4 },
        { 'd', 4 },
        { 'E', 5 },
        { 'e', 5 },
        { 'F', 6 },
        { 'f', 6 },
        { 'G', 7 },
        { 'g', 7 },
        { 'H', 8 },
        { 'h', 8 },
        { 'I', 9 },
        { 'i', 9 },
        { 'J', 10 },
        { 'j', 10 },
        { 'K', 11 },
        { 'k', 11 },
        { 'L', 12 },
        { 'l', 12 },
        { 'M', 13 },
        { 'm', 13 },
        { 'N', 14 },
        { 'n', 14 },
        { 'O', 15 },
        { 'o', 15 },
        { 'P', 16 },
        { 'p', 16 },
        { 'Q', 17 },
        { 'q', 17 },
        { 'R', 18 },
        { 'r', 18 },
        { 'S', 19 },
        { 's', 19 },
        { 'T', 20 },
        { 't', 20 },
        { 'U', 21 },
        { 'u', 21 },
        { 'V', 22 },
        { 'v', 22 },
        { 'W', 23 },
        { 'w', 23 },
        { 'X', 24 },
        { 'x', 24 },
        { 'Y', 25 },
        { 'y', 25 },
        { 'Z', 26 },
        { 'z', 26 }
    };
}

map < char, int > make_gfive_map()
{
    return {
        { 'A', 7 },
        { 'a', 7 },
        { 'B', 8 },
        { 'b', 8 },
        { 'C', 1 },
        { 'c', 1 },
        { 'D', 2 },
        { 'd', 2 },
        { 'E', 3 },
        { 'e', 3 },
        { 'F', 4 },
        { 'f', 4 },
        { 'G', 5 },
        { 'g', 5 },
        { 'H', 6 },
        { 'h', 6 },
        { 'I', 7 },
        { 'i', 7 },
        { 'J', 8 },
        { 'j', 8 },
        { 'K', 9 },
        { 'k', 9 },
        { 'L', 1 },
        { 'l', 1 },
        { 'M', 2 },
        { 'm', 2 },
        { 'N', 3 },
        { 'n', 3 },
        { 'O', 4 },
        { 'o', 4 },
        { 'P', 5 },
        { 'p', 5 },
        { 'Q', 6 },
        { 'q', 6 },
        { 'R', 7 },
        { 'r', 7 },
        { 'S', 8 },
        { 's', 8 },
        { 'T', 9 },
        { 't', 9 },
        { 'U', 1 },
        { 'u', 1 },
        { 'V', 2 },
        { 'v', 2 },
        { 'W', 3 },
        { 'w', 3 },
        { 'X', 4 },
        { 'x', 4 },
        { 'Y', 5 },
        { 'y', 5 },
        { 'Z', 6 },
        { 'z', 6 }
    };
}

map < char, int > select_map( int choice )
{
    switch( choice )
    {
    case 1:
        {
            return make_pythagorean_map();
        }
    case 2:
        {
            return make_simpleeng_map();
        }
    case 3:
        {
            return make_gfive_map();
        }
    }
}

int main()
{
    int cho = 0, d, help;
    char o;
    string phrasetwo;
   
    while( 1 )
    {
        system( "cls" );
        cout << "You want to use: " << endl << "1) Pythagorean Gematria" << endl << "2) English/Simple Gematria" << endl << "3) Extra: " << endl << "Gematria with G = 7" << endl << endl;
        cin >> phrasetwo;
        istringstream asd( phrasetwo );
       
        if( !( asd >> d ) || asd >> o )
        {
            system( "cls" );
            cout << "You want to use: " << endl << "1) Pythagorean Gematria" << endl << "2) English/Simple Gematria" << endl << "3) Extra: " << endl << "Gematria with G = 7" << endl << endl;
        }
        else
        {
            cho = stoi( phrasetwo );
            if( cho <= 3 && cho >= 1 )
            {
                break;
            }
        }
    }
   
    auto m = select_map( cho );
   
    string::size_type n;
    ifstream input( "words.txt" );
    ofstream output( "results.txt" );
    string str, phrase;
    int counter = 1, cnt = 0, choice = 0, chosennum = 0, asd = 0, f = 0, x;
    bool flag;
    char c;
   
    while( 1 )
    {
        system( "cls" );
        cout << "You want to check:" << '\n' << "1) Number" << '\n' << "2) Phrase" << endl;
        cin >> phrase;
        istringstream s( phrase );
       
        if( !( s >> x ) || s >> c )
        {
            system( "cls" );
            cout << "You want to check:" << '\n' << "1) Number" << '\n' << "2) Phrase" << endl;
        }
        else
        {
            choice = stoi( phrase );
            if( choice <= 2 && choice >= 1 )
            {
                break;
            }
        }
    }
   
    switch( choice )
    {
    case 1:
        {
            cout << "Which number do you want to check?: ";
            while( 1 )
            {
                cin >> phrase;
                istringstream s( phrase );
               
                if( !( s >> x ) || s >> c )
                {
                    cout << endl << "Which number do you want to check?: ";
                }
                else
                {
                    chosennum = stoi( phrase );
                    break;
                }
            }
            cout << endl << "All results found: " << endl;
            break;
        }
       
    case 2:
        {
            do
            {
                flag = false;
                cout << "Which phrase do you want to check?: ";
               
                cin.ignore( numeric_limits < streamsize >::max(), '\n' );
                getline( cin, phrase );
               
                for( int i = 0; i < phrase.length(); i++ )
                {
                    if( isdigit( phrase[ i ] ) )
                    {
                        flag = true;
                    }
                }
                cout << endl;
            } while( flag == true );
           
            for( char charr: phrase )
            {
                chosennum += m[ charr ];
            }
            cout << '\t' << phrase << " in gematria = " << chosennum << endl;
            break;
        }
    }
    int tablica[ 4 ], b = 0, easy, H = 1, sum;
    string str2;
    string::size_type G;
    vector < pair < int, string > > Datas;
   
    while( getline( input, str ) )
    {
        sum = 0;
        n = str.find( ',' );
        G = n;
       
        if( n != string::npos )
        {
            do
            {
                tablica[ b ] = n;
                b++;
                n = str.find( ',', n + 1 );
            } while( n != string::npos );
           
            str2 = str.substr( tablica[ 3 ] + 1 );
            easy = stoi( str2 );
            str.resize( G );
            b = 0;
        }
       
        for( int i = 0; i < str.length(); i++ )
        {
            if((( int ) str[ i ] ) > 127 ||(( int ) str[ i ] ) < 0 )
            {
                str.clear();
            }
        }
       
        for( char charr: str )
        {
            sum += m[ charr ];
        }
       
        if( sum == chosennum )
        {
            Datas.emplace_back( easy, str );
            help = sum;
            counter++;
        }
    }
    sort( Datas.begin(), Datas.end(), greater < pair < int, string > >() );
   
    for( const auto & e: Datas )
    {
        cout << "No[" << H << "]: " << e.second << '\t' << '\t' << '\t' << "Value In Gematria: " << help << '\t' << '\t' << '\t' << "Search Number: " << e.first << '\n';
        output << "No[" << H << "]: " << e.second << '\t' << '\t' << '\t' << "Value In Gematria: " << help << '\t' << '\t' << '\t' << "Search Number: " << e.first << '\n';
        H++;
    }
   
    cout << "\n\n You have found: " <<( counter - 1 ) << " phrases" << '\n';
    output << "\n\n You have found: " <<( counter - 1 ) << " phrases" << '\n';
   
    return 0;
}

Jesli moj plik
words.txt
 wyglada tak:
C/C++
it wasnt humans, 1609, 1092, 182, 18
a worm wearing a human suite, 2787, 1674, 279, 18
a human full of worms, 1732, 1308, 218, 0
they call it symbiosis, 1436, 1470, 245, 6
angry abortions, 950, 1068, 178, 4
it tnsaw humans, 1609, 1092, 182, 11
usa gets rights to rare earths, 1387, 1926, 321, 6
usa does not get depopulated, 1251, 1704, 284, 2
human intestine, 677, 1032, 172, 26
it wasnt snamuh, 1609, 1092, 182, 18
ti wasnt humans, 1609, 1092, 182, 300
usa will not be defeated, 1567, 1218, 203, 4
usa protected by god, 1161, 1200, 200, 8

I go uruchomie, wybiore sobie opcje szukania frazy tekstu i wpisze
it wasnt humans
 to znajduje mi wszystkie 4 wyniki poprawnie i ladnie je sortuje. Wszystko dziala tak jak powinno - (it wasnt humans rowna sie to samo co np. it wasnt snamuh bo to jest to samo zdanie zapisane w innej kolejnosci ale suma poszczegolnych cyfr jest taka sama)
Natomiast problem pojawia sie w momencie gdy moj plik
words.txt
 podmieniam na plik ktory ma 1,5mln linijek. Wtedy gdy probuje czegos wyszukac dostaje blad, tutaj zdjecie bledu:

https://imgur.com/a/lNY9Ez2

PS.
Moglbys rowniez zerknac czy nie dodalem <include> jakichs bibliotek ktorych nie uzywam i sa zbedne?
P-177274
jankowalski25
» 2020-07-03 20:58:50
Gdzieś masz wywołanie funkcji
stoi()
, gdzie jako napis podajesz coś, co nie jest liczbą. Jak » Kurs C++ » Poziom Xuruchomisz program pod debuggerem lekcja, to dostaniesz linijkę, która bezpośrednio wywołała ten błąd i wtedy pewnie będzie łatwiej ustalić, do jakiego miejsca plik został odczytany poprawnie.
P-177277
skupi967
Temat założony przez niniejszego użytkownika
» 2020-07-03 21:10:10
Rzeczywiscie tak bylo i juz zidentyfikowalem problem. Wszystko dziala. Dziekuje za pomoc.
P-177278
« 1 »
  Strona 1 z 1