dane dynamiczne, struktury
Ostatnio zmodyfikowano 2016-05-15 16:16
snuffdbko Temat założony przez niniejszego użytkownika |
dane dynamiczne, struktury » 2016-05-15 02:58:16 Witajcie, Jestem w trakcie pisania programu, acz napotkałem problemy. Treść zadań: Struktura Punkt o polach double x, double y, double z Tablica dynamiczna struktur Punkt o wielkości zadanej przez użytkownika#include <iostream> using namespace std;
struct Punkt{ double x, y, z; };
int main(){ int x, y, z; Punkt tab[x][y][z]; cin >> x >> y >> z; }
I tyle co napisałem. Jeśli błąd, proszę o wskazówkę, wytłumaczenie. W dalszej części zadania jest m.in. " Napisać funkcje: f. wypełnia zadaną jako argument tablicę punktów wartościami zadanymi przez użytkownika" i trochę się w tym gubię. Czy trzeba zrobić trzy pętle? Jak to powinno wyglądać? Dzięki za pomoc! |
|
mateczek |
» 2016-05-15 08:06:27 #include <iostream> using namespace std;
struct punkt { double x, y, z; };
ostream & operator <<( ostream & s, punkt & p ) { return s << p.x << " " << p.y << " " << p.z << endl; }
void wypelniTablice( punkt * tab, int rozm ) { for( int i = 0; i < rozm; i++ ) { cout << "podaj punkt nr: " << i + 1 << endl; cin >> tab[ i ].x >> tab[ i ].y >> tab[ i ].z; } }
int main() { cout << "podaj wielkośc zbioru" << endl; int rozmiarZbioru; cin >> rozmiarZbioru; punkt * zbiorPunktow = new punkt[ rozmiarZbioru ]; wypelniTablice( zbiorPunktow, rozmiarZbioru ); for( int i = 0; i < rozmiarZbioru; i++ ) { cout << zbiorPunktow[ i ]; } delete[] zbiorPunktow; } |
|
carlosmay |
» 2016-05-15 09:23:35 std::vector zamiast gołych new i delete . |
|
snuffdbko Temat założony przez niniejszego użytkownika |
» 2016-05-15 12:36:40 Wielkie dzięki! :) Sądziłem, że to będzie nieco inaczej wyglądać, zatem muszę się z Panami podzielić dalszą częścią polecenia: f. wypełnia zadana jako argument tablicę punktów losowymi wartościami [0.00, 10.00] f. zwraca odległość między zadanymi jako argumenty dwoma punktami f. sortuje zadaną jako argument tablicę wg odległości punktów od punktu (0,0,0) funkcja dodaje element na koniec tablicy (tablica zadana jako argument) funkcja usuwa pierwszy element tablicy (tablica zadana jako argument) funkcja dodaje element na zadaną (argument funkcji) pozycję w tablicyWypadałoby zatem zmodyfikować trochę program i zrobić menu, tyle że nadal mam problem... Już całkowicie się pogubiłem. Zrobiłem taki szablon wcześniej, tylko, że teraz... Pomocy! #include <iostream> using namespace std;
struct Punkt { double x, y, z; };
void zad1() { }
void zad2() { }
void zad3() { }
void zad4() { }
void zad5() { }
void zad6() { }
void zad7() { }
int menu() { int opcja; cout << " MENU - wybierz numer zadania " << endl << endl; cout << " 1 - f. wypelnia zadana jako argument tablice punktow wartosciami" << endl; cout << " zadanymi przez uzytkownika" << endl; cout << " 2 - f. wypelnia zadana jako argument tablice punktow losowymi" << endl; cout << " wartosciami [0.00, 10.00]" << endl; cout << " 3 - f. zwraca odleglosc miedzy zadanymi jako argumenty dwoma punktami" << endl; cout << " 4 - f. sortuje zadana jako argument tablice wg odleglosci" << endl; cout << " punktow od punktu (0,0,0)" << endl; cout << " 5 - funkcja dodaje element na koniec tablicy (tablica zadana jako argument)" << endl; cout << " 6 - funkcja usuwa pierwszy element tablicy (tablica zadana jako argument)" << endl; cout << " 7 - funkcja dodaje element na zadana (argument funkcji) pozycje w tablicy" << endl; cout << endl; cout << " 0 - zakoncz program" << endl; cin >> opcja; switch( opcja ) { case 1: zad1(); break; case 2: zad2(); break; case 3: zad3(); break; case 4: zad4(); break; case 5: zad5(); break; case 6: zad6(); break; case 7: zad7(); break; case 0: return 1; break; } return 0; }
int main() { cout << "zad. 5 Dane dynamiczne + struktury" << endl; cout << "--------------------------------------------------------------------------------" << endl; while( menu() == 0 ) { } }
W sumie potrzebuję głównie uporządkować to co jest teraz z kodem od Pana powyżej, z resztą... chyba... chyba sobie poradzę. Mam nadzieję. :) @edit Postanowiłem zrobić bez menu, bo zero odzewu, więc napisałem kolejną funkcję: #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
struct punkt { double x, y, z; };
ostream & operator <<( ostream & s, punkt & p ) { return s << p.x << " " << p.y << " " << p.z << endl; }
void wypelniTablice( punkt * tab, int rozm ) { for( int i = 0; i < rozm; i++ ) { cout << "podaj punkt nr: " << i + 1 << endl; cin >> tab[ i ].x >> tab[ i ].y >> tab[ i ].z; } }
void wypelniTablice2( punkt * tab, int rozm ) { srand( time( NULL ) ); for( int i = 0; i < rozm; i++ ) { cout << "punkt nr: " << i + 1 << endl; cout << tab[ i ].x =( rand() % 10.00 ) + 0.00 << tab[ i ].y =( rand() % 10.00 ) + 0.00 << tab[ i ].z =( rand() % 10.00 ) + 0.00; } }
int main() { cout << "podaj wielkośc zbioru" << endl; int rozmiarZbioru; cin >> rozmiarZbioru; punkt * zbiorPunktow = new punkt[ rozmiarZbioru ]; wypelniTablice( zbiorPunktow, rozmiarZbioru ); for( int i = 0; i < rozmiarZbioru; i++ ) { cout << zbiorPunktow[ i ]; } delete[] zbiorPunktow; } ale wyrzuca mi błędy [Error] invalid operands of types 'int' and 'double' to binary 'operator<<' w linijce z losowaniem liczb losowych. Help? |
|
carlosmay |
» 2016-05-15 13:42:57 f. wypełnia zadana jako argument tablicę punktów losowymi wartościami [0.00, 10.00] | std::vectorstd::uniform_real_distributionf. zwraca odległość między zadanymi jako argumenty dwoma punktami | Przeciążanie operatorówf. sortuje zadaną jako argument tablicę wg odległości punktów od punktu (0,0,0) | std::sort + odpowiedni predykat funkcja dodaje element na koniec tablicy (tablica zadana jako argument) | push_back()funkcja usuwa pierwszy element tablicy (tablica zadana jako argument) | erasefunkcja dodaje element na zadaną (argument funkcji) pozycję w tablicy | insertedit: - modulo % działa tylko dla liczb całkowitych. |
|
snuffdbko Temat założony przez niniejszego użytkownika |
» 2016-05-15 13:55:10 Na liczbach całkowitych też taki błąd wyrzuca. Jakiś pomysł? |
|
carlosmay |
» 2016-05-15 14:27:18 Na liczbach całkowitych też taki błąd wyrzuca. Jakiś pomysł? | fmod() lub lepiej nowsze rozwiązania, std::uniform_real_distribution<> - link w poprzednim poście. |
|
mateczek |
» 2016-05-15 16:16:01 podstawowe pytanie czy możesz skorzystać z kontenerów czy muszą to być surowe tablice dynamiczne ?? jeśli możesz z kontenerów to weź kontener prościej będzie #include <iostream> #include<cmath> #include<algorithm> #include<vector> #include<random> using namespace std; class punkt { int nr_punktu; double x, y, z; double r; public: punkt( double _x, double _y, double _z, int nrPunktu = 0 ) : x( _x ) , y( _y ) , z( _z ) , nr_punktu( nrPunktu ) { r = sqrt( x * x + y * y + z * z ); } bool operator <( const punkt & p ) { return r < p.r; } friend ostream & operator <<( ostream & s, const punkt & p ); };
ostream & operator <<( ostream & s, const punkt & p ) { return s << "punktk nr: " << p.nr_punktu << " o wsolzednych: " << p.x << " " << p.y << " " << p.z << endl; }
void wypelnji( vector < punkt >& tab, int rozmiar ) { double x, y, z; int nrPunktu = 0; tab.clear(); while( rozmiar-- ) { cout << "podaj wspolzedne punktu nr: " << nrPunktu << endl; cin >> x >> y >> z; tab.push_back( punkt( x, y, z, nrPunktu++ ) ); } }
void wypelnjiLosowo( vector < punkt >& tab, int rozmiar ) { double x, y, z; int nrPunktu = 0; tab.clear(); while( rozmiar-- ) { x =( double )( rand() % 1000 ) / 100; y =( double )( rand() % 1000 ) / 100; z =( double )( rand() % 1000 ) / 100; tab.push_back( punkt( x, y, z, nrPunktu++ ) ); } }
void sortuj( vector < punkt >& tab ) { sort( tab.begin(), tab.end() ); }
void wyswietl( vector < punkt >& tab ) { for( const punkt & p: tab ) { cout << p; } }
int main() { srand( time( NULL ) ); vector < punkt > tablica; wypelnjiLosowo( tablica, 5 ); wyswietl( tablica ); sortuj( tablica ); cout << "\n posortowana tablica wyglada: \n" << endl; wyswietl( tablica ); }
|
|
« 1 » |