Struktury typ definiowany przez uŝytkownika.

Podobne dokumenty
Podstawy algorytmiki i programowania - wykład 4 C-struktury

Struktury Struktura polami struct struct struct struct

Deklaracja struktury w C++

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

C-struktury wykład. Dorota Pylak

C-struktury wykład. Dorota Pylak

XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Program 22. #include <iostream> using namespace std; struct Osoba { string Imie; string Nazwisko; char Plec; int RokUr; };

Język ANSI C-struktury

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

Język C zajęcia nr 12. Struktury i unie

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Typ użyty w deklaracji zmiennej decyduje o rodzaju informacji, a nazwa zmiennej symbolicznie opisuje wartość.

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Struktury - wprowadzenie

ALGORYTMY I STRUKTURY DANYCH

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Rozdział 4 KLASY, OBIEKTY, METODY

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

1 Podstawy c++ w pigułce.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Podstawy programowania C. dr. Krystyna Łapin

VII. Ciągi znaków łańcuchy

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Język C zajęcia nr 11. Funkcje

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do programowania

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

int suma; pralka czerwona; // definicja egzemplarza obiektu pralka * wskaŝ; // definicja wskaźnika pralka & ruda = czerwona; // definicja referencji

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Program 14. #include <iostream> #include <ctime> using namespace std;

Zmienne, stałe i operatory

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie strukturalne i obiektowe. Funkcje

1 Podstawy c++ w pigułce.

Wstęp do programowania 1

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Argumenty wywołania programu, operacje na plikach

Podstawy programowania skrót z wykładów:

Wstęp do wskaźników w języku ANSI C

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Podstawy programowania w języku C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Do czego służą klasy?

ZASADY PROGRAMOWANIA KOMPUTERÓW

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Pytania sprawdzające wiedzę z programowania C++

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Informatyka 2. Informatyka 2. Wykład nr 1 ( ) Dane podstawowe. - Wydział Elektryczny. Politechnika Białostocka. Program wykładu (1/2)

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Języki i metodyka programowania. Wprowadzenie do języka C

Spis treści JĘZYK C - STRUKTURY, POLA BITOWE, UNIE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Przeciążanie operatorów

Podstawy programowania w języku C++

Podstawy Programowania

Wykład 5: Klasy cz. 3

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie Komputerów

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

2 Przygotował: mgr inż. Maciej Lasota

Laboratorium 5: Tablice. Wyszukiwanie binarne

5. Administracja kontami uŝytkowników

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

. Podstawy Programowania 1. Struktury i unie. Arkadiusz Chrobot. 7 grudnia 2017

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Języki programowania obiektowego Nieobiektowe elementy języka C++

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

KURS ACCESS 2003 Wiadomości wstępne

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Tablicę 2-wymiarową można przedstawić jako pewien zestaw tablic 1-wymiarowych np.:

Język ludzki kod maszynowy

Struktury czyli rekordy w C/C++

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

W języku C/C++ pomiędzy wskaźnikami a tablicami istnieje bardzo ścisły związek. Do onumerowania elementów w tablicy służą tzw. INDEKSY.

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Wskaźniki. Informatyka

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

KURS C/C++ WYKŁAD 6. Wskaźniki

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Transkrypt:

Struktury typ definiowany przez uŝytkownika. Na tej lekcji nauczymy się, jak grupować dane róŝnych typów, umieszczając je w pojedynczej zmiennej. Nauczymy się tworzyć nowe, zdefiniowane przez siebie typy złoŝone, zwane strukturami. Zastosujemy zdefiniowane przez siebie struktury w swoich programach. Utworzymy małą, prostą bazę danych, w której wykorzystamy zdefiniowane przez siebie struktury. Struktura (typ strukturalny) jest złoŝonym typem danych słuŝącym do grupowania informacji opisujących jakiś obiekt. Dane te mogą być (i najczęściej są) róŝnych typów. Poszczególne dane zgrupowane w strukturze nazywamy polami lub składowymi struktury. Zacznijmy od przykładu: aby zapamiętać dane pewnej osoby, takie jak imię, nazwisko, wiek i płeć (zatem dane róŝnego typu), do tej pory musieliśmy umieścić je w kilku zadeklarowanych zmiennych. Chcąc wyświetlić informacje o tej osobie, musieliśmy wyświetlić wartości poszczególnych zmiennych. NaleŜało więc zapamiętać, Ŝe wszystkie te zmienne dotyczą tej samej opisywanej wielkości. MoŜna jednak zgrupować wszystkie informacje i umieścić w jednej zmiennej. Typ tej zmiennej to właśnie struktura. Aby korzystać z tego typu, musisz go najpierw zdefiniować. Potem moŝesz tworzyć zmienne zdefiniowanego przez siebie typu. Definicja struktury ma postać: struct nazwa_typu //nazwa typu podlega tym samym //regułom, co nazwy zmiennych typ_pola_l nazwa_pola_l; typ_pola_2 nazwa_pola_2;... typ_pola_n nazwa_pola_n; //definicja typu musi kończyć sie średnikiem Aby pokazać, jak informacje o osobie umieścić w jednej zmiennej, moŝemy przykładowo zdefiniować strukturę o nazwie człowiek: struct człowiek char imię[14]; char nazwisko[20] ; int wiek; char płec[10]; 1

