Kefirek Temat założony przez niniejszego użytkownika |
» 2014-02-10 15:24:44 vector < klient >::iterator iter; for( l = 0; l < vektor8.size(); l++ ) iter = find( vektor8.begin(), vektor8.end(), vektor8[ l ].nazwa );
if( iter != vektor8.end() )
Błąd : error C2678: dwuargumentowy "==" : nie znaleziono żadnego operatora, który przyjmuje lewostronny operand typu "klient" (lub nie istnieje akceptowalna konwersja) |
|
Kefirek Temat założony przez niniejszego użytkownika |
» 2014-02-10 15:39:48 .....chyba wynika z tego, że funkcją find() i umieszczonym w niej elementem struktury(pole char nazwa[30]) w wektorze, jako jeden z argumentów nie da się tego wykonać, a może nie ???. W takim razie proszę o pomoc w rozwiązaniu tego zadania. Z pozoru wydaje się łatwe, ale tak jak pisałem spędziłem już parę dni i już się zapętliłem w opcjach sposobu znalezienia rozwiązania. Pozdrawiam Kefirek |
|
Monika90 |
» 2014-02-10 19:22:12 Tu masz pseudokod #include <algorithm> #include <vector> #include <string> #include <iostream>
struct Client { std::string name; double x, y; };
struct ByName { template < class T > bool operator ()( const T & x, const T & y ) const { return x.name < y.name; } };
int main() { std::vector < Client > clients = { { "John", 1.2, 3.4 }, { "John", 2.2, - 3.4 }, { "Jesus", 0, 0 }, { "Matt", 5, 4 }, { "Matt", 4, 5 } }; std::vector < Client > accumulated; std::sort( clients.begin(), clients.end(), ByName() ); auto i = clients.begin(); while( i < clients.end() ) { auto j = std::upper_bound( i, clients.end(), * i, ByName() ); accumulated.push_back( * i ); ++i; while( i < j ) { accumulated.back().x += i->x; accumulated.back().y += i->y; ++i; } } for( const auto & c: accumulated ) std::cout << c.name << ' ' << c.x << ' ' << c.y << std::endl; }
I żebyś nie mówił, że mój pseudokod nie działa, tu dowód że działa http://coliru.stacked-crooked.com/a/2dd5e6e6dc3f6731 |
|
Kefirek Temat założony przez niniejszego użytkownika |
» 2014-02-10 21:04:36 Dziękuje za włożony przez Ciebie wysiłek(swoją drogą jestem ciekaw ile Ci to zajęło?).. ale to nie jest takie ważne. Ten kod wygląda powiedziałbym niestandardowo(nie są to słowa krytyki). I żebyś nie mówił, że mój pseudokod nie działa, tu dowód że działa.
|
Dziwi mnie trochę Twoja powyższa wypowiedź bo akurat Ciebie uważam za najlepszą pomoc na tym forum. To w dużym stopniu dzięki Tobie program, który pisze jest w 80% ukończony. Potrafiłaś mi pomóc w kluczowych momentach gdy zapętliłem się w np zapisie i odczycie danych z plików binarnych itd. Co do Twojego rozwiązania: Zastanawiam się czy jest jakiś inny sposób rozwiązania tego zadania(prostszy bez pseudokodu np: for( j = 0; j < vektor8.size(); j++ ) { tempi++; for( i = tempi; i < vektor8.size(); i++ ) { if( strcmp( vektor8[ j ].nazwa, vektor8[ i ].nazwa ) == 0 ) { vektor8[ j ].kg += vektor8[ i ].kg; vektor8[ j ].koszt += vektor8[ i ].koszt; vektor9.push_back( vektor8[ j ] ); } if( strcmp( vektor8[ j ].nazwa, vektor8[ i ].nazwa ) != 0 ) tu utkn ą ł em....jak wyci ą gn ą ć z wektora ł a ń cuchy wyst ę puj ą ce tylko raz i zapisa ć je do vektor9 } }
Pozdrawiam Kefirek |
|
Monika90 |
» 2014-02-10 22:11:19 Zajęło mi to może kwadrans. Ten kod to kwintesencja prostoty. Jest to jak najbardziej zalecany i typowy sposób pisania programów. Jeżeli dla Ciebie wygląda niestandardowo, to znaczy że nie miałeś dotąd doczynienia ze współczesnym C++. Zastanawiam się czy jest jakiś inny sposób rozwiązania tego zadania
|
Jeżeli i tak sprawdzasz wszystkie elementy w pętli, to możesz sobie policzyć ile było tych z bieżacą nazwą i jeżeli był tylko jeden to dodać go do vektor9 for( j = 0; j < vektor8.size(); j++ ) { tempi++; int count = 1; for( i = tempi; i < vektor8.size(); i++ ) { if( strcmp( vektor8[ j ].nazwa, vektor8[ i ].nazwa ) == 0 ) { vektor8[ j ].kg += vektor8[ i ].kg; vektor8[ j ].koszt += vektor8[ i ].koszt; vektor9.push_back( vektor8[ j ] ); ++count; } } if( count == 1 ) vektor9.push_back( vektor8[ i ] ) ); }
Z tym że wygląda na to, że twój kod będzie wielokrotnie sumował te elementy które wystepują więcej niż raz. |
|
Kefirek Temat założony przez niniejszego użytkownika |
» 2014-02-10 22:40:08 Dzięki. Niestety tak jak napisałaś ten kod nie spełnia moich założeń. Pomyśle jeszcze nad innym rozwiązaniem. Spróbuje ułożyć jakiś algorytm może się uda. Pozdrawiam Kefirek |
|
Monika90 |
» 2014-02-10 23:31:49 Algorytm użyty w moim zamieszczonym wyżej kompilowalnym pseudokodzie jest prosty: Posortuj wektor wg nazw, dzięki temu elementy o tej samej nazwie będą koło siebie. Potem, dla każdego zakresu elementów o tej samej nazwie, weź z niego pierwszy element, wstaw do wektora, dodaj do niego wartości z reszty elementów tego zakresu. Przejdź do następnego zakresu i tak dalej... Ale można też tak: #include <map> #include <vector> #include <string> #include <iostream>
struct Client { std::string name; double x, y; };
int main() { std::vector < Client > clients = { { "John", 1.2, 3.4 }, { "John", 2.2, - 3.4 }, { "Jesus", 0, 0 }, { "Matt", 5, 4 }, { "Matt", 4, 5 } }; std::map < std::string, Client > accumulated; for( const auto & c: clients ) { auto & a = accumulated[ c.name ]; a.x += c.x; a.y += c.y; } for( const auto & c: accumulated ) std::cout << c.first << ' ' << c.second.x << ' ' << c.second.y << std::endl; }
|
|
Kefirek Temat założony przez niniejszego użytkownika |
» 2014-02-11 08:10:14 Tak rzeczywiście jest prosty. Nadal jednak mnie nurtuje czy da się rozwiązać to zadanie układając algorytm wykorzystujący(prosty język C++ a , nie tak współczesny) ze zwykłym if, i stosując indeksy(liczniki) elementów, oraz proste zmienne pomocnicze.....dlatego jeszcze popróbuje.
Pozdrawiam Kefirek |
|
1 « 2 » 3 |