• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ocena zadania z Strukturami dynamicznymi

Object Storage Arubacloud
0 głosów
315 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez mrKaczorrro13 Użytkownik (560 p.)

Witam!

Bardzo proszę o ocenę zadania. Ucze sie programowania sam z ksiazki i roznych zrodel w internecie. Program dziala, jednak nie jestem pewien czy dobrze posluzylem sie "new" i w odpowiedni sposób zainicjalizowalem tablice dynamicznie. 

Zadanie:

Struktura "Batonik" ma trzy pola. Pierwsze to marka slodyczy, drugie to waga (ktora moze zawierac czesc ulamkowa), a trzecie to liczba kalorii (liczba calkowita). Napisz program tworzacy tablice dynamiczna  struktury "Batonik" za pomoca operatora "new". Zainicjalizuj ja wybranymi wartosciami oraz wyswielt zawatrosc wszystkich struktur. 

#include <iostream>
#include <string>

struct batonik
{
    std::string marka;
    float waga;
    int kcal;
};


int main()
{
    using namespace std;

    batonik *snack = new batonik[3];
    batonik *pt=snack;

    cout<<"Podaj marke batonika: ";
    getline(cin,pt->marka);
    cout<<"Podaj wage batonika: ";
    cin>>pt->waga;
    cout<<"Podaj ilosc kalori w jednym batoniku: ";
    cin>>pt->kcal;
    cout<<"\nPodaj marke batonika: ";
    cin.get();
    getline(cin,pt->marka);
    cout<<"Podaj wage batonika: ";
    cin>>pt->waga;
    cout<<"Podaj ilosc kalori w jednym batoniku: ";
    cin>>pt->kcal;
    cout<<"\nPodaj marke batonika: ";
    cin.get();
    getline(cin,pt->marka);
    cout<<"Podaj wage batonika: ";
    cin>>pt->waga;
    cout<<"Podaj ilosc kalori w jednym batoniku: ";
    cin>>pt->kcal;

    cout<<"\nDane pierwszego batonika: \n";
    cout<<"NAZWA: "<<snack[0].marka<<endl;
    cout<<"WAGA: "<<snack[0].waga<<endl;
    cout<<"KCL: "<<snack[0].kcal<<endl;
    cout<<"Dane drugiego batonika: \n";
    cout<<"NAZWA: "<<snack[1].marka<<endl;
    cout<<"WAGA: "<<snack[1].waga<<endl;
    cout<<"KCL: "<<snack[1].kcal<<endl;
    cout<<"Dane trzeciego batonika: \n";
    cout<<"NAZWA: "<<snack[2].marka<<endl;
    cout<<"WAGA: "<<snack[2].waga<<endl;
    cout<<"KCL: "<<snack[2].kcal<<endl;

    delete [] snack;
    return 0;
}

Czy dobrze zaincijalizowalem tablice dynamicznie? Wyglada na to ze nazwy struktury moge uzywac naprzemiennie ze wskaznikiem - czy to jest prawidlowe podejscie czy moze jak juz uzywam wskaznikow to powininem odnosic sie tylko do *wskaznika a nie do nazwy struktury? Z gory wielkie dzieki za wszelkie wskazowki i komentarze.

1 odpowiedź

+1 głos
odpowiedź 1 grudnia 2018 przez RafalS VIP (122,820 p.)
edycja 3 grudnia 2018 przez RafalS

Ciekawą kolejność nauki wybrałeś. Najpierw struktury i dynamiczna alokacja a pętle dopiero później? :P Pytam, bo można to skrócić do:

	batonik *snack = new batonik[3];
	for (batonik *pt = snack; pt != snack + 3; pt++) {
		cout << "Podaj marke batonika: ";
		getline(cin, pt->marka);
		cout << "Podaj wage batonika: ";
		cin >> pt->waga;
		cout << "Podaj ilosc kalori w jednym batoniku: ";
		cin >> pt->kcal;
	}
	for (size_t i = 0; i < 3; i++)
	{
		cout << "\nDane "<< i << ". batonika: \n";
		cout << "NAZWA: " << snack[i].marka << endl;
		cout << "WAGA: " << snack[i].waga << endl;
		cout << "KCL: " << snack[i].kcal << endl;
	}

	delete[] snack;

Jak zauważyłeś bądź nie dodalem pt++, bo w przeciwnym przypadku przypisywales 3 razy do pierwszego batonika.

Wyglada na to ze nazwy struktury moge uzywac naprzemiennie ze wskaznikiem

Pod żadnym pozorem nie.

Wolno Ci natomiast potraktować tablice jako wskaźnik - tablica w większośći sytuacji może być potraktowana jako wskaźnik na pierwszy jej element.

int *t = new int[3];

w ten sposób tworzysz tablice na 3 inty i w zmiennej t ląduje wskaźnik na pierwszy element tej tablicy.

komentarz 3 grudnia 2018 przez mrKaczorrro13 Użytkownik (560 p.)

;D Tak wiem, moje podejście musi wygladac bardzo dziwnie i troche malo logicznie;p Spowodowane jest to tym, że ucze sie z kursu C++ Pana Miroslaw ale jednocznie korzystam tez z książek. Książka z ktorej mam to zadanie to "Jezyk C++ Szkola programowania" Stephen Prata i ona wlasnie takim, jak to zauważyłeś nietypowym trybem idzie:)

Dziekuje bardo za rozwiązanie przykaldu z zastosowaniem petli. Tez wpadl mi ten pomysl do glowy, jednak staram sie wykonywac cwiczenia z ksiazki rzetelnie, tak jak wymaga tego zadanie. Wole podejscie może i wolniejsze ale przynajmniej staram sie zrozumiec jak najwiecej z danego rozdzialu. 

Odnosnie wskaznikow mam pewien kłopot w zrozumieniu czemu w podanym prgramie dostaje taki blad:

#include <iostream>
#include <string>

struct batonik
{
    std::string marka;
    float waga;
    int kcl;
};


int main()
{
    using namespace std;

    batonik *snack = new batonik[3];
    //batonik *pt=snack;

    cout<<"Podaj marke batonika: ";
    getline(cin,snack[0]->marka);
    ...
    delete [] snack;
    return 0;
}

error base operand of '->' has no-pointer type 'batonik'.

Wychdozi na to że "snack" nie jest wskaznikiem, pomimo tego ze użyłem operatora wyłuskania. Myslalem ze kazda nazwa do ktorej uzyje operatora wyluskania staje sie wskaznikiem a wychodzi na to ze nie. Czy jest ktos w stanie cos podpowiedziec w tej kwesti? Z gory dziekuje bardzo za odpowiedz:) 

 

komentarz 4 grudnia 2018 przez RafalS VIP (122,820 p.)
snack to Snack* - wskaznik na pierwszy element tablicy

snack[0] to Snack - pierwszy element tablicy

operator wsk-> jest rownowazny z (*wsk).

Próbujesz zatem zdereferencjowac obiekt typu Snack a nie wskaźnik
komentarz 4 grudnia 2018 przez mrKaczorrro13 Użytkownik (560 p.)
Super, wszystko jasne. Dziekuje bardzo za pomoc!;)

Podobne pytania

0 głosów
0 odpowiedzi 203 wizyt
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez pozdro600 Początkujący (260 p.)
0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 25 listopada 2015 w C i C++ przez martix3 Użytkownik (690 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...