Spis treści rozdziału:
1.1 Obliczenia, modelowanie, symulacja
1.2 Czy warto uczyć się programowania?
1.3 Podstawowe pojęcia
1.4 Zmienne i struktury danych
1.5 Algorytmy
1.6 Przykład 1 - sześć postaci zapisu prostego algorytmu
1.7 Przykład 2 - algorytm rozwiązywania równań kwadratowych
W pracy inżyniera, oprócz standardowych obliczeń, często zachodzi potrzeba badania układów niedostępnych lub jeszcze nie istniejących (projektowanych) albo badania układów istniejących lecz w zakresie niemożliwym lub nieopłacalnym do zrealizowania na rzeczywistym obiekcie. W tym celu stosuje się badania symulacyjne na różnego rodzaju modelach - najczęściej realizowanych przy pomocy programów komputerowych.
Każdy model a więc i komputerowy jest hipotetycznym, przybliżonym i uproszczonym odwzorowaniem wybranych cech rzeczywistego obiektu lub procesu.
Można wyróżnić dwie podstawowe kategorie a mianowicie modele:
- strukturalne (np.: geometryczne) - odzwierciedlające budowę,
- funkcjonalne (np.: matematyczne) - odzwierciedlające działanie.
Najdoskonalsze modele - zwane wirtualnymi prototypami - łączą cechy modeli geometrycznych i matematycznych, odzwierciedlając nie tylko wygląd i zdolności ruchu (kinematykę) ale i dynamikę (masy, przyspieszenia, bezwładność) oraz wzajemne oddziaływania (zderzenia, odbicia, odkształcenia). Wszystkie komputerowe modele realizowane są odpowiednimi programami. Wiele z nich to kosztowne, rozbudowane, profesjonalne programy specjalistyczne, na przykład wspomagające tworzenie modeli bryłowych czy wirtualnych prototypów.
Modelowanie matematyczne polega na opisywaniu funkcjonowania układów i procesów językiem matematyki, przy użyciu równań oraz nierówności zawierających stałe, zmienne, operatory działań oraz funkcje. Model matematyczny pozwala badać wzajemne zależności zmiennych. Może służyć do określania zagrożeń i zakresów dopuszczalnej pracy oraz optymalizacji dla zadanych kryteriów (np.: minimum zużycia materiału lub energii, przy spełnieniu innych wymagań). Badania na modelach określane są jako badania symulacyjne.
Znaczna część modeli matematycznych musi być samodzielnie opracowywana przez inżynierów. Mają oni do dyspozycji dwie drogi:
- wykorzystanie uniwersalnych programów matematycznych jak Excel czy Mathcad,
- napisanie własnych programów przy wykorzystaniu jednego z istniejących języków programowania.
Szczerze mówiąc, sporo racji mają ci, którzy twierdzą "po co inżynier mechanik ma uczyć się programowania, skoro współcześnie dysponuje wielką różnorodnością gotowych programów zarówno uniwersalnych jak i wyspecjalizowanych".
Przed nastaniem epoki komputerów personalnych a częściowo i na jej początku - użytkownicy komputerów, a w szczególności studenci i naukowcy z uczelni technicznych musieli uczyć się programowania gdyż gotowe programy były nieliczne i drogie, bo w związku z niewielką liczbą i dużą różnorodnością typów komputerów - sprzedawały się w stosunkowo niewielu egzemplarzach i dość szybko (przy zmianach sprzętu) dezaktualizowały. Tak więc w sprzedaży oferowano głównie systemy operacyjne, bazy danych, edytory tekstów oraz translatory języków programowania. Inne wyspecjalizowane programy trzeba było na ogół opracowywać we własnym zakresie.
Rozwój liczby komputerów oraz ich unifikacja i standaryzacja skutkowały szybkim rozwojem zastosowań i liczby programów a Internet sprzyja ich rozpowszechnianiu, także legalnie darmowemu (freeware lub public domain) lub udostępnianiu do przetestowania. Tak więc najczęściej zamiast programować samodzielnie, można wyszukać odpowiedni program w Internecie lub rozwiązać problem przy zastosowaniu jednego z wielu uniwersalnych narzędzi (na przykład w arkuszu kalkulacyjnym) - koniecznie trzeba więc być biegłym w posługiwaniu się oprogramowaniem uniwersalnym i inżynierskim
Samodzielne pisanie profesjonalnych programów działających w kolejnych wersjach systemu Ms Windows, staje się coraz bardziej skomplikowane i odpowiednie raczej dla wykwalifikowanych informatyków niż dla inżynierów i naukowców z innych branż. No ale niniejsze wykłady i ćwiczenia nie mają na celu wyszkolenia programistów lecz nauczenie elementarnych podstaw programowania oraz korzystania z niezwykle potężnego, uniwersalnego i rozpowszechnionego a zarazem łatwego narzędzia jakim jest Matlab.
Dlaczego więc jednak warto poznać elementarne podstawy programowania?
M.in. dlatego, że pozwoli nam to:
- poznać ideę działania komputera, jego możliwości i ograniczenia,
- prawidłowo formułować problemy do rozwiązywania na komputerach,
- lepiej współpracować z informatykami przy wspólnym rozwiązywaniu problemów,
- rozwiązywać nietypowe zagadnienia i budować proste w obsłudze i niezawodne narzędzia,
- pełniej wykorzystywać uniwersalne pakiety oprogramowania, które prawie zawsze wyposażane są w języki programowania pozwalające dostosowywać je do nietypowych zadań.
Przykładowo: pakiety biurowe jak Ms Office posiadają język Visual Basic lub jego odmianę VBA (Visual Basic for Applications). Autocad dysponuje językami Lisp lub Visual Lisp oraz Visual Basic. W Matlabie język programowania jest jego istotą. Nowe wersje Mathcad'a zostały także wyposażone w język programowania. Języki programowania (dBase, Clipper, SQL, PHP) są używane w systemach baz danych. Aktywne strony internetowe wykorzystują także języki programowania (np. Java Script, czy PHP). Tak więc przy wszelkich nietypowych czy bardziej zaawansowanych zagadnieniach możemy spotkać się z językami programowania.
Umiejętność napisania programu - na przykład pozwalającego gromadzić i przetwarzać w komputerze dane uzyskiwane z drogiej aparatury pomiarowej - może nam pozwolić zaoszczędzić wydatków na drogie firmowe oprogramowanie.
Jak więc widać, umiejętność programowania jest przydatna także dla inżyniera mechanika zarówno dla poszerzenia ogólnej wiedzy jak i ze względów praktycznych.
Pisanie typowych i niezbyt złożonych programów jest ułatwiane i częściowo automatyzowane przez pakiety RAD (Rapid Application Development) jak Visual Basic, Delphi, C++ Builder, Java Buider. W Matlabie jest ono wspomagane systemem pomocy zawierającym wiele przykładów.
Tworzenie programów jest też wspaniałym rodzajem niemal nieograniczonej twórczości pozwalajacej realizować róznorodne pomysły, uczy logicznego myślenia i stanowi umysłową rozrywkę niegorszą niż szachy a przynoszącą konkretne efekty i - po początkowych trudach - mnóstwo satysfakcji.
Wszelkie działania komputera wynikają z wykonywania poleceń zawartych w opracowanych przez ludzi programach. Dla działania wielu programów niezbędne są także zbiory danych (liczbowych, tekstowych, dźwiękowych, wizualnych i in.)
Przed napisaniem programu zazwyczaj przedstawia się jego koncepcję w postaci algorytmu.
Algorytm musi mieć postać czytelną i zrozumiałą dla człowieka a początkowo jeszcze niekoniecznie dla komputera. Może to być postać schematu blokowego lub tekstu objaśniającego w ponumerowanych zdaniach poszczególne kroki działań jakie mają być realizowane.
Program zawiera zestaw deklaracji opisujących obiekty (zmienne) na których mają być wykonywane operacje oraz ciąg poleceń zwanych też rozkazami, komendami (ang.: command) lub instrukcjami (ang. statement) - zapisanych w odpowiedniej kolejności, w jednym z języków programowania (akceptowanym czyli "rozumianym" przez dany komputer). Niektóre języki programowania (np. Basic, Matlab), nie wymagają deklaracji (przynajmniej w prostych programach).
Tak więc krótko mówiąc: program to algorytm zapisany w języku programowania komputerów.
Jak wiemy, jednym z najważniejszych układów komputera jest procesor, który zawiera t.zw. arytmometr (ALU - arithmetic-logic unit - jednostkę arytmetyczno-logiczną) zdolną do wykonywania opeacji arytmetycznych i logicznych oraz układ sterowania (control unit) pobierający z pamięci operacyjnej RAM poszczególne rozkazy aktualnie wykonywanego programu (załadowanego z dysku do pamięci RAM) i zgodnie z treścią tych rozkazów sterujący układami komputera.
Każdy typ procesora potrafi realizować tylko rozkazy z przewidzianej dla niego listy rozkazów, i zapisywane w odpowiednim binarnym kodzie procesora.
Tak więc jedynym "naturalnym" czy "ojczystym" językiem jest dla każdego komputera lista i kod rozkazów jego procesora. Inne języki programowania muszą być poddawane tłumaczeniu czyli translacji na kod procesora.
Pierwsze w historii komputery "rozumiały" tylko rozkazy kodu procesora wyrażane ciągami zer i jedynek (lub zapisywane krócej przy pomocy pozycyjnego układu ósemkowego lub szesnastkowego)
Następnie pisano programy w kodzie asemblera zastępując liczbowe kody rozkazów kilkuliterowymi anglojęzycznymi skrótami ich nazw a program ASSEMBLER automatycznie tłumaczył to na kod procesora.
Obecnie istnieją setki różnych języków programowania, różniących się obszarem zastosowań oraz poziomem - im wyższy poziom języka tym jest on dogodniejszy dla człowieka. Wszystkie te języki są językami formalnymi to znaczy mają ściśle (formalnie) określone elementy - czyli alfabet języka, reguły gramatyczne określające składnię (ang.syntax) czyli zasady tworzenia poprawnych wyrażeń oraz ustalone znaczenie tych wyrażeń - semantykę (ang.: semantics) czyli sposób ich interpretowania i realizowania przez komputer.
Jako przykłady można wymienić: Algol, Basic, Fortran, Cobol, C, C++, Pascal, Java, Perl, Prolog, CSSL, Visual Basic, Clipper, Delphi (odmiana obiektowego Pascal'a), Logo, Lisp i wiele innych.
Jak już powiedziano, procesor komputera nie potrafi realizować bezpośrednio komend programów napisanych w językach wysokiego poziomu. Wymagają one translacji czyli przetłumaczenia przy pomocy odpowiedniego programu zwanego translatorem - na sekwencje rozkazów dla procesora wyrażonych w jego kodzie. Translatory dzielą się na kompilatory - tłumaczące cały program przed jego wykonaniem oraz na interpretatory (interpretery) od razu wykonujące każdą przetłumaczoną instrukcję.
Po przetłumaczeniu programu przez kompilator następuje zazwyczaj jeszcze tzw. konsolidacja (zwana też z angielska "linkowaniem"). Jest to operacja dołączania podprogramów standardowych (tzw. bibliotecznych) i porządkowania całości realizowana przez konsolidator (linker). W wyniku tych operacji powstaje binarna postać wykonywalna programu (ang.: executable) zapisywana w pliku z rozszerzeniem ".exe" lub ".com".
Gdy uruchamiamy program (np.: otwieramy jego ikonę) wówczas postać wykonywalna ładowana jest do pamięci operacyjnej RAM i następuje wykonywanie poszczególnych rozkazów przez procesor, przy czym bardzo ważna jest ich kolejność.
Jeśli dla konkretnego typu komputera (a w szczególności jego procesora) opracowano translatory pewnego języka programowania to mówi się, że zaimplementowano język na ten komputer albo, że istnieje implementacja tego języka dla tego typu komputera.
Dość często programowanie kojarzy się studentom z obliczeniami wykonywanymi na kalkulatorze. Jest to poważny BŁĄD. Czym więc różni się programowanie od obliczeń na kalkulatorze?
Obliczenia na kalkulatorze wykonywane są na konkretnych liczbach, natomiast program ma operować na zmiennych reprezentujących struktury danych poddawane przetwarzaniu lub sterujące tym przetwarzaniem. Każda zmienna obecna jest w programie przez swoją nazwę i pełni ściśle określoną rolę. Zmienne można więc traktować jak "pojemniki" na dane o różnych typach i różnej strukturze. Dzięki zmiennym program stanowi uogólniony zapis rozwiązywania pewnej klasy zagadnień i może być wielokrotnie wykorzystywany dla różnych danych - czyli różnych wartości zmiennych wejściowych.
Nie da się skonstruować algorytmu czy programu bez precyzyjnego określenia roli każdej zmiennej i pamiętania o tej roli. Tak więc objaśnienia wszystkich zmiennych powinny być umieszczone (w komentarzach) w każdym programie.
Oprócz ściśle określonej roli, każda zmienna musi posiadać:
|
Oprócz zmiennych prostych czyli skalarnych - przechowujących pojedyncze wartości (liczbowe, znakowe, logiczne) w programach uzywane są zmienne złożone czyli struktury danych zwane czasem kontenerami (ang.: container), a mianowicie:
Tablica jednowymiarowa czyli wektor - ciąg n ponumerowanych składowych |
![]() |
Tablica dwu lub więcej wymiarowa - macierz |
![]() |
Rekord - zbiór n danych o pojedynczym obiekcie lub zdarzeniu (np. dane personalne: Nazwisko, rok urodzenia, ...), przy czym każda z tych danych może być innego typu. Tabele baz danych gromadzą rekordy w poszczególnych wierszach (patrz rysunek). |
![]() |
Lista jednokierunkowa - ciąg danych z których każda oprócz wartości zawiera identyfikator (lub adres) swego następnika lub znacznik końca listy |
![]() |
Lista dwukierunkowa - ciąg danych z których każda oprócz wartości zawiera identyfikator (lub adres) swego następnika lub znacznik końca listy oraz identyfikator poprzednika lub znacznik początku | |
Stos - lista o zmiennej długości w której zarówno dołączanie jak usuwanie elementów odbywa się na końcu listy. Może być realizowana jako rejestr LIFO (ang.: Last In First Out - „ostatni przyszedł pierwszy wyjdzie”) |
![]() |
Kolejka - lista o zmiennej długości do której elementy można dołączać na końcu listy a usuwać na początku listy. Może być realizowana jako rejestr FIFO (ang.: First In First Out - „ten co pierwszy przyszedł ten pierwszy odejdzie”) |
![]() |
ALGORYTM to opis procedury prowadzacej do uzyskania określonego celu. Algorytm powinien zawierać: a) opis danych oraz b) opis procedury realizacji dowolnego zadania z pewnej, ściśle określonej klasy zadań, np..: rozwiązywania dowolnego równania kwadratowego Opis procedury składa się ze skończonej liczby jednoznacznie określonych poleceń (kroków) jakie należy wykonać w określonej kolejności dla uzyskania celu. Polecenia muszą być zrozumiałe i możliwe do realizacji dla wykonawcy algorytmu. |
Przykład "algorytmu wziętego z życia": | Ten sam algorytm jako SCHEMAT BLOKOWY: |
Małego Jasia posyłamy na zakupy i mówimy mu: Jasiu masz tu 15 zł idź do sklepu i kup chleb oraz spytaj czy jest mąka "krupczatka", jeśli jest to kup 2 kilo a jeśli nie to tylko kilogram jakiejś innej mąki. Jak będzie kolejka to patrz na zegarek i nie czekaj więcej niż 20 minut. Jak starczy ci pieniędzy to kup jeszcze kilka butelek wody. W schemacie tym zastosowano bloki analogiczne jak w algorytmach dla komputerów a mianowicie: - początek ("Start") i koniec ("Stop"), - wprowadzanie danych (Kwota, godzina G, czas, ..) - modyfikowanie danych (np. zmniejszanie "Kwoty": Kwota = Kwota - koszt...; zwiększanie "L": L=L+1) - podejmowanie decyzji zależnie od określonego warunku ("Czy jest kolejka?", "Czy jest mąka...") - pętle powodujące wielokrotne wracanie i powtarzanie pewnych czynności. |
![]() |
Większość prostych algorytmów numerycznych realizowanych programami komputerowymi można budować z kilku podstawowych typów poleceń.
| |
1) Instrukcja wczytywania: "Wczytaj z urządzenia wejściowego wartości zmiennych A, B i prześlij do obszarów pamięci zarezerwowanych dla tych zmiennych" |
![]() |
2) Instrukcja podstawiania: "Oblicz wartość wyrażenia zapisanego po prawej stronie znaku [=] i nadaj tą wartość zmiennej zapisanej po lewej stronie." UWAGA: znak "=" jest w tym przypadku "znakiem podstawiania" a nie znakiem równości. W języku Pascal i w Mathcadzie używany jest w tym celu znak ":=". |
![]() |
3) Instrukcja wyprowadzania (drukowania): "Przekopiuj na urządzenie wyjściowe (wyświetl, wydrukuj, ...) teksty zamieszczone w cudzysłowach oraz aktualne wartości podanych zmiennych." |
![]() |
4) Rozgałęzienie warunkowe: "Jeśli (ang.: IF) podany WARUNEK jest spełniony to wykonaj instrukcje podane w BLOKU1 a w przeciwnym przypadku (ang.: ELSE) wykonaj instrukcje podane w BLOKU2". |
![]() |
5) Pętla typu "DLA ..." (ang.: FOR) - powtarza operacje określoną liczbę razy: "Dla wartości zmiennej X zmieniającej się od XP z przyrostem DX do XK powtarzaj wykonywanie instrukcji zapisanych wewnątrz pętli, tyle razy ile będzie wartości zmiennej X" |
![]() |
6) Pętla typu "DOPÓKI" (ang.: WHILE) - powtarza operacje nieokreśloną liczbę razy: "Dopóki podany WARUNEK jest spełniony powtarzaj wykonywanie instrukcji zapisanych wewnątrz pętli." "WARUNEK" to wyrażenie logiczne (w najprostszym przypadku relacja) np.: X>0 |
![]() |
Algorytmy, które mają być realizowane jako programy komputerowe muszą składać się z poleceń które będzie wykonywał procesor i inne układy systemu komputerowego. Przy opracowywaniu algorytmu ważny jest przede wszystkim sens tych poleceń oraz ich zrozumiałość, jednoznaczność i wykonalność a mniej istotne środki i sposoby zapisu. Można więc ten sam algorytm zapisać w różnych postaciach na przykład jako:
a) Postać 1 - opis słowny: a) Postać 2 - schemat blokowy: a) Postać 3 - program w języku BASIC: a) Postać 4 - program w języku PASCAL: a) Postać 5 - program w języku MATLAB: a) Postać 6 - program w języku C:
1) Będą użyte zmienne liczbowe: X, Y, oraz tekstowa: P
2) Wyświetl: „Obliczanie kwadratów. Podaj liczbę:”
3) Wczytaj liczbę do zmiennej X
4) Oblicz: X*X i wynik wstaw do Y
5) Wyświetl tekst „ Kwadrat liczby =” oraz wartość Y
6) Wyświetl pytanie: „Czy nowe obliczenie? (T/N):”
7) Wczytaj znak z klawiatury do zmiennej P
8) Jeśli wartość P = „T” lub P = „t” to skocz do (2)
9) KONIEC
' w tym języku nie musimy deklarować zmiennych
2 PRINT "Obliczanie kwadratów"
INPUT "Podaj liczbe:"; X
Y = X * X
PRINT "Kwadrat liczby ="; Y
INPUT "Czy nowe obliczenie? (T/N):"; P$
IF P$ = "T" OR P$ = "t" GOTO 2
STOP
program kwadraty;
uses crt, dos; VAR x,y:real; p:char; label 2;
BEGIN
2: writeln('Obliczanie kwadratow.');
write('Podaj liczbe:'); readln(x);
y:=x*x;
write('Kwadrat liczby='); writeln(y);
write('Czy nowe obliczenie? (T/N):'); readln(p);
if (p='T') OR (p='t') then goto 2
END.
% Program oblicza kwadraty liczb
p= 't';
while p=='T' | p=='t'
disp('Obliczanie kwadratow.');
x = input('Podaj liczbe :');
y = x^2;
disp('Kwadrat liczby = '); disp(y);
p=input('Czy nowe obliczenie? (T/N):', 's');
end
main()
{
float x,y; char p;
p='t';
while(p=='t'| p=='T')
{
printf("\n OBLICZANIE KWADRATOW. Podaj liczbe:");
scanf("%f",&x);
y=x*x;
printf("\n Kwadrat liczby= %f",y);
printf("\n Czy nowe obliczenia? (T/N):");
p=getch();
}
}
1.7 Przykład 2 - algorytm rozwiązywania równań kwadratowych
Kolejny przykład to algorytm zawierający, oprócz pętli, dodatkowe rozgałęzienie wynikające z badania znaku wyróżnika równania kwadratowego DELTA.
Załóżmy że komputer ma obliczać pierwiastki równań kwadratowych tyle razy ile sobie zażyczymy.
Algorytm ma funkcjonować dla dowolnych wartości danych . Zaczynamy od określenia jakie zmienne będą niezbędne. Załóżmy także, że docelowo chcemy utworzyć program w języku BASIC.
W algorytmie rozwiązywania równania kwadratowego użyjemy zmiennych:
Wyjaśnienia wymaga znaczek "$" na końcu ostatniej nazwy. Otóż taki znaczek na końcu nazwy zmiennej lub funkcji oznacza w języku BASIC, że wartości jej będą nie liczbowe lecz tekstowe czyli deklaruje typ tych zmiennych. Zmienne o wartościach liczbowych nie muszą być w języka BASIC deklarowane
A oto trzy postacie algorytmu rozwiązywania równań kwadratowych:
Postać 1 - opis słowny
|
Postać 2 - schemat blokowy
Postać 3 - program w języku Qbasic z komentarzami poprzedzonymi apostrofem lub słowem REM
CLS :' - to jest instrukcja "wyczyść ekran"
|