Skocz do zawartości

Tablice structur w c++


faustin

Pomocna odpowiedź

Witam mam nastepujacy problem chodzi mi o to,że chciałabym stworzyc program, który zapisywałby w tablicy dane wprowadzone do struktury samochód ale nuie mam pojecia jak wgl powiaazac strukture z tablica , która słuzy przewaznie do gromadzenia zmiennych tego samego typu , ponadto jak kompiluje program, którego kod jest niżej, koloru i bieznika mi juz nie wczytuje , czy ktoś może poratować  lub powiedzec co mam zle ?

#include <iostream>
/*3. Napisz program, który będzie przechowywał informacje o samochodach. W tym
celu:
• stwórz strukturę przechowującą informacje o samochodzie:
• rok produkcji
• przebieg
• marka
• kolor karoserii
• wysokość bieżnika na każdym z 4 kół
• napisz funkcję pozwalającą na wprowadzenie danych do tej struktury
• stwórz i wypełnij danymi tablicę przechowującą informacje samochodach
• wyświetl na ekranie informacje o samochodach poczynając od najstarszego*/

using namespace std;
  struct samochod
  {

     double  rok_produkcji;
      double  przebieg;
     double   marka;
     double   kolor;
      double  bieznik;

  };


   void wczytaj (string pytanie,  double &odpowiedz)
   {
       cout<<pytanie;
       cin>>odpowiedz;
   }
int main()
{
    int n;
     cout<<"podaj liczbe pojazdów, które chcesz zapisac"<<endl;
     cin>>n;
     struct samochod s;
     for(int i=0;i<n;i++)
     {


     wczytaj("Podaj rok produkcji",s.rok_produkcji);
     wczytaj("Podaj przebieg ",s.przebieg);
     wczytaj("Podaj  marke",s.marka);
     wczytaj("Podaj kolor",s.kolor);
     wczytaj("podaj bieznik",s.bieznik);

     }
    return 0;
}

 

Edytowano przez faustin
Link do komentarza
Share on other sites

/*
Language: C++ 23
Compiler: CMake
Editor: JetBrain CLion
*/
#include <iostream>
/*3. Napisz program, który będzie przechowywał informacje o samochodach. W tym
celu:
• stwórz strukturę przechowującą informacje o samochodzie:
• rok produkcji
• przebieg
• marka
• kolor karoserii
• wysokość bieżnika na każdym z 4 kół
• napisz funkcję pozwalającą na wprowadzenie danych do tej struktury
• stwórz i wypełnij danymi tablicę przechowującą informacje samochodach
• wyświetl na ekranie informacje o samochodach poczynając od najstarszego*/

using namespace std;

struct samochod {

    double rok_produkcji;
    double przebieg;
    double marka;
    double kolor;
    double bieznik;

};


void wczytaj(string pytanie, double &odpowiedz) {
    cout << pytanie << endl;
    cin >> odpowiedz;
}

int main() {
    int n;
    cout << "podaj liczbe pojazdów, które chcesz zapisac" << endl;
    cin >> n;

    // Definicja tablicy za pomocą wskaźnika i rejestracji pamięci
    samochod *s = (samochod*) calloc(n, sizeof(samochod));
    
    for (int i = 0; i < n; i++)
    {
        wczytaj("Podaj rok produkcji", s[i].rok_produkcji);
        wczytaj("Podaj przebieg ", s[i].przebieg);
        wczytaj("Podaj  marke", s[i].marka);
        wczytaj("Podaj kolor", s[i].kolor);
        wczytaj("podaj bieznik", s[i].bieznik);
    }

    // Zwolnienie pamięci ;)
    free(s);

    return 0;
}

A co do koloru to musisz podać cyfrę, bo tekstu nie wczyta.

1. Inicjowana była struktura, a nie tablica struktur. Skorzystałem z wersji inicjacji poprzez wskaźnik (calloc) oraz na koniec dodałem free() by zwolnić pamięć, inaczej w starszych wersjach C może zostać trochę śmieci w pamięci operacyjnej
2. Dodałem endl przy wczytywaniu treści, co by ładniej wyglądało 😉 

Przykład z tekstową wersją:

#include <iostream>
/*3. Napisz program, który będzie przechowywał informacje o samochodach. W tym
celu:
• stwórz strukturę przechowującą informacje o samochodzie:
• rok produkcji
• przebieg
• marka
• kolor karoserii
• wysokość bieżnika na każdym z 4 kół
• napisz funkcję pozwalającą na wprowadzenie danych do tej struktury
• stwórz i wypełnij danymi tablicę przechowującą informacje samochodach
• wyświetl na ekranie informacje o samochodach poczynając od najstarszego*/

