Podstawy Programowania - Ćwiczenia 5


ZasadyĆw1, Ćw2, Ćw3, Ćw4, Ćw5, Ćw6, Ćw7, Ćw8, Ćw9, Ćw10, Ćw11, Ćw12, Ćw13
Prowadzący: Rafał Witkowski
Temat: Stos i kolejka, ONP

Procedury i funkcje

Procedury i funkcje to takie kawałki programów, które mogą być wywoływane z innych miejsc w programie dowolną liczbę razy. Czasem są nazywane po prostu podprogramami.
Kształt ich zostanie omówiony dokładnie na zajęciach

Definicje

W języku C/C++ można na początku programu definiować dowolnie pewne stałe, ale też wyrażenia, które następnie można wykorzystywać w programie. Robi się to przy pomocy polecenia #define w nagłówku programu.
Przykład deklaracji i użycia stałych:
#define PI 3.14
#define ogr 1000

int main()
{
int tablica[ogr]; // Powstanie tablica ograniczona przez 1000
int r = 4;
double pole_kola; // Zadeklarowanie zmiennej zmiennoprzecinkowej (ułamkowej)
pole_kola = r*r*PI; // Pod PI zostanie podstawione 3,14 i obliczone zostanie pole koła o promieniu r
return 0;
}
Przykład deklaracji wyrażenia i jego użycia:
#define FOR(i,n) for(int i=0; i<n; i++)
// powyżej zdefiniowana została inna struktura pętli for, którą będzie można wykorzystać w kodzie
// Np. szkielet pisanych przez nas programów mógłby wyglądać następująco:

int main()
{
int d; // deklaracja zmiennej oznaczającej liczbę zestawów danych
scanf("%d",&d); // sczytwanie liczby zestawów danych
FOR(i,d) // pętla sterująca programem - wykonywana tyle razy, ile jest zestawów
{ // Powyższa pętla zostanie podmienione przez preprocesor na dokładnie to samo,
// co znajdowało się tu wcześniej w kodzie
//---------------------------------------------------------------------------------------------
// Tu powinien znajdować się właściwy kod programu rozwiązujący zadanie dla pojedynczego testu
//---------------------------------------------------------------------------------------------
}
  return 0;
}

Stos

Stos jest podstawową strukturą danych wykorzystywaną w informatyce. Zasada jego działania jest bardzo prosta: im coś później na stos zostało odłożone, tym wcześniej z niego zostanie zdjęte. Jak w każdym stosie znanym nie tylko z informatyki, ale także z życia - żeby zdjąć coś co jest pod spodem (trafiło na stos wcześniej) trzeba najpierw zdjąć to, co jest na jego wierzchu (trafiło na stos później). Angielski skrót na stos to LIFO (last in first out).
Dwoma operacjami, które są na stosie dopuszczalne są:
push(x) - dodanie elementu x do stosu
pop() - sczytanie elementu ze stosu

Implementacja

Stos można zaimplementować przy pomocy tablicy, której długość będzie maksymalnym rozmiarem stosu. Oprócz tablicy musimy mieć zmienną s która będzie pamiętała ile na stosie jest danych elementów.
Deklaracja zmiennych (tylko tych niezbędnych do wyrzystywania stosu) oraz procedury push i pop wyglądałyby w pascalu następująco:

int stos[1001], s;

void push(int x)
{
stos[s] = x;
s++;
}

int pop()
{
if (s==0)
{
printf("BŁĄD");
return 0;
}
s--;
return stos[s];
}

Zadanie 1

Zadanie 309 - treść jest tutaj.

Kolejka

Kolejka jest również jedną z podstawowych strukturą danych wykorzystywanych w informatyce. Zasada jej działania jest bardzo prosta: im coś później na kolejke zostało odłożone, tym później z niej zostanie zdjęte. Jak w każdej kolejce znanej nie tylko z informatyki, ale także z życia - każdy musi poczekać na swoją kolej i przepuścić wszystkich, którzy przyszli przed nim. Angielski skrót na kolejkę to FIFO (first in first out).
Dwoma operacjami, które są na kolejce dopuszczalne są:
push(x) - dodanie elementu x do kolejki
pop() - sczytanie elementu z kolejki

Implementacja

Kolejkę można zaimplementować przy pomocy tablicy, której długość będzie maksymalnym rozmiarem kolejki (największą liczbą elementów mogących się znajdować naraz w kolejce). Oprócz tablicy musimy mieć zmienne pk i kk  oznaczające odpowiednio początek i koniec kolejki.
Deklaracja zmiennych (tylko tych niezbędnych do wyrzystywania kolejki) oraz procedury push i pop wyglądałyby w pascalu następująco:

#define rozmiar_kolejki 1000

int kolejka[rozmiar_kolejki];
int pk, kk;

void push(int x)
{
 kolejka[kk] = x;
kk = (kk + 1) % rozmiar_kolejki; // % - dzielenie modulo
}

int pop()
{
if (pk==kk)
{
printf("BŁĄD");
return 0;
}
int pom;
pom = kolejka[pk];
pk = (pk + 1) % rozmiar_kolejki;
return pom;
}

Zadanie 2

Rowziąż zadanie ppr6. Treść jest tutaj.