Darmowe Forum
Kwiecień 19, 2024, 08:51:00 *
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Forum zostało uruchomione!
 
   Strona główna   Pomoc Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Struktury -czyli "niepełne" obiekty  (Przeczytany 12232 razy)
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« : Styczeń 25, 2011, 13:24:20 »

W pojedynczej tablicy o nazwie np. Adam można zgrupować tylko zmienne jednego typu. Np. tablica  char Adam [10][10] może przechowywać tylko zmienne znakowe. Co zrobić jeżeli pod jedną nazwą chcemy przechować kilka zmiennych różnych typów. W Pascalu istnieje struktura która nazywa się record i pozwala przechowywać różne typy zmiennych (np. imie, nazwisko, wiek, nr telefonu). W Języku C i C++ odpowiednikiem pascalowskiego rekordu jest konstrukcja programistyczna nazywana strukturą.
Struktura to powiązane ze sobą dane różnych typów. Nazwę struktury deklaruje się podobnie jak zmienną pisząc przed nazwą słowo struct.
struct Adam

Każda struktura powinna zawierać różne pola ale nie  jest obiektem (!) bardziej złożonym niż pojedyncza zmienna i składa się z pól.
Poniżej przykład deklaracji struktury o nazwie Adam składającej się z pól : wiek, wzrost, nazwisko. Strukturę można wykorzystać do tworzenia bazy danych osób o imieniu Adam.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam {int wzrost;
             int wiek;
             char nazwisko[20];};

    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Styczeń 26, 2011, 08:21:47 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #1 : Styczeń 25, 2011, 13:33:10 »

Samo zadeklarowanie struktury, określa tylko szkielet tego co ma się w niej znaleźć. Szkielet trzeba wypełnić treścią. Do tego służy deklaracja zmiennych strukturalnych. Można to porównać do projektu samochodu, wszystkie mają mieć 4 koła, kabinę chroniącą przed deszczem i silnik. Jaki konkretnie to będzie samochód zależy od tego jakiego rozmiaru będą koła , jak wyglądać będzie kabina  itd...
W naszym przypadku należy zadeklarować zmienne strukturalne które będą już konkretnymi wykonaniami struktury Adam. W skrypcie poniżej przedstawiono trzy zmienne a1,a2,a3 będące typami struktury Adam.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam {int wzrost;
             int wiek;
             char nazwisko[20];};
             struct Adam a1,a2,a3;

    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #2 : Styczeń 25, 2011, 13:43:16 »

Każda ze zmiennych a1, a2 i a3 posiada takie same pola jak struktura Adam. Dlatego można do tych zmiennych wpisać już konkretne dane. Np. jeżeli chcemy wpisać do zmiennej a1 wiek, wzrost nazwisko trzeba wpisać:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam {int wzrost;
             int wiek;
             char nazwisko[120];};
             struct Adam a1,a2,a3;
a1.wzrost=123;
a1.wiek=99;
strcpy(a1.nazwisko,"Bielomuslikajewicius");

    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #3 : Styczeń 25, 2011, 13:55:24 »

Możliwe jest zadeklarowanie struktury (a4) już z gotowymi, wypełnionymi polami. Jeżeli pola mają być zadeklarowane, to konieczne jest zbudowanie struktury statycznej czyli poprzedzonej słowem static.

Wyświetlenie określonego pola jest możliwe jeżeli do nazwy struktury po kropce umieszczona zostanie nazwa pola.
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam {int wzrost;
             int wiek;
             char nazwisko[120];};
             struct Adam a1,a2,a3;
static struct Adam a4={22,123," Piramodopolopirynowicz"};
a1.wzrost=123;
a1.wiek=99;
strcpy(a1.nazwisko,"Bielomuslikajewicius");
a2=a1;
cout<<a2.wiek<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #4 : Styczeń 25, 2011, 14:11:37 »

Wskaźnik i operator ->, polecenie strcpy();
To trudny temat, ale warto o nim popisać. Wskaźnik * może wskazywać strukturę w całości lub element struktury . Operator -> pozwala na odwołanie się do elementów struktury.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam {int wzrost;
             int wiek;
             char nazwisko[120];};
             struct Adam a1,a2,a3;
static struct Adam a4={22,123," Piramodopolopirynowicz"};
struct Adam *miecio; /* *miecio to wskaźnik na strukturę*/
miecio=&a1;
miecio->wzrost=345;
cout<<a1.wzrost<<endl;

