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 #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 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 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 ); }
|
|
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<>. Kontener std::vector<>Wprowadzenie do standardowych algorytmówW ostatnim linku masz informacje przydatne by taki kontener posortować (ostatni przykład). Zapewne namieszalem cos tutaj |
Zmienna b nie jest zerowana. |
|
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 #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: 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? |
|
jankowalski25 |
» 2020-07-03 20:58:50 Gdzieś masz wywołanie funkcji stoi() , gdzie jako napis podajesz coś, co nie jest liczbą. Jak uruchomisz program pod debuggerem, 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. |
|
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. |
|
« 1 » |