PILNE!!! 100pkt
Podaj specyfikację zadania i skonstruuj algorytmy iteracyjne w postaci schematu blokowego realizujące wypisywanie podanych ciągów całkowitych (specyfikacja, schemat blokowy i program w c++)
c) 7-wyrazowy ciąg liczb całkowitych postaci (12, 8, 4, 0, -4, -8, -12)
d) 6-wyrazowy ciąg liczb całkowitych postaci (12, 8, 4, -4, -8, -12)


Odpowiedź :

Wynikiem ma być ciąg arytmetyczny, gdzie

Realizacja algorytmu w C++:

#include <iostream>

int main(){

   std::cout << "(";

   for (int a = -4, i = 0; i < 7; i++, a += 3){

       std::cout << a << ((i < 6) ? ", " : ")");

   }

}

Schemat blokowy realizujący dokładnie ten sam algorytm:

Jest w załączniku.

Wyjaśnienie:

Specyfikacja zadania polega m.in. na znalezieniu korelacji pomiędzy danymi wejściowymi, a wyjściowymi, i poprawnym jej opisaniu. W tym przypadku nie ma danych wejściowych - wszystkie wartości wymagane do implementacji algorytmu są z góry określone, więc opisujemy po prostu co ma być wynikiem programu.

Iteracja polega na powtarzaniu tego samego zestawu instrukcji w pętli. Sformułowanie "algorytm iteracyjny" daje nam do zrozumienia, że powinniśmy wykorzystać właśnie pętlę. W tym przypadku najlepszym rozwiązaniem będzie pętla for, jednak nic nie stoi na przeszkodzie wykorzystania innych typów pętli, które mamy dostępne. Dlaczego akurat pętla for? Ponieważ mamy z góry określone jak długo ma się pętla wykonywać (n), oraz jakie początkowe wartości mają przyjąć zmienne iteracyjne (a). Ponad to wiemy też jaką operację mamy wykonywać na zmiennych iteracyjnych ( zwiększamy o 1, o 3 po każdej iteracji).

Pętlę można było ograniczyć tylko do jednej zmiennej - mamy określony maksymalny wyraz ciągu, więc można to było zapisać tak:

   for (int a = -4; a <= 14; a += 3)

ale takie podejście generuje nam kod, którego przerabianie będzie dość kłopotliwe. Co jeśli nagle każą nam zmienić długość wypisywanego ciągu? Trzeba będzie wyliczyć ostatni wyraz, jeśli nie będzie on podany w specyfikacji zadania. Dzięki dodatkowej zmiennej , możemy po prostu określić jak długi ma być ciąg bez martwienia się o wartość ostatniego wyrazu tego ciągu. Oczywiście według tego toku myślenia, powinniśmy przypisać wartość 3 do zmiennej , wartość -4 do zmiennej , wartość 7 do zmiennej . Kod wyglądałby wtedy tak:

   /* Początek kodu */

   int r = 3, a1 = -4, n = 7;

   /* ... */

   for (int a = a1, i = 0; i < n; i++, a +=r){

Teraz omówię kwestię wyświetlania ostatniego nawiasu. Użyłem operatora trójargumentowego, którego rozpiskę znajdziesz na schemacie blokowym. Jego składnia wygląda tak:

Jeśli warunek jest prawdą, operator zwróci wartość po pytajniku, jeśli nie, zostanie zwrócona wartość po dwukropku. W tym przypadku sprawdzam, czy obecna iteracja pętli nie jest ostatnią (, bo szósty wyraz jest ostatnim wyrazem tego ciągu ( zaczyna się od zera, a nie od jeden)). Jeśli to prawda, wyświetlam przecinek i spację, w przeciwnym wypadku wyświetlam nawias zamykający.

Wszelkie pytania związane z moją odpowiedzią kieruj do sekcji komentarzy :)