Io-1-lab: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
MOchodek (dyskusja | edycje)
mNie podano opisu zmian
MOchodek (dyskusja | edycje)
mNie podano opisu zmian
Linia 245: Linia 245:
\cfrac{SP2}{Answer \equiv \exists_{a <= k < b} \beta(k)}
\cfrac{SP2}{Answer \equiv \exists_{a <= k < b} \beta(k)}
</math>
</math>
'''Zaproponuj program sprawdzający czy dana liczba jest pierwsza, który da się uogólnić do postaci schematu SP2.'''
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span style="font-variant:small-caps">Podpowiedź </span>
<div class="mw-collapsible-content" style="display:none">
W pierwszej kolejności można stworzyć program sprawdzający czy dana liczba jest podzielna przez liczbę z przedziału <a,b). Wówczas warunek <math>\beta</math> miałby postać:
*n % k == 0, dla  (a <= k < b)
</div>
</div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<span style="font-variant:small-caps">Rozwiązanie </span>
<span style="font-variant:small-caps">Rozwiązanie </span>
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
Plik z rozwiązaniem ([[media:io-2-lab-z3-ans.rtf|rtf]])
Można uszczegółowić bardziej przedział <a, b). Dana liczba jest liczbą pierwszą jeśli dzieli się tylko przez siebie samą i liczbę 1.
Zatem nie może być podzielna przez liczby z przedziału <2, n), gdzie n to badana liczba.
Wykorzystując pomysł podany w podpowiedzi możemy zaproponować program sprawdzający, czy dana liczba jest podzielna przez liczbę z przedziału <a, b), a dokładniej z przedziału <2, n).
 
Można zatem określić, kiedy liczba n, jest podzielna przez liczbę z przedziału <2, n):
*MaPodzielnik(n) <math>\iff \exists</math> (2 <= k < n),  n % k == 0
Program obliczający MaPodzielnik(n), może mieć postać:
 
bool MaPodzielnik(int n){
  bool Answer = False;
  int k = 2;
  while ( k < n){
    if (n % k = 0){
        Answer = True;
    }
    k = k + 1;
  }
  return Answer;
};
Program ten jest instancją schematu SP2, zatem możemy stwierdzić, że jest on poprawny.
Aby stworzyć program badający, czy liczba n jest liczbą pierwsza posłużymy się zależnością:
*Pierwsza(n) <math>\equiv \not</mant>MaPodzielnik(n)
 
bool Pierwsza(int n){
  bool Answer = False;
  int k = 2;
  while ( k < n){
    if (n % k = 0){
        Answer = True;
    }
    k = k + 1;
  }
  Answer; '''<- tutaj kończył się program MaPodzielnik(n) '''
  return !Answer;
};
Wiemy, że program MaPodzielnik(n) jest poprawny, zatem możemy stwierdzić, że program Pierwsza(n) do linijki zaznaczonej w kodzie także jest poprawny.
Jednak oba programy różnią się warunkiem końcowym. Wiemy, że Pierwsza(n) <math>\equiv \not</mant>MaPodzielnik(n),
zatem aby spełnić warunek końcowy należy wprowadzić negację zmiennej Answer (zmienna typu bool – wartości 0,1).
</div>
</div>
</div>
</div>
Linia 282: Linia 331:
==Pytania do dyskusji==
==Pytania do dyskusji==
#Jak mogłoby wyglądać stosowanie zasady „ostrz piłę” w firmie informatycznej?
#Jak mogłoby wyglądać stosowanie zasady „ostrz piłę” w firmie informatycznej?
#W jaki sposób zasada win-win może funkcjonować w relacjach kierownik projektu – programista?
#W jaki sposób zasada win-win może funkcjonować w relacjach kierownik projektu – programista?</math></div>

Wersja z 21:23, 27 lis 2006

Ćwiczenia – Wprowadzenie do przedmiotu

Wprowadzenie

