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

Struktury danych

Object Storage Arubacloud
0 głosów
917 wizyt
pytanie zadane 1 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)

Moje zadanie brzmi: "Utwórz strukturę o nazwie student, która przechowuje następujące dane: imię, nazwisko, numer indeksu, średnia. Utwórz pięć obiektów struktury student i wypełnij wszystkie pola danymi. Stwórz dwie tablice zawierające tych pięć obiektów: z pamięcią alokowaną statycznie i pamięcią alokowaną dynamicznie."

Udało mi się (tak myślę) wykonać wszystko poprawnie aż do pamięci alokowanej dynamicznie. Nie za bardzo rozumiem koncepcję skoro ma być 5 obiektów to jak to zaprogramować dynamicznie. Dynamiczna czyli dostosowująca się do użytkownika a on może zmienić liczbę z 5 na inną.

Proszę o pomoc w tym zadaniu

#include <iostream>
#include <list>
#include <string>
#include <cstdlib>

using namespace std;

struct student {
  string imie;
  string nazwisko;
  int indeks;
  float srednia;
};


int main()
{
    cout<<"Podaj dane studentow"<<endl<<endl;
    student osoby[5];
    for (int i=0; i<5; i++)
    {
        cout<<"Imie studenta nr "<<i+1<<": ";
        cin>>osoby[i].imie;
        cout<<"Nazwisko studenta nr "<<i+1<<": ";
        cin>>osoby[i].nazwisko;
        cout<<"Indeks studenta nr "<<i+1<<": ";
        cin>>osoby[i].indeks;
        cout<<"Srednia studenta nr "<<i+1<<": ";
        cin>>osoby[i].srednia;
        cout<<endl;
    }
    return 0;
}

 

komentarz 1 maja 2020 przez TOWaD Mądrala (5,700 p.)

może tak;

int main (){
student * tab[5]{nullptr};
for(int i=0; i<5; i++) tab[i]=new student;
 for (int i=0; i<5; i++)
    {
        cout<<"Imie studenta nr "<<i+1<<": ";
        cin>>tab[i]->imie;
.....
}
.....
for(int i=0; i<5; i++) if(tab[i]) delete tab[i];
return 0;
}

 

komentarz 1 maja 2020 przez Atman Użytkownik (810 p.)
Po co jest {nullptr}? Nie spotkałem się z tym jeszcze.

I czym nie wystarczyłoby na końcu programu samo delete [] tab?
komentarz 1 maja 2020 przez TOWaD Mądrala (5,700 p.)
edycja 1 maja 2020 przez TOWaD
a to taki mój wymysł, bo też się z tym nie spotkałem, by użyć if() przy usuwaniu tablicy, żeby nie usuwać studenta którego nie ma;

A może się z spotkałem u Qian'a bo też usuwał obiekty których nie ma, ale to było dawno i nie pamiętam.
komentarz 1 maja 2020 przez Atman Użytkownik (810 p.)
A jak zrobić wy jedno wypisanie danych działało zarówno dla tablicy dynamicznej i statycznej? Bo wypisywanie 2 razy tego samego tak średnio będzie wyglądać
komentarz 1 maja 2020 przez TOWaD Mądrala (5,700 p.)
nie do końca rozumiem kontekst jak masz obiekt new to masz i tyle a jak masz tablicę tylko wskaźników to nie używasz new i deleta bo to tylko tablica wskaźników. Dlatego też nie delete[] bo tablica wskaźników jest statyczna.

Ale tu na forum był poruszany wątek usuwania tablic dynamicznych 2 wymiarowych i ich prawidłowego usuwania
komentarz 1 maja 2020 przez adrian17 Ekspert (344,860 p.)
forestG.tmp, IMO przekombinowałeś - nie widzę, by była tu potrzebna aż tablica wskaźników.

Dałem swoją odpowiedź niżej.
komentarz 1 maja 2020 przez TOWaD Mądrala (5,700 p.)
edycja 1 maja 2020 przez TOWaD

no ok tez zakumałem że tylko o to chodzi ale jeżeli będzie fragment kodu:

tak 
delete [] osoba2;
osoba2=osoba1 ;

nie tak
osoba2=osoba1 // bo wyciek pamięci;
delete [] // bo dwukrotne usunięcie obiektów z osoba 1;

edytowałem, bo poprzedni komentarz był niezbyt mądry :)

 

1 odpowiedź

0 głosów
odpowiedź 1 maja 2020 przez adrian17 Ekspert (344,860 p.)

Dynamiczna czyli dostosowująca się do użytkownika a on może zmienić liczbę z 5 na inną.

Nie, to nie jest znaczenie słowa "z pamięcią alokowaną statycznie i pamięcią alokowaną dynamicznie." Dynamicznie po prostu oznacza, że alokacja (zarezerwowanie pamięci pod obiekty) następuje podczas działania programu. Przy "alokacji statycznej", pamięć już jest z góry gotowa - bo obiekty po prostu trafiają na stos.

(tak, faktycznie alokacja dynamiczna pozwala na przekazanie liczby wybranej przez użytkownika, ale nie to jest znaczenie słowa i nie o to chodzi w zadaniu - wyraźnie piszą, że ma być tablica z 5 elementami.)

Chodzi po prostu o:

// alokacja "statyczna"
student osoby1[5];

// alokacja "dynamiczna"
student *osoby2 = new student[5];
// (pamietaj o delete[] na koncu)

 

Podobne pytania

0 głosów
1 odpowiedź 198 wizyt
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 1 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)
+1 głos
2 odpowiedzi 315 wizyt
pytanie zadane 10 marca 2021 w C i C++ przez huberos23 Nowicjusz (170 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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!

...