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

problem z tabela lub struktura

Ostatnio zmodyfikowano 2009-10-31 06:10
Autor Wiadomość
szkuner
» 2009-10-17 22:19:46
Ja dopiero teraz zauważyłem że nie dałem ci gwiazdki ale widze że doszłeś już do tego.
Moim zdaniem zamiast stosować np dane.name powinieneś zastosowc coś na wzór tego
C/C++
dane->name;
//wtedy możesz robić nawet coś takiego
cin >> dane->name;

A tu spróbuje ci to zademonstrować
C/C++
struct osoba
{
    char name[ 20 ];
    float volume;
    double price;
};
int main()
{
    using namespace std;
    osoba * ps = new osoba;
   
    //tak wprowadzasz dane;
    cout << "Podaj cenę (zł): ";
    cin >> ps->price;
    //a wyswietlaz normanie cout
    //no ioczywiscie trzeba na koncu zwolnic
    delete otym operatorze docztaj sobie sam co ś tu brakuje;
P-10950
Elaine
» 2009-10-17 23:28:20
Well, ale tu chodzi o dyntablice, czyli będzie raczej coś takiego:
C/C++
foo * dane = new foo[ rozmiar ];
// teraz normalnie odwołujemy się, jakby dane to była tablica, na przykład:
cin >> dane[ 0 ].costam;
dane[ 3 ].cosinnego = dane[ 1 ].cosinnego;
// zwalnianie pamięci:
delete[] dane;
P-10951
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-19 22:59:50
mam dalej problem, teraz z zapisem danych do struktury

co program ma zrobic:

-zapytac, ile potrzeba biletow - wprowadzamy przez cin>> zamowienie === np 3

-tyle samo razy zapytac = 3 razy nazwisko - rozwiazane przez petle for(int i=0;i<zamowienie;i++)

-dopisywac do struktury np bilet.nazwisko - kazdorazowo nazwisko, czyli nie moge skorzystac z tej samej petli, bo zaczynaloby zapisywac po kazdym zamowieniu od pozycji 0, wykombinowalem, ze wprowadze int licznik=0, a kazde wpisane nazwisko bedzie zapisane w pozycji bilet[licznik+i].nazwisko - czyli w pierwszym przejsciu bedzie zapisywac od 0 + kazde przejscie petli + 1. po wyjsciu z petli ustawilem, ze licznik+=zamowienie, czyli nastepna petla nie zacznie sie od 0, ale od i=0+3
nie wiem tylko, czy nie powinienem wczesniej "zarezerwowac" miejsca na zapis nazwisk w strukturze

pytanie = bo po pierwszym przejsciu petli wywala mi blad i program sie zawiesza/kompilator rowniez


a tu przykladowy kod

C/C++
#include <iostream>
#include <conio.h>
#include <string>

struct loty
{
   
    std::string nazwisko;
};
main()
{
    using namespace std;
    int zamowienie, ilosc_biletow = 5, licznik = 0;
    loty * Rzym = new loty[ licznik ];
    char znak;
    do
    {
        cout << " Ile zamawiasz biletow?\n";
        cin >> zamowienie;
        if( zamowienie > ilosc_biletow )
        {
            cout << "\nnie ma tyle biletow!\a\n";
        }
        else
        {
            licznik += zamowienie;
            ilosc_biletow -= zamowienie;
            for( int i = 0; i < zamowienie; i++ )
            {
               
                cout << "\nPodaj nazwisko\n";
                cin >> Rzym[ i ].nazwisko;
            }
        }
        cout << "\n nazwiska " <<( * Rzym ).nazwisko << "\n Wcnisnij q aby zakonczyc\n";
        cin >> znak;
       
    }
    while( znak != 'q' );
   
}

blad pewnie jest w zapisie nazwisk do struktury, bo jak usune cin>>.... to program dziala dobrze, poza tym ze nie moge wpisac nazwisk
P-11002
malan
» 2009-10-19 23:26:30
Nie dziw się, że program się zawiesza skoro zadeklarowałeś wskaźnik na tablicę o liczbie elementów = 0:
C/C++
int /*...*/ licznik = 0;
loty * Rzym = new loty[ licznik ];
Jeśli chodzi o wyświetlanie nazwisk to prędzej tak:
C/C++
for( int j = 0; j < zamowienie; j++ )
     std::cout << Rzym[ j ].nazwisko;

P-11003
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-19 23:37:26
ale nie ma znaczenia, ze jeszcze przed zapetleniem dalem, ze licznik+= zamowienie?? czyli ze robi miejsce w stukturze na konkretna ilosc zapisow? bo wlasnie o to mi chodzi, aby byla mozliwosc dopisywania nazwisk, po to uzywam dynamicznego przydzialu pamieci? chyba, ze robie to zle, prosze o podpowiedz, bo kombinuje z tym juz dosc dlugo i utknalem


ps, zmienilem licznik na 10 w deklaracji zmiennej no i poszlo... ale chodzi mi, aby zapisal na pozycji Rzym[0], a pozniej juz kazdy nastepny zapis +1,w miedzy czasie dalej kombinuje....


ps2, twoj pomysl na wyswietlanie nazwisk - mialem podobnie - jako POTWIERDZENIE ZAKUPU - DLA KAZDEGO NOWEGO NAZWISKA,
ale potrzebuje wyswietlic nazwiska dla wszytskich dokonanych zakupow - czyli zamowien bedzie wiele wiecej, zamowienie na 2 bilety - dodaj 2 nazwiska, zamowienie na 3 nazwiska, dodaj 3 nazwiska - czyli ograniczeniem nazwisk nie moze byc l. zamowien
P-11005
DejaVu
» 2009-10-19 23:44:12
Poczytaj o strukturze listy.

/edit:
http://pl.wikipedia.org/wiki/Lista
P-11006
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-19 23:51:46
no to wiem, dlaczego mi nie szlo... zawsze zabiore sie za cos i wychodzi, ze to material, ktorego jeszcze nie czytalem. dzieki za podpowiedzi i dobrej nocy, a ja dalej dzialam


niestety nie lapie tego

http://forum.ddt.pl/?Tid=137

moze moglby ktos wytlumaczyc bardziej? 
tzn dla mojego kodu tworze dodatkowo w strukturze

loty* nastepny
chyba tez
loty* poczatek

"Jeśli chcesz dodać teraz element do listy jednokierunkowej, musisz dynamicznie zarezerwować pamięć, i dodać go do kolejki."

czyli dla Rzym.nazwisko robie to wg lekcji o new/delete

czyli

wskaznik1=new typ_zmiennej  ewentualnie   [ilosc_elementow_danego_typu]

w moim przypadku?:

loty* Rzym=new loty;
Rzym->nastepna=NULL;
poczatek=Rzym;


pomijam juz sprawdzanie czy poczatek == null czy szukac OSTATNIE itd, chodzi mi o sam zapis, bo z tego nie rozumiem, jak kompilator bedzie wiedzial, ze ma dodac nowy zapis dla danej zmiennej w strukturze, a do mnie chyba tak tylko mozna trafic, tlumaczac jak widzi to krok po kroku kompilator



kolejny raz ja.... zrobilem cos takiego, przerobilem podpowiadany kod na to

C/C++
#include <iostream>
#include<conio.h>
struct osoba
{
    char name[ 20 ];
    float volume;
    double price;
};
int main()
{
    int r;
    using namespace std;
    osoba * ps = new osoba[ r ];
    cout << "podaj r\n";
    cin >> r;
    for( int i = 0; i < r; i++ )
    {
        //tak wprowadzasz dane;
        cout << "Podaj cene (zl): ";
        cin >> ps[ i ].price;
        cout << ps[ i ].price << "\n";
    }
    for( int i = 0; i < r; i++ )
         cout << "\n " << ps[ i ].price << "\n";
   
    getch();
}

i dziala...


i znowu 
C/C++
#include <iostream>
#include<conio.h>
struct osoba
{
    char name[ 20 ];
    float volume;
    double price;
};
int main()
{
    int r, t = 0;
    char znak;
    using namespace std;
    osoba * ps = new osoba[ r ];
   
    do
    {
        cout << "podaj r\n";
        cin >> r;
        for( int i = 0; i < r; i++ )
        {
            //tak wprowadzasz dane;
            cout << "Podaj cene (zl): ";
            cin >> ps[ t ].price;
            cout << ps[ t ].price << "\n";
            t++;
        }
        for( int i = 0; i < t; i++ )
        {
            cout << "\n " << ps[ i ].price << "\n";
        }
        cout << "q aby zakonczyc\n";
        cin >> znak;
    }
    while( znak != 'q' );
   
    getch();
}
dziala, mniej wiecej tak, jak chce, musze znalezc, co robie nie tak w moim kodzie


C/C++
#include <iostream>
#include <conio.h>
#include <string>

struct loty
{
   
    std::string nazwisko;
};
int main()
{
    using namespace std;
    int r, t = 0;
    loty * Rzym = new loty[ zamowienie ];
    char znak;
    do
    {
        cout << " Ile zamawiasz biletow?\n";
        cin >> r;
       
       
        for( int i = 0; i < r; i++ )
        {
           
            cout << "\nPodaj nazwisko\n";
            cin >> Rzym[ t ].nazwisko;
            t++;
        }
       
        for( int i = 0; i < t; i++ )
        {
            cout << "\n nazwiska " << Rzym[ i ].nazwisko << "\n Wcnisnij q aby zakonczyc\n";
        }
        cout << "q aby zakonczyc";
        cin >> znak;
       
       
    }
    while( znak != 'q' );
   
}
 dalej nie dziala, zawiesza sie po 2 wpisaniach nazwiska
P-11007
DejaVu
» 2009-10-20 03:00:28
Nie pojmujesz idei działania listy. Spójrz na obrazek na wikipedii. Masz element listy:
C/C++
struct Element
{
    int wiek;
    std::string imie;
    Element * nastepny;
};
//...
Element * poczatek = NULL;

Utworzenie nowego elementu to:
C/C++
Element * nowy = new Element;
//ustawienie wartości elementu nowy
nowy->nastepny = NULL; // wiadomo - element dodajemy na końcu, więc nic za nim nie będzie
Element następnie trzeba dodać do kolejki. Kolejka jest w zmiennej poczatek:
C/C++
if( !poczatek )
{
    poczatek = nowy;
} else
{
    Element * ostatni = poczatek;
    while( ostatni->nastepny )
    {
        ostatni = ostatni->nastepny;
    } //while
    ostatni->nastepny = nowy;
} //else
Przemyśl te fragmenty kodu, spójrz na obrazek i wczytaj się w tekst...

/edit:
Wikipedia to nie jedyne źródło informacji. Możesz poszukać innych stron znając hasło pod jakim występuje zagadnienie.
P-11008
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona