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