Mając tak zdefiniowany typ, moŝemy z niego korzystać, deklarując zmienne strukturalne. Zmienne strukturalne są to zmienne, które sa typu struktury przez nas zdefiniowanej. Dla typu człowiek mogą być to zmienne mama, babcia, stryjek. Ich deklaracja wygląda następująco: człowiek mama, babcia, stryjek; Inicjalizacja zadeklarowanych zmiennych polega na nadaniu wartości poszczególnym polom. KaŜdej zmiennej przypiszemy wartość imienia, nazwiska, wieku i płci, odwołując się do pól zdefiniowanej struktury. Odniesienie się do poszczególnych pól struktury realizujemy za pomocą operatora odniesienia do pola struktury, który oznacza się kropką. mama.imie="anna"; mama.nazwisko="kowalska"; mama.wiek=40; mama.plec="kobieta"; babcia.imie="maria"; babcia.nazwisko="nowak"; babcia.wiek=70; babcia.plec="kobieta"; stryjek.imie="piotr"; stryjek.nazwisko="kawecki"; stryjek.wiek=51; stryjek.plec="mezczyzna"; KaŜdej zmiennej przypisaliśmy wartości pól zdefiniowanej struktury, na przykład zmiennej mama nadaliśmy wartości: Anna Kowalska, 40, kobieta. Są to zatem zmienne róŝnych typów (wiek jest liczbą całkowita a imię, nazwisko i płeć są ciągami znaków o róŝnych dozwolonych długościach). Zatem - w przeciwieństwie do tablicy, która będąc pojedynczą zmienną, przechowuje kilka, kilkanaście bądź więcej wartości tego samego typu - pola struktury mogą być róŝnych typów. Na rysunku przedstawiamy ilustrację zmiennych: mama, babcia, stryjek - są one zmiennymi typu człowiek. ZauwaŜ, Ŝe samo zdefiniowanie typu człowiek nie opisuje jeszcze Ŝadnej osoby: jest dopiero: modelem, mówiącym o tym, jakie cechy przypiszemy konkretnej osobie. Dopiero zainicjalizowane zmienne opisują rzeczywistych ludzi. 2

struct pacjent //definicja struktury "pacjent" int nr_badania; //elementy struktury char *imie ; //elementy struktury float koszt; //elementy struktury pt1,pt2; //deklaracje zmiennych strukturalnych Istnieje jeszcze jeden sposób deklaracji - przy pomocy słowa kluczowego typedef: typedef struct int nr_badania; //elementy struktury char *imie ; //elementy struktury float koszt; //elementy struktury pacjent; Tego typu deklaracja umoŝliwia tworzenie nowych nazw dla typów danych. Deklaracja zmiennych moŝe mieć postać: pacjent pt1,pt2; Pola zmiennej moŝemy oczywiście inicjalizowac wartościami podanymi przez uŝytkownika, jak w przykładzie poniŝej: #include <iostream.h> #include <conio.h> struct osoba char nazwisko[ 20 ] ; int wiek; 3

main() osoba uczeń; //definicja zmiennej typu osoba coutt«"podaj nazwisko ucznia "; cin»uczen.nazwisko; cout«"podaj wiek ucznia "; cin»uczen.wiek; cout«"informacje o uczniu: \n"; cout«uczen. imie«" "«uczen.nazwisko«" "«uczen.wiek«"lat"; getch(); I Na rysunku,obok uŝytego juŝ przykładu uczeń, przedstawiliśmy jeszcze dwie inne przykładowe wielkości, które warto zdefiniować za pomocą struktur: Jeśli chcemy zdefiniować strukturę, która opisuje cechy samochodów zgodnie z atrybutami zaznaczonymi na rysunku, to prawidłowa definicja wygląda następująco: struct samochód char marka [30]; //jeśli uznamy, ze jest to wystarczająca dlugosc int pojemnosc_silnika; int rok_produkcji; //przypominamy o średniku! Dwie przykładowe zmienne typu strukturalnego zadeklarujemy: samochód moje_auto, auto_sasiada; a wartości nadamy im podobnie jak w poprzednim przykładzie. Definicja struktury punkt w kartezjańskim układzie współrzędnych miałaby postać: struct punkt float wsp_x; float wsp_y; 4