using namespace std;

struct samochod {

    double rok_produkcji;
    double przebieg;
    char marka[32];
    char kolor[16];
    double bieznik;

};

void wczytaj(string pytanie, char *odpowiedz) {
    cout << pytanie << endl;
    cin >> odpowiedz;
}

void wczytaj(string pytanie, double &odpowiedz) {
    cout << pytanie << endl;
    cin >> odpowiedz;
}

int main() {
    int n;
    cout << "podaj liczbe pojazdów, które chcesz zapisac" << endl;
    cin >> n;

    // Definicja tablicy za pomocą wskaźnika i rejestracji pamięci
    samochod *s = (samochod*) calloc(n, sizeof(samochod));

    for (int i = 0; i < n; i++)
    {
        wczytaj("Podaj rok produkcji", s[i].rok_produkcji);
        wczytaj("Podaj przebieg ", s[i].przebieg);
        wczytaj("Podaj  marke", s[i].marka);
        wczytaj("Podaj kolor", s[i].kolor);
        wczytaj("podaj bieznik", s[i].bieznik);
    }

    // Zwolnienie pamięci ;)
    free(s);

    return 0;
}

3. Podmieniłem pole koloru i marki na tablice znaków
4. Dodałem funkcję wczytującą tablicę znaków (uwaga, nie każdy kompilator trawi kilka funkcji z różnymi typami parametrów)

Edytowano przez H1M4W4R1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

a jeszcze mam takie pytanie czy uzycie poprzez wskaznik jest jedyna droga to zamieszczenia tego w tablicy?

Próbuje zrobic teraz tak to za pomoca uzycia tablic dynamicznych? czy daloby sie ta strukture stworzyc za pomoca tablicy dynamcznej , czy moze to bedzie bez sensu?

#include <iostream>

using namespace std;



struct samochod
{

    double przebieg;
    double rocznik;

};
void wczytaj(string pytanie, double &odpowiedz)
{

    cout<<pytanie;
    cin>>odpowiedz;
}
int main()
{
    struct samochod s;
    int n;
    int i;
    cout<<"podaj n"<<endl;
    cin>>n;
    double* samochod;
   samochod=new double[2];
    for(i=0;i<n;i++)
    {
        wczytaj("podaj",s[i].przebieg);
        wczytaj("rok produkcji",s[i].rocznik);
      delete[] samochod;
    }
    return 0;
}

 

Link do komentarza
Share on other sites

próbuje ta informacje wykorzystac w kodzie ale wywala mi jakis bład

#include <iostream>

using namespace std;





struct samochod s[2]
{

    int przebieg;
    int rocznik;

};
void wczytaj(string pytanie, int &odpowiedz)
{

    cout<<pytanie;
    cin>>odpowiedz;
}
int main()
{
    struct samochod s;
    int n;
    int i;
    cout<<"podaj n"<<endl;
    cin>>n;

    for(i=0;i<n;i++)
    {
        wczytaj("podaj",s[i].przebieg);
        wczytaj("rok produkcji",s[i].rocznik);

    }
    return 0;
}

 

Link do komentarza
Share on other sites

Może spróbujmy tak:

struct samochod
{
    int przebieg;
    int rocznik;
};


int main()
{
    samochod s[100];
    int n;
  
    cout<<"podaj n"<<endl;
    cin>>n;
  
    if(n>100)
    {
      cout<<"Serio? Nie dasz rady tyle danych wkelpac :)"<<endl;
      return 1;
    }
  
    for(i=0;i<n;i++)
    {
        wczytaj("podaj",s[i].przebieg);
        wczytaj("rok produkcji",s[i].rocznik);

    }
    return 0;
}

Tworzymy strukturę, a w funkcji main (w pierwszej linijce) tworzymy tablicę 100 elementów tej struktury.

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

12 minut temu, faustin napisał:

 ale wywala mi jakis blad

Cale szczescie...jak by bledu nie bylo to by bylo dopiero dziwne😉

Tworzac strukture tworzysz sobie swoj typ(zlozony) jak int czy float...i dopiero w nastepnej linijce piszesz typ(czyli to co stworzylas) nazwe zmiennej tego typu(typu structury) i w nawiasie kwadratowym podajesz ilosc elementow...i otrzymujesz tablice struktur o okreslonym rozmiarze...

struct cos {
int d;
int f;
};

struct cos tab_struct[5];

