Zakres i zasięg deklaracji Zakres : obszar programu, w którym identyfikator może być użyty zakres globalny : cały program zakres lokalny : definicja pojedynczej funkcji
int i, j, k; float X, Y; int F1(int a, int b) { char c1, c2; float B; } int F2(float Z1, float Z2, char cp) { int A1[15]; long A2[15][15]; float B1, B2, B3; } void main(void) { int m, n, p, q; float V1, V2, V3; long T1[15][15], T2[15][15]; }
zakres globalny : i, j, k, X, Y, F1, F2 zakres lokalny w funkcji F1 : a, b, c1, c2, B zakres lokalny w funkcji F2 : Z1, Z2, cp, A1, A2, B1, B2, B3 zakres lokalny w funkcji main : m, n, p, q, V1, V2, V3, T1, T2
Zasięg deklaracji : te fragmenty programu, w których obowiązuje deklaracja Identyfikator o zakresie globalnym : dowolne miejsce programu ( zasięg globalny ) Identyfikator o zakresie lokalnym : zasięg od miejsca wystąpienia deklaracji do końca bloku, w którym deklaracja wystąpiła
{inti;..... {.... intj;.... { z.i int n;..... z.n z.j } for(int k=0;.. ) {...} z.k }
Przesłanianie identyfikatorów : deklaracja lokalna przesłania deklarację globalną int i = 5; // i == 5 int F1 (int n) {int i = 7; // i == 7 return i + n; } int F2 (int m) {return i + m; // i == 5 } void main(void) {int k,z,i = 0; // i == 0 k = F1(0); // k == 7 z = F2(0); } // z == 5
Redefinicja identyfikatora w tym samym zakresie : błąd float eps = 0.001;... double eps = 0.05; // błąd - redefinicja // w zakresie globalnym... void main(void) { long k1;... int k1; // błąd - redefinicja // w zakresie lokalnym... }
Dostęp do obiektów globalnych const int max = 15750; // zakres globalny int MAX(int TAB[ ], int rozmiar) { int max = TAB[0]; // zakres lokalny for (int i = 1 ; i < rozmiar ; ++i) if (::max > TAB[i] && // zakres globalny max < TAB[i]) // zakres lokalny max = TAB[i]; // zakres lokalny return max; // zakres lokalny }
Lokalizacja zmiennych zmienne statyczne zmienne dynamiczne zmienne automatyczne zmienne rejestrowe Zmienne statyczne (ustalona wartość początkowa) : zmienne o zakresie globalnym zmienne lokalne poprzedzone słowem static
int Licznik(void) { static int ct = 0; return ++ct; } int numer; numer = Licznik(); // numer == numer = Licznik(); // numer == numer = Licznik(); // numer == 3
Zmienne dynamiczne : na stosie programu autoregister register int i, rozmiar; for (i = 0; i < rozmiar; ++ i) T[i] = i; struct lista { int cecha; lista *nastepny; }; int Sprawdz(register lista *wsk, int wzor) { while (wsk != NULL) { if (wsk->cecha == wzor) return 1; wsk = wsk->nastepny; } return 0; }
Pliki dyskowe Plik dyskowy : ciąg pozycji bajtowych z jedną pozycją aktualną Zapis lub odczyt danych : zawsze od pozycji aktualnej, przesunięcie tej pozycji w kierunku końca pliku o liczbę przeczytanych lub zapisanych bajtów Otwarcie pliku : wskaźnik pliku FILE* Zamknięcie pliku
pliki tekstowe i binarne 25=> - plik tekstowy - plik binarny 32H 35H 20H19H 0H 0H 0H
#include 3 grupy funkcji : fopen, fclose, fcloseall : otwieranie i zamykanie plików ftell, fseek, rewind, feof: ustalanie aktualnej pozycji pliku, wykrywanie końca pliku fread, fwrite, fgetc, fputc, fgets, fputs fscanf, fprintf : odczyt i zapis danych
fopen D. FILE* fopen(const char* nazwa, const char* tryb); F. Otwarcie pliku nazwa tryb : r : odczyt istniejącego pliku w : utworzenie pliku do zapisu a : zapis na końcu istniejącego pliku r+ : zapis lub odczyt istniejącego pliku w+ : utworzenie pliku do zapisu i odczytu a+ : zapis lub odczyt na końcu istniejącego pliku dodatkowo t : plik tekstowy b : plik binarny
W. Wskaźnik pliku lub NULL P. #include void main(void) {... FILE *spis; spis = fopen("SPIS.TXT","rt+")); if (spis == NULL) printf("\nNie można otworzyć pliku.");... }
fclose D. int fclose ( FILE *plik ) ; F. Zamknięcie pliku W. 0 lub EOF P. #include void main(void) {... FILE *personel = fopen ( "PER.TXT", "rt" );... fclose ( personel );... }
fcloseall D. int fcloseall ( void ) ; F. Zamkniecie wszystkich otwartych plików dyskowych W. Liczba zamkniętych plików lub EOF
fseek D. int fseek (FILE *plik, long pozycja, int cel); F. Ustalenie aktualnej pozycji pliku cel : SEEK_SET - początek pliku, SEEK_CUR - aktualna pozycja pliku SEEK_END - koniec pliku pozycja : +/-, od 0, można poza koniec pliku W. 0 : poprawnie, !0 : błąd
P. #include void main(void) {... long pp; FILE *opis = fopen("OP1.DOC","rt+"); fseek(opis, 0L, SEEK_END);... // zapis na końcu pliku fseek(opis, 0L, SEEK_SET);... // zapis na początku pliku pp = 15453l; fseek(opis, pp, SEEK_CUR);... // odczyt z pliku... }
rewind D. void rewind ( FILE *plik ); F. Ustalenie aktualnej pozycji na początku pliku P. #include void main(void) {... FILE *roboczy = fopen("R1.DAT","rt+"); fseek(roboczy, 0L, SEEK_END);... // zapis na końcu pliku rewind(roboczy); // początek pliku... }
feof D. int feof ( FILE *plik ); F. Odczyt stanu znacznika końca pliku W. !0 : napotkano EOF, przeciwnie 0 P. #include void main(void) {... FILE *plik1 = fopen("P1.MAN","rt");... // odczyt z pliku if (feof(plik1)!= 0) printf("\nKoniec pliku.");... }
fgetc D. int fgetc ( FILE *plik ); F. Odczyt kolejnego znaku W. Liczba całkowita 000 | kod_znaku P. #include void main(void) {... char cc; FILE *info = fopen("INF.DOC","rt"); cc = fgetc(info);... }
fputc D. int fputc ( int znak, FILE *plik ) ; F. Zapis kolejnego znaku (liczba całkowita : 000 | kod) W. znak lub EOF P. #include void main(void) {... char cc = 'K'; FILE *dane = open("DANE.DOC","rt+");... fputc(cc, dane);... }
fgets D. char* fgets ( char *napis, int liczba, FILE *plik) ; F. Odczyt ciąg znaków, maksymalnie liczba-1 znaków W. napis lub NULL P. #include void main(void) {... char nazwisko[16]; FILE *teczka = fopen("TECZ.DOC","rt"); fgets(nazwisko, 16, teczka);... }
fputs D. int fputs ( char *napis, FILE *plik ); F. Zapis ciągu znaków W. Ostatni zapisany znak lub EOF P. #include void main(void) {... char *spis = "Spis treści"; FILE *dok = fopen("DOK1.DOC","rt+"); fputs(spis, dok);... }
fscanf D. int fscanf(FILE *plik, const char *format, wskaźnik, wskaźnik,...); F. Odczyt ciągów znaków i konwersji na wartości binarne (podobnie jak scanf) W. Liczba wczytanych ciągów znaków lub EOF
P. #include void main(void) {... int sztuki; float cena; FILE *towar = fopen("SPIS_TOW.DOC","rt");... fscanf(towar, "%d%f", &sztuki, &cena);... }
fprintf D. int fprintf ( FILE *plik, const char *format, wyrażenie, wyrażenie,...); F. Zapis ciągów znaków zadanych za pomocą wyrażeń (podobnie jak printf) W. Liczba zapisanych bajtów lub EOF
P. #include void main(void) {... int kod_waluty = 15; float kurs_biezacy = ; FILE *tabela_kursow = fopen("KURSY.TAB","wt");... fprintf(tabela_kursow, "\n%3d\t%8.3f", kod_waluty, kurs_biezacy);... }
fread D. int fread (wskaźnik, int rozmiar, int liczba, FILE *plik); F. Odczytanie zadanej liczby struktur danych, każda o długości rozmiar W. Liczba odczytanych struktur lub 0
P. #include void main(void) {... struct ksiazka { char autor[25]; char tytul[50]; } ksiazki[100];... FILE *magazyn = fopen("MAG.DOC","rt"); fread(ksiazki, sizeof(ksiazka), 100, magazyn);... }
void main(void) { int liczba _ odczytow; struct pozycja { double wspolrzedne[2]; double wysokosc; } marszruta[1000];... FILE *wycieczka = fopen("W1.DAT","rb"); fread(&liczba _ odczytow, sizeof(int), 1, wycieczka); fread(marszruta, sizeof(pozycja), liczba _ odczytow, wycieczka);... }
fwrite D. int fwrite ( wskaźnik, int rozmiar, int liczba, FILE *plik ); F. Zapis wskazanej liczby struktur danych o długości rozmiar W. Liczba zapisanych struktur lub 0
P. #include void main(void) {... long double pomiary[wie][kol];... FILE *archiwum = fopen("ARCH.TAB","wb"); fwrite(pomiary, sizeof(pomiary), 1, archiwum);... } PaNiePa, Split, BookCode, BitMap