Pracownia programowania (C/C++). Zaoczne inżynierskie (INK). Ćwiczenie 3.
Zagadnienia: Wskaźniki i tablice. Dostęp do tablic wielowymiarowych. Zmienne i tablice dynamiczne. Wskaźniki tablic.
1. Opracować funkcje, które inicjują losowymi liczbami całkowitymi należącymi do przedziału [-100, 100]:
a) tablicę jednowymiarową int tab1[N0], gdzie N0 – stała w programie; prototyp funkcji:
void init(int *tab, int w0);
b) tablicę dwuwymiarową int tab2[N0][N1], gdzie N0, N1 – stałe w programie; prototyp funkcji: void init(int *tab, int w0, int w1);
c) tablicę trzywymiarową int tab3[N0][N1][N2], gdzie N0, N1, N2 – stałe w programie;
prototyp funkcji: void init(int *tab, int w0, int w1, int w2).
2. Wykorzystując operator new przydzielić dynamicznie pamięć zmiennym typu char, int, long, float, double oraz zapamiętać ich adresy w odpowiednich wskaźnikach. W przypadku, gdy alokacja pamięci powiedzie się zainicjować zmienne danymi wprowadzanymi z klawiatury (np. char *z1 = new char; if (z1!=NULL) scanf(”%c”, z1)). Wyprowadzić wartości zmiennych na ekran. Przed zakończeniem programu zwolnić przydzieloną pamięć.
3. Opracować funkcję, która wyznacza adres wskazywany przez wskaźnik void far *p (wykorzystać FP_OFF i FP_SEG). Adres fizyczny jest obliczany ze wzoru: adres = 16seg + off. Prototyp funkcji: unsigned long adres(void far *p);
4. Opracować funkcję zwracającą wskaźnik na ustalony adres (wykorzystać MK_FP).
Utworzyć wskaźnik na początek pamięci ekranu w trybie znakowym (adres 0xB8000 - wskaźnik 0xB800:0x0000). Wstawić daną do pamięci ekranu.
Prototyp funkcji: void far * wsk(unsigned segment, unsigned offset);
5. Opracować funkcje:
a) wstawiającą daną typu unsigned char do pamięci wskazywanej przez void far *p;
b) odczytującą daną typu unsigned char z pamięci wskazywanej przez void far *p.
6. Zdefiniować w programie tablicę double w[5] = {1.0, 2.0, 3.0, 4.0, 5.0} oraz wskaźnik cwsk na tablicę 5 elementów typu double (uwaga: operacja cwsk++ prowadzi do przesunięcia wskaźnika o 5 elementów typu double). Ustawić wskaźnik cwsk na adres pierwszego
elementu tablicy w[5]. Wykorzystując wskaźnik cwsk wyprowadzić zawartość tablicy na ekran.
7. Opracować program, który utworzy dynamicznie tablicę liczb całkowitych o rozmiarze n wczytywanym z klawiatury.
a) Utworzyć tablicę t1 za pomocą operatora new.
b) Utworzyć tablicę t2 za pomocą funkcji malloc.
Jeżeli operacja przydziału pamięci dla t1 i t2 zakończyła się pomyślnie (wskaźniki t1 i t2 są różne od NULL), to zainicjować tablicę t1 losowymi liczbami należącymi do przedziału [0, 100). Znaleźć minimalny i maksymalny element w tablicy. Wyprowadzić zawartość tablicy t1, a także znalezione minimum i maksimum, na ekran. Przekopiować tablicę t1 do t2 wykorzystując standardową funkcję memmove lub memcpy. Wyprowadzić zawartość
tablicy t2 na ekran. Przed zakończeniem programu zwolnić pamięć przydzieloną t1 i t2.
8. Opracować funkcje:
a) kopiującą n bajtów pamięci ekranu, zaczynając od adresu określonego przez wskaźnik 0xB800:ofs, do bufora o początku określonym przez wskaźnik void far *buf_dest i rozmiarze co najmniej równym n; prototyp funkcji:
void kopiuj_z_ekranu(unsigned n, unsigned ofs, void far *buf_dest);
b) wstawiającą n bajtów z bufora, o początku określonym przez wskaźnik void far *buf_src, do pamięci ekranu o początku określonym przez wskaźnik 0xB800:ofs; prototyp funkcji:
void wstaw_z_bufora(unsigned n, void far *buf_src, unsigned ofs).