59
Struktura programu dyrektywy preprocesora deklaracje i definicje globalnych danych i struktur danych deklaracje i definicje funkcji definicja funkcji main

Struktura programu dyrektywy preprocesora

  • Upload
    janna

  • View
    32

  • Download
    0

Embed Size (px)

DESCRIPTION

Struktura programu dyrektywy preprocesora deklaracje i definicje globalnych danych i struktur danych deklaracje i definicje funkcji definicja funkcji main. Preprocesor # dyrektywa argumenty Dołączanie plików bibliotecznych : #include - PowerPoint PPT Presentation

Citation preview

Page 1: Struktura programu   dyrektywy preprocesora

Struktura programu

• dyrektywy preprocesora• deklaracje i definicje globalnych danych

i struktur danych• deklaracje i definicje funkcji• definicja funkcji main

Page 2: Struktura programu   dyrektywy preprocesora

Preprocesor

# dyrektywa argumenty

Dołączanie plików bibliotecznych : #include

#include <stdio.h>

#include "funkcje.cpp"

Page 3: Struktura programu   dyrektywy preprocesora

.cpp

.cpp

.obj

.obj

.obj

.obj

.exe

Plik

i źró

dłow

eP

liki b

iblio

tecz

ne

.h

.h

.h

.h

Pliki tekstowe Pliki półskompilowane Plik binarny

Page 4: Struktura programu   dyrektywy preprocesora

Zastępowanie tekstów : #define

#define ROZMIAR 150

#define moje cena_zakupu – cena_sprzedazy

#define EPS 3.5E-8

........

#undef EPS // usunięcie definicji

#define EPS 1.5E-8

Page 5: Struktura programu   dyrektywy preprocesora

Makrogeneracja

#define Makro1(x) x = sin(x) + 3 * x;

..........................

double akr = 2.544;

Makro1(akr) // akr = sin(akr) + 3 * akr;

//

#define Makro2(x, y) x = x + y - 1;

..........................

double alfa = -12.74, beta = 0.21;

Makro2(alfa, beta) // alfa = alfa + beta - 1

Page 6: Struktura programu   dyrektywy preprocesora

Kompilacja warunkowa

#if wyrażenie_stałe_1

tekst_źródłowy_1

#elif wyrażenie_stałe_2

tekst_ źródłowy_2

...........................

#else

tekst_ źródłowy_n

#endif

Page 7: Struktura programu   dyrektywy preprocesora

Test zdefiniowania

#defined identyfikator// 1 : gdy identyfikator był już zdefiniowany // 0 : gdy identyfikator jest nie zdefiniowany

#if defined identyfikator

/* równoważne */

#ifdef identyfikator

#if ! defined identyfikator

/* równoważne */

#ifndef identyfikator

Page 8: Struktura programu   dyrektywy preprocesora

#define WersjaProbna

//

#ifdef WersjaProbna

. . . . . . . . . . . . . . . . . . . .

#else

. . . . . . . . . . . . . . . . . . . .

#endif

Page 9: Struktura programu   dyrektywy preprocesora

Polecenia dla kompilatora : #pragma

#pragma message "WersjaProbna" // podczas kompilacji

#pragma once // jednokrotne dołączenie pliku

Page 10: Struktura programu   dyrektywy preprocesora

Funkcja main

void main( void ){ ... }

void main ( ){ ... }

int main ( ){ ..... return 0;}

Page 11: Struktura programu   dyrektywy preprocesora

void main ( int liczba_slow,

char *tabela_slow [ ] ){ ... }

PROG RAZ DWA TRZY

liczba_słów : 4

R A

O GP R

Z

D W A

T R Z Y

0

0

0

0

tabela_słów

Param, ConvTest

Page 12: Struktura programu   dyrektywy preprocesora

Struktury danych

Struktura danych określa układ powiązań

występujących w pewnym zestawie danych.

• tablice• struktury (unie)

Page 13: Struktura programu   dyrektywy preprocesora

Tablice

Ciąg elementów tego samego rodzaju.

Page 14: Struktura programu   dyrektywy preprocesora

Tablice jednowymiarowe