PoniŜej przedstawiamy fragment kodu programu, w którym wykorzystana jest zdefiniowana struktura: main () punkt punktl, punkt2; //deklaracja zmiennych typu punkt punktl.wsp_x = 3; punktl.wsp_y = 5; punkt2.wsp_x = 3; punkt2.wsp_y = 7.4; if (punktl.wsp_x==punkt2.wsp_x) cout«"punkty wyznaczają prosta równoległa do osi OY"; getch(); Po zdefiniowaniu struktury punkt przejdźmy do kolejnej definicji matematycznej - tym razem dotyczącej wektorów. Przypomnijmy, Ŝe wektorem jest uporządkowana para dwóch punktów. Pierwszy z nich nazywamy początkiem wektora, drugi zaś jego końcem. Aby opisać wektory w kartezjańskim układzie współrzędnych, moŝemy zdefiniować strukturę do tego przeznaczoną: struct wektor float poczatek_wsp_x; //odcięta początku wektora float poczatek_wsp_y; //rzedną początku wektora float koniec_wsp_x; //odcięta końca wektora float koniec_wsp_y; //rzedną końca wektora Mając jednak zdefiniowaną strukturę punkt, na jej bazie zdefiniujemy strukturę wektor (ryc. poniŝej) struct wektor punkt początek; punkt koniec; 5

Teraz, w celu odwołania się do poszczególnych pól zmiennej wektor, zastosujemy dwukrotnie operator odniesienia do pola struktury. Dla przykładu: aby nadać wartości zmiennej moj_wektor naleŝącej do typu wektor, wykonamy kolejno instrukcje: moj_wektor.początek.wsp_x = 4.5; moj_wektor.początek. wsp_y = -6.1; moj_wektor.koniec. wsp_x = 2.8; moj_wektor.koniec.wsp_y = 4.9; Pamiętaj, Ŝe definicja struktury punkt musi się znajdować przed definicją Struktury wektor, gdyŝ druga z nich wykorzystuje pierwszą. Przeanalizuj krótki program, wykorzystujący obie struktury; jego zadaniem jest wyznaczenie współrzędnych środka wektora, którego krańce podajemy z zewnątrz: #include<iostream.h> #include<conio.h> struct punkt //definicja struktury punkt musi poprzedzać definicję struktury wektor I float wsp_x; hoat wsp_y; //pamiętaj o średniku kończącym definicje strukt struct wektor punkt początek; punkt koniec; //pamiętaj o średniku kończącym definicje strukt main () punkt p; //deklaracja zmiennej strukturalnej typu punkt; wektor w; //deklaracja zmiennej strukturalnej typu wektor; cout«"podaj odcięta początku wektora: "; cin»w.poczatek.wsp_x; cout«"podaj rzedną początku wektora: "; cin»w. poczatek.wsp_y; cout«"podaj odcięta końca wektora: "; cin»w. koniec.wsp_x; cout«"podaj rzedną końca wektora: "; 6

cin»w.koniec.wsp_y; p.wsp_x= 0.5*(w.poczatek.wsp_x+w.koniec.wsp_x); p.wsp_y= 0.5*(w.poczatek.wsp_y+w.koniec.wsp_y); cout«"oto współrzędne środka wektora: "«p.wsp_x«", "«p.wsp_y; getch(); JuŜ w tym krótkim programie moŝna zauwaŝyć, Ŝe duŝo łatwiej jest odnosić się do pojedynczego wektora za pomocą jednej zmiennej niŝ przeznaczać na jego opis aŝ cztery zmienne (dwie współrzędne początku i dwie współrzędne końca). Tablice o elementach typu strukturalnego #include <iostream.h> #include <conio.h> struct uczen char imie[20]; char nazwisko[20]; long numer_akt; uczen grupa[10]; cout<< Wypelniamy tablice danymi uczniow z naszej grupy: ; for(int i=0;i<10;i++) cout<< Podaj imie ucznia: ; cin>>grupa[i].imie; cout<< Podaj nazwisko ucznia: ; cin>>grupa[i].naziwsko; cout<< Podaj numer akt ucznia: ; cin>>grupa[i].numer_akt; 7