Podczas wykładu „Wprowadzenie do przedmiotu”, była mowa o wielu aspektach Inżynierii oprogramowania. Większość przedstawionych zagadnień będzie przedstawiona szerzej przy okazji kolejnych wykładów (także podczas kursu „Zaawansowana inżynieria oprogramowania”). W ramach tych ćwiczeń chcielibyśmy zwrócić uwagę na jedno zagadnienie, które nie będzie już dalej omawiane – dowodzeniu poprawności programów.


Ćwiczenie 1 – Dowodzenie programu obliczającego n-ty wyraz ciągu Fibonacciego.

W ramach wykładu „Wprowadzenie do przedmiotu”, przedstawiony został przykład dowodzenia programu z wykorzystaniem niezmienników (ang. Invariants), na przykładzie programu obliczającego wartość wyrażenia n!.

Zadanie polega na udowodnieniu w analogiczny sposób programu obliczającego n-ty wyraz ciągu Fibonacciego.

Ciąg Fibonacciego jest zdefiniowany w następujący sposób:

Parser nie mógł rozpoznać (nieznana funkcja „\begin{cases}”): {\displaystyle Fib(n) = \begin{cases} 0, \mbox{dla n=0,} \\ 1, \mbox{dla n=1,} \\ F(n-1) + F(n-2) \mbox{, dla n > 1.} \end{cases} }

Badany program w języku C ma następującą postać:

int Fib(int n){
 int k, f0, f1, f2;
 k = 0; f0 = 1; f1 = 1;
 while (k != n){
   k = k + 1;
   f2 =  f0 + f1;
   f0 = f1;
   f1 = f2;
 };
 return f0;
};

Podpowiedź

Rozwiązanie


Ćwiczenie 2 – Schematy programów, których poprawność udowodnić można wykorzystując podobnie jak w przypadku programów obliczających n! i n-ty wyraz ciągu Fibonacciego.

Analizując przykłady dowodów na poprawność programu obliczającego wyrażenie n! (przedstawionego na wykładzie) oraz programu obliczającego n-ty wyraz ciągu Fibonacciego, możemy zauważyć, że przeprowadzane dowody poprawności są dość zbliżone.

Można zatem spróbować stworzyć pewne schematy (wzorce) programów, dla których jesteśmy w stanie udowodnić pewne własności, które mogą okazać się bardzo pomocne podczas dowodzenia.

Przyjrzyjmy się poniższemu schematowi (SP1):

k = p; 
Instrukcja1;     /* prawdziwy Invariant – nie zmienia ani k ani n*/
/* INV: α */
while ( k != n){
   k = k + 1;
   Instrukcja2; /* prawdziwy Invariant – nie zmienia ani k ani n*/
   /* INV: α */    
};

We wzorcu występuje niezmiennik α:

  • n>=pα

Aby, wykazać poprawność programu wystarczy udowodnić, że α jest niezmiennikiem.

Tego typu wzorce mogą ułatwić dowodzenie poprawności dłuższych programów. Jeśli potrafimy udowodnić pewne właściwości wzorca, nie musimy dowodzić ich dla konkretnego przykładu tego wzorca (w postaci konkretnego programu).

Przeanalizuj jeszcze raz program na obliczanie n-tego wyrazu ciągu Fibonacciego pod kątem przedstawionego schematu i spróbuj dopasować wzorzec SP1 do tego programu.

Podpowiedź

Rozwiązanie


Ćwiczenie 3 – Opracowanie programu sprawdzającego czy dana liczba jest pierwsza w oparciu o schemat.

W zadaniu 2 udało się opracować schemat programu, który nazwaliśmy SP1. Jeśli dany program można uogólnić do postaci schematu SP1, możemy w łatwy sposób udowodnić jego poprawność.

Możemy zatem stwierdzić, że:

SP1α

Zaproponujmy schemat (SP2) dla innego typu problemów, w postaci:

Answer = False;
k = a;
while ( k < b){
   if (β(k)){
       Answer = True;
   }
   k = k + 1;
};

Możemy stwierdzić, że prawdziwa jest implikacja:

SP2Answera<=k<bβ(k)

Zaproponuj program sprawdzający czy dana liczba jest pierwsza, który da się uogólnić do postaci schematu SP2.

Podpowiedź

Rozwiązanie