inf2 w06


Wykład 6  part a
Zanim zaczniemy kodować
- jakość oprogramowania
Gdzie jesteśmy?
Analiza Projekt Implementacja
Klasy (Atrybuty, Metody,
Mechanizmy dostępu)
Struktury (Dziedziczenie,
Asocjacje, agregacje i
kompozycje)
Architektury (Warstwy,
Moduły, Przetwarzanie
danych)
itm / MVLab (c) 2007-2011
Cele tego wykładu
co jest do zrobienia?
zadania w fazie implementacji
jak to zrobić?
systematyczne postępowanie podczas implementacji
programu obiektowego
jak to działa?
podstawowa umiejętność wdrażania elementarnych
zasad obiektowości w języku programowania C++
itm / MVLab (c) 2007-2011
4.1. Zanim rozpoczniemy
implementację...
itm / MVLab (c) 2007-2011
Cele implementacji
oszczędn
bez- dokumen-
stabilność ość
błędność tacja
czasu
przyjaznoś
oszczędno
zrozumia- ć rozsze-
ść
łość użytkowni- rzalność
kosztów
kowi
Jakość
(za ISO 9126 dla oprogramowania):
efektywno
funkcjonalność, niezawodność,
otwartość
stosowalność, efektywność,
ść
serwisowalność, przenośność
itm / MVLab (c) 2007-2011
 Diabelski kwadrat (Harry M. Sneed)
Ilość
Jakość
Powierzchnia kwadratu
" miara produktywności
zespołu projektowego,
" relatywnie niezmienna
Czas
projektowania
Koszty
itm / MVLab (c) 2007-2011
Software - jakość produktu
Serwisowalność
Funkcjonalność
zrozumiałość
celowość
łatwość uczenia
pewność
łatwość obsługi
dokładność
Przenośność
współdziałanie,
możliwość analizy systemu
zgodność ze standardami
możliwość modyfikacji
Niezawodność
stabilność
dojrzałość
łatwość analizy błędów
tolerancja błędów
Stosowalność
łatwość modyfikacji
dopasowanie do wymagań
Efektywność
łatwość instalacji
wymagania czasowe
zgodność ze standardami
 zasobożerność
zamienność
itm / MVLab (c) 2007-2011
Konstruktywne wskazniki
jakości software'u
Zapewnienie jakości dzięki projektowaniu w
chińskie piły
sposób systematyczny (jakość jest
są super!
 wbudowana )