typ identyfikator [ rozmiar ] ;

typ : liczbowy, znakowy, wskaźnikowy lub

typ struktury

rozmiar : wyrażenie stałe,

o wartości większej od zera

( w gcc wyrażenie całkowitoliczbowe )

Page 15: Struktura programu   dyrektywy preprocesora

int TAB[5]; // 0, 1, 2, 3, 4

TAB

const int sumy = 50, iloczyny = 120;

float WYNIKI[ 2 * (sumy + iloczyny)];

int i;

i = TAB[3];

// TAB + 3 * sizeof int

0 1 2 3 4

Page 16: Struktura programu   dyrektywy preprocesora

WYNIKI[i + 2] = WYNIKI[i] +

WYNIKI[i + 1];

//

double TAB_DANYCH [ 7 ] ;

for (int ix = 0; ix < 12; ++ix )

TAB_DANYCH [ ix ] = 48.74 ;

// ?

Page 17: Struktura programu   dyrektywy preprocesora

// wartości początkowe

typ identyfikator[rozmiar] = {lista_ wartości};

lista_wartości : wyrażenia stałe

long MM[3] = { 154835L, 337782L, 0L };

/*

MM[0] == 154835,

MM[1] == 33782,

MM[2] == 0

*/

Page 18: Struktura programu   dyrektywy preprocesora

const float F1 = 3.5E7F, F2 = 33.E8F;

float DANE[ ] = { F1 + F2, F1 / (F1 - F2)};

/* tablica DANE ma 2 elementy */

double PQ[150] = { 1.5, 3.8, 3.8, 2.7 };

/* PQ[0] == 1.5, PQ[1] == 3.8, PQ[2] == 3.8,

PQ[3] == 2.7, pozostałe elementy == 0 */

double Empty[1200] = {0}; //

zerowanie

Page 19: Struktura programu   dyrektywy preprocesora

char NN[5] = { "alfa" }; // NN[4] == 0char MM[4] = { "beta" }; // błąd, tablica

// zbyt mała

int i = 1, j = 2, k;int *WW[3] = { &i, &j };WW[2] = & k;*WW[2] = *WW[0] + *WW[1]; // k == 3

char *TYDZIEN[ ] = { "pon", "wto", "śro", "czw", "pią", "sob",

"nie" };

Page 20: Struktura programu   dyrektywy preprocesora

Zapisy *TAB i TAB [ 0 ] są równoważne.

char bufor[8];char *pp;pp = bufor; /* przypisania pp = & bufor[0]; równoważne */

*( TAB + 4 ) i TAB [ 4 ] są równoważne

const int ele = 25;short TS[ele];int TI[ele];double TD[ele];for (int i = 0; i < ele; ++i ){ *(TS + i) = 1; *(TI + i) = 1; *(TD + i) = 1.0; }

Page 21: Struktura programu   dyrektywy preprocesora

//wczytywanie elementów tablicy jednowymiarowej

int TabLicz [ 125 ];for (int i = 0; i < 125; ++i)

scanf("%d", &TabLicz[ i ]);

double Rzeczywiste [ 12 ];for (i = 0; i < 12; ++i)

scanf("%lf", &Rzeczywiste[ i ]);

long A[5];int obszar, element, elementow;obszar = sizeof A; // == 20element = sizeof A[0]; // == 4elementow = sizeof A / sizeof A[0]; // == 5

Page 22: Struktura programu   dyrektywy preprocesora

• rozszerzenia gcc

int dl;

scanf("%d", &dl);

double Tab[ dl ]; // nie można inicjować

int T[5] = { 3, [2] = 5, [4] = 2 };

for (int i = 0; i < 5; ++i)

printf("\t%d", T[i]);

// 3 0 5 0 2

Z4-9, TabDemol

Page 23: Struktura programu   dyrektywy preprocesora

Tablice wielowymiarowe

float MACIERZ[10][20];/* 10 wierszy, 20 kolumn */MACIERZ[nw][nk]

const int kwa = 30;long KWADRAT[kwa][kwa];

