Download - Zakres i zasięg deklaracji Zakres : obszar programu, w którym identyfikator może być użyty
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
{ int i;
.....
{ ....
int j;
....
{ 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 == 1
..................
numer = Licznik(); // numer == 2
..................
numer = Licznik(); // numer == 3
Zmienne dynamiczne : na stosie programu
auto register
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 20H
19H 0H 0H 0H
#include <stdio.h>
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 <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, maksymalnie liczba-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, 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 <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;
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 <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