wskazówki
szablony
narzędzia
notacja
metodyka
wykształcenie
Większość wskazników jakości software'u
została stworzona na podstawie
doświadczeń z systematycznym
podejściem.
itm / MVLab (c) 2007-2011
Zadania w fazie implementacji
Cel główny: kodowanie,
Zadania pomocnicze:
Wybór języka programowania (np. C++)
Wybór środowiska programistycznego (np. MS Visual Studio)
Wybór generatora kodu (np. Rhapsody)
Wybór potrzebnych bibliotek (np. .net-Framework)
Zasady programowania (o tym pózniej)
Design Pattern (już nieco omówione)
Dokumentacja (o tym pózniej)
Algorytmika (o tym pózniej)
Modularność (o tym pózniej)
Modyfikowalność (o tym pózniej)
Serwis (o tym pózniej)
itm / MVLab (c) 2007-2011
Generatory kodu
Znane, dostępne generatory kodu:
Matlab, Rhapsody, Rational Rose, Poseidon for UML,
Trice, Easy Code, ...
Projekt
Otwarte problemy:
Zakres generacji (np. czy tylko statyczny
szkielet klas?)
Sposób sprzężenia (generacja w jednym
kierunku czy także z powrotem)
Funkcjonalność/stabilność
Gospodarka czasowa, efektywność (np.
także  zasobożerność )
#include
Czytelność, zrozumiałość kodu zródłowego
//kod zródł.
Aspekty pewności systemu
int main()
{ //...
itm / MVLab (c) 2007-2011
Dygresja: Narzędzia CASE
Definicja:
Computer Aided Software Engineering
Komputerowo wspomagana inżynieria oprogramowania
Możliwości:
wspomaganie tworzenia diagramów UML
generacja kodu zródłowego na podstawie UML
tworzenie diagramów UML na podstawie kodu zródłowego
(Reverse Engineering)
Roundtrip-Engineering
wymiana danych pomiędzy narzędziami różnych firm dzięki
formatowi XMI (XML Metadata Interchange)
itm / MVLab (c) 2007-2011
Zasady programowania
Problem
składnia języków programowania pozwala na daleko idącą swobodę
 goły kod oznacza kiepską jakość softwere'u
brak zasad: niespójności i kiepska jakość softwere'u
Rozwiązanie: konwencje
zasady formatowania kodu
komentarze
dobór identyfikatorów (nazw)
szczególne zasady i algorytmika
dokumentacja
...
Niestosowanie obowiązującej konwencji jest uważane za błąd!
itm / MVLab (c) 2007-2011
Zasady programowania
Formatowanie
Wcięcia, odstępy
Widoczne ustawienie klamry
Zasady dot. maksymalnych rozmiarów bloku programowego (np. metody,
znaków w linii, linii w bloku)
Komentarze
Co jest komentowane
pliki
klasy
metody
algorytmy
Jak jest komentowane
wzorce standardowe
-Pańskie przemówienie było wyborne,
automatyczna dokumentacja XML
kolego. -Kto je panu napisał?
-Dziękuję. Cieszę się że się podobało. -
Kto je panu wytłumaczył?
itm / MVLab (c) 2007-2011
Zasady programowania
Identyfikatory
Język (polski, angielski?)
Pliki (nazwa modułu, nazwa nagłówka?)
Klasy, typy danych (np. struktury)
Nazwy metod (otwarte, prywatne, wg zwracanej wartości?)
Zmienne -wg funkcji (zmienne -składniki, zmienne lokalne, zmienne
globalne, ...)
Zmienne -wg typu
(standardowe,
tablice, obiekty,
wskazniki, ...)
Stałe
(stałe literalne, makra, ...)
itm / MVLab (c) 2007-2011
Zasady programowania
Algorytmika i inne
Modularyzacja (modele komponentów, rozdział tekstu zródłowego na wiele plików, co
znajduje się w plikach nagłówkowych, co w implementacji)
Zalecenia do implementacji łącz
klasy abstrakcyjne (interfejsy)
preferencje (przekazywanie argumentów przez referencje/wartość)
zwracanie wartości przez funkcje (np. dla obsługi błędów)
wzorce (templates)
Zalecenia do wdrażania zależności klas (asocjacje, kompozycje, ...)
Zasady inicjalizacji
Zasady rozgałęziania (if...else, switch...case...default)
Obsługa błędów i wyjątków
unikanie dzielenia przez 0 (zero)
unikanie wykraczania poza dopuszczalne zakresy wartości
inne zasady obsługi błędów
itm / MVLab (c) 2007-2011
Zasady programowania
Dokumentacja
Podczas implementacji
projektant
wersja
zaplanowane testy
przeprowadzone testy
znalezione błędy
naprawione błędy
Po implementacji
wprowadzenie do instalacji
wymagania
wprowadzenie dla użytkownika
szczegóły dla programistów
rozszerzalność
serwis
itm / MVLab (c) 2007-2011
Zasady programowania -
standardy
Zasady MISRA
The Motor Industry Software Reliability Association
141 zasad kodowania dla C (wcześniej 127)
Zasady kodowania dla C++: Wysoko integralny C++
Opracowane przez THE PROGRAMMING RESEARCH GROUP
Ok. 200 zasad, opracowanych dla standardowych zadań
programistycznych z zakresu C++
Narzędzia do automatycznej kontroli
PC-lint, FlexeLint
QA C/C++
CodeSurfer
...
itm / MVLab (c) 2007-2011
Dalsza statystyczna analiza
kodu
Wiedza: Całościowe badanie kodu zródłowego konkretnej implementacji bez
uruchamiania programu
Cele:
Rozpoznanie miejsc potencjalnie krytycznych w programie
możliwe dzielenie przez 0 (zero)
niezabezpieczone przekroczenie obszaru zapisu
...
Analiza metryk
wyjaśnianie przez modularność/złożoność
wyjaśnianie przez spójność
...
Rozpoznawanie klonów
...
itm / MVLab (c) 2007-2011
itm / MVLab (c) 2007-2011
Metryki oprogramowania
itm / MVLab (c) 2007-2011
Zarządzanie wersjami i błędami
Zarządzanie błędami
dokumentacja i reprodukowalność błędów
klasyfikacja błędów (np. pod względem ich krytyczności)
poszukiwanie błędów i uwzględnianie w planach kolejnych wersji
Zarządzanie wersjami
wersje oprogramowania definiują w sposób ciągły zmiany
nanoszone na oprogramowanie, dyskretne stany na które ma
zostać położony szczególny nacisk
wersja: zdefiniowana jednostka programistyczna powstała przez
integrację modułów
Narzędzia
Bugzilla, WinCVS, Subversion SVN (open source), ...
itm / MVLab (c) 2007-2011
Wykład 6  part b
Pierwsze kroki w C++
Klasy, metody, atrybuty, konstruktor,
operator, organizacja programu
4.2. Pierwsze kroki w kierunku
programowania w C++
itm / MVLab (c) 2007-2011
Co już mamy do dyspozycji ?
Mamy
dokumentację projektu szczegółowego (diagramy
klas, działań i stanów)
Plan
język programowania C++
(rozdz. 3)
środowisko programistyczne .net
zasady programowania
Implementujemy...
krok 1: implementacja klas
Krok 1 Krok 2
krok 2: implementacja działań
narzędzia działania
(klasy) (obiekty)
itm / MVLab (c) 2007-2011
Klasy
Klasa jest definicją właściwości, metod i semantyki dla pewnego zbioru
obiektów. Wszystkie obiekty danej klasy odpowiadają jej definicji.
Wyrażenia  klasa i  typ mogą być w pewnych warunkach traktowane
jako synonimy.
Implementacja klasy
Podejście statyczne
definicja struktury danych podobna do struktur lub rekordów
klasa jako szablon dla potencjalnych obiektów
Podejście dynamiczne
mechanizmy dostępu
implementacja metod podobna do funkcji i procedur
Ogólne
klasa może być potencjalnie wykorzystana poza konkretnym
programem, jako w pełni oprogramowany komponent
należy rozpatrzyć wszystkie potencjalne przypadki zastosowań
itm / MVLab (c) 2007-2011
Metoda
Metoda to operacja jaka może być wykonana przez obiekt. Metodę
określa sygnatura (nazwa, lista parametrów, typ wartości zwracanej).
Wyrażenia:  operacja ,  usługa ,  procedura ,  routine i  funkcja mogą
być traktowane jako synonimy.
Implementacja metod
implementacja algorytmu
przekazane parametry obróbka wynik
łącze wejściowe:
przekazane parametry + właściwości (dostęp do odczytu)
łącze wyjściowe:
wartość zwracana + właściwości (dostęp do zapisu)
Następstwa
działanie metody nie zależy tylko do parametrów przekazanych, ale także
od wewnętrznego stanu obiektu (właściwości).
itm / MVLab (c) 2007-2011
Deklaracja klasy w C++
Dane reprezentujące
Ulamek
dowolny ułamek zwykły
- Licznik
- Mianownik
Metody do przetwarzania
+ Ulamek(int L, int M)
UML
dowolnego ułamka zw.
+ ~Ulamek()
+ Wypisz()
Mechanizm dostępu
+ SprowDoMian(int M)
Zasada: information hiding
class CUlamek {
Deklaracja właściwości
private:
int m_iLicznik;
Deklaracja metod
int m_iMianownik;
C++
public:
CUlamek(int iLicznik, int iMianownik);
~CUlamek()
void Wypisz() const;
void SprowDoMian(int iMianownik);
};
itm / MVLab (c) 2007-2011
Rozdział: deklaracja i
implementacja
Plik nagłówkowy: Ulamek.h Plik implementacji: Ulamek.cpp
definicje struktur i powiązań: realizacja -implementacja metod:
" deklaracje klas " konstruktorów
" używane biblioteki " destruktorów
" używane definicje typów " operatorów
" akcesorów
" innych metod
Zasada  czarnej skrzynki
Oddzielenie struktur i powiązań od implementacji
pomaga radzić sobie z dużą złożonością
umożliwia oddzielną kompilację elementów programu
gdy potrzebna jest klasa CUlamek, wystarczy dodać odpowiednie pliki
nagłówkowe
itm / MVLab (c) 2007-2011
Rozdział: deklaracja i
implementacja
// Ulamek.h
Powiązanie z plikiem
nagłówkowym
class CUlamek {
private:
// Ulamek.cpp
int m_iLicznik;
#include "Ulamek.h"
int m_iMianownik;
public:
CUlamek::CUlamek(int iLicznik, int
CUlamek(int iLicznik,
iMianownik) {
int iMianownik);
m_iLicznik=...
~CUlamek()
}
void Wypisz() const;
CUlamek::~CUlamek(){ ... }
void SprowDoMian
void CUlamek::Wypisz() const
(int iMianownik);
{
};
cout<<"Wynik: "<< ...
}
Implementacja metody Wypisz():
void CUlamek::SprowDoMian
" należącej do klasy CUlamek,
(int iMianownik) {
m_iLicznik = ...
" bezparametrowej,
}
" niezmieniającej stanu obiektu,
" zwracającej typ void.
itm / MVLab (c) 2007-2011
Implementacja metod
na podst.
Specyfikacja metody Wypisz klasy CUlamek:
specyfikacji szczegółowej
" funkcja: wypisuje na monitorze wartość ułamka
w postaci dziesiętnej
cout -obiekt związany
" parametry wejściowe: brak
z monitorem (o tym pózniej)
" zwracana wartość: brak
" warunki PRE i POST: brak
złącze  na zewnątrz
" metoda nie może zmieniać stanu obiektu
-zmiana właśc. obiektu
void CUlamek::Wypisz() const
{
if(m_iMianownik)
cout << m_iLicznik / m_iMianownik;
else
cerr << " NaN"; //BLAD: dzielenie przez zero
}
void CUlamek::SprowDoMian(int iMianownik) {
double mnoznik = (m_iLicznik * iMianownik / m_iMianownik);
if(!m_iMianownik && !(mnoznik%1))
m_iLicznik *= mnoznik; m_iMianownik = iMianownik;
else
cerr << "Nie mozna sprowadzic do podanego mianownika. ;
}
itm / MVLab (c) 2007-2011
Konstruktory
Nazwa taka
sama jak klasy
CUlamek::CUlamek(int iLicznik, int iMianownik)
{
if(!iMianownik) {
cerr << "Mianownik nie może być zero! Ustawiam na 1." << endl;
iMianownik = 1;
}
m_iLicznik = iLicznik;
m_iMianownik = iMianownik;
}
Konstruktor:
specjalna metoda,
gwarantuje prawidłową inicjalizację obiektu,
wywoływane automatycznie podczas tworzenia obiektów,
mogą posiadać parametry wejściowe (argumenty)
itm / MVLab (c) 2007-2011
Konstruktory standardowe
konstruktor
bezparametrowy
CUlamek::CUlamek()
{
m_iLicznik = 0;
m_iMianownik = 1;
}
//Alternatywa dla domyslnego konstruktora standardowego
CUlamek::CUlamek(int iLicznik = 0, int iMianownik = 1)
{
if(!iMianownik) { //Blad dzielenia przez 0
{
wartości domyślne w przypadku braku
argumentów w wywołaniu.
Konstruktor standardowy:
UWAGA! niebezpieczeństwo
dwuznaczności przy wywołaniu
także konstruktor domyślny,
bezparametrowym!
brak argumentów,
powinien być zawsze implementowany,
szczególnie potrzebny w przypadku agregacji (o tym pózniej)
itm / MVLab (c) 2007-2011
Destruktory
brak parametrów
CUlamek::~CUlamek()
{
//tu umieszcza sie operacje pozwalajace usunac obiektypowiazane
//z danym obiektem.
//Pamiec przydzielona samamu obiektowi na rzecz ktorego wywolany
//jest destruktor jest dealokowana autoamtycznie (pusty
//destruktor, lub jego brak)
}
Destruktor:
oznaczony przez znak tyldy (~) i nazwę klasy,
brak argumentów,
wywoływane automatycznie przez system
aby usunąć obiekt po zakończeniu działania bloku programu (np.
funkcji)
przez wywołanie delete w sposób jawny (o tym pózniej)
itm / MVLab (c) 2007-2011
Nasz pierwszy program w C++
Deklaracja klasy
Definicja i
implementacja klasy
CUlamek.h CUlamek.cpp
Krok 1 CUlamek
Użycie
zaimplementowanej
TestUlamek.cpp
Krok 2
klasy w działającym
programie
 używa
itm / MVLab (c) 2007-2011
Nasz pierwszy program w C++
// Ulamek.h
// Ulamek.cpp
#include
#include "Ulamek.h"
using namespace std;
class CUlamek {
private:
CUlamek::CUlamek(int iLicznik, int iMianownik)
int m_iLicznik;
{ /*implementacja podana wcześniej*/ }
int m_iMianownik;
public:
CUlamek::~CUlamek()
CUlamek(int iLicznik,
{ }
int iMianownik);
~CUlamek()
void CUlamek::Wypisz() const
void Wypisz() const;
{ /*implementacja podana wcześniej*/ }
void SprowDoMian
(int iMianownik);
void CUlamek::SprowDoMian(int iMianownik)
};
{ /*implementacja podana wcześniej*/ }
// TestUlamek.cpp
łączenie z definicją klasy
#include "Ulamek.h"
void main() {
Tworzenie instancji (obiektu) klasy
CUlamek mojUlamek(1,2);
mojUlamek.Wypisz();
CUlamek -niejawne wywołanie konstr.
mojUlamek.SprowDoMian(4);
mojUlamek.Wypisz();
operator odwołania (.)
}
itm / MVLab (c) 2007-2011
Przebieg kompilacji
Ulamek.cpp
Ulamek
Kompilator
.obj
Ulamek.h
Linker
TestUlamek.exe
TestUlamek
Kompilator .obj
TestUlamek.cpp
itm / MVLab (c) 2007-2011
Przebieg kompilacji
Muszą znajdować się w
jednym katalogu.
wspierane przez wizardy
Ulamek.cpp
Ulamek
Kompilator
.obj
Ulamek.h
Linker
TestUlamek.exe
TestUlamek
Kompilator .obj
TestUlamek.cpp
niepowiązane adresy wejściowe
itm / MVLab (c) 2007-2011
4.3. Nasze klasy  rosną ...
4.3 Nasze klasy  rosną ...
4.3.1 Przestrzenie nazw
4.3.2 Przeciążanie metod
4.3.3 Przeciążanie operatorów
4.3.4 Wzorce
4.3.5 Właściwości i dynamiczna
alokacja pamięci
itm / MVLab (c) 2007-2011
Przestrzenie nazw
Powód:
większa swoboda nazywania funkcji, zmiennych, ...
niebezpieczeństwo konfliktów nazw w przypadku dużych
projektów
// AAA.h // BBB.h
class CMojaKlasa class CMojaKlasa
{ {
private: private:
int var_1; int var_1;
//... //...
}; };
Użycie obydwu headderów
na raz jest niemożliwe.
// Test.cpp
Błąd kompilacji.
#include AAA.h
#include BBB.h
itm / MVLab (c) 2007-2011
Zastosowanie przestrzeni nazw
deklaracje widoczne tylko w obrębie swojej przestrzeni
deklaracje bibliotek standard. znajdują się w przestrzeni nazw std
UWAGA! mechanizm nie jest wspierany przez wszystkie kompilatory.
// AAA.h // BBB.h
namespace A namespace B
{ {
class CMojaKlasa class CMojaKlasa
{ /* ... */ }; { /* ... */ };
}; };
dostęp do innych
od obecnie używanej
// Test.cpp
przestrzeni nazw przez
using: wybiera
#include AAA.h
operator dostępu (::)
do użycia jedna
#include BBB.h
z istniejących
using namespace A
przestrzeni nazw
B::CMojaKlasa test;
//...
itm / MVLab (c) 2007-2011
Przeciążanie metod
Powód:
W standardowym C mogła istnieć tylko jedna funkcja o danej
nazwie.
Funkcje (metody) robiące zasadniczo to samo, powinny
również tak samo się nazywać. Np:
class CUlamek {
// ...
public:
void WypiszNaEkranie() const
{
//...
};
void WypiszNaDrukarce() const
{
//...
};
Czy
//...
w każdym przypadku
};
potrzebna jest nowa
nazwa?
itm / MVLab (c) 2007-2011
Zły przykład: konstruktory
class CUlamek1 class CUlamek2 class CUlamek3
{ { {
CUlamek1(int iL, int iM) CUlamek2(int iL) CUlamek3()
{ { {
m_iLicznik=iL; m_iLicznik=iL; m_iLicznik=0;
m_iMianownik=iM; m_iMianownik=1; m_iMianownik=1;
}; }; };
\\... \\... \\...
}; }; };
#include "Ulamek1.h"
#include "Ulamek2.h"
#include "Ulamek3.h"
Nigdy
void main()
{
w ten
CUlamek1 ulamekA(1,2);
CUlamek2 ulamekB(3);
sposób
CUlamek3 ulamekC;
};
itm / MVLab (c) 2007-2011
Przeciążanie metod - przykład
class CUlamek
takie same nazwy,
{
ale inny zestaw parametrów
private:
int m_iLicznik;
#include "Ulamek.h"
int m_iMianownik;
#include
public:
CUlamek() {
CUlamek();
m_iLicznik=0;
CUlamek(int iLicznik);
m_iMianownik=1;
CUlamek(int iLicznik,
};
int iMianownik);
CUlamek(int iLicznik) {
};
m_iLicznik=iLicznik;
m_iMianownik=1;
#include "Ulamek.h"
};
void main()
CUlamek(int iLicznik, int iMianownik) {
{
if(!iMianownik) {
CUlamek ulamekA(1,2);
std::cerr<<"Dzielenie przez 0!";
CUlamek ulamekB(3);
std::exit(1);
CUlamek ulamekC(ulamekB);
};
CUlamek ulamekD;
m_iLicznik=iLicznik;
};
m_iMianownik=iMianownik;
};
itm / MVLab (c) 2007-2011
Przeciążanie metod - przykład
#include "Ulamek.h"
void main()
{
CUlamek ulamekA(1,2);
CUlamek ulamekB(3);
CUlamek ulamekC(ulamekB); //Kopiowanie; kompilator dostarcza
//standardowego konstruktora kopiującego
};
#include "Ulamek.h"
lu
void main()
najlepsze
b
{
rozwiązanie
CUlamek ulamekA(1,2);
CUlamek ulamekB(3);
CUlamek ulamekC; //konstruktor
ulamekC=ulamekB; //przypisanie
};
#include "Ulamek.h"
lu
void main()
b
{
CUlamek ulamekA(1,2);
CUlamek ulamekB(3);
CUlamek ulamekC(3);
};
itm / MVLab (c) 2007-2011
Przeciążanie metod - przykład
#include "Ulamek.h"
void main()
{
CUlamek ulamekA(1,2);
CUlamek ulamekB(3);
CUlamek ulamekC(ulamekB); //Kopiowanie; kompilator dostarcza
//standardowego konstruktora kopiującego
};
#include "Ulamek.h"
lub:
#include
przeładować
samodzielnie
CUlamek::CUlamek(int iLicznik) {
m_iLicznik = iLicznik;
konstruktor i
m_iMianownik = 1;
kopiować elementy w
};
zdefiniowany przez
siebie sposób CUlamek::CUlamek(const CUlamek& kUlamek) {
m_iLicznik = kUlamek.m_iLicznik;
m_iMianownik = kUlamek.m_iMianownik;
};
itm / MVLab (c) 2007-2011
Konstruktory kopiujące i
konwertujące
argument
class CUlamek
przekazany
{
przez referencję
private:
int m_iLicznik;
#include "Ulamek.h"
int m_iMianownik;
public:
CUlamek::CUlamek
CUlamek(const CUlamek& kUlamek);
(const CUlamek& kUlamek)
CUlamek(int iLicznik);
{
CUlamek(int iLicznik, int iMianownik);
m_iLicznik =
};
kUlamek.m_iLicznik;
m_iMianownik =
konstruktory z niejawne
kUlamek.m_iMianownik;
dokładnie jednym wywołanie
};
argumentem konstruktora
#include "Ulamek.h"
void main()
{
CUlamek ulamekB = 3;
CUlamek ulamekC = ulamekB;
};
itm / MVLab (c) 2007-2011
Konstruktory kopiujące i
konwertujące
Porównanie: jawne i niejawne wywołanie
konstruktorów.
#include "Ulamek.h"
void main()
{
CUlamek ulamekB(3);
CUlamek ulamekC(ulamekB);
};
niejawne wywołanie jawne wywołanie
konstruktora konstruktora
#include "Ulamek.h"
void main()
{
CUlamek ulamekB = 3;
CUlamek ulamekC = ulamekB;
};
Która metoda jest preferowana?
itm / MVLab (c) 2007-2011


Wyszukiwarka

Podobne podstrony:
W06 apr int
MB W06 PWr
Aire W06
W06?solutna kalibracja robotów
BD 2st 1 2 w06 tresc 1 1 kolor
inf2 w01
LP mgr W06 Zasady Lean Manuf
podst inf2 dzialana na liczbach dwojkowych
podst inf2 jezyki formalne
PodstawyAutomatyki w06
WM w06 A Skrecanie swobodne okno
inf2 w02
MES JCh MM WW OKnO w06 Koncepcja MES macierze
OEiM AiR W06 SLS odpowiedz

więcej podobnych podstron