piątek, 27 października 2017

Kilka zasad programowania

Zasada 1.
Należy stosować zrozumiałe nazwy zmiennych,skróty. W nazewnictwie należy przestrzegać norm danego języka. Mimo,że stosowanie wieloliterowych,opisowych nazw jest czasochłonne,to jest bardzo dobrym nawykiem.
Zasada 2.
Warto rezerwować pewne nazwy na zmienne używane wielokrotnie,np. sterujące pętlami -i,j.
Zasada 3.
Dobrze jest sporządzić listy używanych zmiennych. Niektóre języki programowania obligują do sporządzenia takich list.
Zasada 4.
Należy dzielić program na podprogramy realizujące mniejsze fragmenty zadania, zwłaszcza w złożonych problemach. Często wykorzystywane, uniwersalne procedury i funkcje można łączyć w niezalezni od głównie programu moduły.
Zasada 5.
Trzeba dbać o przejrzystość tekstu programu i zachować czytelność jego struktury. Warto też dodawać komentarze na początku procedur i funkcji oraz przy niektórych instrukcjach.
Zasada 6.
Należy pisać programy odporne na błędy użytkowników. Program powinien instruować swojego użytkownika o działaniach, jakie musi on podejmować, oraz wyświetlać komunikaty dotyczące oczekiwanego rodzaju danych i nałożonych na nie ograniczeń. Trzeba też zabezpieczać program przed błędem typu zmiennych. Jeśli program wymaga danych numerycznych, a użytkownik przypadkowo naciśnie klawisz z literą B, program nie powinien przerywać działania ani się zwieszać, tylko wyświetlić odpowiedni komunikat.

Dobry styl programowania to taki,w którym potrafimy zapisać algorytm w sposób zrozumiały dla komputera i człowieka.  Dobry styl programowania przynosi wymierne korzyści: skrócenie czasu projektowania,pisania i uruchomiania programu oraz łatwość wprowadzania poprawek. Choć pożytek ze stosowania tych zasad docenia się, kiedy tworzy się duże programy, celowe jest stosowanie ich przy rozwiązywaniu nawet prostych zadań.

piątek, 20 października 2017

Funkcje zwracające w języku programowania C++

1.Zasięg zmiennej określa zakres widoczności nazwy zmiennej w obrębie pliku.
Zasięg zmiennej to w programowaniu fragment programu (np. obszar lub blok kodu) z którym skojarzone są wartości lub wyrażenia (np. zmienne). Różne języki programowania posiadają różne rodzaje zasięgów widoczności.
Zasięgu najczęściej używa się do:
  • kontrolowania cyklu życia zmiennych
  • kontrolowania widoczności i dostępności zmiennych i stałych w obrębie programu
  • implementacji hermetyzacji
Zasięgi mogą zawierać:
  • deklaracje lub definicje identyfikatorów (np. zmiennych)
  • instrukcje lub wyrażenia definiujące wykonywalny algorytm lub jego część
  • inne, zagnieżdżone zasięgi

2.Ze względu na zasięg zmiennej rozróżniamy zmienne globalne i lokalne:
Zmienna globalna – zmienna istniejąca przez cały czas życia programu i widziana z wielu miejsc w programie.
Nadużywanie zmiennych globalnych może prowadzić do poważnych problemów, takich jak:
  • w przypadku programów wielowątkowych, zmienna taka może być modyfikowana przez dowolny wątek, co prowadzić może do nieokreśloności przy braku synchronizacji wątków.
  • jeśli funkcja używa zmiennej globalnej jako zmiennej pomocniczej, niemożliwe może być jej rekursywne wywołanie
  • zmienne globalne zaśmiecają przestrzeń nazw, w niektórych architekturach może to doprowadzić do przepełnienia stosu
  • na działanie danej części kodu może mieć wpływ kod zupełnie niezwiązany, o ile oba używają tej samej zmiennej globalnej i jeden z nich ją modyfikuje.
  • zmienne globalne mogą kolidować ze zmiennymi lokalnymi (te drugie przesłaniają zmienne globalne o ile posiadają identyczne nazwy).

