Od problemu do programu - 3h


Cele ogólne
Uczeń:
  • definiuje pojęcie specyfikacja algorytmu, określa dane i wyniki
  • planuje kolejne kroki rozwiązania problemu
  • omawia różne sposoby przedstawiania algorytmów (opis słowny, lista kroków, schemat blokowy, pseudokod)
  • programuje i testuje rozwiązanie problemu
  • sprawdza działanie algorytmów dla różnych danych
  • tworzy algorytmy działania na liczbach całkowitych
  • stosuje w języku C++ podstawowe konstrukcje programistyczne (operacje wejścia i wyjścia, instrukcja warunkowa, operatory matematyczne i logiczne)
  • tworzy w języku C++ programy wykonujące działania na liczbach całkowitych
  • dobiera struktury i typy danych do rodzaju problemu
  • wyszukuje optymalne rozwiązania problemów
  • ocenia efektywność algorytmu
  • objaśnia dobrany do danego problemu algorytm, uzasadnia jego poprawność i wybór
  • Przydatne narzędzia/oprogramowanie
  • Do tworzenia schematów blokowych (zagadnienie 1.2) można wykorzystać oprogramowanie "JavaBlock" http://javablock.sourceforge.net/
    Zapoznaj się tekstem w podręczniku strony od 10 do 26 ze szczególnym uwzględnieniem Podsumowania.

    Specyfikacja algorytmu (specyfikacja zadania)


    Specyfikacja algorytmu (specyfikacja problemu algorytmicznego) to dokładny opis problemu algorytmicznego, który ma zostać rozwiązany, oraz podanie danych wejściowych (dane) i danych wyjściowych (wynik).

    Oto kilka przykładów specyfikacji problemów algorytmicznych, często nazywanych również specyfikacjami zadania.
    Problem: Obliczanie ilorazu dwóch liczb rzeczywistych
    Dane:
    a – liczba rzeczywista
    b – liczba rzeczywista

    Wynik:
    il – iloraz liczb a i b (a/b) – liczba rzeczywista

    Co to jest algorytm ?

    Na lekcjach matematyki czy fizyki często słyszymy zdanie „rozwiąż zadanie”. Większość tych zadań rozwiązujemy według pewnych schematów. Najpierw wypisujemy dane i zastanawiamy się do jakiego celu dążymy, a więc jaki ma być wynik. Następnie wypisujemy wzory łączące dane z szukanymi bądź twierdzenia, które można zastosować.

    Przed koniecznością rozwiązywania zadań stajemy również poza szkołą. Robimy to w każdej innej dziedzinie naszego życia, na przykład:

    • telefonując do koleżanki i zapraszając ją na ciasto
    • gotując jajko na twardo
    • kupując piłkę w sklepie
    • znajdując najniższego ucznia w klasie
    • pisząc wypracowanie

    Również przy takim typie zadań musimy określić dane i warunki, które muszą one spełniać. Formułujemy także wynik, który pragniemy uzyskać.

    Czym jest algorytm?

    Algorytm to przepis na rozwiązanie zadania, który zawiera opis danych wraz z opisem czynności, które należy wykonać z tymi danymi, aby osiągnąć zamierzony cel.

    Cechy algorytmu

    Co powinniśmy wiedzieć jeszcze zanim zabierzemy się za tworzenie algorytmu? Poznajmy cechy, które powinien posiadać algorytm.

    Algorytm musi być:

    • poprawny, tzn. dla każdego poprawnego zestawu danych, po wykonaniu skończonej liczby czynności, prowadzi do poprawnych wyników.
    • jednoznaczny- w każdym wypadku jego zastosowania, dla tych samych danych uzyskamy ten sam wynik
    • szczegółowy, aby wykonawca algorytmu rozumiał opisane czynności i potrafił je wykonać
    • uniwersalny, aby służył do rozwiązywania pewnej grupy zadań, a nie tylko jednego konkretnego przypadku zadania.

    Etapy rozwiązywania problemów

    Wiemy już co to jest algorytm, jakie cechy powinien posiadać. Jak wygląda zatem tworzenie algorytmu?

    W procesie rozwiązywania każdego zadania możemy wyróżnić pewne etapy, które nas do niego prowadzą. Tak samo postępujemy tworząc algorytm.

    Etapy rozwiązywania problemów:

    • Sformułowanie zadania
    • Określenie danych wejściowych
    • Określenie celu, czyli wyniku
    • Poszukiwanie metody rozwiązania, czyli algorytmu
    • Przedstawienie algorytmu w postaci: opisu słownego, listy kroków, schematu blokowego, języka programowania
    • Analiza poprawności rozwiązania
    • Testowanie rozwiązania dla różnych danych. Ocena efektywności przyjętej metody.

    Działania niealgorytmiczne

    Zastanów się: Czy wszystkie działania są algorytmiczne ?
    Czy dla każdego zadania można skonstruować algorytm? Czy rozwiązanie każdego zadania polega na wykonywaniu jednoznacznie opisanych, ściśle określonych czynności?

    Oczywiście, że nie. Istnieją zadania, których realizacji nie można ująć w ramy jakiegoś planu działania. Taki charakter ma np. każda twórczość artystyczna. Konieczna jest do tego wyobraźnia i twórcze działanie, a na to nie ma algorytmu.

    Co raz częściej do działań niealgorytmicznych zaliczamy także gotowanie. Niby mamy przepis na daną potrawę, ale tak naprawdę jest on „luźny”, mogę modyfikować lekko składniki, ich ilość czy czas przygotowania.

    Budowa algorytmów

    Algorytmy powinny być tak przedstawiane, aby było możliwe ich jednoznaczne odczytanie i zastosowanie. Niektóre algorytmy można opisać w języku potocznym, zwłaszcza wtedy, gdy jego wykonawcą ma być człowiek (w informatyce zajmujemy się opracowywaniem algorytmów, których wykonanie powierzamy komputerom).

    Z czego składa się algorytm?
    Algorytm zawiera opis danych, opis wyników oraz plan działania, czyli przetworzenia danych. Plan ten można przedstawić w postaci ciągu czynności, które muszą być wykonane w określonej kolejności. Opis czynności występujących w algorytmie nazywamy instrukcjami.

    Algorytmy z życia codziennego

    Załóżmy, że ugotowanie jajka to działanie algorytmiczne, czyli możemy utworzyć dla niego algorytm.

    Zastanów się jak ugotować jajko na miękko. Na początku opracowywania algorytmu przyjmijmy, że używamy kuchenki gazowej, posiadamy garnek i wodę. Oczywiście niezbędne jest też samo jajko. Zakładamy również, że nic nie utrudni samej czynności, to znaczy np. w trakcie gotowania nie zostaniemy pozbawieni dopływu gazu, czy też osoba gotująca nie wie co to garnek.

    Przykład algorytmu. Przykład algorytmu z życia codziennego, przykład algorytmu liniowego
    Opracuj algorytm gotowania jaja na miękko.

    Algorytm ten ma postać:

    1. Wlać do garnka zimną wodę.
    2. Zapalić gaz.
    3. Gotować wodę do wrzenia.
    4. Włożyć jajko.
    5. Odczekać trzy minuty.
    6. Zgasić gaz.
    7. Wyjąć jajko

    Algorytmy powinny być tak przedstawiane, aby było możliwe ich jednoznaczne odczytanie i zastosowanie.

    Niektóre algorytmy można opisać słownie korzystając z języka potocznego. Jest to proste zwłaszcza wtedy, gdy algorytm jest prosty, a jego wykonawcą ma być człowiek. Pamiętajmy jednak, iż informatyka zajmuje się opracowywaniem algorytmów, których wykonanie powierzone zostaje komputerom. Dlatego taki sposób zapisu nie zawsze jest wystarczający. Musimy sięgnąć po inne metody.

    Z czego składa się algorytm?

    Algorytm zawiera opis danych, opis wyników oraz plan działania, czyli przetworzenia danych. Możemy to przedstawić tak:

    Algorytm = opis danych+ opis wyników + plan działania
    Opis danych i wyników nazywamy specyfikacją algorytmu.

    Przejdźmy teraz do tego, jak możemy zapisać algorytm, a w zasadzie tą główną jego część, czyli plan działania, przetworzenia danych. Będziemy to robić zapisując ciąg czynności (działań), które muszą być wykonane w określonej kolejności. Opis czynności występujących w algorytmie nazywamy instrukcjami.

    Sposoby zapisu algorytmów:

    • opis słowny
    • lista kroków
    • pseudojęzyk (pseudokod)
    • schemat blokowy
    • drzewo (drzewo algorytmu)
    • język programowania

    Załóżmy, że naszym celem jest przedstawienie algorytmu obliczania średniej dwóch liczb. Algorytm ten przedstawimy teraz korzystając z podanych wyżej wszystkich sposobów zapisywania algorytmu.

    Zadanie

    Napisz algorytm obliczający średnią arytmetyczną dwóch liczb rzeczywistych.

    Przykładowe rozwiązania zawierające wszystkie sposoby zapisu algorytmu zaprezentuję poniżej.

    Opis słowny

    W jaki sposób obliczymy średnią dwóch liczb? Weźmiemy dwie liczby i je zsumujemy, a otrzymany wynik podzielimy przez 2. Wystarczy teraz po prostu to zapisać.

    Rozwiązanie 1. Opis słowny:
    Weź dwie liczby i dodaj je do siebie. Otrzymany wynik podziel przez 2.

    Lista kroków

    Lista kroków to najprostsza i jednocześnie najbardziej naturalna metoda zapisywania algorytmu. Polega na opisie reguł postępowania za pomocą kolejnych kroków, punktów. Jest to sposób, z którym prawdopodobnie spotkałeś się na lekcjach matematyki, na których nauczyciel podaje schemat rozwiązania zadania danego typu.

    Elementem charakterystycznym w tym sposobie zapisu jest numeracja poszczególnych kroków.

    Rozwiązanie 2a. Lista kroków:

    Krok 1. Pobierz pierwszą liczbę.
    Krok 2. Pobierz drugą liczbę.
    Krok 3. Dodaj liczby do siebie.
    Krok 4. Wynik sumowania podziel przez 2.
    Krok 5. Wyświetl wynik.
    Krok 6. Zakończ

    Powyższy algorytm możemy zapisać również za pomocą listy kroków pomijając słowo krok:

    Rozwiązanie 2b. Lista kroków:
    1. Pobierz pierwszą liczbę.
    2. Pobierz drugą liczbę.
    3. Dodaj liczby do siebie.
    4. Wynik sumowania podziel przez 2.
    5. Wyświetl wynik.
    6. Zakończ

    Pseudojęzyk, pseudokod

    Pseudojęzyk (zwany również pseudokodem) to sposób pośredni między listą kroków, a językiem programowania. Zwykle zapis podobny jest do któregoś z popularnych języków programowania, ale jest mniej formalny.

    Rozwiązanie 3a. Pseudokod:

    Początek
    				Rzeczywiste a
    				Rzeczywiste b
    				suma:= a+b
    				średnia:= suma/2
    				Wypisz(średnia)
    				Koniec

    W powyższym pseudokodzie widzimy dwa działania (instrukcje): obliczającą sumę i średnią. Tak naprawdę możemy przecież połączyć je w jedno.

    Rozwiązanie 3b. Pseudokod:

    Początek 
    				Rzeczywiste a 
    				Rzeczywiste b 
    				średnia:= (a+b)/2 
    				Wypisz(średnia) 
    				Koniec

    Schemat blokowy

    Schemat blokowy to graficzny sposób przedstawienia algorytmu. Składa się on z bloków, zawierających określone działania, oraz połączeń wskazujących kolejność ich wykonywania.

    My teraz wracamy do naszego przykładu ze średnią. Jak będzie teraz wyglądał nasz algorytm?


    Schemat blokowy algorytmu

    Język programowania

    Aby zrealizować algorytm za pomocą komputera, zapisujemy go w postaci odpowiednio dobranego języka programowania. Mówiąc w skrócie, piszemy program.

    Algorytmy można przedstawiać na różne sposoby. Od prostego, czyli po prostu opowiedzeniu o algorytmie, poprzez narysowanie schematu blokowego, aż po język programowania i ostateczną realizację w postaci programu komputerowego. Sposób zapisu dobieramy do konkretnego przypadku.

    Struktura programu w C++

    Ogólna struktura programu w C++ (generowana automatycznie) składa się z kilku części, które zostaną opisane poniżej:

    część 1     
    #include <cstdlib>
    #include <iostream>
    część 2     
    using namespace std;
    część 3     
    int main(int argc, char *argv[])
    część 4     
    {
    	/* instrukcje funkcji main */
    	return 0;
    }
    				


    Część I - trochę o bibliotekach

    Ta część programu opisuje biblioteki jakie mają być dołączone do programu. Biblioteki to pliki, których zawartość jest dołączana do programu za pomocą dyrektywy preprocesora #include. Biblioteka to plik o nazwie podanej w nawiasie "< nazwa biblioteki >", który posiada między innymi definicje przydatnych funkcji.

    Użycie funkcji pierwiastkującej zdefiniowanej w bibliotece cmath
    				#include <cstdlib>
    				#include <iostream>
    				//dodanie biblioteki cmath, w której znajduje się 
    				//definicja funkcji pierwiastkującej sqrt
    				#include <cmath>
    
    				using namespace std;
    
    				int main()
    				{
    
    					//użycie funkcji sqrt wyznaczającej 
    					//pierwiastek z liczby 2 
    					cout<<sqrt(2)<<endl;
    
    					return 0;
    				}
    				

    Np. biblioteka cstdlib zawiera funkcje ogólne takie jak konwersje, alokacja pamięci czy funkcje matematyczne. Biblioteka iostream (input/output stream) jest standardową biblioteką wejścia/wyjścia w C++. Jeśli chcemy coś wyświetlać na ekranie (za pomocą obiektu cout i przeciążonego operatora "<<"), lub pobierać dane z klawiatury (za pomocą obiektu cin i przeciążonego operatora ">>") musimy ją dodać do nagłówka programu.

    Wcześniejsze wersje bibliotek miały rozszerzenie "*.h". Język C++ odchodzi od takiego nazewnictwa, gdyż pliki z tym rozszerzeniem były początkowo wykorzystywane w języku C (oczywiście C++ może nadal korzystać z tych bibliotek) i dla rozdzielenia bibliotek kojarzących się z danym językiem, C++ przyjął nazwy bez rozszerzenia. Niektóre biblioteki zostały przekształcone z C na C++, i w takich przypadkach pozbyto się rozszerzenia, ale dodano literkę "c" na początku takiego pliku np.:

    stara nazwa pliku nowa nazwa pliku

    math.h

    stdlib.h

    ...

    cmath

    cstdlib

    ...

    Część II - przestrzenie nazw

    Dyrektywę using namespace musimy użyć w przypadku, gdy zamiast pliku iostream.h, będziemy używać iostream, w celu udostępnienia definicji zawartej w tym pliku. Generalnie chodzi o to, żeby nie pisać za każdym razem wywołanie obiektu cout czy cin z przedrostkiem std::. Np.:

    				#include<iostream> 
    				#include<cstdlib>
    
    				int main()
    				{
    
    				//bez użycia dyrektywy using namespace std musimy 
    				//do każdej definicji z biblioteki 
    				//iostream dodać przedrostek std::
    
    				std::cout<<"Ala ma kota"<<std::endl;
    
    				system("pause");
    				return 0;
    				}
    				

    Wyobraźmy sobie, że mamy dwa pakiety, w których zdefiniowana jest funkcja o nazwie wspaniala(). Pierwszy pakiet jest od producenta JANEK, a drugi od MARCIN. Jeśli chcemy używać funkcji wspaniala() od MARCIN, bo uważamy, że jest lepsza, udostępniamy definicję przestrzeni nazw MARCIN:

    using namespace MARCIN;

    i nie musimy za każdym wywołaniem funkcji wspaniala(), pisać MARCIN::wspaniala().

    Wiąże się to także z uproszczeniem uaktualnienia starszych wersji programu, dodając tylko odpowiednią dyrektywę bez konieczności dopisywania do każdego elementu przedrostka.

    Część III - funkcja main

    Funkcja main() jest charakterystyczną funkcją w C++, która musi występować w każdym konsolowym programie. Wszystko co zaczyna się dziać w danej aplikacji, jest określana w ciele właśnie tej funkcji. Oczywiście wszystkie inne funkcje mogą być wywoływane z wnętrza tej funkcji.

    Funkcja main() ma kilka postaci:

    • int main() lub int main(void) - postacie równoważne, oznaczające, że w ciele funkcji pojawia się informacja zwrotna (return 0 lub return EXIT_SUCCESS), która zwraca do systemu operacyjnego informacje o zakończeniu działania danej aplikacji
    • void main() - nie posiada informacji zwrotnej o zakończeniu działania programu, niezalecane, a w niektórych systemach niedopuszczalne
    • main() - to samo co int main()
    • int main(int argc, char *argv[]) - funkcja z argumentami opisana poniżej.

    Podczas uruchomienia programu za pomocą konsoli (w Windowsie: cmd.exe), oprócz podania nazwy programu, który chcemy uruchomić, możemy przekazać wstępne dane (parametry programu). Argument int argc, mówi ile tych danych jest, natomiast char *argv[] przechowuje te dane. Prześledźmy przykład programu program.exe, który wyświetli argumenty danego programu:

    program.cpp
    #include <cstdlib>
    				#include <iostream>
    
    				using namespace std;
    
    				int main(int argc, char *argv[])
    				{
    
    				for(int i=1;i<argc;i++)
    					cout<<i<<" argument to "<<argv[i]<<endl;
    					
    				
    
    				return 0;
    				}
    				

    Przykładowe wywołanie programu program.exe i wynik działania:

    wywołanie funkcji main z argumentami

    Wywołana została aplikacja z argumentami: arg1, arg2, x oraz 8991. Zauważmy, że argumenty oddzielamy spacją.

    Jeśli program wywołujemy bez dodatkowych parametrów, listę argumentów funkcji main() można pominąć.

    Część IV - życie programu

    W tej części programu zaczyna się życie naszej aplikacji. Wszystko to co tu napiszemy, będzie rzutowało na sposób zachowania się naszego programu. Oprócz słowa kluczowego return, które zostało wyjaśnione w części III, domyślnie dopisana zostaje przez Dev-C++instrukcja system("pause"). Powoduje ona zatrzymanie się programu w tym miejscu i wyświetlenie komunikatu: "Aby kontynuować, naciśnij dowolny klawisz . . .".

    Zauważmy, że blok funkcji main(), zaczynamy nawiasem "{" i kończymy nawiasem "}".



  • Podstawy Programowania - Budowa Programu i komunikacja użytkownik - program.

    Zadanie 1.
    Działanie programu:
    1. Wyświetlenie komunikatu: Wprowadź liczbę całkowitą:
    2. Użytkownik wprowadza liczbę całkowitą.
    3. Wyświetlenie w następnej linii komunikatu Wprowadź liczbę rzeczywistą:
    4. Użytkownik wprowadza liczbę rzeczywistą z częścią ułamkową.
    5. Wyświetlenie w następnej linii komunikatu: Wprowadź dowolny znak
    6. Użytkownik wprowadza znak litery lub cyfry.
    7. Wyświetlenie w następnej linii wprowadzonych liczb i znaku, oddzielając je przecinkiem i spacją (np. 1, 2.45, s ).
    Wymagania: Użyj odpowiednich zmiennych, Biblioteki iostream i instrukcji cout oraz cin.

    Zadanie 2.
    Działanie programu: 1. Wyświetlenie komunikatu: Wprowadź trzy liczby całkowite:
    2. Użytkownik wprowadza  liczEy całkowite (każdą w nastĊSnej linii).
    3. Wyliczenie i zapamiętanie arytmetycznej średniej tych liczb (ajk wyznaczyć średnią arytmetyczną dla trzech liczb?).
    4. Wyświetlenie w nastęnej linii tej średniej.
    Wymagania: Użyj odpowiednich zmiennych, biblioteki iostream, instrukcji cout i cin oraz obliczeń związanych ze średnią arytmetyczną.

    Zadanie 3.
    Działanie programu: 1. Wyświetlenie Enter 2 integer numbers:
    2. Użytkownik wprowadza dwie liczEy całkowite do zmiennych a i b.
    3. Wyliczenie i zapamiętanie ich sumy, iloczynu, ilorazu a/b, potęgi ab i pierwiastka z liczby a
    4. Wyświetlenie w następnych liniach tych wartości.
    Wymagania: Użyj odpowiednich zmiennych, bibliotek iostream math.h, i instrukcji cout, cin. Przy oEliczaniu ilorazu i pierwiastka rzutuj zmienne a i b na odpowiedni typ rzeczywistoliczbowy.




    Algorytm NWD



    Zapisz specyfikację oraz algorytm podziału na równoliczne grupy (algorytm NWD - podręcznik strona 13)


    Podział liczby na cyfry



    Zapisz specyfikację oraz algorytm wypisujący poszczególne cyfry liczby.


    Schemat blokowy



    Zapisz w postaci schematu blokowego algorytm obliczający dla danej liczby naturalnej liczbę jej dzielników właściwych większych od 1. Wykorzystaj pseudokod zapisany w podręczniku na stronie 17 /Ćwiczenie 5 str. 16/


    Programy w C++



    Napisz w środowisku CodeBlocks następujące programy:
    1. Program sprawdzający czy liczba jest parzysta
    2. Program wypisujący poszczególne cyfry z liczby
    3. Program wyświetlający liczbę dzielnikó właściwych liczby n większych od 1
    4. Program wypisujący NWD dla dwóch liczb naturalnych a i b



    Test wiedzy



    |
    		1. Jaka wartość jest zwracana do systemu operacyjnego po poprawnym zakończeniu działania programu?
    			A. –1
    			B. 1
    			C. 0
    			D. Programy nie zwracają wartości.
    			
    		2. Jaka jest jedyna funkcja, którą musi zawierać każdy program napisany w C++?
    			A. start ()
    			B. system ()
    			C. main ()
    			D. program ()
    			
    		3. W jaki sposób oznaczany jest początek i koniec bloku kodu?
    			A. { i }
    			B. -> i <-
    			C. BEGIN i END
    			D. ( i )
    			
    		4. Jaki znak kończy większość wierszy kodu w C++?
    			A. .
    			B. ;
    			C. :
    			D. '
    			
    		Który z poniższych zapisów stanowi poprawny komentarz?
    			A. */ Komentarz */
    			B. ** Komentarz **
    			C. /* Komentarz */
    			D. { Komentarz }
    			
    		6. Który plik nagłówkowy jest potrzebny, aby uzyskać dostęp do instrukcji cout?
    			A. stream
    			B. Żaden, instrukcja cout jest dostępna domyślnie.
    			C. iostream
    			D. using namespace std;
    			
    		



    Podsumowanie



  • Instrukcja wejścia (wczytywanie danych): cin >> nazwa_zmiennej
  • Instrukcja wyjścia (wypisanie informacji na ekran) : cout << "teks do wyswietlenia" ;
    cout <<nazwa_zmiennej;
  • Instrukcja warunkowa if - else w języku C++ ma postać:
    if (warunek) instrukcja na tak;
    else instrukcja na nie;
  • Instrukcja pętli for
    for
    ( inicjalizacja zmiennej; warunek; aktualizacja zmiennej )
    {
    // Wykonywany kod, jeśli warunek został spełniony
    }
    Przykład:
    for ( int i = 0; i < 10; i++ )
    {
    cout << i << endl;
    }
  • Etapy rozwiązywania problemu: określenie problemu (zadania), podanie specyfikacji, sformułowanie rozwiązania - algorytmu, zaprogramowanie rozwiązania, testowanie rozwiązania.
  • Specyfikacja zadania to określenie danych i wyniku oraz określenie związku między nimi
  • Algorytm to skończony ciąg instrukcji prowadzących do rozwiązania problemu
  • Zapis algorytmu w języku programowania to kod źródłowy programu
  • Testowanie programu polega na wielokrotnym uruchamianiuu go dla różnych danych, dane muszą spełniać warunki specyfikacji.
  • Podstawowe instrukcje sterujące to: instrukcja warunkowa, instrukcja iteracji (pętla)
  • Translatory (które dzielimy na na kompilatory i interpretery) to programy tłumaczące kod źródłowy programu na język maszynowy.
  • Zintegrowane środowisko programistyczne (IDE) to program posiadający edytor do pisania kodu źródłowego, translator oraz funkcje ułatwiające uruchamianie programów



  • Przykładowe rozwiązania oraz komentarze do wybranych ćwiczeń i zadań
  • (ćw. 1, s. 11) Zakończenie działania algorytmu jest opisane w punkcie 2, który mówi o tym, do jakiego momentu należy powtarzać opisane w punktach 3 i 4 czynności. Pełne rozwiązanie:
  • #include <iostream>
    using namespace std;
    int main()
    {
        int n, d, ld = 0;
        cout << "n = ";
        cin >> n;
    
        for(d = 2; d*d < n; d++)
        {
            if(n % d == 0)
            {
                ld = ld + 2;
            }
        }
    
        if(d*d == n)
        {
            ld++;
        }
    
        cout << "Liczba dzielnikow wlasciwych wiekszych od 1: ";
        cout << ld << endl;
    
        return 0;
    }
    
    
    (ćw. 2, s. 13) Lista kroków algorytmu:
    1. Dopóki liczba jest większa od 0, wykonuj kroki 2 i 3.
    2. Wypisz resztę z dzielenia liczby przez 2.
    3. Zastąp liczbę częścią całkowitą z dzielenia liczby przez 2.

    Wynikiem działania algorytmu będzie uzyskanie zapisu liczby w systemie binarnym (zapis reszt z dzielenia w kolejności od ostatnio uzyskanej).
    
    
    Zmodyfikowana lista kroków wygląda następująco.
    1.	Dopóki liczba jest większa od 0, wykonuj kroki 2 i 3.
    2.	Wypisz resztę z dzielenia liczby przez 2.
    3.	Zamień liczbę na część całkowitą z dzielenia liczby przez 2.
    Przykład
    Liczba	Część całkowita z dzielenia przez 2		Reszta z dzielenia przez 2
    213		106						1
    106		53						0
    53		26						1
    26		13						0
    13		6						1
    6		3						0
    3		1						1
    1		0						1
    
    W wyniku otrzymujemy kolejne cyfry liczby w zapisie binarnym (dwójkowym).
    
    

    (ćw. 3, s. 14) Liczba operacji dzielenia w każdym z algorytmów jest zależna od wartości liczby n. Pełne rozwiązanie poniżej:

    (ćw. 4, s. 15) Rozwiązanie w pliku T01_CW4.

    Rozwiązania do ćwiczeń z tej strony

    Ćwiczenie 5 - test
  • 1 --> C; 2 --> C; 3 --> A; 4 --> B; 5 --> C; 6 --> C;