a1.wzrost=123;
a1.wiek=99;
strcpy(a1.nazwisko,"Bielomuslikajewicius");
a2=a1;
cout<<a2.wiek<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Patrz wytłuszczony tekst:
linia1: zadeklarowano wskaźnik struktury Adam, wskaźnik nazywa się miecio, oznacza to tylko tyle,że pod nazwą miecio trzeba zarezerwować tyle adresów ile jest pól w strukturze Adam.
linia2: Do wskaźnika miecio przypisywane są adresy poszczególnych pól zmiennej strukturalnej a1.
linia3: do adresu wskazywanego przez wskaźnik miecio opisującego pole wzrost wpisać liczbę 345.
linia4: wyświetlić pole a1.wzrost
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #5 : Styczeń 25, 2011, 17:28:19 »

Unia - krótko o strukturze przypominającej typ struct.
Unia jest zmienną, która w różnych momentach może przechowywać w tym samym miejscu pamięci obiekty różnych typów. Obiekty typu unia wymagają do zapisu tyle bajtów pamięci ile wynosi liczba bajtów potrzebna na przechowanie najdłuższego elementu unii. Deklaracja unii podobna jest do deklaracji struktury, tyle tylko, że dokonuje się jej przy pomocy słowa kluczowego union.
Operacje dozwolone na strukturach są dozwolone na uniach : kopiowanie i przypisywanie unii traktowanych jako całość, pobieranie adresu, dostęp do ich składowych.
Należy pamiętać o tym, aby do przypisywania składników unii zadeklarować taką zmienną, która będzie mogła przechować najdłuższą składowa unii.
Sposób deklaracji i operowania uniami przedstawimy na przykładzie:


#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{union {int licz;
char slowo[25];
}to_unia;
char znak=0;
system("clr");
cout<<"Duze A  umozliwia wyjscie z petli";
while (znak!='A'){
      cout<<endl<<"Podaj cyfre: ";znak=getchar();
if (znak>47&&znak<58){to_unia.licz=znak-48;}
else {to_unia.slowo[0]=znak;
to_unia.slowo[1]='\0';}
cout<<endl<<"Pole jako cyfra/liczba:  Pole jako napis:"<<endl;
cout<<to_unia.licz<<"  "<<to_unia.slowo;
}
    system("PAUSE");
    return EXIT_SUCCESS;
}

Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #6 : Styczeń 26, 2011, 08:35:33 »

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam{int wzrost;
int wiek;
char nazwisko[120];};
struct Ewa{ char imie[120];
char nazwisko[120];
int wymiary[3];};
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #7 : Styczeń 26, 2011, 09:23:23 »

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam{int wzrost;
int wiek;
char nazwisko[120];};
struct Ewa{ char imie[120];
char nazwisko[120];
int wymiary[3];};

struct a1 {int wzrost;
int wiek;
char nazwisko[120];};

    system("PAUSE");
    return EXIT_SUCCESS;
}
-------------------------------------- deklaracja potomków Ewy --------------------
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam{int wzrost;
int wiek;
char nazwisko[120];};
struct Ewa{ char imie[120];
char nazwisko[120];
int wymiary[3];};
struct Ewa adam1,adam2,adam3,magda;
struct a1 {int wzrost;
int wiek;
char nazwisko[120];};
    system("PAUSE");
    return EXIT_SUCCESS;
}
--------------------------------- Zadanie Rysi-Zdzisio ---------------------------------
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct Adam{int wzrost;
int wiek;
char nazwisko[120];};
struct rysio {char imie[20];
char nazwisko[20];
int pesel;};
struct rysio zdzisio;


    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Styczeń 26, 2011, 10:37:21 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #8 : Styczeń 26, 2011, 12:27:33 »

Zadanie 1. Napisać program deklarujący strukturę o nazwie klasa, w której zadeklarowano pola: imie, nazwisko, ocena. Zadeklarować strukturę tablicową potomną do struktury klasa o nazwie PSI i rozmiarze 20. Następnie umieścić kod pozwalający na wpisywanie do kolejnych pól struktury, danych o uczniach klasy PSI..

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct klasa{
        string imie;
        string nazwisko;
        int ocena;};
struct klasa psi[20];

for(int a=0;a<20;a++){
        cout<<endl<<"Nr w dzienniku."<<a+1<<" podaj imie ucznia :";cin>>psi[a].imie;
        cout<<endl<<" podaj nazwisko ucznia :";cin>>psi[a].nazwisko;
        cout<<endl<<" podaj ocene :";cin>>psi[a].ocena;
        }

    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Styczeń 26, 2011, 12:57:22 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #9 : Luty 02, 2011, 09:19:00 »