Zmienna lokalna  zmienna zdefiniowana i dostępna wyłącznie w określonym bloku programu, tworzona w momencie wejścia do tego bloku oraz usuwana z pamięci w momencie wyjścia z danego bloku. Tym samym zasięg zmiennej lokalnej oraz czas jej życia pokrywają się i obejmują blok, w którym zmienna lokalna jest zdefiniowana. Zmienna lokalna ma więc określony, ograniczony zakres istnienia i dostępności. To w jakich blokach programowych można tworzyć zmienne lokalne definiuje składnia konkretnego języka programowania. Typowymi blokami, w których można w różnych językach programowania tworzyć zmienne lokalne, są moduły, podprogramy oraz w pewnych językach programowania także instrukcje blokowe (lub inne instrukcje strukturalne, np. pętla for w języku C++ i inne).

3.Zmienne globalne w języku C++ deklarujemy poza funkcjami. 

Zmienne te są widoczne od miejsca deklaracji do końca pliku, również w funkcjach. 

Niezależnie od zmiennych globalnych można wewnątrz funkcji C++ zdeklarować zmiennie lokalne. 
Zmienne te będą widoczne w C++ w części programu  od miejsca deklaracji do końca funkcji. W języku C++ zmienne lokalne mogą być również widoczne tylko w obrębie jednego bloku instrukcji {}.

 Próba użycia zmiennej lokalnej w programie głównym spowoduje pojawienie się podczas kompilacji błędu niezdeklarowanej zmiennej. 

Zmiennym globalnym pamięć przydzielana jest na cały czas wykonywania programu, natomiast zmiennym lokalnym - tylko na czas działania procedury lub funkcji. 

4. Stosowanie zmiennej lokalnej.

void Usmiechy()
{
    int k;
    cin >>k;
    if (k>0) for  (i=0; i<20; i++) cout << ":-)";
    else for (i=0; i<20; i++) cout << ":-(";
}

Zmienne globalne mogą zostać przesłonięte. Zdeklarowanie w procedurze lub funkcj zmiennej lokalnej o takiej samej nazwie jak zmienna globalna spowoduje przesłonięcie zmiennej globalnej, co oznacza, że używana będzie zmienna lokalna a nie globalna.

5. Przesyłanie zmiennej globalnej.

#include <iostream>
using namespace std;
int i;
void Usmiechy()
{
    int i;
    for (i=0; i<20; i++) cout << ":-)";
}
int main ()
{
    i=10;
    Usmiechy();
    cout<<i;
    return 0;
}

------------------------------------------------------------------

int main ()
{
    for (i=0; i<20; i++) cout << ":-)";
    cout << endl;
    return 0;
}


wtorek, 10 października 2017

Stosowanie procedur i funkcji w języku programowania

1. Programowanie zstępujące i wstępujące.

Programowanie zstępujące (projektowanie zstępujące, ang. top-down design) – rozwiązanie programistyczne polegające na zdefiniowaniu problemu ogólnego poprzez podzielenie na podproblemy, które są dzielone na jeszcze mniejsze podproblemy aż do rozwiązań oczywistych, łatwych do zapisania. Następnie złożenie z rozwiązań podproblemów niższego rzędu rozwiązań problemów wyższego rzędu aż do całkowitego rozwiązania problemu.

Programowanie wstępujące - oznacza rozpoczęcie pracy z interfejsem, zaimportowanie go do modułu, a następnie, jeśli to konieczne, zmodyfikowanie go w edytorze interfejsów.
Poniższa ilustracja przedstawia to programowanie:



2.Zalety stosowania podprogramów - procedur i funkcji


Stosowanie procedur i funkcji umożliwia:
- dzielenie zadania na mniejsze części - każda może być realizowana w oddzielnej procedurze lub funkcji. 
-wprowadzenie porządku do programu- zwiększenie jego czytelności i przejrzystości.
-łatwiejsze wyszukiwanie błędów i dokonywanie poprawek - w procedurze  lub w funkcji można zlokalizować błędy szybciej niż na długiej liście instrukcji programu głównego.
-programowanie zespołowe - po uzgodnieniu postaci procedur lub funkcji każdy z członków zespołu może zająć się pracą się nad "swoimi" procedurami lub funkcjami.
Zaletami programowania strukturalnego są szczególnie widoczne przy pisaniu dużych programów,rozwiązujących złożone problemy.