getch(); Unie Unia (ang. union) jest strukturą, której wszystkie składowe umieszczane są w tym samym obszarze pamięci. Kompilator ustala ilość potrzebnej pamięci wyliczając ilość pamięci potrzebnej do przechowania składowej o największym zapotrzebowaniu. W dowolnej chwili unia moŝe zawierać maksymalnie jeden obiekt (składową), poniewaŝ elementy unii dzielą ten sam obszar pamięci. Deklaracja unii jest podobna do deklaracji struktury, zamiast słowa kluczowego struci występuje słowo union. Przykładowa deklaracja unii moŝe mieć postać: union zmien int x1; char zn; Zmienne typu unii moŝna deklarować przez ich nazw na końcu definicji unii albo w oddzielnej instrukcji deklaracji. Aby zadeklarować zmienna wx1 jako typu zmień naleŝy napisać: union zmien wx1; Zarówno liczba całkowita x1 jak i znak zn zmiennej wx1 zajmują ten sam obszar pamięci ( zazwyczaj potrzebujemy dwóch bajtów dla zmiennej typu int i jednego bajtu dla zmiennej typu char). Unie umoŝliwiają oszczędne gospodarowanie pamięcią komputera. Dostęp do składowych unii jest analogiczny jak dla struktur. /*pm60.cpp unie i struktury */ #include <stdio.h> #include <conio.h> #include <string.h> // dla strcpy() int main(int) struct wx1 int tel; char nazwisko[50]; 8

char miasto[50]; union wx2 int tel; char nazwisko[50]; char miasto[50]; struct wx1 x1; union wx2 x2; Pola bitowe Język C/C++ umoŝliwia określenie liczby bitów, w których będą zapamiętywane składowe unsigned lub int struktury, klasy lub unii. Składowe takie nazywane są polami bitowymi ( ang. bit field). Typem pola bitowego musi być liczba całkowita ze znakiem lub bez. Pól bitowych uŝywa się w celu zaoszczędzenia pamięci. Bardzo często w programach musimy mieć dane reprezentujące wartości binarne. Przykładem jest reprezentacja stanu konkretnego przełącznika przełącznik moŝe być włączony lub wyłączony. Do opisania działania przełącznika potrzebujemy jednego bitu ( wartość 0 lub 1). Najmniejszym standardowym typem danych jest typ char. UŜywanie typu char do przechowywania wartości binarnych jest duŝym marnotrawieniem pamięci. Zwykle jednak uŝywa się typu int, który moŝe składać się z dwóch lub częściej z czterech bajtów. W wielu przypadkach do reprezentowania wartości zmiennej moŝemy potrzebować niewielkiej ilości bitów (2, 3). MoŜemy zebrać kilka nieduŝych zmiennych razem jako pola struktury. Składową struktury definiuje się jako pole przez podanie jej nazwy, a za nią liczby potrzebnych bitów. UŜywając pól moŝemy zmieścić w typie char osiem wartości binarnych, a typie long trzydzieści dwie wartości. Na przykład, poniŝsza deklaracja tworzy strukturę pol_bit zawierającą trzy pola o rozmiarze 1 bitu: struct unsigned int nra : 1; unsigned int nrb : 1; unsigned int nrc : 1; pol_bit; Poszczególnym polom przypisanie wartości początkowych odbywa się klasycznie, z wykorzystaniem operatora kropki: pol_bit.nra = 1; pol_bit.nrb = 0; pol_bit.nrc = 1; 9

W tym przykładzie, kaŝde uŝyte pole ma długość 1 bitu, moŝemy więc przypisywać jedynie wartości 0 lub 1. Wykorzystanie pamięci nie jest imponujące w tym przykładzie. Zmienna pol_bit jest typu int, rezerwuje więc 16 (lub 32 w zaleŝności od implementacji) bitów, gdy tymczasem wykorzystywane są jedynie trzy bity. Pola bitowe mogą mieć róŝna długość: struct unsigned int nra : 2; unsigned int nrb : 2; unsigned int nrc : 8; pol_bit; W tym przykładzie mamy dwa pola 2-bitowe i jedno 8-bitowe. Dysponując szerszymi polami, moŝemy operować większymi wartościami, np. teraz zmienna nra moŝe być zainicjalizowana wartością 3. Musimy jednak pamiętać, aby przypisując wartości nie przekroczyć pojemności pola. JeŜeli całkowita ilość bitów przypisana poszczególnym polom przekroczy rozmiar typu int, rezerwowana jest kolejna jednostka o długości typu int. PoniewaŜ Ŝadne z pól nie moŝe znajdować się na granicy pomiędzy dwoma jednostkami, kompilator tak rozmieszcza pola aby znalazły się całkowicie w pierwszej 10