for (int i = 0; i < kwa; i ++)for (int j = 0; j < kwa; j ++) KWADRAT [ i ] [ j ] = i == j ? 0 : 1;/* główna przekątna zostanie wyzerowana, pozostałe elementy == 1 */

Page 24: Struktura programu   dyrektywy preprocesora

int BB[2][3] = { { 1, 2, 3} , {4, 5, 6} };/* BB[0][0] == 1, BB[0][1] == 2, BB[0][2] == 3 BB[1][0] == 4, BB[1][1] == 5, BB[1][2] == 6 */ float CC[3][2] = { { 8.5 } , { 3.2 } };/* CC[0][0] == 8.5, CC[0][1] == 0 CC[1][0] == 3.2, CC[1][1] == 0 CC[2][0] == 0 , CC[2][1] == 0 */

long LL[2][3];sizeof LL; // 24sizeof LL[0]; // 12sizeof LL[0][0]; // 4

Page 25: Struktura programu   dyrektywy preprocesora

// wczytywanie macierzy wierszami

const int Wie = 10, Kol = 5;

int MM [ Wie ][ Kol ];

for (int i = 0; i < Wie; ++i)

for (int j = 0; j < Kol; ++j)

scanf("%d", & MM[ i ][ j ];

//

int ile = Wie * Kol, k;

int *p = &MM[0][0];

k = 0;

while (k++ < ile)

scanf("%d", p++);

Page 26: Struktura programu   dyrektywy preprocesora

float TTT[5][10][20];

/* tablica trójwymiarowa składająca się z

5-ciu macierzy o 10 wierszach

i 20 kolumnach każda */

for (int mac = 0; mac < 5; mac ++)

for (int wie = 0; wie < 10; wie ++)

for (int kol = 0; kol < 20; kol ++)

TTT[mac][wie][kol] = 1.0F;

Z0-23,TopBottom, MatMul, CyBuff, Sort

Page 27: Struktura programu   dyrektywy preprocesora

Przetwarzanie tekstów

Definiowanie tekstów

char *Litery = "ABC";

0x41 0x42 0x43 0x00

Page 28: Struktura programu   dyrektywy preprocesora

char *Napis = "Waniki.";// tekst stały

*(Napis + 1) = 'y'; // błąd

char Tekst[16] = { "Pomołka." };

// kopiowanie tekstu stałego do tablicy

Tekst[3] = 'y'; // poprawnie

*(Tekst + 3) = 'y'; // poprawnie

Page 29: Struktura programu   dyrektywy preprocesora

Przetwarzanie tekstów

char Napis [ 16 ] = "Kopytko.";

int i = 0;

while( Napis[i] != 0 )

{

if ( Napis[i] == 'o')

Napis[i] = 'a';

++i;

}

Page 30: Struktura programu   dyrektywy preprocesora

//

char *ptr = Napis;

while( *ptr != 0 )

{

if ( *ptr == 'o')

*ptr = 'a';

++ptr;

}

Szyfr

Page 31: Struktura programu   dyrektywy preprocesora

Biblioteka string.h

char* strcat( char* Destination, const char* Source );

// Dodaje (konkatenuje) łańcuchy Source // i Destination. Wynik: wskaźnik// łańcucha, do którego dołączany jest tekst

char* strncat( char* Dest, const char* Source, size_t Count );

// Analogicznie jak strcat lecz kopiuje // nie więcej niż Count znaków

Page 32: Struktura programu   dyrektywy preprocesora

char* strchr( const char* String, int C );

// Wyszukuje pierwsze wystąpienie znaku C // w łańcuchu String . Wynik: wskaźnik // znalezionego znaku bądź NULL// jeśli nie znaleziono

char* strrchr( const char* String, int C );

// Analogicznie jak strstr lecz od końca

Page 33: Struktura programu   dyrektywy preprocesora

char* strpbrk( const char* String, const char* CharSet );

// Wyszukuje pierwsze wystąpienie jednego// ze znaków z łańcucha CharSet// w łańcuchu String

size_t strlen( const char* String );

// Oblicza długość łańcucha String

Page 34: Struktura programu   dyrektywy preprocesora

int strcmp( const char* String1, const char* String2 );

// Porównanie dwóch łańcuchów. Wynik funkcji:< 0 - String1 mniejszy niż String2= 0 - String1 i String2 identyczne> 0 - String1 większy niż String2

int strncmp( const char* String1, const char* String2, size_t Count );

// Analogicznie jak strcmp lecz nie więcej// niż Count znaków

Page 35: Struktura programu   dyrektywy preprocesora

char* strcpy( char* Destination, const char* Source );

// Kopiuje łańcuch Source do Destination // usuwając poprzednią wartość Destination. // Wynik: wskaźnik łańcucha, do którego // kopiowany jest tekst

char* strncpy( char* Dest, const char* Source, size_t Count );

// Analogicznie jak strcpy lecz nie więcej// jak Count znaków

Z2-12

Page 36: Struktura programu   dyrektywy preprocesora

Struktury

struktura : zestaw pólpole : dana lub struktura danych

struct typ_struktury { lista_pól }

lista_identyfikatorów ;struct{ int szerokosc; int dokladnosc; char konwersja;} wzorzec;

struct{ float re; float im;} z0, z1, z2;

Page 37: Struktura programu   dyrektywy preprocesora

struct osoba{ char *imie; char *nazwisko; int rok_urodzenia;};struct osoba Ala, Ola, Ela;

struct adres{ char miejscowosc[16]; char ulica[32]; int dom; int mieszkanie;};adres AAla, AOla, AEla;

Page 38: Struktura programu   dyrektywy preprocesora

Ala imie

nazwisko

rok_ur 1990

"Alicja"

"Nowak"

AAla

16

32

5

11

"Koło"

"Mała"

miejscowosc

ulica

nr_domu

nr_mieszkania

Page 39: Struktura programu   dyrektywy preprocesora

struct silnik{ float pojemnosc; char *paliwo;};

struct samochod{ struct { char *producent; char *model; } marka; silnik naped;};

Page 40: Struktura programu   dyrektywy preprocesora

struct S1{ int i; float f;} es1;

struct S2{ int i; long l;} es2;

struct S1 *wst1;S2 *wst2;

Page 41: Struktura programu   dyrektywy preprocesora

wst1 = &es1;wst2 = &es2;wst1 = &es2; // błąd,

// nieodpowiedni typ strukturywst2 = wst1; // błąd,

// nieodpowiedni typ wskaźnika

struct AZ{ char z1; char z2; int lz;} p1 = { 'a', 'b', 37 }, p2 = { 'x', 'y', 35 };

AZ p3 = { 'k', 'l', 36 };

Page 42: Struktura programu   dyrektywy preprocesora

Dostęp do pól :

identyfikator .referencja .wskaźnik ->

struct podpis{ char *Imie; char Inicjal; char *Nazwisko;};

podpis st, *wst = &st ;st . Imie = "Andrzej" ;wst -> Inicjal = 'K' ;

Page 43: Struktura programu   dyrektywy preprocesora

Przypisanie struktur

podpis AK = {"Anna", 'M', "Kowalska"}, NN;

NN = AK ; // gdy typy równe

// NN . Imie = AK . Imie ;

// NN . Inicjal = AK . Inicjal ;

// NN . Nazwisko = AK . Nazwisko ;

// AK.Imie i NN.Imie wskazują

// ten sam tekst stały

// AK.Nazwisko i NN.Nazwisko wskazują

// ten sam tekst stały

Page 44: Struktura programu   dyrektywy preprocesora

char PiekneImie[20] = { "Teofil" };

AK.Imie = PiekneImie;

NN = AK; // kopiowanie tablicy

AK.Imie[0] = 'M';

printf("%s, %s", AK.Imie, NN.Imie);

// Meofil, Teofil

Page 45: Struktura programu   dyrektywy preprocesora

int T1[3], T2[3] = { 1, 2, 3 };

T1 = T2; // błąd

//

struct TT

{

int T[3];

};

TT T1, T2 = { { 1 , 2, 3} };

T1 = T2; // poprawnie

// ale

int a = T1.T[1];

Page 46: Struktura programu   dyrektywy preprocesora

Tablice struktur

struct kartoteka{ char nazwa [ 16 ] ; int liczba ;} komputery [ 100 ] ;

kartoteka drukarki [ 100 ] ;

Page 47: Struktura programu   dyrektywy preprocesora

int ile_k = 0, ile_d = 0;

for ( int i = 0 ; i < 100 ; ++i ){ ile_k += komputery [ i ] . liczba ; ile_d += drukarki [ i ] . liczba ;}

Page 48: Struktura programu   dyrektywy preprocesora

struct zakres{ float poczatek; float koniec;} fm;

sizeof fm; // == 8sizeof (zakres); // == 8

typedef struct { int p1; float p2; } wynik;wynik w1, w2, w3;

EwTel

Page 49: Struktura programu   dyrektywy preprocesora

Listy

struct lista

{

char etykieta[8];

struct lista *poprzedni;

struct lista *nastepny;

} E0 = { "AA", NULL, NULL };

lista E1 = { "BB" },

E2 = { "CC", NULL, NULL };

E0.nastepny = &E1;

E1.nastepny = &E2;

E2.poprzedni = &E1;

E1.poprzedni = &E0; RevList, CyBuff

Page 50: Struktura programu   dyrektywy preprocesora

Unie

Wszystkie pola w tym samym obszarze pamięci.

Page 51: Struktura programu   dyrektywy preprocesora

union{ char p1 ; // 1 bajt int p2 ; // 4 bajty long long p3 ; // 8 bajtów} u1; // 8 bajtów

u1.p1 = 'A'; // pola p2, p3 //

niezdefiniowaneu1.p2 = 1357; // pola p1, p3

// niezdefiniowaneu1.p3 = 15432678LL; // pola p1, p2

// niezdefiniowaneunion umaszczenie{

char kolor_pior [ 64 ] ;char kolor_siersci [ 64 ] ;

}

Page 52: Struktura programu   dyrektywy preprocesora

struct artykuł{ char autor[64]; char tytul[64]; int rok; union { struct { char tytuł[64]; int numer; int strona; } czasopismo; struct { char nazwa[64]; } konferencja; } miejsce;} a1;

// string.hstrcpy ( a1.miejsce.konferencja.nazwa, "Polman" );

Page 53: Struktura programu   dyrektywy preprocesora

Dynamiczny przydział pamięci

new delete

Zmienne

int *p;

p = new int;

delete p;

Page 54: Struktura programu   dyrektywy preprocesora

Tablice

float *taba = new float [ 150 ];delete [ ] taba;

int rozmiar;scanf( "%d" , &rozmiar );

long *Tablica = new long [ rozmiar ];

Page 55: Struktura programu   dyrektywy preprocesora

double *TD1 = new double[150];

double x = TD1[53]; // poprawnie

//

double *TD2 = new double [20][30];// błąd

double *TD2 = new double [600]; // ok

double y = TD2[3][21]; // błąd

double z = TD2[3 * 30 + 21]; // ok

Page 56: Struktura programu   dyrektywy preprocesora

tablica dwuwymiarowa - tablica wierszy

int** WW = new int*[20];

for (int i = 0; i < 20; ++i)

WW[i] = new int[30];

 

WW[4][5] = 17;

int x = WW[4][5]; // poprawne

Page 57: Struktura programu   dyrektywy preprocesora

WW

0

19

0 29

. . .

0 29

. . .

.

.

.

.

.

.

Page 58: Struktura programu   dyrektywy preprocesora

tablica dwuwymiarowa nierównomierna

int DL [ ] = {5, 15000, 7, 2000, 3};

int N = sizeof(DL) / sizeof(DL[0]);

int** WW = new int*[N];

for (int i = 0; i < N; ++i)

WW[i] = new int[DL[i]];

 

WW[1][12547] = 17;

int x = WW[1][12547];

Page 59: Struktura programu   dyrektywy preprocesora

Struktury

struct pies

{

char *smycz;

char *obroza;

char *pies_wlasciwy;

};

pies *Morus;

Morus = new pies;

delete Morus; TopBottomP, EwRowDyn