Zadanie 2.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{ struct przedmiot{ string nazwa;
int ocena[5];};
    struct uczen {
         string imie;
         string nazwisko;
         struct przedmiot przedmiot1;
         };
   struct uczen psi[20];
   cout<<psi[1].przedmiot1.ocena[1];
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
--------------------------------- ver.2----------------------------------------------------
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{ struct przedmiot{
         string nazwa;
         int ocena[5];};
       
    struct uczen {string imie;
string nazwisko;
string przedmiot;
struct przedmiot przedmiot1[3];
};
int a,y,z;
 struct uczen klasa[20];
for (a=0; a<3;a++){
cout<<"Podaj nazwisko "<<a+1<<" ucznia: ";
cin>>klasa[a].nazwisko;
cout<<"Podaj imie "<<a+1<<" ucznia: ";
cin>>klasa[a].imie;
for (y=0; y<3;y++){
switch (y)
{case 0:{
      for(z=0;z<5;z++){
cout<<"Podaj "<<z+1<<" ocene z przedmiotu PSiO: ";
cin>>klasa[a].przedmiot1[y].ocena[z];}     
      ;break;}
case 1:{for(z=0;z<5;z++){
cout<<"Podaj "<<z+1<<" ocene z przedmiotu UTK: ";
cin>>klasa[a].przedmiot1[y].ocena[z];};break;} 
 
 case 2:{for(z=0;z<5;z++){
cout<<"Podaj "<<z+1<<" ocene z przedmiotu Multimedia: ";
cin>>klasa[a].przedmiot1[y].ocena[z];};break;} 
 default: {cout<<"blad";}
   
   
   
    }}}


 cin>>klasa[0].przedmiot1[0].nazwa;
 cin>>klasa[0].przedmiot1[0].ocena[0];
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
« Ostatnia zmiana: Luty 02, 2011, 10:50:14 wysłane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #10 : Luty 02, 2011, 13:24:02 »

#include <cstdlib>
#include <iostream>

using namespace std;

struct przedmiot{
         string nazwa;
         int ocena[5];};
       
    struct uczen {string imie;
string nazwisko;
string przedmiot;
struct przedmiot przedmiot1[3];
};
int x,y,z;
struct uczen klasa[20];

void ame(uczen x[20]){};

int main(int argc, char *argv[])
{

for (x=0; x<3;x++){
cout<<"Podaj nazwisko "<<x+1<<" ucznia: ";
cin>>klasa
  • .nazwisko;
cout<<"Podaj imie "<<x+1<<" ucznia: ";
cin>>klasa
  • .imie;
for (y=0; y<3;y++){
switch (y)
{case 0:{
      for(z=0;z<5;z++){
cout<<"Podaj "<<z+1<<" ocene z przedmiotu PSiO: ";
cin>>klasa
  • .przedmiot1[y].ocena[z];}     
      ;break;}
case 1:{for(z=0;z<5;z++){
cout<<"Podaj "<<z+1<<" ocene z przedmiotu UTK: ";
cin>>klasa
  • .przedmiot1[y].ocena[z];};break;} 

 case 2:{for(z=0;z<5;z++){
cout<<"Podaj "<<z+1<<" ocene z przedmiotu Multimedia: ";
cin>>klasa
  • .przedmiot1[y].ocena[z];};break;} 
default: {cout<<"blad";}
   
   
   
    }}}
int min=0,os;
for (x=0;x<3;x++){int b=0;int c=0;
    for(z=0;z<5;z++){ if (klasa
  • .przedmiot1[0].ocena[z]!=0){++c;}
                     b= b+klasa
  • .przedmiot1[0].ocena[z];};b=b/c;
if (b>min){min=b;os=x;}} 
 cout<<"Osoba "<<klasa[os].imie<<" "
 <<klasa[os].nazwisko<<"ma najwyzsza srednia= "<<min;

 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
admin
Administrator
Ekspert
*****
Wiadomości: 821


Email
« Odpowiedz #11 : Luty 21, 2013, 13:10:49 »

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{struct szkola {
        char imie[255];
        char nazwisko [255];
        float wiek;
        };
        struct  szkola psi2[16];
     for (int i=0; i<3;i++)
     {cout<<endl<<"podaj imie: ";cin>>psi2.imie;
      cout<<endl<<"podaj nazwisko ";cin>>psi2.nazwisko; 
      cout<<endl<<"podaj wiek: ";cin>>psi2.wiek;
      }     
  int x;
  for( int i=0; i<2;i++)
  { if(psi2.wiek>psi2[i+1].wiek){x= i;} else {x=i+1;};};   
  cout<<endl<<"najstarszym uczniem jest: "<< psi2
  • .imie<<endl; 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC | Sitemap

Polityka cookies
Darmowe Fora | Darmowe Forum

pytamy zostangwiazda schoolmonster wataha-wilkow-nocy life