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

Ocena zadania z Strukturami dynamicznymi

0 głosów
65 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez mrKaczorrro13 Początkujący (460 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 (113,290 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 Początkujący (460 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 (113,290 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 Początkujący (460 p.)
Super, wszystko jasne. Dziekuje bardzo za pomoc!;)

Podobne pytania

0 głosów
1 odpowiedź 47 wizyt
pytanie zadane 25 listopada 2015 w C i C++ przez martix3 Użytkownik (680 p.)
0 głosów
1 odpowiedź 65 wizyt
pytanie zadane 15 grudnia 2016 w C i C++ przez adam1297 Użytkownik (630 p.)
0 głosów
1 odpowiedź 176 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

66,451 zapytań

113,207 odpowiedzi

239,680 komentarzy

46,704 pasjonatów

Przeglądających: 283
Pasjonatów: 10 Gości: 273

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...