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

dane dynamiczne, struktury

Ostatnio zmodyfikowano 2016-05-15 16:16
Autor Wiadomość
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!
P-148243
mateczek
» 2016-05-15 08:06:27
C/C++
#include <iostream>
using namespace std;

struct punkt {
    double x, y, z;
};

ostream & operator <<( ostream & s, punkt & p ) { //operator zdolny wypisać punkt
    return s << p.x << " " << p.y << " " << p.z << endl;
}

void wypelniTablice( punkt * tab, int rozm ) { //twoja funkcja do wypełniania tablicy
    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 ]; //dynamiczna tablica punktów
    wypelniTablice( zbiorPunktow, rozmiarZbioru ); //wywołanie funkcji która ta tablicę wypełni
   
    //wyświetlenie już bez funkcji
    for( int i = 0; i < rozmiarZbioru; i++ ) {
        cout << zbiorPunktow[ i ]; //wypisz punkt na ekran
    }
    delete[] zbiorPunktow;
   
}
P-148245
carlosmay
» 2016-05-15 09:23:35
std::vector
 zamiast gołych
new
 i
delete
.
P-148246
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 tablicy


Wypadał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!
C/C++
#include <iostream>
using namespace std;

// Struktura Punkt o polach double x, double y, double z
// Tablica dynamiczna struktur Punkt o wielkosci zadanej przez uzytkownika

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ę:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

struct punkt {
    double x, y, z;
};

ostream & operator <<( ostream & s, punkt & p ) { //operator zdolny wypisać punkt
    return s << p.x << " " << p.y << " " << p.z << endl;
}

void wypelniTablice( punkt * tab, int rozm ) { //twoja funkcja do wypełniania tablicy
    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 ) { //twoja funkcja do wypełniania tablicy losowymi
    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 ]; //dynamiczna tablica punktów
    wypelniTablice( zbiorPunktow, rozmiarZbioru ); //wywołanie funkcji która ta tablicę wypełni
   
    //wyświetlenie już bez funkcji
    for( int i = 0; i < rozmiarZbioru; i++ ) {
        cout << zbiorPunktow[ i ]; //wypisz punkt na ekran
    }
    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?
P-148252
carlosmay
» 2016-05-15 13:42:57
f. wypełnia zadana jako argument tablicę punktów losowymi wartościami [0.00, 10.00]
std::vector
std::uniform_real_distribution

f. zwraca odległość między zadanymi jako argumenty dwoma punktami
Przeciążanie operatorów

f. 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)
erase

funkcja dodaje element na zadaną (argument funkcji) pozycję w tablicy
insert

edit:
( rand() % 10.00 )
 - modulo
%
 działa tylko dla liczb całkowitych.
P-148253
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ł?
P-148254
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.
P-148258
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

C/C++
#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 ); //odleglosc od środka
    }
    bool operator <( const punkt & p ) {
        return r < p.r; //do sortowania
    }
    friend ostream & operator <<( ostream & s, const punkt & p );
   
};

ostream & operator <<( ostream & s, const punkt & p ) { //operator zdolny wypisać punkt
    return s << "punktk nr: " << p.nr_punktu << " o wsolzednych: " << p.x << " " << p.y << " " << p.z << endl;
}

//funkcje
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; //np da ci liczbę z dwoma miejscami po przecinku
        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 ) ); // na początku inicjalizacja generatora
    vector < punkt > tablica;
   
    wypelnjiLosowo( tablica, 5 );
    wyswietl( tablica );
    sortuj( tablica );
    cout << "\n posortowana tablica wyglada: \n" << endl;
    wyswietl( tablica );
}
P-148265
« 1 »
  Strona 1 z 1