tab_struct[0].d //pierwsza struct
tab_struct[0].f. //pierwsza
tab_struct[1].d. //druga
tab_struct[1].f. //druga
tab_struct[2].d. //trzecia
tab_struct[2].d. //trzecia
    //itp itp itp

 

  • Lubię! 1
Link do komentarza
Share on other sites

Wszystko do tej pory było ok , fajnie mi wczytywało tylko teraz zaczełam ten program rozbudowywać i własnie coś jest nie tak, bo teraz ogólnie chciałąbym zacząć sprawdzać pewen rzeczy takie jak np. czy przebieg samochodu, który został wprowadzony przez uzytkownika wczesniej jest większy od wprowadzonego póżniej itp. pytania, ale teraz cały czas nie zaleznie jakie dane wprowadze przy uruchomieniu programu wyrzuca mi ta sama opcje po else.

#include <iostream>

using namespace std;





struct samochod
{

    int przebieg;
    int rocznik;

};
void wczytaj(string pytanie, int &odpowiedz)
{

    cout<<pytanie;
    cin>>odpowiedz;
}
int main()
{
     samochod s[100];


    int n;
    int i;
    cout<<"podaj n"<<endl;
    cin>>n;

    for(i=0;i<n;i++)
    {
        wczytaj("podaj",s[i].przebieg);
        //wczytaj("rok produkcji",s[i].rocznik);
    }
    cout<<s[i].przebieg;
    if(s[i].przebieg>s[i-1].przebieg)
    {

        cout<<"przebieg poprzedniego wprowadzonego auta był mniejszy niż kolejnego";
    }else{
    cout<<"bylo odwrotnie";
    }




    return 0;
}

 

Link do komentarza
Share on other sites

Zauważ, że sprawdzenie jest w kodzie już po pętli for. Zwróć uwagę jaką wartość ma wówczas iterator i. Porównujesz przebieg samochodu o indeksie n z samochodem o indeksie n-1, a w tablicy masz tylko samochody o indeksach 0, 1, 2, ..., n-1. W tablicy pod pozycją samochodu o indeksie n są jakieś śmieci.

  • Lubię! 1
Link do komentarza
Share on other sites

Pisząc tego typu kod warto sprawdzać czy program przypadkiem nie ma możliwości dobrania się do pamięci z poza zakresu tablicy - tak jest w tym przypadku jeżeli np. podasz n większe niż 100. W najlepszym wypadku będzie crash a w najgorszym UB (undefined behavior). Trzeba zawsze przemyśleć takie przypadki brzegowe aby nie było możliwości UB. I dobrze jest to robić od samego początku nauki programowania. Jeżeli masz możliwość to warto też rozważyć zastosowanie std::array albo std::vector zamiast zwyklej tablicy z języka C, przynajmniej jak już poczujesz się pewnie z tablicami C bo jednak warto je znać (ale już niekoniecznie używać jak nie ma takiej potrzeby).

Dnia 15.11.2021 o 11:07, piotr96 napisał:

iterator i.

Nie czepiam się (chociaż to tak wygląda) ale w C++ iterator to coś innego 😉 Tutaj i to zmienna sterująca.

Na koniec dodam, że preinkrementacja w cpp jest bardziej wydajna(edited) od postinkrementacji a logicznie to to samo w przypadki pętli for (++i vs i++). [Niekoniecznie prawda - patrz poniższe komentarze]

Edytowano przez Rogal
  • Lubię! 1
Link do komentarza
Share on other sites

Oczywiście, iterator w języku C++ to coś innego, ale na uczelni, którą kończyłem, często nazywano zmienną sterującą pętli właśnie iteratorem pętli. I taki iterator, w potocznym znaczeniu, miałem na myśli. Jeżeli kogoś wprowadziłem w błąd, to przepraszam. Być może jest to niepoprawne, ale widzę, że na innych uczelniach też się używa tego sformułowania:

Cytat

Punkt startu określa tzw. iterator pętli, czyli zmienna dowolnego typu arytmetycznego2, o zadanej wartości, której zmiany wartości będą badane, tu: int a=0.


Jeżeli już chcemy czepiać się słówek, to bardzo rażące w oczy jest sformułowanie:

26 minut temu, Rogal napisał:

preinkrementacja w cpp jest bardziej optymalna od postinkrementacji

Tego też nauczyłem się na jednym przedmiocie na politechnice, dotyczącym badań operacyjnych (nieprawidłowość tego sformułowania to dla dużej części studentów jedyna wiedza, jaka została w głowie po tym przedmiocie), a na przykład tutaj znajduje się wyjaśnienie.😉

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.