Podstawowe informacje:
Laboratorium jest częścią zajęć ze Wstępu do programowania. Szczegółowe zasady zaliczania przedmiotu ogłasza wykładowca.
Obecność na zajęciach jest obowiązkowa.
Pierwszych pięć tygodni zajęć laboratoryjnych poświęcamy na zapoznanie się ze środowiskiem pracy programisty i opanowanie umiejętności programowania w języku C w stopniu podstawowym.
W dalszej części semestru studenci samodzielnie pracują nad rozwiązaniem czterech zadań zaliczeniowych. Za każde z nich można zdobyć maksymalnie 20 pkt. Zadanie czwarte jest zadaniem poprawkowym. Jego oceną można poprawić najsłabszą ocenę z zadań od 1 do 3. Łącznie można więc zdobyć maksymalnie 60 pkt. Wykładowca uwzględni je, wystawiając ostateczną ocenę z przedmiotu.
Pracujemy w środowisku systemu operacyjnego Linux kompilując programy za pomocą kompilatora gcc.
Czas trwania zajęć może nie wystarczyć do napisania programów zaliczeniowych. Studenci, którzy chcą programować w domu, mają dwie możliwości.
Najprostszym rozwiązaniem jest zdalna praca na koncie wydziałowym. Pod Windows można to robić za pomocą programu PuTTY. Przyda się też dołączony do niego program PSCP pozwalający na przesyłanie plików.
Osoby, które nie mają możliwości pracy zdalnej, np. z powodu braku dostępu do Internetu, mogą zainstalować kompilator gcc na swoim komputerze.
Nie gwarantujemy, że wszystko, co będziemy robili na zajęciach laboratoryjnych, da się powtórzyć pod Windows. Studenci, którzy chcą mieć w domu możliwie wierną kopię środowiska, w którym prowadzone są zajęcia, mogą rozważyć instalację Linuxa. Nie oznacza to konieczności rezygnacji z Windows - oba systemy mogą współistnieć na jednym komputerze. Uprzedzamy jednak - instalacja nowego systemu operacyjnego nie zawsze jest łatwa.
Po uruchomieniu lub zresetowaniu komputera, na ekranie pojawi się menu, z którego wybieramy system operacyjny (Linux). Następnie, w oknie dialogowym wpisujemy login i hasło, by uzyskać dostęp do indywidualnego konta użytkownika. Konta te zostały założone dla każdego studenta przed rozpoczęciem zajęć. Loginy i hasła powinny być znane.
Pracę kończymy, wybierając z menu Programy polecenie Zakończ sesję i dalej Wyloguj, Uruchom ponownie lub Wyłącz.
Zaczniemy od wprowadzenia pojęć, którymi będziemy się posługiwali w dalszej części zajęć. Uprzedzamy: pewne kwestie będą przedstawiane w uproszczeniu.
Plik to zestaw danych, zwykle stanowiący logiczną całość. Programy również przechowywane są w postaci plików.
System operacyjny organizuje pliki w system plików.
W systemie plików pliki grupowane są w katalogi.
Katalogi tworzą strukturę drzewiastą nazywaną drzewem katalogów.
Korzeniem drzewa katalogów jest katalog główny.
Każdy użytkownik ma w systemie plików swój własny katalog nazywany katalogiem domowym.
Podczas pracy z systemem plików dla każdego użytkownika jest określony katalog aktualny, czyli katalog, w którym użytkownik się znajduje.
Plik, z którego chcemy skorzystać wskazujemy, podając ścieżkę dostępu. Ścieżka składa się z ciągu nazw katalogów rozdzielonych znakami '/'
. Jeśli ścieżka zaczyna się od '/'
, to opisuje drogę do pliku od katalogu głównego, wpp. od katalogu aktualnego.
W ścieżce dostępu może wystąpić '~'
oznaczające katalog domowy użytkownika, '.'
oznaczające katalog aktualny i '..'
oznaczające katalog, w którym znajduje się katalog aktualny.
Prosimy o otworzenie okna konsoli przez wybranie z menu Programy części Terminale i dalej Konsola.
Konsola to program wykonujący polecenia wprowadzane przez użytkownika. Przydadzą się nam:
ls
Wyświetla zawartość aktualnego katalogu. Z opcją -l
podaje dodatkowe informacje o elementach katalogu, m. in. rozmiar pliku, prawa dostępu.
Polecenie ls
można wywołać z argumentem wskazującym, o których elementach katalogu chcemy uzyskać informacje. W argumencie tym znak '?'
zastępuje dowolny znak a '*'
dowolny ciąg znaków. Np. polecenie ls -l *.c
poda informacje o plikach, których nazwa ma rozszerzenie .c
.
pwd
Podaje katalog aktualny.
cd nazwa
Zmienia katalog aktualny na katalog o podanej nazwie.
cp nazwa1 nazwa2
Tworzy kopię pliku nazwa1
nadając jej nazwę nazwa2
.
mv nazwa1 nazwa2
Zmienia nazwę pliku nazwa1
na nazwa2
.
rm nazwa
Usuwa plik nazwa
.
mkdir nazwa
Tworzy katalog o nazwie nazwa
.
rmdir nazwa
Usuwa katalog o nazwie nazwa
.
touch nazwa
Zmienia datę ostatniej modyfikacji pliku o podanej nazwie. Jeśli plik nie istnieje, tworzy go.
cat nazwa
Wypisuje na wyjście zawartość pliku nazwa
.
Argumentem polecenia cat
może też być wiele nazw plików. Wypisywana jest wówczas zawartość każdego z nich.
echo napis
Wypisuje swój argument.
man polecenie
Podaje opis wskazanego polecenia.
Naciskanie strzałek w górę i w dół pozwala na przeglądanie historii wprowadzanych poleceń. Oszczędza to pracy, gdy chcemy ponownie wykonać polecenie. Pisanie poleceń ułatwia też klawisz tabulacji, którego naciśnięcie powoduje uzupełnienie nazwy pliku.
Prosimy o przećwiczenie opisanych powyżej poleceń.
Kompilacja to tworzenie programu wykonywalnego na podstawie kodu źródłowego. Narzędzie, które taką operację wykonuje, nazywamy kompilatorem. Na zajęciach laboratoryjnych ze Wstępu do programowania posługujemy się kompilatorem gcc.
Kompilator gcc będziemy uruchamiali w tzw. trybie wsadowym, np. za pomocą polecenia gcc nazwa.c
, gdzie nazwa.c
to nazwa pliku z kodem źródłowym.
Innym sposobem pracy z kompilatorem jest posłużenie się tzw. zintegrowanym środowiskiem programistycznym, będącym połączeniem kompilatora, edytora tekstu i innych narzędzi. Na razie nie będziemy z takich środowisk korzystali.
Praca programisty polega na wielokrotnym powtarzaniu cyklu "edycja kodu źródłowego - kompilacja programu - testowanie". By proces ten przebiegał sprawnie, warto otworzyć na ekranie dwa okna. Jednym z nich będzie okno konsoli, w którym programy kompilujemy i testujemy. W drugim oknie uruchamiamy edytor tekstu.
Na początek dobrym wyborem jest edytor KWrite, który można znaleźć w menu Programy i dalej Akcesoria, Edytory i KWrite. Ma on wszystkie niezbędne operacje edycyjne, podświetla składnię programów w C, potrafi numerować wiersze (trzeba wybrać odpowiednią opcję). Oczywiście w przyszłości można zmienić ten edytor na inny.
Prosimy o wpisanie w edytorze tekstu programu:
#include <stdio.h> int main(void) { printf("Cześć !\n"); return 0; }
i zapisanie go w pliku o nazwie czesc.c
.
Prosimy o jego samodzielne wpisanie a nie skopiowanie z okna przeglądarki do edytora tekstu.
Przechodzimy do okna konsoli i wpisujemy polecenia:
gcc czesc.c ls -l
Jeśli nie było błędów, powstanie plik a.out
. To program wykonywalny (w Linuxie pliki z programami wykonywalnymi nie mają rozszerzenia .exe
).
Kompilator można też uruchomić poleceniem:
gcc czesc.c -o czesc
Program wykonywalny zostanie wówczas zapisany w pliku o nazwie czesc
. Dalej będziemy zakładali taki właśnie sposób uruchomienia kompilatora.
Uruchamiamy program:
./czesc
Osobom, które dotąd korzystały z systemu Windows, dziwna może się wydawać konieczność poprzedzania nazwy programu znakami './'
wskazującymi, że chodzi nam o program z katalogu aktualnego. Jest to spowodowane względami bezpieczeństwa. Gdyby system operacyjny domyślnie uruchamiał programy z aktualnego katalogu, byłoby możliwe podszycie się pod któryś z programów "standardowych" przez program pozostawiony w katalogu, w którym znalazł się użytkownik.
Zobaczymy, co się dzieje, gdy program jest błędny. Prosimy o usunięcie średnika po return 0
i ponowne skompilowanie programu. Dostaniemy komunikat:
czesc.c: In function ‘main’: czesc.c:6:1: error: expected ‘;’ before ‘}’ token } ^
Poprawmy błąd i ponownie skompilujmy program.
Operacją edycyjną nazwiemy usunięcie jednego znaku lub wstawienie znaku do tekstu. Prosimy o znalezienie operacji edycyjnej na kodzie źródłowym zapisanym w pliku czesc.c
, która spowoduje największą liczbę komunikatów o błędach.
Prosimy o wpisanie poniższego programu:
#include <stdio.h> int main(void) { int x; scanf("%d", &x); printf("%d\n", 2 * x); return 0; }
i zapisanie go w pliku o nazwie dwarazy.c
.
Kompilujemy program poleceniem:
gcc dwarazy.c -o dwarazy
i uruchamiamy za pomocą:
./dwarazy
a następnie wpisujemy jakąś liczbę całkowitą i naciskamy klawisz Enter.
Każdy program ma źródło danych nazywane standardowym wejściem i miejsce, w które kieruje wyniki, nazywane standardowym wyjściem. Domyślnie wejściem programu jest klawiatura a wyjściem okno konsoli.
Za pomocą znaku '>'
można zmienić (przekierować) wyjście programu. Prosimy o uruchomienie:
./dwarazy > plik.txt
Wynik programu dwarazy
trafi do pliku o nazwie plik.txt
. Jego zawartość możemy obejrzeć za pomocą polecenia cat
:
cat plik.txt
Przekierowanie za pomocą '>'
wyniku programu do pliku, który już istnieje, spowoduje zamazanie jego zawartości. Jeśli chcemy tego uniknąć, możemy się posłużyć '>>'
, np.
./dwarazy >> plik.txt
Wynik programu zostanie wówczas dopisany na koniec pliku o podanej nazwie.
Wejście programu przekierowujemy za pomocą '<'
, np.
./dwarazy < plik.txt
W jednym poleceniu można też przekierować jednocześnie wejście i wyjście programu:
./dwarazy < plik.txt > inny.txt
Wyjście jednego programu można połączyć z wejściem innego za pomocą '|'
. Prosimy o przetestowanie polecenia:
./dwarazy | ./dwarazy
a następnie:
./dwarazy | ./dwarazy | ./dwarazy | ./dwarazy
Prosimy też o uruchomienie:
echo 5 | ./dwarazy
Jaka jest najmniejsza nieujemna liczba całkowita, dla której program dwarazy
daje wynik niezgodny z oczekiwaniami ?
Czas, który pozostanie do końca zajęć, można wykorzystać na pracę samodzielną. Zachęcamy zwłaszcza do zapoznania się z opcjami edytora KWrite i programu Midnight Commander, który można znaleźć w menu Programy, dalej Akcesoria i Menedżery plików, albo po prostu wpisać mc
na konsoli.
Można też sprawdzić inne dostępne narzędzia, np. edytory tekstu. Być może znajdzie się tam taki, który będzie nam odpowiadał bardziej, niż KWrite. Warty polecenia jest np. edytor Kate.
Prosimy o uruchomienie przeglądarki internetowej, np. za pomocą polecenia Programy, Sieć, Przeglądarki WWW i dalej Iceweasel i zajrzenie na strony wazniak.mimuw.edu.pl, smurf.mimuw.edu.pl i moodle.mimuw.edu.pl.
Przypominamy o konieczności wylogowania się na zakończenie zajęć.