3. Modele programowania:
- liniowe:
a_1 x_1 + a_2 x_2 + \cdots + a_n x_n \leqslant \alpha

 
a_1 x_1 + a_2 x_2 + \cdots + a_n x_n \geqslant \alpha
a_1 x_1 + a_2 x_2 + \cdots + a_n x_n = \alpha

- strukturalne - paradygmat programowania opierający się na podziale kodu źródłowego programu na procedury i hierarchicznie ułożone bloki z wykorzystaniem struktur kontrolnych w postaci instrukcji wyboru i pętli.
- modularne:
-zdarzeniowe:
















-obiektowe:

piątek, 6 października 2017

Algorytm z pętlą zagnieżdżoną

1. Specyfikacja

Zadanie: napisz liste kroków algorytmu,który umożliwi wyprowadzenie na ekran monitora prostokąta o bokach n,m, narysowanego za pomocą znaku *
(m-liczba znaków * w poziomie, n- liczba znaków* w pionie).
Wnętrze prostokąta powinno być wypełnione znakami *.
Dane: liczby naturalne dodatnie,określające ilość znaków * w prostokącie o bokach m,n.
Wynik: prostokąt o wymiarach m x n,zbudowany ze znaków*.

Lista kroków:
1.Zacznij algorytm.
2.Zmiennej i przypisz wartość jeden: i:=1.
3.Jeśli i jest większe od n, przejdź do kroku 4;
w przeciwnym wypadku
3.1. Zmiennej j przypisz wartość jeden: j:=1;
3.2. Jesli j jest większe od m,
przejdz do nowego wiersza;
zwiększ licznik i o jeden (i:= i+1)
wróć do kroku 3;
w przeciwnym wypadku 
wprowadź ('*');
zwiększ licznik j o jeden(j := j+1)
wróć do kroku 3.2;
4. Zakończ algorytm. 

2. Schemat blokowy

Schemat blokowy algorytmu z pętlą zagnieżdżoną

3. Listing programu
#include <iostream> using namespace std; int main () { int i,j,m,n; cout << "Podaj wartosc m: "; cin >> m; cout << "Podaj wartosc n: "; cin >> n;
for (i=0; i<n; i++) { for(j=0; j<m; j++) cout << "*"; cout << endl; } return 0; }


Algorytm iteracyjny iloczynu n liczb


Iteracja - polega na wielokrotnym powtarzaniu tej samej operacji (ciągu operacji).
Iterację implementujemy, stosując tzw. PĘTLĘ.


Specyfikacja zadania lub problemu - opis zadania, w którym wymienia się dane wejściowe oraz wyniki, związek między danymi a wynikami.

1. Specyfikacja


Zadanie: Oblicz iloczyn n liczb całkowitych.
Dane: n dowolnych liczb całkowitych, kolejno zapamiętywanych w zmiennej a.
Wynik: wartość iloczynu zatytułuj: iloczyn.
Lista kroków:
1.Rozpocznij algorytm.
2.Zmiennej iloczyn oraz zmiennej i przypisz wartość jeden: iloczyn:=1; i:=1.

3.Wprowadź liczbę całkowitą i zapamiętaj ją w zmiennej a.
4.Pomnóż iloczyn poprzez wprowadzoną liczbę a: iloczyn := iloczyn * a.
5.Jeżeli i nie równa się n, zwiększ licznik o jeden (i:= i+1) i wróć do kroku nr. 3.
6.Wprowadź wynik: iloczyn.

7.Zakończ algorytm.

2. Schemat blokowy


Schemat blokowy algorytmu iteracyjnego

3. Listing programu

#include <iostream>
using namespace std;
int main() {
int i, a, iloczyn, n;
cout << "Podaj ilosc liczb: \n";

cin >> n;
iloczyn=1;
for (i=0; i<n; i++)
{
cout << "Podaj liczbe nr : " << i+1 <<" ";
cin >> a; iloczyn*=a;
}


cout << iloczyn;
return 0;
}