1 / 15

Informatyka I Wykład 11

Informatyka I Wykład 11. STRUKTURY I UNIE. STRUKTURY - składnia. Jest to definicja typu struct - słowo kluczowe etykieta - nazwa typu, tag name, label pole1, pole2 - składowe struktury umieszczane jedna po drugiej

nellie
Télécharger la présentation

Informatyka I Wykład 11

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informatyka IWykład 11 STRUKTURY I UNIE Jerzy F. Kotowski

  2. STRUKTURY - składnia • Jest to definicja typu • struct - słowo kluczowe • etykieta - nazwa typu, tag name, label • pole1, pole2 - składowe struktury umieszczane jedna po drugiej • Rozmiaru struktury najlepiej nie liczyć “na piechotę“ - operator sizeof • }; - średnik niezbędny przy składni C++ struct etykieta { pole1; pole2; ……… }; Jerzy F. Kotowski

  3. STRUKTURY - przykład • Jest to równoczesna definicja i deklaracja obiektów x, y i grupa • grupa - tablica struktur • struct student *kolega - adres do obiektu swojego typu • struct data- zdefiniowana wcześniej, na przykład tak: • struct data • { • int day, month, year, y_day; • char mon_name[4]; • }; struct student { char Nazwisko[20]; char Wydzial[20]; int semestr_studiow; float stypendium; struct student *kolega; struct data data_ur; struct data data_rozp; }x,y,grupa[30]; Jerzy F. Kotowski

  4. To jest to: . Priorytet: 15 Przykłady użycia: printf(“%s”,x.Nazwisko); // &(x.Nazwisko[0]) y.semestr_studiow = 7; grupa[11].kolega = &x; grupa[1].kolega = grupa; // &grupa[0] grupa[7].kolega = grupa+5; // &grupa[5] x.data_ur.day = 10; y.data_rozp.year = 1998; strcpy(grupa[2].Nazwisko,”Ela”); // kopiowanie grupa[2].Nazwisko[0] = ‘A’; // Ela - Ala Operator składowych struktur Jerzy F. Kotowski

  5. Trochę ciekawostek • struct student egzamin[100]; - deklaracja poza definicją. W C++ wystarczy: student egzamin[100]; • int v = sizeof(struct student); - jedyny rozsądny sposób na określenie rozmiaru struktury. Uniezależnia nas od komputera i modelupamięci. • y = x; - operator podstawiania kopiuje obiekty składnik po składniku • memcpy( &y, &x, sizeof(struct student)); - alternatywna technika wykorzystująca funkcję z biblioteki mem.h • void *memcpy(void *dest, const void *src, size_t n); To jest prototyp funkcji memcpy.Funkcja zwraca dest. • memcpy( egzamin, grupa, 30*sizeof(struct student)); Jerzy F. Kotowski

  6. Inicjalizacja wartości początkowych struct student st1,st2 = {„Kotowski”, ”Elektronika”, 7, 500.0, &st1, {1, 2, 1981, 32, ”FEB”}, {1, 10, 2001,-1, ”OCT”}}; • Inicjalizacja TYLKO obiektu st2. • &st1 - st1 zostało zadeklarowane wcześniej bo komputer analizuje linie programu od lewej do prawej. • Podwójna struktura nawiasowa. • -1 - do liczenia numeru dnia w roku najlepiej mieć osobną procedurę i nie robić tego własnymi rękoma:int day_of_year(int day, int month, int year); Jerzy F. Kotowski

  7. Definicja funkcji day_of_year int days[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; int day_of_year(int day, int month, int year) { int y=!(year%4) && year%100 || !(year%400); while(--month) day += days[y][month]; // day - input return day; } • Przykład wywołania: if(st2.data_rozp.y_day<0) st2.data_rozp.y_day = day_of_year(st2.data_rozp.day, st2.data_rozp.month, st2.data_rozp.year);// RATUNKU!! Jerzy F. Kotowski

  8. Redefinicja funkcji day_of_year • int days[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, • {0,31,29,31,30,31,30,31,31,30,31,30,31}}; • int day_of_year(struct data x)// struct data już znana • { • int y=!(x.year%4) && x.year%100 || !(x.year%400); • while(--x.month) x.day += days[y][x.month]; • return x.day; • } • Przykład wywołania: • st2.data_rozp.y_day = day_of_year(st2.data_rozp); Jerzy F. Kotowski

  9. Definicja funkcji day_month • Mamy rok i numer dnia w roku. Trzeba podać: numer miesiąca i numer dnia w miesiącu. Propozycja: podajemy adresy numeru miesiąca i numeru dnia w miesiącu. • void day_month(int y_day, int year, int *p_d, int *p_m) • { • int m=1, y=!(year%4) && year%100 || !(year%400); • while(y_day>days[y][m]) y_day -= days[y][m++]; • *p_d = y_day; *p_m = m.; • } • Przykład wywołania: • int month, day; • day_month(100, 2001, &day, &month); Jerzy F. Kotowski

  10. Redefinicja funkcji day_month • Inny sposób rozwiązania: funkcja może zwrócić strukturę. • struct data day_month(int y_day, int year) • { • struct data x; • int m=1, y=!(year%4) && year%100 || !(year%400); • while(y_day>days[y][m]) y_day -= days[y][m++]; • x.day = y_day; x.month = m.; • return x; • } • Przykład wywołania: • struct data xx = day_month(100, 2001); Jerzy F. Kotowski

  11. Operator wskazania na składową • Inna ważna struktura • struct complex • { • float Re, Im; • }; • Przykład wykorzystania: • struct complex x, *p; • x.Re = 1; • x.Im = -1; x=1-j • Sprzężenie l. zespolonej: x.Im *= -1; lub • x.Im = -x.Im; • Jednym z większych błędów w C jest posłu-giwanie się nieustawio-nymi wskaźnikami • p - globalny: NULL • p - automatyczny: ??? • Ustawiamy wskaźnik: • p = &x; • (*p).Re = 1; • Nawiasy są niezbędne • *p.Re Û *(p.Re) • (*p).Re Û p -> Re 15 Jerzy F. Kotowski

  12. Przykłady wykorzystania • void suma(struct complex *p, struct complex *q, struct complex *r) • { • r->Re = p->Re + q->Re; • r->Im = p->Im + q->Im; • } • Przykład wykorzystania: • struct complex x = {1.5, 2.0}, y = {-2, 0}, z; • suma(&x, &y, &z); • Inny przykład: • struct student st1, st2; • st1.kolega = &st2; // ......... Coś się dzieje • st1.kolega -> data_ur.year = 1982; Jerzy F. Kotowski

  13. UNIE - składnia • Jest to definicja typu • union - słowo kluczowe • etykieta - nazwa typu, tag name, label • pole1, pole2 - składowe unii umieszczane jedna obok drugiej • Rozmiar unii to rozmiar największego składnika. Najlepiej nie liczyć “na piechotę“. • }; - średnik niezbędny przy składni C++ union etykieta { pole1; pole2; ……… }; Jerzy F. Kotowski

  14. x y s[0] s[1] s[2] s[3] x s y.Re y.Im UNIE - komentarz union Elektronika { int x,y; char s[4]; }; union ICT { double x; char s[6]; struct complex y; }; Jerzy F. Kotowski

  15. UNIE - przykłady union FIELD { int x; unsigned char s[2]; }pole; unsigned char low_byte(int x) { pole.x = x; return pole.s[0]; } unsigned char high_byte(int x) { pole.x = x; return pole.s[1]; } • Przykład wykorzystania: • unsigned char low,high; • int x; • scanf(“%d”,&x); • low = low_byte(x); • high = high_byte(x); • KONIEC! inf_11_1 Jerzy F. Kotowski

More Related