Temat: Typ strukturalny. Tablica struktur. Wskaźniki do struktur
Transkrypt
Temat: Typ strukturalny. Tablica struktur. Wskaźniki do struktur
Temat: Typ strukturalny. Tablica struktur. Wskaźniki do struktur. Struktury to najbardziej elastyczny sposób reprezentowania danych. Struktura jest typem defiowanym przez programistę. Jest to zestaw pól, z których każde może być innego typu. Przykład 1 nazwisko imię char [30] char [15] płeć wzrost char unsigned char 1. Deklaracja typu strukturalnego struct nazwa_typu { typ_pola_1 nazwa_pola_1; typ_pola_2 nazwa_pola_2; • • • typ_pola_n nazwa_pola_n; }; Przykład 2 struct Dane_osobowe { char nazwisko[31]; char imie[16]; char plec; unsigned char wzrost; }; struct Punkt { double x, y; } ; struct Okrag { Punkt srodek_okregu; double promien; }; // struktura zagnieżdżona 1 struct Data { short dzien, miesiac; unsigned rok; }; struct Osoba { char nazwisko[31]; char imie[16]; Data data_ur; // struktura zagnieżdżona char plec; }; struct Uczen { Osoba O; // struktura zagnieżdżona double srednia; }; struct Pracownik { Osoba O; // struktura zagnieżdżona char stanowisko[30]; double zarobki; }; 3. Definiowanie oraz inicjowanie zmiennych typu strukturalnego nazwa_typu nazwa_zmiennej; Przykład 3 Osoba O1, O2, O3; Okrag F1, F2; Przykład 4 Dane_osobowe O= { ”Nowak”, ”Tomasz”, ‘M’, 165 }; Okrag F1 = { { 10.0, 15.75 } , 50.5 }; Osoba O1={„Kowalski”,”Jan”,{12,03,1992},’M’}; Uczen U={{„Kowalski”,”Jan”,{12,03,1992},’M’},4.5}; 2 Można połączyć deklarację typu strukturalnego z definicją zmiennych struct nazwa_typu { typ_pola_1 nazwa_pola_1; typ_pola_2 nazwa_pola_2; • • • typ_pola_n nazwa_pola_n; } nazwa_ zmiennej ; Przykład 4 struct // Można pominąć nazwę typu { char nazwisko[31]; char imie[16]; int rok_urodz; char plec; unsigned char wzrost; double stypendium; } S1, S2; // definicja dwóch zmiennych strukturalnych struct okrag // jednoczesna deklaracja typów i definicja zmiennych { struct punkt // bezpośrednia definicja struktury zagnieżdżonej { double x, y; } srodek_okregu; double promien; } F1; 3. Operator selekcji Operator selskcji zapisany przez znak „.” umożliwa dostęp do pól struktury. Przykład 5 S1.wzrost = 180 ; S2.wzrost = S1 . wzrost; F1.promien = 50; F1.srodek_okregu . x = 15; scanf( ”%lf” , &S1.stypendium ); scanf( ”%s” , S1.nazwisko ); 3 S1 = S2; // kopiowanie pól struktur S2 do struktury S1 4. Dostęp do struktury za pośrednictwem adresu Dane_osobowe O; Dane_osobowe ∗wsk_O; O.wzrost = 180; // bezposrednie przypisanie do pola struktury wsk_os = &O; (∗wsk_O) . wzrost = 180; // pośrednie przypisanie poprzez wskaźnik wsk_O −> wzrost = 180; // j.w. operatorem strzałki Przykład 5 //Program wprowadza dane dotyczące osób, // wyznacza liczbę osób, które zarabiają więcej niż średnia krajowa, // wypisuje też dane szukanej osoby, // usuwa wskazaną nazwiskiem osobę #include <stdio.h> #include <conio.h> #include <string.h> // plik nagłówkowy zawierający funkcje napisowe // z pliku tego użyto funkcji strcmp, która porównuje // dwa napisy: strcmp(napis1,napis2)==0, gdy napisy // są identyczne, strcmp(napis1,napis2)<0, gdy // napis1 jest leksykograficznie mniejszy niż napis2, // strcmp(napis,napis2)>0, gdy napis2 jest // leksykograficznie mniejszy niż napis1 struct Osoba { char nazwisko[40]; unsigned wiek; float zarobki; }; void dodaj_osobe(Osoba *T,int *ile) { int i=*ile; printf("Nazwisko:"); scanf("%s",T[i].nazwisko); 4 printf("Wiek:"); scanf("%d",&T[i].wiek); printf("Zarobki:"); scanf("%f",&T[i].zarobki); i++; *ile=i; } short usun_osobe(Osoba *T,int *ile,char *naz) { short byla=0; for (int i=0;i<*ile;i++) if (strcmp(T[i].nazwisko,naz)==0) { byla=1; for (int j=i;j<*ile;j++) T[j]=T[j+1]; (*ile)--; break; } return byla; } void wypisz_informacje(Osoba O) { printf("Nazwisko:%s\nWiek:%d\nZarobki: %0.2f\n",O.nazwisko,O.wiek,O.zarobki); } void szukaj(Osoba *T, int ile,char *naz) { int byla=0; for (int i=0;i<ile;i++) if (strcmp(T[i].nazwisko,naz)==0) { wypisz_informacje(T[i]); byla=1; } if (byla==0) printf("Brak osoby o nazwsiku %s \n",naz); } int policz_bogaczy(Osoba *T, int ile, float zar) 5 { int l=0; for (int i=0; i<ile; i++) if (T[i].zarobki>zar) l++; return l; } #define n 100 int menu() { int z; printf("1-dodaj osobe\n"); printf("2-usun osobe\n"); printf("3-znajdz osobe\n"); printf("4-policz bogaczy\n"); printf("5-koniec programu\n"); scanf("%d",&z); return z; } int main( ) { Osoba T[n]; char naz[40]; int ile=0,z,byla; float zar; do { z=menu(); switch(z) { case 1: dodaj_osobe(T,&ile);break; case 2: printf("Podaj nazwisko do usuniecia:"); scanf("%s",naz); byla=usun_osobe(T,&ile,naz); if (!byla) printf ("Brak takiej osoby !!!"); break; case 3:printf("Podaj nazwisko osoby szukanej: "); scanf("%s",naz); szukaj(T,ile,naz); 6 break; case 4:printf("Podaj wysokosc sredniej krajowej: "); scanf("%f",&zar); printf("Liczba osob zarabiajacych powyzej %d\n",policz_bogaczy(T,ile,zar)); } sredniej: }while (z!=5); return 0; } 7