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 :)