350 likes | 476 Views
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; }
E N D
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 miejsceprogramu ( zasięg globalny ) Identyfikator o zakresie lokalnym : zasięg od miejscawystąpienia deklaracji do końca bloku, w którym deklaracja wystąpiła
{ int i; ..... {.... int j; .... { z.i int n; ..... z.nz.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 } voidmain(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 // wzakresie 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) { staticint ct = 0; return++ct; } int numer; numer = Licznik(); // numer == 1 .................. numer = Licznik(); // numer == 2 .................. numer = Licznik(); // numer == 3
Zmienne dynamiczne : na stosie programu auto register registerint 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 oliczbę przeczytanych lub zapisanych bajtów Otwarcie pliku : wskaźnik pliku FILE* Zamknięcie pliku
32H 35H 20H 19H 0H 0H 0H • ·pliki tekstowe i binarne • => • - plik tekstowy • - plik binarny
#include <stdio.h> 3 grupy funkcji : ·fopen, fclose, fcloseall : otwieranie i zamykanie plików ·ftell, fseek, rewind, feof: ustalanie aktualnejpozycji pliku, wykrywanie końca pliku ·fread, fwrite, fgetc, fputc, fgets, fputsfscanf, fprintf : odczyt i zapis danych
fopen D. FILE* fopen(constchar* nazwa, constchar* 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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, maksymalnieliczba-1 znaków W. napis lub NULL P. #include <stdio.h> 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 <stdio.h> 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 <stdio.h> 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, constchar *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 <stdio.h> void main(void) { ... int kod_waluty = 15; float kurs_biezacy = 0.23547; 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 <stdio.h> 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; structpozycja { doublewspolrzedne[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 <stdio.h> void main(void) { ... long double pomiary[wie][kol]; ... FILE *archiwum = fopen("ARCH.TAB","wb"); fwrite(pomiary, sizeof(pomiary), 1, archiwum); ... } PaNiePa, Split, BookCode, BitMap