tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem » 2018-08-24 11:01:38 Witam, mam problem z moim programem co prawda znalazłem podobny problem na forum lecz nie był on rozwiązany do końca. Mój program nie działa poprawnie, proszę o pomoc i ewentualne wskazówki jak można go inaczej (lepiej) napisać. Zadanie: Program wczytuje dane z klawiatury do tablicy typu double, a następnie sprawdza: 1.czy te liczby są uporządkowane rosnąco lub malejąco, 2.czy elementy tablicy mają symetryczną zawartość (tj. pierwszy element równy ostatniemu, drugi przedostatniemu, itd.) 3.czy w tablicy występuje chociaż jedno powtórzenie wartości #include <iostream>
using namespace std;
int main() { const int rozmiar = 5; double tablica[ rozmiar ]; cout << "Podaj dane do tablicy: " << endl; for( int i = 0; i < rozmiar; i++ ) { cin >> tablica[ i ]; } cout << endl; for( int i = 0; i < rozmiar; i++ ) cout << tablica[ i ] << endl; for( int i = 0; i < rozmiar; i++ ) if( tablica[ i ] < tablica[ i + 1 ] ) { cout << "Uporzadkowane rosnaco" << endl; } else if( tablica[ i ] > tablica[ i + 1 ] ) cout << "Uporzadkowane malejaco" << endl; for( int i = 0; i < rozmiar; i++ ) { if( tablica[ i ] == tablica[ rozmiar - 1 - i ] ) cout << "Jest symetryczna"; else cout << "Jest niesymetryczna"; } return 0; } |
|
pekfos |
» 2018-08-24 11:48:33 |
|
tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem » 2018-08-24 16:27:58 Witam, po modyfikacji kodu program działa, pytanie tylko czy można go jeszcze zoptymalizować? Brakuje mi jeszcze tylko funkcji, która sprawdzi czy w tablicy powtarzają się jakieś elementy. Tutaj brak mi pomysłu, ktoś podpowie? #include <iostream>
using namespace std;
const int r = 5; int tab[ r ];
bool rosnie( int * tab ) { for( int i = 0; i < r - 1; i++ ) { if( !( tab[ i ] < tab[ i + 1 ] ) ) return false; } return true; }
bool maleje( int * tab ) { for( int i = 0; i < r - 1; i++ ) { if( !( tab[ i ] > tab[ i + 1 ] ) ) return false; } return true; }
bool sym( int * tab ) { for( int i = 0; i < r / 2; i++ ) { if( !( tab[ i ] == tab[ r - 1 - i ] ) ) return false; } return true; }
int main() { cout << "Hello world!" << endl; cout << "podaj elementy: " << endl; for( int i = 0; i < r; i++ ) cin >> tab[ i ]; cout << endl; for( int i = 0; i < r; i++ ) cout << tab[ i ] << endl; cout << endl; rosnie( tab ); maleje( tab ); sym( tab ); if( rosnie( tab ) == true ) cout << "rosnaca"; else if( maleje( tab ) == true ) cout << "malejaca"; else if( sym( tab ) == true ) cout << "symetryczna"; else cout << "Zaden z warunkow nie jest spelniony"; return 0; } |
|
pekfos |
» 2018-08-24 17:18:15 Brakuje mi jeszcze tylko funkcji, która sprawdzi czy w tablicy powtarzają się jakieś elementy. Tutaj brak mi pomysłu, ktoś podpowie? |
Redukcja problemu. Czy tablica jednoelementowa ma powtórzenia? Nie. Czy tablica N+1 elementowa ma powtórzenia? To zależy czy ten +1 element zawiera się w pierwszych N elementach i czy te pierwsze N elementów same nie ma powtórzeń. |
|
tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem » 2018-08-24 17:29:13 pekfos, ja jestem początkującym i nie za bardzo rozumiem twojej podpowiedzi, mógłbyś jakoś prościej tak dla laika ? Dzięki. |
|
pekfos |
» 2018-08-24 17:54:00 To bym cię musiał zapytać o wykształcenie, bo to co opisałem to nic innego jak indukcja matematyczna. To jeden z takich problemów, w którym nie sposób zgadnąć, czy ktoś nie chce myśleć, czy po prostu jest w podstawówce. Jeśli tablica N-elementowa nie ma powtórzeń, to tablica N+1 elementowa ma powtórzenia tylko wtedy, gdy dodany element się powtarza. Znasz wartość dodanego elementu, sprawdzenie czy wystąpił do tej pory w tablicy jest trywialne. Tablica 1-elementowa nie ma powtórzeń, bo i nie ma jak. Dodajesz kolejny element i jeśli się powtarza, to koniec algorytmu, jeśli nie, to masz 2-elementową tablicę bez powtórzeń. I tak dalej do wyczerpania danych. Alternatywnie, podobne zagadnienie jest opisane w kursie Losowanie bez powtórzeń |
|
mateczek |
» 2018-08-24 18:19:16 np tak #include <iostream> #include<vector> using namespace std; bool isDuplicate( vector < int > & t ) { for( size_t i = 0; i < t.size() - 1; i++ ) { for( size_t j = i + 1; j < t.size(); j++ ) { if( t[ i ] == t[ j ] ) return true; } } return false; } int main() { vector < int > tablica { 33, 77, 2, 3, 4, 8, 24, 7, 343 }; cout << std::boolalpha << isDuplicate( tablica ) << endl; } |
|
tomeq35 Temat założony przez niniejszego użytkownika |
C++ problem z programem » 2018-08-24 18:36:34 Dzięki za podpowiedzi, mateczek zrobiłem to według twojego wzoru. bool powt( int * tab ) { for( int i = 0; i < r; i++ ) { for( int j = i + 1; j < r; j++ ) { if( tab[ i ] == tab[ j ] ) return true; } } return false; } Teraz jeszcze przydało by się wypisać które elementy się powtarzają i ile razy. |
|
« 1 » 2 |