Metodyki i technki programowania 1
2011
B. Butryło
1
Metodyki i techniki
programowania 1
Metodyki i techniki
programowania 1
•Kierunek:
elektronika i telekomunikacja
•Studia:
I stopnia
•Kierunek:
elektronika i telekomunikacja
•Studia:
I stopnia
Programowanie
C++
Programowanie
C++
Metodyki i technki programowania 1
2011
B. Butryło
2
Języki programowania
3
3
Języki
Języki
Klasyfikacja języków
Klasyfikacja języków
niskiego poziomu
niskiego poziomu
specjalistyczne
specjalistyczne
maszynowe
maszynowe
wysokiego poziomu
wysokiego poziomu
interpretowane
interpretowane
kompilowane
kompilowane
potokowe
potokowe
blokowo-strukturalne
blokowo-strukturalne
proceduralne
proceduralne
obiektowe
obiektowe
asemblery
asemblery
makroasemblery
makroasemblery
do przetwarzania danych (Cobol, PL/1)
do przetwarzania danych (Cobol, PL/1)
do symulacji obiektów (Simula, GPSS, CSL)
do symulacji obiektów (Simula, GPSS, CSL)
konwersacyjne (Forcon, Jean)
konwersacyjne (Forcon, Jean)
inne
inne
C ... C++ ... Java
4
4
Ewolucja języków: porównanie C i C++
Ewolucja języków: porównanie C i C++
Programowanie proceduralne
• Grupowanie instrukcji (funkcje).
• Program jako zbiór funkcji.
• Funkcja: zbiór instrukcji wykonujących operacje
na lokalnym i/lub ogólnym zestawie danych.
• Funkcje komunikują się między sobą przez
przekazywanie danych (argumentów).
Programowanie proceduralne
• Grupowanie instrukcji (funkcje).
• Program jako zbiór funkcji.
• Funkcja: zbiór instrukcji wykonujących operacje
na lokalnym i/lub ogólnym zestawie danych.
• Funkcje komunikują się między sobą przez
przekazywanie danych (argumentów).
Programowanie proceduralne i
programowanie obiektowo
zorientowane
• Program jako zbiór obiektów.
• Obiekt składa się z:
• atrybutów/dane/pola - zestawów danych,
• usług/metod– jednej lub kilku funkcji,
które mogą przetwarzać atrybuty.
• Struktura klas ma postać hierarchiczną.
• Obiekty komunikują się przez metody/
komunikaty.
Programowanie proceduralne i
programowanie obiektowo
zorientowane
• Program jako zbiór obiektów.
• Obiekt składa się z:
• atrybutów/dane/pola - zestawów danych,
• usług/metod– jednej lub kilku funkcji,
które mogą przetwarzać atrybuty.
• Struktura klas ma postać hierarchiczną.
• Obiekty komunikują się przez metody/
komunikaty.
• Programowanie proceduralne, imperatywne.
• Instrukcje strukturalne:
podejmowanie decyzji (if), wybór jednego z wielu przypadków (switch),
instrukcje iteracyjne (for, while, do ... while).
• Zbiór typów podstawowych: c
ałkowitoliczbowe, zmiennopozycyjne, znakowe.
• Możliwość tworzenia i wykorzystania typów pochodnych:
tablice, struktury, unie.
• Identyczne: zestaw podstawowych słów kluczowych, kolejność operatorów,
operowanie na wskaźnikach, ...
• Programowanie proceduralne, imperatywne.
• Instrukcje strukturalne:
podejmowanie decyzji (if), wybór jednego z wielu przypadków (switch),
instrukcje iteracyjne (for, while, do ... while).
• Zbiór typów podstawowych: c
ałkowitoliczbowe, zmiennopozycyjne, znakowe.
• Możliwość tworzenia i wykorzystania typów pochodnych:
tablice, struktury, unie.
• Identyczne: zestaw podstawowych słów kluczowych, kolejność operatorów,
operowanie na wskaźnikach, ...
C
C
C++
C++
Metodyki i technki programowania 1
2011
B. Butryło
3
C ... C++ ... Java
5
5
Ewolucja języków
Ewolucja języków
• Język ogólnego stosowania.
• Programowanie proceduralne lub
programowanie obiektowo-zorientowane.
• Język kompilowany.
• Język niezależny od architektury
(wysokiego poziomu).
• Zmienna / zróżnicowana reprezentacja
danych.
• Język o słabo określonych typach danych,
ale o ścisłej kontroli tych typów.
• Brak automatycznego zarządzania
pamięcią.
• Przenaszalność kodów źródłowych.
• Język programowania systemowego (np.
Unix, interfejs MS Windows).
C++
C++
Java
Java
• Język ogólnego stosowania.
• Programowanie obiektowe.
• Język kompilowano-interpretowany.
• Język niezależny od architektury
(wysokiego poziomu).
• Stała reprezentacja danych.
Wbudowany Unicode.
• Ścisła kontrola typów zmiennych i ich
inicjowania przed użyciem.
• Bezpieczeństwo (wirtualna maszyna,
automatyczna obsługa pamięci).
• Programowanie z użyciem wątków.
• Wbudowane narzędzia pracy w sieci.
• Przenaszalność kodu wynikowego (!?).
• Język internetu.
• Wydajność (ok. 50 – 100% C++).
C++
C++
C++
C++
C++
C++
C++
C++
Ogólna charakterystyka C++, Java
6
6
C/C++: kompilowany
C/C++: kompilowany
Kompilator (compiler)
Kompilator (
Kompilator (
compiler
compiler
)
)
Plik
obiektowy
1
*.OBJ
Plik
obiektowy
2
*.OBJ
Plik
obiektowy
N
*.OBJ
Plik wykonywalny, np.:
*.EXE
*.*
Plik wykonywalny, np.:
*.EXE
*.*
C++
C++
C++
C++
C++
C++
C++
C++
Konsolidator (linker)
Konsolidator (linker)
Konsolidator (linker)
Standardowa biblioteka A
Standardowa biblioteka B
Standardowa biblioteka C
...
Pliki
nagłówkowe
Pliki
nagłówkowe
Pliki
nagłówkowe
Plik
źródłowy 1
*.C
*.CPP
*.CXX
Plik
źródłowy 2
*.C
*.CPP
*.CXX
Plik
źródłowy N
*.C
*.CPP
*.CXX
*.obj - niewykonywalny plik,
zawierający instrukcje
maszynowe specyficzne dla danej
platformy sprzętowej (odwołania
do funkcji CPU) i OS (np.
odwołania do API). Powstaje kod
maszynowy niezależny od języka
programowania ale zawierający
odwołania do zastosowanego
środowiska.
*.obj - niewykonywalny plik,
zawierający instrukcje
maszynowe specyficzne dla danej
platformy sprzętowej (odwołania
do funkcji CPU) i OS (np.
odwołania do API). Powstaje kod
maszynowy niezależny od języka
programowania ale zawierający
odwołania do zastosowanego
środowiska.
Konsolidator tworzy wykonywalny
plik (do uruchomienia), przez
połączenie plików *.obj. Pliki *.obj
mogą być z różnych środowisk.
Powstaje kod maszynowy zależny
od platformy.
Konsolidator tworzy wykonywalny
plik (do uruchomienia), przez
połączenie plików *.obj. Pliki *.obj
mogą być z różnych środowisk.
Powstaje kod maszynowy zależny
od platformy.
Metodyki i technki programowania 1
2011
B. Butryło
4
Ogólna charakterystyka C++, Java
7
7
Java: kompilowany+interpretowany
Java: kompilowany+interpretowany
Plik
źródłowy 1
*.java
Plik
źródłowy 2
*.java
public class test
{
double alfa, beta;
...
metoda_test()
{
alfa = 3.14;
beta = 1;
...
javac (kompilator)
javac
javac
(kompilator)
(kompilator)
Kod binarny interpretowany
*.class
Kod binarny interpretowany
*.class
Java
Virtual
Machine
PC
Java
Virtual
Machine
Mac
Java
Virtual
Machine
Super-
komp.
bytecode, b-code: kod binarny
dla wirtualnej maszyny javy
(JVM). Możliwe tworzenie b-kody
z innych języków i uruchomienie
przez JVM.
W przypadku Javy realizowane
pliki mają zwykle rozszerzenia
*.class lub *.jar
bytecode, b-code: kod binarny
dla wirtualnej maszyny javy
(JVM). Możliwe tworzenie b-kody
z innych języków i uruchomienie
przez JVM.
W przypadku Javy realizowane
pliki mają zwykle rozszerzenia
*.class lub *.jar
Słowa kluczowe
w
C++
Słowa kluczowe
w
C++
Metodyki i technki programowania 1
2011
B. Butryło
5
C ... C++ ... Java
9
9
Słowa zarezerwowane
Słowa zarezerwowane
C: proceduralnie
C: proceduralnie
asm
auto
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast
else
enum
explicit
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
operator
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
struct
switch
template
this
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
asm
auto
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast
else
enum
explicit
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
operator
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
struct
switch
template
this
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
C++: proceduralnie / OOP
C++: proceduralnie / OOP
słowa kluczowe
=
nazwy
zabronione
słowa kluczowe
=
nazwy
zabronione
C ... C++ ... Java
10
10
Słowa zarezerwowane
Słowa zarezerwowane
Java: obiektowo
Java: obiektowo
abstract
boolean
break
byte
case
catch
char
class
const
(*)
continue
default
do
double
else
extends
final
finally
float
for
goto
(*)
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
(*)
try
void
volatile
while
Nie są słowami kluczowymi, ale są zastrzeżone:
null, true, false
asm
auto
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast
else
enum
explicit
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
operator
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
struct
switch
template
this
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
C++: proceduralnie / OOP
C++: proceduralnie / OOP
Metodyki i technki programowania 1
2011
B. Butryło
6
C ... C++ ... Java
11
11
Słowa zarezerwowane
Słowa zarezerwowane
Java: obiektowo
Java: obiektowo
abstract
boolean
break
byte
case
catch
char
class
const
(*)
continue
default
do
double
else
extends
final
finally
float
for
goto
(*)
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
(*)
try
void
volatile
while
Nie są słowami kluczowymi, ale są zastrzeżone:
null, true, false
asm
auto
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast
else
enum
explicit
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
operator
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
struct
switch
template
this
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
C++: proceduralnie / OOP
C++: proceduralnie / OOP
słowa kluczowe
=
nazwy
zabronione
słowa kluczowe
=
nazwy
zabronione
Struktura programu w C++
(programowanie
blokowo - strukturalne)
Struktura programu w C++
(programowanie
blokowo - strukturalne)
Metodyki i technki programowania 1
2011
B. Butryło
7
Paradygmaty
13
13
{
{
}
}
{
{
}
}
§
Grupowanie instrukcji.
§
Podejmowanie decyzji.
§
Wybór jednego z wielu możliwych przypadków.
§
Powtarzanie rozkazów ze sprawdzeniem
warunku na początku lub końcu.
§
Wykorzystanie funkcji.
§
Budowa programu z wielu plików źródłowych.
§
Możliwość tworzenia i wykorzystania typów
pochodnych.
Programowanie blokowo-strukturalne
Programowanie blokowo-strukturalne
Struktura programu w C++ (programowanie strukturalne)
14
14
Najprostszy program w C++
Najprostszy program w C++
void main( void )
{
}
funkcja główna (definicja):
main
Metodyki i technki programowania 1
2011
B. Butryło
8
Struktura programu w C++ (programowanie strukturalne)
15
15
Program z przetwarzaniem (1)
Program z przetwarzaniem (1)
void main( void )
{
int a;
int b = 20;
a = 30;
a=a+b;
}
funkcja główna (definicja):
main
Struktura programu w C++ (programowanie strukturalne)
16
16
Program z przetwarzaniem (2)
Program z przetwarzaniem (2)
#include <cmath>
void main( void )
{
double radiany, stopnie;
int a = 30;
// re
int b = 20;
// im
radiany = atan2( b; a );
stopnie = radiany * 180 / 3.14;
}
funkcja główna (definicja):
main
deklaracja plików nagłówkowych
Re
Im
a
b
radiany
stopnie
Komentarze:
/* komentarz
wieloliniowy */
// komentarz w 1 linii
Komentarze:
/* komentarz
wieloliniowy */
// komentarz w 1 linii
Metodyki i technki programowania 1
2011
B. Butryło
9
Struktura programu w C++ (programowanie strukturalne)
17
17
Program z przetwarzaniem (3) i komunikacją
Program z przetwarzaniem (3) i komunikacją
#include <cmath>
#include <iostream>
using namespace std;
void main( void )
{
double radiany, stopnie;
int a = 30;
// re
int b = 20;
// im
radiany = atan2( b; a );
stopnie = radiany * 180 / 3.14;
cout << "Wynik obliczen: " << endl;
cout << stopnie << endl;
}
funkcja główna (definicja):
main
deklaracja plików nagłówkowych
Użycie zmiennych
środowiskowych, nazw typów
pochodnych i złożonych
wymaga wskazania jaką
przestrzeń nazw użytkujemy.
Można wskazać raz:
using namespace std;
Użycie zmiennych
środowiskowych, nazw typów
pochodnych i złożonych
wymaga wskazania jaką
przestrzeń nazw użytkujemy.
Można wskazać raz:
using namespace std;
Standardowe
funkcje przed
użyciem musza być
zdefiniowane
przez użycie
plików
nagłówkowych.
Standardowe
funkcje przed
użyciem musza być
zdefiniowane
przez użycie
plików
nagłówkowych.
Struktura programu w C++ (programowanie strukturalne)
18
18
Program z własnymi funkcjami (1)
Program z własnymi funkcjami (1)
#include <cmath>
#include <iostream>
using namespace std;
/*******************/
double licz_stopnie( double wart_radian)
{
stopnie = wart_radiany * 180 / 3.14;
return stopnie;
}
/*******************/
void main( void )
{
double radiany, stopnie;
int a = 30;
// re
int b = 20;
// im
radiany = atan2( b; a );
stopnie = licz_stopnie( radiany );
cout << "Wynik obliczen: " << stopnie << endl;
}
funkcja główna (definicja):
main
deklaracja plików nagłówkowych
Własne funkcje należy
definiować przed ich
użyciem.
Sposób najprostszy ale
utrudnia analizę programu.
funkcja pomocnicza (definicja):
licz_stopnie
Metodyki i technki programowania 1
2011
B. Butryło
10
Struktura programu w C++ (programowanie strukturalne)
19
19
Program z własnymi funkcjami (2)
Program z własnymi funkcjami (2)
#include <cmath>
#include <iostream>
using namespace std;
double licz_stopnie( double);
//deklaracja
/*******************/
void main( void )
{
double radiany, stopnie;
int a = 30;
// re
int b = 20;
// im
radiany = atan2( b; a );
stopnie = licz_stopnie( radiany );
cout << "Wynik obliczen: " << endl;
cout << stopnie << endl;
}
/*******************/
double licz_stopnie( double wart_radian)
{
stopnie = wart_radiany * 180 / 3.14;
return stopnie;
}
funkcja główna (definicja):
main
deklaracja plików nagłówkowych
Własne funkcje
można
zadeklarować a
potem dopiero
definiować.
funkcja pomocnicza (deklaracja):
licz_stopnie
funkcja pomocnicza (definicja):
licz_stopnie
Struktura programu w C++ (programowanie strukturalne)
20
20
Program z własnymi funkcjami (3)
Program z własnymi funkcjami (3)
#include <cmath>
#include <iostream>
#include "moje_funkcje"
using namespace std;
/*******************/
void main( void )
{
double radiany, stopnie;
int a = 30;
// re
int b = 20;
// im
radiany = atan2( b; a );
stopnie = licz_stopnie( radiany );
cout << "Wynik obliczen: " << endl;
cout << stopnie << endl;
}
Zalecane
tworzenie
programów wielo-
modułowych,
złożonych z wielu
plików.
funkcja główna
(definicja):
main
deklaracja plików
nagłówkowych
funkcja pomocnicza
(definicja):
licz_stopnie
deklaracja plików
nagłówkowych
#include <cmath>
#include <iostream>
using namespace std;
double licz_stopnie( double);
/*******************/
double licz_stopnie( double
wart_radian)
{
stopnie = wart_radiany * 180 / 3.14;
return stopnie;
}
Plik: moje_funkcje
Metodyki i technki programowania 1
2011
B. Butryło
11
Paradygmaty
21
21
C++: struktura pliku źródłowego
C++: struktura pliku źródłowego
pliki nagłówkowe dołączane w trakcie kompilacji
pliki nagłówkowe dołączane w trakcie kompilacji
deklaracja i definicja funkcji B
deklaracja i definicja funkcji B
deklaracja i definicja funkcji main
deklaracja i definicja funkcji main
deklaracja i definicja funkcji A
deklaracja i definicja funkcji A
Paradygmaty
22
22
C++: struktura pliku źródłowego
C++: struktura pliku źródłowego
pliki nagłówkowe dołączane w trakcie kompilacji
pliki nagłówkowe dołączane w trakcie kompilacji
stałe deklarowane w programie
stałe deklarowane w programie
zmienne globalne dostępne w programie
zmienne globalne dostępne w programie
deklaracja i definicja funkcji D
deklaracja i definicja funkcji D
deklaracja i definicja funkcji B
deklaracja i definicja funkcji B
deklaracja i definicja funkcji main
deklaracja i definicja funkcji main
deklaracja i definicja funkcji A
deklaracja i definicja funkcji A
deklaracja i definicja funkcji E
deklaracja i definicja funkcji E
pliki nagłówkowe dołączane w trakcie kompilacji
pliki nagłówkowe dołączane w trakcie kompilacji
stałe deklarowane w programie
stałe deklarowane w programie
zmienne globalne dostępne w programie
zmienne globalne dostępne w programie
deklaracja i definicja funkcji D
deklaracja i definicja funkcji D
deklaracja i definicja funkcji B
deklaracja i definicja funkcji B
deklaracja i definicja funkcji main
deklaracja i definicja funkcji main
definicja funkcji E
definicja funkcji E
definicja funkcji A
definicja funkcji A
deklaracja funkcji A
deklaracja funkcji A
deklaracja funkcji E
deklaracja funkcji E
Metodyki i technki programowania 1
2011
B. Butryło
12
Paradygmaty
23
23
C++: zbiór plików tworzących kod źródłowy
C++: zbiór plików tworzących kod źródłowy
pliki nagłówkowe dołączane w trakcie kompilacji
pliki nagłówkowe dołączane w trakcie kompilacji
stałe deklarowane w programie
stałe deklarowane w programie
deklaracja i definicja funkcji main
deklaracja i definicja funkcji main
pliki nagłówkowe dołączane w trakcie kompilacji
pliki nagłówkowe dołączane w trakcie kompilacji
stałe deklarowane w programie
stałe deklarowane w programie
zmienne globalne dostępne w programie
zmienne globalne dostępne w programie
deklaracja i definicja funkcji D
deklaracja i definicja funkcji D
deklaracja i definicja funkcji B
deklaracja i definicja funkcji B
definicja funkcji E
definicja funkcji E
definicja funkcji A
definicja funkcji A
deklaracja funkcji A
deklaracja funkcji A
deklaracja funkcji E
deklaracja funkcji E
deklaracja i definicja funkcji A1
deklaracja i definicja funkcji A1
deklaracja i definicja funkcji A2
deklaracja i definicja funkcji A2
deklaracja i definicja funkcji A3
deklaracja i definicja funkcji A3
deklaracja i definicja funkcji A4
deklaracja i definicja funkcji A4
Paradygmaty
24
24
C++: struktura programu
C++: struktura programu
Program
Funkcja
A
Wyrażenia,
instrukcje
wykonywanie
operacji na
zmiennych
Funkcja
E
Funkcja
E
zmienne
instrukcje
wyrażenia
Funkcja
B
Funkcja
B
zmienne
instrukcje
wyrażenia
Funkcja
D
Funkcja
D
zmienne
instrukcje
wyrażenia
Funkcja main
Funkcja main
zmienne
instrukcje
wyrażenia
Funkcja
S2
Funkcja
S2
zmienne
instrukcje
wyrażenia
Funkcja
S1
Funkcja
S1
zmienne
instrukcje
wyrażenia
Enter
Metodyki i technki programowania 1
2011
B. Butryło
13
Paradygmaty
25
25
C: struktura pliku źródłowego *.C
C: struktura pliku źródłowego *.C
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
float funkcja( float w_x )
{
float w_y;
w_y = 3 * w_x * w_x * w_x + 2 * w_x * w_x - 40 * w_x + 10;
return( w_y );
}
int main (void)
{
int i, j;
float a, f_a, b, f_b, x, y, epsilon;
printf( "\na = ");
scanf( "%f", &a);
printf( "\nb = ");
scanf( "%f", &b);
epsilon = 1e-5;
f_a = funkcja( a );
f_b = funkcja( b );
if ( f_a * f_b < 0 )
{
i = 0;
x = a;
y = f_a;
while ( fabs( y ) > epsilon )
{
x = a - f_a * ( b - a ) / ( f_b - f_a );
y = funkcja( x );
if ( f_a * y > 0 ) f_a = y;
else f_b = y;
i = i + 1;
}
printf( "Wynik x = %f, y(x) = %f po %d krokach. \n", x, y, i );
}
else
printf( "Nie ma miejsca zerowego w podanym przedziale.\n" );
getch();
}
Enter
•Średnik.
•Instrukcja grupująca.
•Komentarz.
•Wartość logiczna (?!).
•Średnik.
•Instrukcja grupująca.
•Komentarz.
•Wartość logiczna (?!).
C++:
standardowe
elementy
środowiska programowania
C++:
standardowe
elementy
środowiska programowania
Metodyki i technki programowania 1
2011
B. Butryło
14
Struktura programu w C++ (programowanie strukturalne)
27
27
Pliki nagłówkowe (header files)
Pliki nagłówkowe (header files)
Dołączanie plików nagłówkowych
#include <
nazwa_pliku
>
#include "nazwa_pliku"
<algorithm>
<bitset>
<complex>
<deque>
<exception>
<fstream>
<functional>
<iomanip>
<ios>
<iosfwd>
<iostream>
<istream>
<iterator>
<limits>
<list>
<locale>
<map>
<memory>
<new>
<numeric>
<ostream>
<queue>
<set>
<sstream>
<stack>
<algorithm>
<bitset>
<complex>
<deque>
<exception>
<fstream>
<functional>
<iomanip>
<ios>
<iosfwd>
<iostream>
<istream>
<iterator>
<limits>
<list>
<locale>
<map>
<memory>
<new>
<numeric>
<ostream>
<queue>
<set>
<sstream>
<stack>
<stdexcept>
<streambuf>
<string>
<typeinfo>
<utility>
<valarray>
<vector>
<cassert>
<cctype>
<cerrno>
<cfloat>
<ciso646>
<climits>
<clocale>
<cmath>
<csetjmp>
<csignal>
<cstdarg>
<cstddef>
<cstdio>
<cstdlib>
<cstring>
<ctime>
<cwchar>
<cwtype>
Należy unikać
stosowania starych
nazw plików
nagłówkowych z
języka C.
Należy unikać
stosowania starych
nazw plików
nagłówkowych z
języka C.
Struktura programu w C++ (programowanie strukturalne)
28
28
Pliki nagłówkowe (header files)
Pliki nagłówkowe (header files)
...
#include <cmath>
...
Funkcje trygonometryczne:
acos, asin, atan, atan2, cos, sin, tan.
Funkcje hiperboliczne:
cosh, sinh, tanh.
Funkcje wykładnicze i logarytmiczne: exp, frexp, ldexp, log, log10, modf.
Funkcje potęgowe:
pow, sqrt.
Funkcje zaokrąglenia:
ceil, fabs, floor, fmod.
...
#include <complex>
...
Klasa complex do reprezentacji i operacji na liczbach zespolonych (Re+jIM).
Funkcje dotyczące liczb zespolonych: abs, arg, conj, imag, norm, polar, real.
Funkcje przeciążone dla liczb zespolonych:
cos, sin.
cosh, sinh.
exp, log.
pow, sqrt.
Operatory przeciążone dla liczb zespolonych:
+ - * / == != += -= *= /=
Metodyki i technki programowania 1
2011
B. Butryło
15
Struktura programu w C++ (programowanie strukturalne)
29
29
Pliki nagłówkowe (header files)
Pliki nagłówkowe (header files)
...
#include <iostream>
...
Klasy, m.in..:
istream, ostream, iostream, ifstream,
ofstream.
Obiekty (standardowe strumienie):
cin, cout, cerr, clog.
Funkcje do formatowania, przetwarzania i manipulowania strumieniami, np.:
fixed, scientific,
left, right, fmod,
setw, setprecision,
uppercase, nouppercase,
endl, ends.
...
#include <ctime>
...
Typy danych właściwe do zapisu czasu, m.in.:
clock_t, time_t, size_t, struct tm.
Funkcje do konwersji:
asctime, ctime, gmtime, localtime, strftime.
Funkcje do przetwarzania danych w formatach właściwych dla czasu, np.:
clock, difftime, mktime, time.
C++:
przestrzeń nazw
C++:
przestrzeń nazw
Metodyki i technki programowania 1
2011
B. Butryło
16
Struktura programu w C++ (programowanie strukturalne)
31
31
Włączenie / aktywacja przestrzeni
Włączenie / aktywacja przestrzeni
Deklaracja przestrzeni
Deklaracja przestrzeni
Program
Przestrzeń nazw – widoczność, dostęp
Przestrzeń nazw – widoczność, dostęp
namespace
nazwa_przestrzeni
{
nazwy / zmienne / funkcje / klasy
}
using namespace
nazwa_przestrzeni
;
namespace std
namespace std
namespace moje
namespace moje
namespace bibl
namespace bibl
standardowe
specjalne
biblioteki
Struktura programu w C++ (programowanie strukturalne)
32
32
Przestrzeń nazw – widoczność, dostęp
Przestrzeń nazw – widoczność, dostęp
namespace kal_julianski
{
int dzien;
int miesiac;
int rok;
}
#include …
using namespace std;
main()
{
…
using namespace kal_julianski;
…
using namespace kal_aaaa;
…
}
namespace kal_aaaa
{
int dzien;
int miesiac;
int rok;
}
Metodyki i technki programowania 1
2011
B. Butryło
17
Nowe zagadnienie ...
33
33
Dodatek:
klasa (!) complex
Dodatek:
klasa (!) complex
Klasy standardowe
34
34
Liczby zespolone
Liczby zespolone
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <complex>
complex<double> cmp_1, cmp_2, cmp_3;
double d1, d2, d3;
...
complex<double> jedynka_rzeczyw;
jedynka_rzeczyw = complex<double>( 1.0, 0.0);
complex<double> zero_zespolone = complex<double>( 0.0, 0.0);
complex<double> jedynka_urojona = complex<double>( 0.0, 1.0);
complex<double> * zespolony_wektor;
zespolony_wektor = new complex<double> [ dlugosc ];
cmp_1 = complex<double>( 2.0, 3.0);
cmp_2 = complex<double>( dane1*dane_pi, mnoznik*dane2);
zespolony_wektor[0] = cmp_1 * cmp_2;
d1 = real( zespolony_wektor[0]);
d2 = imag( zespolony_wektor[0]);
cout << real( zespolony_wektor[1]) << endl;
cout << imag( zespolony_wektor[1]) << endl;
cout << sqrt( d1 * d1 + d2 * d2 ) << " " << atan2( d2, d1 ) << endl;
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <complex>
complex<double> cmp_1, cmp_2, cmp_3;
double d1, d2, d3;
...
complex<double> jedynka_rzeczyw;
jedynka_rzeczyw = complex<double>( 1.0, 0.0);
complex<double> zero_zespolone = complex<double>( 0.0, 0.0);
complex<double> jedynka_urojona = complex<double>( 0.0, 1.0);
complex<double> * zespolony_wektor;
zespolony_wektor = new complex<double> [ dlugosc ];
cmp_1 = complex<double>( 2.0, 3.0);
cmp_2 = complex<double>( dane1*dane_pi, mnoznik*dane2);
zespolony_wektor[0] = cmp_1 * cmp_2;
d1 = real( zespolony_wektor[0]);
d2 = imag( zespolony_wektor[0]);
cout << real( zespolony_wektor[1]) << endl;
cout << imag( zespolony_wektor[1]) << endl;
cout << sqrt( d1 * d1 + d2 * d2 ) << " " << atan2( d2, d1 ) << endl;
Dostępne operatory
*
/
+
-
*=
/=
+=
-=
=
>>
<<
Dostępne operatory
*
/
+
-
*=
/=
+=
-=
=
>>
<<
Dostępne funkcje
sqrt
pow
exp
log
sin
cos
sinh
cosh
atan2
Dostępne funkcje
sqrt
pow
exp
log
sin
cos
sinh
cosh
atan2
Metodyki i technki programowania 1
2011
B. Butryło
18
35
35
Funkcje
deklarowanie i definiowanie
własnych funkcji
Funkcje
deklarowanie i definiowanie
własnych funkcji
Funkcje
36
36
C++: funkcja, definicja funkcji
C++: funkcja, definicja funkcji
typ
wyniku
nazwa
funkcji
nazwa
funkcji
(
)
deklaracja
argumentów
deklaracja
argumentów
{
}
wewnętrzna część funkcji:
• deklaracje zmiennych;
• wyrażenia;
• przetwarzanie danych;
void pusta()
{
}
void pusta()
{
}
pusta()
{
}
pusta()
{
}
Przykład 1:
Przykład 2:
Metodyki i technki programowania 1
2011
B. Butryło
19
Funkcje
37
37
C++: funkcja, definicja funkcji
C++: funkcja, definicja funkcji
typ
wyniku
nazwa
funkcji
nazwa
funkcji
(
)
deklaracja
argumentów
deklaracja
argumentów
{
}
wewnętrzna część funkcji:
• deklaracje zmiennych;
• wyrażenia;
• przetwarzanie danych;
int jedynka()
{
int a;
a= 1;
return (a);
}
int jedynka()
{
int a;
a= 1;
return (a);
}
int jedynka()
{
return (1);
}
int jedynka()
{
return (1);
}
Przykład 1:
Przykład 2:
Funkcje
38
38
C++: funkcja, definicja funkcji
C++: funkcja, definicja funkcji
typ
wyniku
nazwa
funkcji
nazwa
funkcji
(
)
deklaracja
argumentów
deklaracja
argumentów
{
}
wewnętrzna część funkcji:
• deklaracje zmiennych;
• wyrażenia;
• przetwarzanie danych;
float modul_liczby( float a, float b)
{
float wynik;
wynik= sqrt( a*a + b*b);
return (wynik);
}
float modul_liczby( float a, float b)
{
float wynik;
wynik= sqrt( a*a + b*b);
return (wynik);
}
float suma( int a, float b)
{
return (b+a);
}
float suma( int a, float b)
{
return (b+a);
}
Przykład 1:
Przykład 2:
Metodyki i technki programowania 1
2011
B. Butryło
20
Funkcje
39
39
C++: funkcja, definicja funkcji
C++: funkcja, definicja funkcji
typ
wyniku
nazwa
funkcji
nazwa
funkcji
(
)
deklaracja
argumentów
deklaracja
argumentów
{
}
wewnętrzna część funkcji:
• deklaracje zmiennych;
• wyrażenia;
• przetwarzanie danych;
float funkcja( float w_x )
{
float w_y;
w_y =
3 * w_x * w_x * w_x +
2 * w_x * w_x –
40 * w_x + 10;
return( w_y );
}
float funkcja( float w_x )
{
float w_y;
w_y =
3 * w_x * w_x * w_x +
2 * w_x * w_x –
40 * w_x + 10;
return( w_y );
}
Przykład 1:
Funkcje
40
40
C++: funkcja, definicja funkcji
C++: funkcja, definicja funkcji
typ
wyniku
nazwa
funkcji
nazwa
funkcji
(
)
deklaracja
argumentów
deklaracja
argumentów
{
}
wewnętrzna część funkcji:
• deklaracje zmiennych;
• wyrażenia;
• przetwarzanie danych;
int main (void)
{
int i, j;
float a, f_a, b, f_b, x, y, epsilon;
printf( "\na = ");
scanf( "%f", &a);
printf( "\nb = ");
scanf( "%f", &b);
epsilon = 1e-5;
f_a = funkcja( a );
f_b = funkcja( b );
if ( f_a * f_b < 0 )
{
i = 0;
x = a;
y = f_a;
while ( fabs( y ) > epsilon )
{
x = a - f_a * ( b - a ) / ( f_b - f_a );
y = funkcja( x );
if ( f_a * y > 0 ) f_a = y;
else f_b = y;
i = i + 1;
}
printf( "x = %f, y(x) = %f.\n", x, y);
}
else
printf( "Nie ma miejsca zerowego w przedziale.\n" );
getch();
}
int main (void)
{
int i, j;
float a, f_a, b, f_b, x, y, epsilon;
printf( "\na = ");
scanf( "%f", &a);
printf( "\nb = ");
scanf( "%f", &b);
epsilon = 1e-5;
f_a = funkcja( a );
f_b = funkcja( b );
if ( f_a * f_b < 0 )
{
i = 0;
x = a;
y = f_a;
while ( fabs( y ) > epsilon )
{
x = a - f_a * ( b - a ) / ( f_b - f_a );
y = funkcja( x );
if ( f_a * y > 0 ) f_a = y;
else f_b = y;
i = i + 1;
}
printf( "x = %f, y(x) = %f.\n", x, y);
}
else
printf( "Nie ma miejsca zerowego w przedziale.\n" );
getch();
}
Przykład 1
Metodyki i technki programowania 1
2011
B. Butryło
21
Funkcje
41
41
Przekazywanie argumentów
Przekazywanie argumentów
typ
wyniku
nazwa
funkcji
nazwa
funkcji
(
)
deklaracja
argumentów
deklaracja
argumentów
{
}
wewnętrzna część funkcji:
• deklaracje zmiennych;
• wyrażenia;
• przetwarzanie danych;
przez wartość
double oblicz_kat( double x, int flaga )
{
double z;
if (flaga == 1)
z=x*2*M_PI/360;
else if (flaga == 2) z=x*100/360;
x=0;
return( z );
}
double oblicz_kat( double x, int flaga )
{
double z;
if (flaga == 1)
z=x*2*M_PI/360;
else if (flaga == 2) z=x*100/360;
x=0;
return( z );
}
przez referencję
double oblicz_kat( double &x, int flaga )
{
double z;
if (flaga == 1)
z=x*2*M_PI/360;
else if (flaga == 2) z=x*100/360;
x=0;
return( z );
}
double oblicz_kat( double &x, int flaga )
{
double z;
if (flaga == 1)
z=x*2*M_PI/360;
else if (flaga == 2) z=x*100/360;
x=0;
return( z );
}
przez wskaźnik
double oblicz_kat( double * x, int flaga )
{
double z;
if (flaga == 1)
z=*x*2*M_PI/360;
else if (flaga == 2) z=*x*100/360;
*x = 0;
return( z );
}
double oblicz_kat( double * x, int flaga )
{
double z;
if (flaga == 1)
z=*x*2*M_PI/360;
else if (flaga == 2) z=*x*100/360;
*x = 0;
return( z );
}
double argument = 1.2;
wynik = oblicz_kat( argument, 1 );
double argument = 1.2;
wynik = oblicz_kat( argument, 1 );
double argument = 1.2;
wynik = oblicz_kat( &argument, 1 );
Nowe zagadnienie ...
42
42
Typy podstawowe
Typy podstawowe
Metodyki i technki programowania 1
2011
B. Butryło
22
Nowe zagadnienie ...
43
43
Zmienne
Zmienne
• Sposób deklarowania zmiennych.
• Definiowanie zmiennych.
• Propozycje notacji.
• Charakterystyka modyfikatorów.
• Dynamiczna alokacja zmiennych.
• Zakres życia zmiennych.
• Zakres widoczności zmiennych.
• Przestrzenie nazw.
Zmienne
44
44
Typy podstawowe
Typy podstawowe
C++
C++
Java
Java
8 B
0.0
IEEE 754
double
4 B
0.0
IEEE 754
float
8 B
0
-1·2
64-1 :
2
64-1
-1
long
4 B
0
-2 147 483 648 :
2 147 483 647
int
2 B
0
-32768 : 32767
short
1 B
0
-128 : 127
byte
2 B
\u0000
znak Unicode
char
1 B
false
true | false
boolean
Rozmiar
Wartość
domyślna
Zakres dopuszczalnych
wartości
Typ
zmiennej
Programy są przenośne ponieważ rozmiar
każdego typu jest niezmienny.
8 B
0.0
IEEE 754
double
10 B
0.0
IEEE 754
long double
4 B
0.0
IEEE 754
float
4 B
0
-2 147 483 648 :
2 147 483 647
long int
long
4 B
0
-2 147 483 648 :
2 147 483 647
int
2 B
0
-32768 : 32767
short
short int
1 B
0
znak, -128 : 127
char
1 B
false
true | false
bool
Rozmiar
Wartość
domyślna
Zakres dopuszczalnych
wartości
Typ zmiennej
Programy (kody wynikowe) nie są przenośne
ponieważ rozmiary niektórych typów zależą
od implementacji.
void = (pusty)
void = (pusty)
Metodyki i technki programowania 1
2011
B. Butryło
23
Wstęp
45
45
C++ typy zmiennych
C++ typy zmiennych
Zmienne
Zmienne
-128
0
-32768
-32768
0
-2147483648
0
3.4e-38
1.7e-308
3.4e-4932
127
255
32767
32767
65635
2147483647
429467295
3.4e+38
1.7e+308
1.1e+4932
Proste,
podstawowe
Proste,
podstawowe
Pochodne
Pochodne
Pusty
Pusty
znakowy
znakowy
całkowity
całkowity
zmienno-
pozycyjny
zmienno-
pozycyjny
tablice
tablice
struktury
struktury
unie
unie
wskaźniki
wskaźniki
void
char
unsigned char
short
int
unsigned int
long
unsigned long
enum
float
double
long double
Zmienne
46
46
C++ i Java: definicja zmiennych
C++ i Java: definicja zmiennych
;
modyfikator/
modyfikatory
modyfikator/
modyfikatory
typ zmiennej
typ zmiennej
identyfikator
identyfikator
wartość
początkowa
wartość
początkowa
Po identyfikatorze
może być określona
wartość początkowa
zamiennej
poprzedzona znakiem
równości.
Opcjonalny ciąg
modyfikatorów w dowolnej
kolejności. Typy
modyfikatorów: dostępu,
zachowania wartości,
zakresu wartości,
synchronizacji.
C++
C++
Java
Java
public
private
protected
auto
const
extern
register
static
volatile
signed
unsigned
public
private
protected
auto
const
extern
register
static
volatile
signed
unsigned
public
private
protected
const
(*)
final
static
synchronized
transient
volatile
public
private
protected
const
(*)
final
static
synchronized
transient
volatile
const
const
double
double
pi
pi
= 3.14
= 3.14
;
;
static
static
int
int
i_licznik
i_licznik
= 0
= 0
;
;
float
float
zm_1, zm2
zm_1, zm2
;
;
long
long
a1=0, zm2=5
a1=0, zm2=5
;
;
Jeden z typów
dostępnych w języku,
określa dozwolone
wartości
C++
C++
Java
Java
• podstawowe,
• wyliczeniowy,
• pochodne,
• własne.
Lista identyfikatorów
zmiennych
oddzielanych
przecinkami
•
reguły (!),
• zalecenia (?),
• przyzwyczajenia (??),
• zasady (???)
Metodyki i technki programowania 1
2011
B. Butryło
24
Zmienne
47
47
Identyfikatory zmiennych / pól / metod
Identyfikatory zmiennych / pól / metod
C++
C++
Java
Java
• Dowolna długość.
• Musi zaczynać się literą,
podkreśleniem _, znakiem $.
• Kombinacja znaków (litery, cyfry, _).
• Obowiązuje Unicode (szeroki zbiór
liter i znaków).
• Rozróżniane są małe i duże litery.
/*
identyfikatory zmiennych */
int
a, ą, à, á, ã;
char
znak, Zażółć, _to_jest_to;
double
ππππ
= 3.15;
float $b1=0.5f;
• Dowolna długość (kompilator
identyfikuje zwykle pierwsze 16/32
znaki).
• Musi zaczynać się literą,
podkreśleniem _, znakiem $.
• Kombinacja znaków (litery, cyfry, _).
• Obowiązuje ASCII.
• Rozróżniane są małe i duże litery.
/*
identyfikatory zmiennych */
int
a, a1, a2, aa, a_b;
char
znak, Zazolc, _to_jest_to;
double pi = 3.15;
float $b1=0.5f;
słowa kluczowe = nazwy zabronione
słowa kluczowe = nazwy zabronione
Zmienne
48
48
Identyfikatory: notacja węgierska
Identyfikatory: notacja węgierska
• Sposób nazewnictwa zmiennych, polegający na poprzedzaniu właściwej
nazwy zmiennej małą literą (literami) określającą rodzaj tej zmiennej.
• Jeden ze sposobów oznaczania zmiennych. Nie do końca
sformalizowany, np.
i_calkowita
icalkowita
iCalkowita
• Wada: problemy przy zmianie typu zmiennej. Zmiana typu zmiennej
wymaga poprawienia nazwy zmiennej w całym programie. Z tego powodu
nie zalecana dla początkujących programistów.
• Zalety:
• przejrzysta zasada nazewnictwa,
• ułatwione kontrolowanie operacji na zmiennych w programie,
• kontrola algorytmu (swoiste
debugowanie
) na etapie pisania
programu.
Propozycja
Propozycja
Metodyki i technki programowania 1
2011
B. Butryło
25
Zmienne
49
49
Identyfikatory: notacja węgierska
Identyfikatory: notacja węgierska
s
string (łańcuch znaków)
sz
string (łańcuch znaków zakończony bajtem zerowym - null'em)
c
1. char (jeden znak),
2. const - wartość stała
by
byte, unsigned char
n
short
i
integer, int
x, y
integer, zmienne określające współrzędne
cx, cy
integer, zmienne określające rozmiar, długość
i
integer, int
l
long
przedrostek
opis symbolu w notacji
Propozycja
Propozycja
Zmienne
50
50
Identyfikatory: notacja węgierska
Identyfikatory: notacja węgierska
b
boolean (wartość logiczna: prawda lub fałsz)
f
flaga
fn
funkcja
h
handle (uchwyt)
p
pointer (wskaźnik)
• Możliwe jest łączenie przedrostków, np.
pf
,
pi
.
przedrostek
opis symbolu w notacji
Propozycja
Propozycja
Metodyki i technki programowania 1
2011
B. Butryło
26
Zmienne
51
51
Identyfikatory: klasy i pola
Identyfikatory: klasy i pola
Klasy:
• nazwy rozpoczynają się dużą literą,
• kolejne wyrazy w identyfikatorze też z dużej litery.
Przykłądy:
KlasaDanychOsobowych
InputFromDataAcquisitionCard
Zmienne, pola, metody (w ramach klasy):
• nazwy rozpoczynają się małą literą,
• kolejne wyrazy w identyfikatorze też z dużej litery.
Przykłądy:
nazwiskoOsoby
osoba_Rok_Urodzenia
inputFromChannel_5
Propozycja
Propozycja
Nowe zagadnienie ...
52
52
Modyfikatory
Modyfikatory
Metodyki i technki programowania 1
2011
B. Butryło
27
Zmienne
53
53
Modyfikatory: zakres wartości
Modyfikatory: zakres wartości
C++
C++
signed
8 B
0.0
IEEE 754
double
10 B
0.0
IEEE 754
long double
4 B
0.0
IEEE 754
float
4 B
0
-2 147 483 648 :
2 147 483 647
long int
long
4 B
0
-2 147 483 648 :
2 147 483 647
int
2 B
0
-32768 : 32767
short
short int
1 B
0
znak, -128 : 127
char
1 B
false
true | false
bool
Rozmiar
Wartość
domyślna
Zakres dopuszczalnych
wartości
Typ zmiennej
8 B
0.0
IEEE 754
double
10 B
0.0
IEEE 754
long double
4 B
0.0
IEEE 754
float
4 B
0
0 :
4 294 967 296
long int
long
4 B
0
0 :
4 294 967 296
int
2 B
0
0 : 65536
short
short int
1 B
0
znak, 0 : 255
char
1 B
false
true | false
bool
Rozmiar
Wartość
domyślna
Zakres dopuszczalnych
wartości
Typ zmiennej
unsigned
W Javie nie
ma
modyfikatorów
zakresu!
W Javie nie
ma
modyfikatorów
zakresu!
/*
identyfikatory zakresu wartości */
signed int roznica_wieku = -10;
signed char przesuniecie_kodu = -32;
/*
identyfikatory zakresu wartości */
unsigned int wiek_osoby = 25;
unsigned char red, green = 0, blue=255;
Zmienne
54
54
Modyfikatory: register
Modyfikatory: register
Komputer
Komputer
Procesor
Procesor
ALU,
ukł.
ster.
ALU,
ukł.
ster.
rejestry
rejestry
stos
stos
cache
cache
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna stała
pamięć operacyjna stała
pamięci taśmowe
pamięci taśmowe
wewnętrzna pamięć dyskowa
wewnętrzna pamięć dyskowa
pamięci dyskowe
pamięci dyskowe
R
os
ną
ca
s
zy
b
ko
ść
d
os
tę
pu
R
os
ną
ca
w
ie
lk
oś
ć
pa
m
ię
ci
Rejestry
• Grupa przerzutników służąca do przechowywania informacji.
Rejestry są szybsze niż typowe układy pamięci. W porównaniu z
liczbą komórek pamięci operacyjnej ich liczba jest niewielka. W
części adresowej rozkazu potrzebna jest niewielka liczba bitów do
wskazania rejestru.
• Główne użycie rejestrów polega na przechowywaniu adresów lub
danych przed lub w trakcie ich przetwarzania.
• Rejestry mogą być używane do modyfikacji adresów, do
zapamiętania adresów powrotu z podprogramu, jako liczniki
rozkazów, jako akumulatory pomocnicze lub jako małe pamięci
notatnikowe. Sposób ich użycia zależy od architektury
mikroprocesora.
C++
C++
W Javie nie ma
modyfikatora
bezpośredniego
dostępu do
rejestrów!
W Javie nie ma
modyfikatora
bezpośredniego
dostępu do
rejestrów!
register
– modyfikator zmiennej
umieszczanej w rejestrze.
Oznacza bezpośredni dostęp do
rejestrów z poziomu programu.
Nie wszystkie kompilatory zrealizują
przetwarzanie zmiennej przez jej
umieszczenie w rejestrze.
Zmienne
rejestrowe
mogą być
użyteczne
przy
dużej
liczbie
obliczeń.
/*
identyfikatory zmiennych */
register double pi = 3.15;
register int rok = 2008;
rok = rok + 1;
Metodyki i technki programowania 1
2011
B. Butryło
28
Zmienne
55
55
Modyfikatory: deklaracja, def. zmiennej
Modyfikatory: deklaracja, def. zmiennej
C++
C++
...
/*
deklaracja zmiennej nie rezerwuje
miejsca w pamięci,
deklaracji może być wiele, byle identyczne */
extern int
licznik;
extern int
licznik_drugi;
extern int
licznik;
// może być
/*
definicja zmiennej rezerwuje
miejsce w pamięci,
* tworzy opis zmiennej / pola,
* definicja to więcej niż deklaracja,
* jedna definicja w danym zakresie */
int
a, b, i_c, to_jest_liczba;
char
znak, c_znak_z_konsoli;
double pi = 3.15;
float b1=0.5f;
int
i_c, znak;
// błąd
Java
Java
...
/*
deklaracja zmiennej nie rezerwuje
miejsca w pamięci,
deklaracji może być wiele, byle identyczne */
extern int
licznik;
extern int
licznik_drugi;
extern int
licznik;
// może być
/*
definicja zmiennej rezerwuje
miejsce w pamięci,
* tworzy opis zmiennej / pola,
* definicja to więcej niż deklaracja,
* jedna definicja w danym zakresie */
int
a, b, i_c, to_jest_liczba;
char
znak, c_znak_z_konsoli;
double pi = 3.15;
float b1=0.5f;
int
i_c, znak;
// błąd
Zmienne
56
56
Modyfikatory: wartości stałe
Modyfikatory: wartości stałe
C++
C++
...
/*
definicja zmiennej która nie może
ulec zmianie
w trakcie działania programu */
const float pi = 3.15;
const double eps_zero = 8.85e-12;
const int mnoznik = 4;
Java
Java
...
/*
Definicja zmiennej która nie może
ulec zmianie
w trakcie działania programu.
Modyfikator const jest dopuszczalny
ale nie jest zalecany */
final float
pi = 3.15;
final double eps_zero = 8.85e-12;
final int mnożnik = 4;
Metodyki i technki programowania 1
2011
B. Butryło
29
Zmienne
57
57
Modyfikatory: wartości „ulotne”
Modyfikatory: wartości „ulotne”
C++
C++
...
/*
definicja zmiennej która może
ulec zmianie
i nie jest zsynchronizowana
ze środowiskiem */
volatile float
temperatura = 0.0;
volatile double kurs_waluty = 0.0;
volatile int stan_czujnika_drzwi = 0;
Java
Java
...
/*
definicja zmiennej która może
ulec zmianie
i nie jest zsynchronizowana
ze środowiskiem */
volatile float
temperatura = 0.0;
volatile double kurs_waluty = 0.0;
volatile int stan_czujnika_drzwi = 0;
Komputer
Komputer
Procesor
Procesor
ALU,
ukł.
ster.
ALU,
ukł.
ster.
rejestry
rejestry
stos
stos
cache
cache
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna stała
pamięć operacyjna stała
pamięci taśmowe
pamięci taśmowe
wewnętrzna pamięć dyskowa
wewnętrzna pamięć dyskowa
pamięci dyskowe
pamięci dyskowe
R
os
ną
ca
s
zy
b
ko
ść
d
os
tę
pu
R
os
ną
ca
w
ie
lk
oś
ć
pa
m
ię
ci
Karta pomiarowa
Karta pomiarowa
Stan czujników
Stan czujników
Dane z interentu
Dane z interentu
...
...
Układy
I/O
Układy
I/O
Nowe zagadnienie ...
58
58
Zakres zmiennych
Widoczność zmiennych
Zakres zmiennych
Widoczność zmiennych
Metodyki i technki programowania 1
2011
B. Butryło
30
Zmienne
59
59
Zmienne w programie: sterta i stos
Zmienne w programie: sterta i stos
Komputer
Komputer
Procesor
Procesor
ALU,
ukł.
ster.
ALU,
ukł.
ster.
rejestry
rejestry
stos
stos
cache
cache
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna stała
pamięć operacyjna stała
pamięci taśmowe
pamięci taśmowe
wewnętrzna pamięć dyskowa
wewnętrzna pamięć dyskowa
pamięci dyskowe
pamięci dyskowe
R
os
ną
ca
s
zy
b
ko
ść
d
os
tę
pu
R
os
ną
ca
w
ie
lk
oś
ć
pa
m
ię
ci
Sterta (ang. heap)
• Część pamięci elektronicznej (RAM
Cache)
przydzielana dla programu dla przechowywania
zmiennych.
• Zarządzanie stertą nie jest możliwe w językach
wysokiego
poziomu.
Możliwe
jest
jedynie
zarezerwowanie fragmentu pamięci (sterty) na
zachowanie zmiennych lub zwolnienie obszaru
pamięci.
• Przydział sterty dla programu oznacza, że ten
obszar pamięci jest zerowany w momencie
przydzielenia.
Stos (ang. stack)
• Uporządkowana lista komórek pamięci, w której dostęp
jest zawsze do wierzchołka stosu.
• Stos = lista spychania, kolejka LIFO (last in first out).
• Ułatwia
zarządzanie
wywołaniami
i
powrotami
z
podprogramów.
• Wykonywane operacje odnoszą się do wierzchołka stosu.
Ze względu na jednoznaczną lokację nie jest konieczne
podawanie adresu argumentu do zrealizowanego rozkazu.
• W niektórych procesorach (w celu przyspieszenia
przetwarzania) dwa wierzchołkowe elementy stosu są
przechowywane w rejestrach procesora.
• Zmienne wewnątrz funkcji (do umieszczenia na stosie) nie
są automatycznie inicjowanie.
Zmienne
60
60
Zmienne w programie: sterta i stos
Zmienne w programie: sterta i stos
Komputer
Komputer
Procesor
Procesor
ALU,
ukł.
ster.
ALU,
ukł.
ster.
rejestry
rejestry
stos
stos
cache
cache
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna o dostępie
swobodnym
pamięć operacyjna stała
pamięć operacyjna stała
pamięci taśmowe
pamięci taśmowe
wewnętrzna pamięć dyskowa
wewnętrzna pamięć dyskowa
pamięci dyskowe
pamięci dyskowe
R
os
ną
ca
s
zyb
ko
ść
d
os
tę
pu
R
os
ną
ca
w
ie
lko
ść
p
am
ię
ci
#include
<iostream>
#include
<dodatek.h>
using namespace std;
int
red=255, green=255, blue=0;
float
wektor_x, wektor_y, wektor_modul, wektor_faza;
void
ustaw_kolory( int, int, int
,
int );
void
dlugosc_wektora( float, float );
void main ( void )
{
int
liczba_wektorow = 1;
float
* wektor_x, * wektor_y;
wektor_x = new float [3];
dlugosc_wektora( 3.0, -4.0 );
ustaw_kolory( 0, 255, 0, 0);
// ustaw zielony
dlugosc_wektora( 0.0, 1.0 );
ustaw_kolory( 255, 255, 0, 10);
// ustaw zolty
dlugosc_wektora( 3.0, -4.0 );
ustaw_kolory( 255, 0, 128, 0);
// ustaw purpurowy
}
void ustaw_kolory( int red, int green, int blue, int nas )
{ static int licznik;
int biezace_nasycenie = nas;
set_color( red, green, blue );
set_shading( nas );
licznik++;
cout<< "Zmiana koloru " << licznik << "raz.”<<endl;
}
void dlugosc_wektora( float wsp_x, float wsp_y )
{ static float point_x = 0.0;
static float point_y;
float
dlugosc =
sqrt( pwd(wsp_x – point_x, 2)+pwd(wsp_y – point_y, 2) );
point_x = wsp_x;
point_y = wsp_y;
cout << "Przemieszczenie " << dlugosc << endl;
}
Modyfikator
static
Zmienne
dynamicznie
alokowane
Modyfikator
static
Zmienne
dynamicznie
alokowane
Metodyki i technki programowania 1
2011
B. Butryło
31
Zmienne
61
61
Zakres zmiennej, obiektu
Zakres zmiennej, obiektu
Zakres ważności zmiennej , obiektu:
• dostęp do wymaganych danych w wybranym miejscu programu,
• dotyczy przypadków gdy dane istnieją, są zadeklarowane w programie ale
mogą być niewidoczne, niedostępne, przysłonięte w danym miejscu.
Czas życia zmiennej, obiektu:
• czas od zadeklarowania i zainicjowania zmiennej do jej usunięcia z pamięci
(bezpośrednego wymazania, utraty informacji przechowywanych w zmiennej,
obiekcie).
• ma wpływ na rozmiar pamięci zajmowanej przez dane, a zatem efektywność,
wymagania programu.
Zakres zmiennej, obiektu
Zakres zmiennej, obiektu
W OOP
jest
zakres klasy
W OOP
jest
zakres klasy
lokalny
Z wykorzystaniem instrukcji
grupującej { }
lokalny
Z wykorzystaniem instrukcji
grupującej { }
funkcja (metoda)
Dotyczy etykiet i zmiennych.
Nie dotyczy wskaźników, tablic (new).
funkcja (metoda)
Dotyczy etykiet i zmiennych.
Nie dotyczy wskaźników, tablic (new).
plik
plik
Zmienne
62
62
Zakres zmiennej, obiektu
Zakres zmiennej, obiektu
void moc( float u, float i, float kat )
{
float modul = 0.0;
float faza = 0.0;
float re, im;
float f_p;
// czynna
f_p = u * i * cos( kat );
{
float f_s;
// pozorna
float f_p;
// przysloniencie
f_p = u * i * sin( kat );
f_s = u * i;
cout << "Q = " << f_p << endl;
cout << "S = " << f_s << endl;
}
cout << „P = " << f_p << endl;
cout << "S = " << f_s << endl;
// blad
}
Przysłanianie
zmiennych.
Operator ::
Przysłanianie
zmiennych.
Operator ::
lokalny
Z wykorzystaniem instrukcji
grupującej { }
lokalny
Z wykorzystaniem instrukcji
grupującej { }
Metodyki i technki programowania 1
2011
B. Butryło
32
Zmienne
63
63
Zakres zmiennej, obiektu
Zakres zmiennej, obiektu
float moc(float u, float i, float kat)
{ float modul = 0.0;
float faza = 0.0;
float re, im;
float f_p;
// czynna
f_p = u * i * cos( kat );
goto komunikat;
modul = u * i;
faza = kat;
return ( modul );
komunikat:
cout << „P = " << f_p << endl;
double * wyniki;
wyniki = new double [ 100 ];
return ( f_p );
}
funkcja (metoda)
Dotyczy etykiet i zmiennych.
Nie dotyczy wskaźników, tablic (new).
funkcja (metoda)
Dotyczy etykiet i zmiennych.
Nie dotyczy wskaźników, tablic (new).
Zmienne
64
64
plik
plik
Zakres zmiennej, obiektu
Zakres zmiennej, obiektu
#include
<iostream>
using namespace std;
int
red=255, green=0, blue=0;
float
wektor_x, wektor_y,
float
wektor_modul, wektor_faza;
int resetuj_kolory( void );
void main ( void )
// funkcja main
{
int
liczba_wektorow = 1;
red = 255;
green = 123;
}
int resetuj_kolory ( void )
// funkcja resetuj_kolory
{
int status = 1;
red = 0;
green = 0;
blue = 0;
return( status );
}
Metodyki i technki programowania 1
2011
B. Butryło
33
Struktura programu w C++ (programowanie strukturalne)
65
65
Przestrzeń nazw – widoczność, dostęp
Przestrzeń nazw – widoczność, dostęp
namespace
nazwa_przestrzeni
{
}
using namespace
nazwa_przestrzeni
namespace std
namespace std
namespace moje
namespace moje
namespace demo
namespace demo
Wstęp
66
66
C: deklaracje zmiennych
C: deklaracje zmiennych
-128
0
-32768
-32768
0
-2147483648
0
3.4e-38
1.7e-308
3.4e-4932
127
255
32767
32767
65635
2147483647
429467295
3.4e+38
1.7e+308
1.1e+4932
char
unsigned char
short
int
unsigned int
long
unsigned long
enum
float
double
long double
RAM
char znak;
char a, ten, k = 64;
short liczba;
int liczba_w = 2006;
unsigned int nowa_wartosc;
unsigned int new_value = 45000;
long d;
unsigned long e, f, g;
float pi = 3.41;
float alfa, beta = 1.46e+10, gamma = 1.4E-4;
double zmienna;
double nowa_wartosc_liczby = 1.0;
Przykłady:
Metodyki i technki programowania 1
2011
B. Butryło
34
Wstęp
67
67
C: wyrażenia i operatory
C: wyrażenia i operatory
wyrażenie
wyrażenie
proste
proste
arytmetyczne
arytmetyczne
relacyjne
relacyjne
logiczne
logiczne
operatory
operatory
proste
proste
arytmetyczne
arytmetyczne
relacyjne
relacyjne
logiczne
logiczne
bitowe
bitowe
adresowania
adresowania
rzutowania
rzutowania
...
...
Wstęp
68
68
C: wyrażenia i operatory (hierarchia)
C: wyrażenia i operatory (hierarchia)
( ) [ ] .
funkcja
!
~
++ -- + -
(
typ
) sizeof
* / %
+ -
<< >>
< <= > >=
== !=
& | ^
&&
||
?:
= += -= *= /= %=
&= ^= |= <<= >>=
odwołanie do, wywołanie
jednoargumentowe
arytmetyczne
dwuargumentowe
bitowe przesunięcia
relacyjne i logiczne
dwuargumentowe
bitowe dwuargumentowe
logiczne
dwuargumentowe
warunkowy
przypisania
przecinkowy
,
logiczne
bitowe
arytmetyczne
rzutowania
iloczyn, iloraz, reszta
suma, różnica
relacyjne
relacyjne / logiczne
koniunkcja
alternatywa
arytmetyczne
bitowe
Metodyki i technki programowania 1
2011
B. Butryło
35
Wstęp
69
69
C: wyrażenia i operatory (przykłady)
C: wyrażenia i operatory (przykłady)
int
ia, ib, ic;
float fa, fb, fc;
int iw;
float fw;
ia = 10;
ib = 5;
ic = -8;
fa = 1.5;
fb = 5.4321E-10;
fc = -.78;
iw = ia == ib;
/* 0 */
iw = ia > ib;
/* 1 */
iw = ia && ib;
/* 1 */
iw = ia || ib;
/* 1 */
iw = ia * ib;
/* 50 */
fw = fa < fb + fa < fc;
/* 0.0 */
fw = fa < fb + fa > fc;
/* 1.0 */
fw = (fa < fb) + (fa < fc);
/* 0.0 */
fw = (fa > fb) + (fa > fc);
/* 2.0 */
fw = fa + fb * fc / (ia + ib );
/* 1.5 */
fw == iw;
/* brak skutku */
Instrukcje
70
70
Najprostsze instrukcje
Najprostsze instrukcje
Instrukcja / wyrażenie proste
Instrukcja / wyrażenie proste
Instrukcja grupująca
Instrukcja grupująca
C++: proceduralnie
C++: proceduralnie
Java: obiektowo
Java: obiektowo
Metodyki i technki programowania 1
2011
B. Butryło
36
Wstęp
71
71
C: instrukcja warunkowa if ... else
C: instrukcja warunkowa if ... else
if
(
)
wyrażenie
wyrażenie
instrukcja (instrukcje) A
instrukcja (instrukcje) A
else
instrukcja (instrukcje) B
instrukcja (instrukcje) B
wyrażenie
wyrażenie
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie
≠
0
TAK
(prawda)
instrukcja
(instrukcje) B
instrukcja
(instrukcje) B
wyrażenie = 0
NIE
(fałsz)
int a, b;
/* wartości muszą być wpisane*/
if (a + b == 10 )
wynik = 100;
else
wynik = 0;
int a, b;
/* wartości muszą być wpisane*/
if (a + b == 10 )
wynik = 100;
else
wynik = 0;
int a, b;
/* wartości muszą być wpisane*/
if (a == b )
a = 0;
int a, b;
/* wartości muszą być wpisane*/
if (a == b )
a = 0;
Przykłady:
Wstęp
72
72
C: wersja wielowariantowa if-else-if
C: wersja wielowariantowa if-else-if
wyrażenie 1
wyrażenie 1
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
( wyrażenie 1)
≠
0
TAK
(prawda)
int punkty, ocena;
/* wartość zmiennej punkty musi być znana */
if (punkty > 36 )
ocena = 5;
else if (punkty >= 34)
ocena = 4.5;
else if (punkty >= 31)
ocena = 4;
else if (punkty >= 25)
ocena = 3.5;
else if (punkty >= 20)
ocena = 3.5;
else
ocena = 2.0;
int punkty, ocena;
/* wartość zmiennej punkty musi być znana */
if (punkty > 36 )
ocena = 5;
else if (punkty >= 34)
ocena = 4.5;
else if (punkty >= 31)
ocena = 4;
else if (punkty >= 25)
ocena = 3.5;
else if (punkty >= 20)
ocena = 3.5;
else
ocena = 2.0;
Przykłady:
(wyrażenie 1) = 0
NIE
(fałsz)
wyrażenie 2
wyrażenie 2
instrukcja
(instrukcje) B
instrukcja
(instrukcje) B
( wyrażenie 2)
≠
0
TAK
(prawda)
( wyrażenie 2) = 0
NIE
(fałsz)
instrukcja
(instrukcje) B
instrukcja
(instrukcje) B
Metodyki i technki programowania 1
2011
B. Butryło
37
Wstęp
73
73
C: instrukcja iteracyjna for
C: instrukcja iteracyjna for
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie 2
≠
0
TAK
(prawda)
for (
wyrażenie 1
wyrażenie 1
instrukcja (instrukcje) A
instrukcja (instrukcje) A
;
wyrażenie 2
wyrażenie 2
;
wyrażenie 3
wyrażenie 3
)
wyrażenie 1
(inicjujące)
wyrażenie 1
(inicjujące)
wyrażenie 2 = 0
NIE
(fałsz)
wyrażenie 2
(sterujące)
wyrażenie 2
(sterujące)
wyrażenie 3
(przyrostowe)
wyrażenie 3
(przyrostowe)
int i, wynik = 0;
for (i=10; i < 20; i=i+3 )
wynik = wynik + i;
int i, wynik = 0;
for (i=10; i < 20; i=i+3 )
wynik = wynik + i;
for (;;)
;
for (;;)
;
Przykłady:
float i, potega;
for (i=200; i >= 10; i=i-3 )
potega = i * i;
float i, potega;
for (i=200; i >= 10; i=i-3 )
potega = i * i;
Wstęp
74
74
C: instrukcja iteracyjna for
C: instrukcja iteracyjna for
for (
wyrażenie 1
wyrażenie 1
instrukcja (instrukcje) A
instrukcja (instrukcje) A
;
wyrażenie 2
wyrażenie 2
;
wyrażenie 3
wyrażenie 3
)
wyrażenie 2 = 0
NIE
(fałsz)
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie 2
≠
0
TAK
(prawda)
wyrażenie 1
(inicjujące)
wyrażenie 1
(inicjujące)
wyrażenie 2
(sterujące)
wyrażenie 2
(sterujące)
wyrażenie 3
(przyrostowe)
wyrażenie 3
(przyrostowe)
float i, wynik = 0;
for (i=0; i < 100; i=i+1)
printf( ”%f %f\n”, i, i*i);
float i, wynik = 0;
for (i=0; i < 100; i=i+1)
printf( ”%f %f\n”, i, i*i);
Przykłady:
float odsetki = 0;
float oprocentowanie = 0,08;
float kapital = 100;
int rok, lata;
lata = 4;
for (rok=0; rok < lata; rok=rok+1)
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
}
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
float odsetki = 0;
float oprocentowanie = 0,08;
float kapital = 100;
int rok, lata;
lata = 4;
for (rok=0; rok < lata; rok=rok+1)
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
}
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
Metodyki i technki programowania 1
2011
B. Butryło
38
Wstęp
75
75
C: instrukcja iteracyjna while
C: instrukcja iteracyjna while
while (
wyrażenie
wyrażenie
instrukcja (instrukcje) A
instrukcja (instrukcje) A
)
wyrażenie = 0
NIE
(fałsz)
wyrażenie
(sterujące)
wyrażenie
(sterujące)
int i, wynik = 0;
i=10;
while (i < 20)
{
wynik = wynik + i;
i=i+3;
}
int i, wynik = 0;
i=10;
while (i < 20)
{
wynik = wynik + i;
i=i+3;
}
while (1)
;
while (1)
;
Przykłady:
float i, potega;
i=200;
while (i >= 10)
{
potega = i * i;
i=i-3;
}
float i, potega;
i=200;
while (i >= 10)
{
potega = i * i;
i=i-3;
}
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie
≠
0
TAK
(prawda)
Wstęp
76
76
C: instrukcja iteracyjna while
C: instrukcja iteracyjna while
while (
wyrażenie
wyrażenie
instrukcja (instrukcje) A
instrukcja (instrukcje) A
)
wyrażenie = 0
NIE
(fałsz)
wyrażenie
(sterujące)
wyrażenie
(sterujące)
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie
≠
0
TAK
(prawda)
float i, wynik = 0;
i=0;
while (i < 100)
{
printf( ”%f %f\n”, i, i*i);
i=i+1;
}
float i, wynik = 0;
i=0;
while (i < 100)
{
printf( ”%f %f\n”, i, i*i);
i=i+1;
}
Przykłady:
float odsetki = 0;
float oprocentowanie = 0,08;
float kapital = 100;
int rok, lata;
lata = 4;
rok = 0;
while (rok < lata)
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
rok=rok+1;
}
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
float odsetki = 0;
float oprocentowanie = 0,08;
float kapital = 100;
int rok, lata;
lata = 4;
rok = 0;
while (rok < lata)
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
rok=rok+1;
}
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
Metodyki i technki programowania 1
2011
B. Butryło
39
Wstęp
77
77
C: instrukcja iteracyjna do ... while
C: instrukcja iteracyjna do ... while
int i, wynik = 0;
i=10;
do
{
wynik = wynik + i;
i=i+3;
}
while (i < 20);
int i, wynik = 0;
i=10;
do
{
wynik = wynik + i;
i=i+3;
}
while (i < 20);
do
;
while (1);
do
;
while (1);
Przykłady:
float i, potega;
i=200;
do
{
potega = i * i;
i=i-3;
}
while (i >= 10);
float i, potega;
i=200;
do
{
potega = i * i;
i=i-3;
}
while (i >= 10);
wyrażenie
≠
0
TAK
(prawda)
do
instrukcja (instrukcje) A
instrukcja (instrukcje) A
while (
wyrażenie
wyrażenie
);
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie
(sterujące)
wyrażenie
(sterujące)
wyrażenie = 0
NIE
(fałsz)
Wstęp
78
78
C: instrukcja iteracyjna while
C: instrukcja iteracyjna while
float i, wynik = 0;
i=0;
do
{
printf( ”%f %f\n”, i, i*i);
i=i+1;
}
while (i < 100);
float i, wynik = 0;
i=0;
do
{
printf( ”%f %f\n”, i, i*i);
i=i+1;
}
while (i < 100);
Przykłady:
float odsetki = 0;
float oprocentowanie = 0,08;
float kapital = 100;
int rok, lata;
lata = 4;
rok = 0;
do
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
rok=rok+1;
}
while (rok < lata);
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
float odsetki = 0;
float oprocentowanie = 0,08;
float kapital = 100;
int rok, lata;
lata = 4;
rok = 0;
do
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
rok=rok+1;
}
while (rok < lata);
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
wyrażenie
≠
0
TAK
(prawda)
do
instrukcja (instrukcje) A
instrukcja (instrukcje) A
while (
wyrażenie
wyrażenie
);
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie
(sterujące)
wyrażenie
(sterujące)
wyrażenie = 0
NIE
(fałsz)
Metodyki i technki programowania 1
2011
B. Butryło
40
Instrukcje
79
79
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
Założenia:
• dana/znana postać funkcji podcałkowej.
• znany, ograniczony przedział całkowania.
Właściwości:
• nie wymaga obliczania funkcji
pierwotnej.
• zbieżna jeżeli funkcja ciągła i
ograniczona w przedziale całkowania.
• poprawna realizacja wymaga podwójnej
procedura iteracyjnej.
Przykłady zastosowań: AVG, RMS, P.
Numeryczne obliczanie całki metodą prostokątów.
K
K
→
→
→
→
→
∆
∆
∆
n
x
x
x
I
I
I
I
zmniejsz
2
zmniejsz
1
zmniejsz
0
E
N
I
I
≈
N
n
,
,
2
,
1
,
0
K
=
n
I
Obliczaj
Instrukcje
80
80
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
( )
( ) (
)
( )
∫
∑
∑
+
∆
⋅
≈
+
−
⋅
≈
→
+
=
−
=
−
=
+
g
d
N
i
i
N
i
i
i
i
c
v
v
f
I
c
v
v
v
f
I
c
dv
v
f
I
1
0
1
0
1
v
i
d
v
N
d
g
v
i
∆
⋅
+
=
−
=
∆
v
f(v)
v
0
v
1
v
2
v
3
v
4
v
N
d
g
Metodyki i technki programowania 1
2011
B. Butryło
41
Instrukcje
81
81
#include <iostream>
#include <cmath>
using namespace std;
double licz_calke(double, double, double);
double funkcja( double, double);
int main(int argc, char** argv)
{
double epsilon
= 1.0e-6;
double g_dolna
= 0.1;
double g_gorna
= 10.5;
int liczba_punktow
= 10;
double krok_x = (g_gorna - g_dolna) / liczba_punktow;
double w_calki
= 0.0;
double po_w_calki = 0.0;
do
{
po_w_calki = w_calki;
w_calki = licz_calke( g_dolna, g_gorna, krok_x );
krok_x = krok_x * 0.5;
}
while (fabs( (w_calki - po_w_calki) /po_w_calki ) > epsilon);
cout << "Calka w przedziale [" << g_dolna << ";" << g_gorna << "]
wynosi " << w_calki << endl;
cout << "Koniec liczenia" << endl;
return( 0 );
}
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
double funkcja( double x_1, double x_2 )
{
double wynik;
wynik = 10 * exp( -0.072 * x_1 ) *
sin( 2 * 3.14159265 * 0.1 * x_1 );
return( wynik );
}
double funkcja( double x_1, double x_2 )
{
double wynik;
wynik = 10 * exp( -0.072 * x_1 ) *
sin( 2 * 3.14159265 * 0.1 * x_1 );
return( wynik );
}
double licz_calke( double dolna, double gorna,
double krok )
{
double wart_x;
double wynik = 0.0;
wart_x = dolna;
while ( wart_x < gorna )
{
wynik = wynik + krok * funkcja( wart_x, 0.0 );
wart_x = wart_x + krok;
}
return( wynik );
}
Instrukcje
82
82
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
-8
-6
-4
-2
0
2
4
6
8
10
0
5
10
15
20
25
30
35
x
f(x)
( )
=
−
x
e
x
f
x
10
2
sin
10
072
,
0
π
5
,
10
1
,
0
=
=
g
d
dx
x
e
I
x
∫
=
−
5
,
10
1
,
0
072
,
0
10
2
sin
10
π
7,4
7,6
7,8
8
8,2
8,4
8,6
8,8
9
1,E-06
1,E-05
1,E-04
1,E-03
1,E-02
1,E-01
1,E+00
1,E+01
8,40166
I
∆
x
Metodyki i technki programowania 1
2011
B. Butryło
42
Instrukcje
83
83
C++: instrukcja iteracyjna for
C++: instrukcja iteracyjna for
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie 2
≠
0
TAK
(prawda)
for (
wyrażenie 1
wyrażenie 1
instrukcja (instrukcje) A
instrukcja (instrukcje) A
;
wyrażenie 2
wyrażenie 2
;
wyrażenie 3
wyrażenie 3
)
wyrażenie 1
(inicjujące)
wyrażenie 1
(inicjujące)
wyrażenie 2 = 0
NIE
(fałsz)
wyrażenie 2
(sterujące)
wyrażenie 2
(sterujące)
wyrażenie 3
(przyrostowe)
wyrażenie 3
(przyrostowe)
int i, wynik = 0;
for (i=10; i < 20; i=i+3 )
wynik = wynik + i;
int i, wynik = 0;
for (i=10; i < 20; i=i+3 )
wynik = wynik + i;
for (;;)
;
for (;;)
;
Przykład 1:
float i, potega;
for (i=200; i - 10; i=i-1 )
potega = i * i;
float i, potega;
for (i=200; i - 10; i=i-1 )
potega = i * i;
Przykład 2:
Przykład 3:
Instrukcje
84
84
C++: instrukcja iteracyjna for
C++: instrukcja iteracyjna for
for (
wyrażenie 1
wyrażenie 1
instrukcja (instrukcje) A
instrukcja (instrukcje) A
;
wyrażenie 2
wyrażenie 2
;
wyrażenie 3
wyrażenie 3
)
wyrażenie 2 = 0
NIE
(fałsz)
instrukcja
(instrukcje) A
instrukcja
(instrukcje) A
wyrażenie 2
≠
0
TAK
(prawda)
wyrażenie 1
(inicjujące)
wyrażenie 1
(inicjujące)
wyrażenie 2
(sterujące)
wyrażenie 2
(sterujące)
wyrażenie 3
(przyrostowe)
wyrażenie 3
(przyrostowe)
float i, wynik = 0;
for (i=0; i < 100; i=i+1)
printf( ”%f %f\n”, i, i*i);
float i, wynik = 0;
for (i=0; i < 100; i=i+1)
printf( ”%f %f\n”, i, i*i);
Przykład 1:
float
odsetki = 0;
float
oprocentowanie = 0,08;
float
kapital = 100;
int
rok, lata;
lata = 4;
for
(rok=0; rok < lata; rok=rok+1)
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
}
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
float
odsetki = 0;
float
oprocentowanie = 0,08;
float
kapital = 100;
int
rok, lata;
lata = 4;
for
(rok=0; rok < lata; rok=rok+1)
{
odsetki = kapital * oprocentowanie;
kapital = kapital + odsetki;
}
printf( ”Kapital po %d latach wynosi %f zl.\n”,
lata, kapital);
Przykład 2:
Metodyki i technki programowania 1
2011
B. Butryło
43
Instrukcje
85
85
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
Kilka informacji:
• długość rekordu pamięci 4kS.
• szybkość próbkowania w czasie rzeczywistym 250 MS/s.
• szybkość próbkowania w czasie ekwiwalentnym 50 GS/s.
Cyfrowe przetwarzanie sygnału w oscyloskopie cyfrowym.
Instrukcje
86
86
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
Filtr cyfrowy
NOI (ang. IIR)
SOI (ang. FIR)
∑
=
−
=
N
k
k
n
k
n
x
a
y
0
n
y
n
n
n
n
s
x
±
=
DF
∑
∑
=
−
=
−
−
=
M
k
k
n
k
N
k
k
n
k
n
y
b
x
a
y
1
0
n
y
n
n
n
n
s
x
±
=
DF
b
-
+
Metodyki i technki programowania 1
2011
B. Butryło
44
Instrukcje
87
87
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
2
2
1
1
0
+
+
+
+
=
n
n
n
n
x
a
x
a
x
a
y
Instrukcje
88
88
Przykład: funkcje / instrukcje
Przykład: funkcje / instrukcje
#include <iostream>
#include <cmath>
using namespace std;
double licz_calke(double, double, double);
double funkcja( double, double);
int filtrowanie(int okno_start , int
liczba_probek)
{
extern float * kanal_A;
extern float * kanal_B;
float * out_A_filter;
float * out_B_filter;
out_A_filter = new float [liczba_probek];
out_B_filter = new float [liczba_probek];
if (filtr_A_on == 1)
filtr( kanal_A, out_A_filter );
if (filtr_B_on == 1)
filtr( kanal_B, out_B_filter );
}
2
2
1
1
0
+
+
+
+
=
n
n
n
n
x
a
x
a
x
a
y
void filtr( float * dane, float * wyniki )
{
extern int okno_start;
extern int liczba_probek;
extern int filtr_rzad;
extern float filtr[3];
float sygnal_n, sygnal_n_1, sygnal_n_2;
int sam;
sygnal_n
= dane[okno_start];
sygnal_n_1
= dane[okno_start + 1];
for ( sam = 0; sam < liczba_probek; sam = sam + 1 )
{
sygnal_n_2 = dane[okno_start + 2 + sam];
wyniki[sam] =
filtr[0] * sygnal_n + filtr[1] * sygnal_n_1
+ filtr[2] * sygnal_n_2;
sygnal_n
= sygnal_n_1;
sygnal_n_1 = sygnal_n_2;
}
}
void filtr( float * dane, float * wyniki )
{
extern int okno_start;
extern int liczba_probek;
extern int filtr_rzad;
extern float filtr[3];
float sygnal_n, sygnal_n_1, sygnal_n_2;
int sam;
sygnal_n
= dane[okno_start];
sygnal_n_1
= dane[okno_start + 1];
for ( sam = 0; sam < liczba_probek; sam = sam + 1 )
{
sygnal_n_2 = dane[okno_start + 2 + sam];
wyniki[sam] =
filtr[0] * sygnal_n + filtr[1] * sygnal_n_1
+ filtr[2] * sygnal_n_2;
sygnal_n
= sygnal_n_1;
sygnal_n_1 = sygnal_n_2;
}
}
Metodyki i technki programowania 1
2011
B. Butryło
45
Pierwszy program ...
89
89
Jak to wygląda – banalny program
Jak to wygląda – banalny program
C: proceduralnie
C: proceduralnie
C++: proceduralnie
C++: proceduralnie
#include <stdio.h>
void main ( void )
{
int stawka_vat = 0;
float cena_brutto;
float cena_netto = 10.0f;
stawka_vat = 22;
cena_brutto = cena_netto *
(1.0 + stawka_vat / 100.0 );
printf("Cena brutto= %f \n”, cena_brutto );
}
#include <iostream>
using namespace std;
void main ( void )
{
int stawka_vat = 0;
float cena_brutto;
float cena_netto = 10.0f;
stawka_vat = 22;
cena_brutto = cena_netto *
(1.0 + stawka_vat / 100.0 );
cout << "Cena brutto= " << cena_brutto <<endl;
}
Uwaga na
błędy obliczeń
(zastosowano
float)!