Programowanie 2016

Transkrypt

Programowanie 2016
Programowanie 2016
Łukasz Dulny
18 marca 2016
Jeszcze raz polecam, żeby zdobyli państwo Symfonię C++ Standard. Wygląda, że w bibliotece FUWu jest koło 30 egzemplarzy, więc lepiej, żeby chemicy wypożyczali na chemii i żeby wypożyczali państwo parami. W najgorszym razie można czytać niewypożyczalny egzemplarz w bibliotece.
1
Nasza pracownia
Na pracowni mamy dystrybucję Linuksa, Fedorę.
Środowisko graficzne to Gnome 3 i jak widać, wymaga nieraz wyszukiwania programów, ale w sumie nie jest chyba wiele dziwniejszy niż Windows
8. Po kliknięciu Activities (polskie Podgląd), po lewej są ulubione i uruchomione programy. Klikając prawym przyciskiem myszy, można usunąć program z ulubionych. Żeby dodać do ulubionych, klikamy prawym przyciskiem
na znaleziony program. Wybór języka można dostać wpisując w wyszukiwarce languages, ale nie wiem, na ile jest skuteczny na pracowni.
Do pisania programów potrzebujemy w praktyce menadżera plików, edytora tekstu i terminala.
Menadżer plików w Gnome to Nautilus, w wyszukiwarce trzeba wpisać
Files. Ctrl+L pozwala zmienić pasek adresu w pole tekstowe. Przeciągnięcie pliku albo katalogu, nawet z paska adresu, do terminala, wpisuje nazwę
pliku z pełnym adresem. Usuwanie wymaga kliknięcia prawym przyciskiem i
wybranie przenieś do kosza.
Edytor tekstu to Gedit.
Terminal to program taki, jak dosowe okno w Windowsie. Powłoka (shell ),
na pracowni bash (w ogóle chyba najpopularniejsza), interpretuje wpisane
polecenia, jak command.com albo cmd.exe w systemach Microsoftu. sh to
najbardziej standardowa powłoka, gwarantowana przez standard POSIX, ale
robi tylko to, co przewiduje ten standard. Może dojdziemy np. do tego, że
jest wykorzystywana np. przez funkcję system() w C++.
Polecenia powłoki – niezbędne na początek:
1
• cd przenosi nas do podanego katalogu. (.. to katalog poziom wyżej w
hierarchii, . to bieżący katalog). Katalogi w ścieżce dostępu oddzielamy
symbolem /, a nie \, jak w Windows.
• ~ zmienia się w katalog domowy. * zmienia się w listę nazw plików.
• pwd podaje bieżący katalog, czyli ten, w którym jesteśmy.
• ls wypisuje pliki. Można też podać parametr, z jakiego katalogu ma
wypisać pliki (zamiast bieżącego). ls -l dodatkowo opisuje pliki.
• Jeśli po poleceniu wpiszemy &, program uruchomi się w tle. W ten
sposób warto uruchamiać programy graficzne.
• Ctrl+C kończy program. Ctrl+Z zatrzymuje go i wraca do powłoki. bg
uruchamia zatrzymany program w tle. W ten sposób można odzyskać
terminal, jeśli zapomni się o wpisaniu &.
• man podaje opis polecenia podanego jako parametr. Poleceń wbudowanych w Bash czasem (akurat nie na pracowni) trzeba szukać pod man
bash. Można też szukać opisu w Internecie.
Powłoka uruchamia swoje polecenia wbudowane i pliki wykonalne ze
ścieżki dostępu $PATH, a inne tylko wtedy, jeśli podamy wyraźnie ścieżkę.
Przed plikami w bieżącym katalogu trzeba podać ./.
Wciśnięcie Tab daje podpowiedź. Raz tak długo, jak jest jedna możliwość,
dwa razy wypisuje możliwości. Strzałka w górę pozwala powtarzać polecenia
(w dół pozwala wracać), a w lewo i w prawo pozwalają je zwyczajnie zmieniać.
1.1
Pisanie programów
Pliki z kodem źródłowym w C++ mają zwykle rozszerzenia .cpp, .cxx,
.cc albo .C. (Rozszerzeniem C było po prostu .c.) Jeśli rozszerzenie jest
niewłaściwe, do polecenia kompilacji trzeba dodać przed plikiem wejściowym
-x c++.
Na naszej pracowni uruchamiamy terminal i przechodzimy do katalogu,
do którego chcemy. Wygląda na to, że w Gnome 3 prawym przyciskiem można
tworzyć katalogi, ale nie pliki, więc trzeba tworzyć nowy plik (z odpowiednim
rozszerzeniem) przez gedit nazwa &, albo ręcznie zapisywać pod odpowiednią nazwą.
Bieżący katalog można otworzyć w Nautilusie poleceniem nautilus . &.
2
Kiedy zapiszemy plik z kodem źródłowym, uruchamiamy kompilator g++.
Jako parametr podajemy plik z kodem źródłowym, np. g++ program1.cc –
wtedy program będzie w pliku a.out. Nazwę inną niż ta domyślna można
podać po -o, np. -o program1.
Po udanej kompilacji mamy program. Żeby go uruchomić musimy podać nazwę, koniecznie jako ścieżkę, czyli z /, np. ./a.out albo ./program1,
powtarzając, że jest w bieżącym katalogu (.).
Co do programu podanego w ściądze:
#include<biblioteka > dołącza plik nagłówkowy. iostream to strumienie wyjścia/wyjścia. (Innym sposobem pisania jest wykorzystanie pliku nagłówkowego cstdio, standardowe wyjście/wyjście z C.)
using namespace to po prostu „używając przestrzeni nazw”. std to standardowa p-ń nazw. Bez tej linijki musielibyśmy pisać np. std::cout, ale to
miałoby tę zaletę, że wiadomo, co jest nasze własne, a co z biblioteki standardowej, i nie okaże się, że jakieś nazwy się nie zgadzają.
Średniki wstawia się po poleceniach.
int main() to deklaracja funkcji głównej (main). int oznacza, że funkcja
ma zwracać. W nawiasie byłyby argumenty, gdybyśmy jakieś podali. Funkcja
główna jest trochę dziwna, np. jeśli nie napisać, co zwraca, to zwraca 0 (patrz
dalej return), a inne funkcje przewiduję dopiero za jakiś czas.
Nawiasy {} otaczają bloki kodu, w tym zawsze ciało funkcji.
cout (console output) to strumień standardowego wyjścia. cin to strumień standardowego wejścia. Jest jeszcze cerr – strumień błędu.
<< to operator, który w sumie należy czytać jak strzałeczkę. Cudzysłowy
"" oznaczają łańcuch znaków. endl każe przejść do nowej linijki. Czyli jakby
„na wyjście „witaj” i koniec wiersza” (czytanie to cin >> zmienna , „z wejścia zmienna”).
return 0 oznacza, że funkcja ma zwrócić 0. Program powinien zwracać
zero, kiedy kończy się prawidłowo.
Ważna rzecz, której nie ma w ściądze, to komentarze, których kompilator
nie czyta i które przydają się dla ludzi: // komentarz do końca linii i /*
komentarz wielolinijkowy */.
2
Kompilacja
• g++ -o zad1 zad1.cc daje plik zad1
• g++ -o smiec zad1.cc daje plik smiec
• g++ zad1.cc daje plik a.out
3
• make zad1 tworzy (jeśli wie jak i stwierdzi, że trzeba) plik zad1, w
naszym wypadku przez g++ -o zad1 zad1.cc
Jeśli skompilowany program, np. przy kopiowaniu, zgubi właściwość wykonalny, nie daje się uruchomić. Można go kompilować na nowo (make może
nie zadziałać), albo zmienić tę własność z powrotem (klikając prawym przyciskiem, albo z pomocą chmod).
Pliki skompilowane pod Windowsem nie dadzą się uruchomić pod Linuksem i na odwrót (chyba, że użyjemy Wine czy czegoś takiego).
3
Polecenia powłoki
• man podaje opis polecenia podanego jako parametr. Polecenia wbudowane w Bash czasem (akurat nie na pracowni) są tylko w help (można
też szukać pod man bash). Ogólnie, oczywiście można też szukać opisu
w Internecie.
• cd (change directory) przenosi nas do podanego katalogu. Katalogi w
ścieżce dostępu oddzielamy symbolem /, a nie \, jak w Windows.
– Jeśli nic nie podamy, będzie katalog domowy, .. to katalog poziom
wyżej w hierarchii, . to bieżący katalog, ~ zmienia się (zobacz
echo ~ itp.) w katalog domowy, ~kaste czy ~ld276974 w katalog domowy innego użytkownika, a * w listę nazw plików (Jakby
zastępuje fragment nazwy, np. a*a zmieni się w nazwy zaczynające się i kończące na a, jeśli takie są. Podobnie ? zastępuje jeden
dowolny znak.)
• pwd podaje bieżący katalog, czyli ten, w którym jesteśmy.
• mkdir (make directory) tworzy katalog podany jako parametr.
• touch dotyka plik, czyli zmienia datę ostatniego dostępu i tworzy, jeśli
go nie było.
• rm usuwa plik. rm -r (rekurencyjnie) dla katalogów.
• ls wypisuje pliki. Można też podać parametr, z jakiego katalogu ma
wypisać pliki (zamiast bieżącego). ls -a wypisuje też ukryte pliki (z
nazwą zaczynającą się od kropki), a ls -l opisuje.
• echo po prostu wypisuje podane parametry.
4
• cat wypisuje zawartość podanego pliku. Bez parametru powtarza to,
co wpiszemy.
• tee wpisuje to, co piszemy do podanego pliku i jednocześnie powtarza
na ekranie.
• ps wypisuje procesy uruchomione w danym terminalu, a ps -e – wszystkie procesy.
• Ctrl+C kończy program. Ctrl+Z zatrzymuje go i wraca do powłoki.
bg (background ) uruchamia zatrzymany program w tle. W ten sposób
można odzyskać terminal, jeśli zapomni się o wpisaniu &. fg (foreground ) przywraca zatrzymany program na pierwszy plan. Jako parametry
bg i fg można podać numer poleceń w tle. jobs daje listę programów
w tle.
• chmod zmienia uprawnienia. chown zmienia właściciela (a w zasadzie
tylko grupę, jeśli nie mamy specjalnych uprawnień). Jak dokładnie, sam
zawsze szukam, normalnie da się to zmienić też w trybie graficznym.
Powłoka uruchamia swoje polecenia wbudowane i pliki wykonalne ze
ścieżki dostępu $PATH, a inne tylko wtedy, jeśli podamy wyraźnie ścieżkę.
Przed plikami w bieżącym katalogu trzeba podać ./. Programy w innych katalogach można uruchamiać bez dodatkowych komplikacji, podając tylko ten
katalog, np. katalog/program albo ../program, albo nawet ~/Pulpit/program z pulpitu,
/etc/smietnik/zagubiony program czy ../../kolega/jego programy/program19.
Spacja utrudnia życie – trzeba pisać cudzysłów (gedit "plik ze spacjami".txt)
albo wyescapeować spacje (gedit plik\ ze\ spacjami.txt). Polskie litery
mogą zmienić się w krzaczki albo nie działać po przeniesieniu pliku na inny
komputer. Jakiś program może sobie w ogóle nie radzić z takimi rzeczami.
Wciśnięcie Tab daje podpowiedź. Raz tak długo, jak jest jedna możliwość,
dwa razy wypisuje możliwości. Strzałka w górę pozwala powtarzać polecenia
(w dół pozwala wracać), a w lewo i w prawo pozwalają je zwyczajnie zmieniać.
Zmienna $0 oznacza wykonywany plik. W skryptach (którymi chyba się
nie będziemy zajmować) $1, $2 itp. to kolejne parametry, a $# to liczba parametrów. $? to wartość zwrócona (przez return) przez ostatni zakończony
program.
Przekierowywanie standardowego wejścia i wyjścia: < zastępuje wejście
treścią pliku, > zapisuje wyjście do pliku (usuwa jego poprzednią zawartość),
>> dopisuje wyjście do pliku (zachowuje poprzednią zawartość), a | przekierowuje wyjście do innego programu. Zatem ./suma < we.txt uruchomi
5
plik program suma w bieżącym katalogu (jeśli jest) tak, jakbyśmy sami wpisywali to, co jest w pliku we.txt. echo pies > fasola sprawia, że treścią
pliku fasola będzie „pies”, a echo pies >> fasola dopisuje „pies” do tego
pliku. ./suma > wy.txt pozwoli zapisać wyjście, ale będziemy pracować na
ślepo, a ./suma | tee wy.txt pozwoli zapisać wyjście i widzieć, co jest wypisywane.
4
Inne możliwości
Popularną dystrybucją Linuksa jest Ubuntu. Mam je zainstalowane w domu,
więc najlepiej znam. Wystarczy ściągnąć, nagrać płytę i można instalować
albo wypróbować bez instalowania.
Gnome 2 było podobne do Windows 95–Windows 7, z tym, że zamiast
menu start było normalne menu. Kontynuują je Cinamon i Mate. Unity (standard w Ubuntu) przypomina Gnome 3. Jest też KDE, ale w sumie nie wiem,
jak wygląda, możliwe, że mocno się zmieniło. (Jest też UbuntuMate, UbuntuGnome i Kubuntu (z KDE).)
Menadżer plików w Unity to też Nautilus, w Mate jest Caja, na innych
się nie znam.
Poza Geditem edytory tekstu to np. Kate z KDE i Pluma z Mate (polecenie to nazwa z małej litery). W trybie tekstowym można używać nano
albo mcedit (z mc, Midnight Commander, klon Norton Commandera, dwupanelowego dosowego menadżera plików). Słynne potężne i trudne edytory
(sam ich nie znam) to vi, vim i emacs. Zawsze można poszukać, który jest
dostępny na którym komputerze.
Inne powłoki to np. dash, csh, tcsh, zsh i fish. Powłokę można rozpoznać (Na innych komputerach znak zachęty podaje często adres, a nie
powłokę) wpisując echo $0.
Zamiast gcc (dla C++ g++) można używać clang (dla C++ polecenie to clang++, używane bardzo podobnie do g++). Dev-C++ to połączony
z edytorem tekstu darmowy kompilator, który działa bez problemów pod
Windowsem.
Ctrl+Alt+F1, Ctrl+Alt+F2 itd. pozwalają przejść do trybu tekstowego.
Ctrl+Alt+F7 to powrót do trybu graficznego. Na naszej pracowni najwyraźniej Ctrl+Alt+F1 to tryb graficzny, a od Ctrl+Alt+F2 do Ctrl+Alt+F6 jest
tryb tekstowy.
6