if
).
/
Linux większość zadań wykonuje się na
plikach tekstowych. Z tego powodu nabycie umiejętności posługiwania
się dobrym edytorem tekstu jest niezbędne. Równocześnie, w samym
procesie pisania programów, drugim podstawowym narzędziem staje się
kompilator. Nic dziwnego więc, że nauka obu, po opanowaniu użytkowania
systemu operacyjnego, rozpoczyna kurs Podstaw programowania.
Poniższa tabela zawiera często używane skróty klawiszowe, przydatne przy pracy z edytorem Emacs. Skrót C-
oznacza równoczesne użycia klawisza Control z podanym znakiem, zaś M-
– lewego klawisza Alt ze znakiem (lub najpierw klawisza ESC, a następnie podanego znaku).
Skrót | Operacja | Skrót | Operacja |
M-x |
wywołaj polecenie | M-x shell |
wywołaj polecenie powłoki |
C-_ |
cofnij | M-> |
przejdź na koniec bufora |
C-g |
anuluj operację | M-< |
przejdź na początek bufora |
C-x C-f |
otwórz/utwórz plik | M-g g |
przejdź do linii |
C-x C-w |
zapisz bufor jako... | M-% |
znajdź i zamień |
C-x C-s |
zapisz bufor | C-a |
przejdź na początek linii |
C-x C-c |
zamknij edytor | C-e |
przejdź na koniec linii |
C-x k |
zamknij bufor | C-f |
przesuń kursor w lewo |
C-x b |
zmień bufor | C-b |
przesuń kursor w prawo |
C-x C-b |
lista buforów | C-n |
przejdź do następnej linii |
C-SPACE |
ustaw znacznik | C-p |
przejdź do poprzedniej linii |
C-w |
wytnij zaznaczone | C-x h |
zaznacz cały bufor |
C-y |
wklej | M-l |
zamień na małe litery |
M-w |
kopiuj zaznaczone | M-u |
zamień na duże litery |
M-y |
wklej kolejne z 'kill ring' | M-c |
pierwsza litera duża |
C-k |
wytnij do końca linii | C-t |
zamień znaki miejscami |
C-s |
wyszukaj do przodu | M-t |
zamień słowa miejscami |
C-r |
wyszukaj do tyłu | C-x r k |
wytnij prostokąt |
C-x 1 |
jedno okno | C-x r y |
wklej prostokąt |
C-x 2 |
podziel okno w poziomie | C-x r o |
wstaw pusty prostokąt |
C-x 3 |
podziel okno w pionie | C-x - |
zmniejsz czcionkę |
C-x o |
zmień okno | C-x + |
powiększ czcionkę |
W materiałach dodatkowych do tego ćwiczenia znajdziesz przykładowy plik konfiguracyjny edytora Emacs. Podczas zajęć prowadzący wyjaśni w jaki sposób go wykorzystać i jakie są jego najważniejsze elementy składowe, co zapewne pozwoli Ci w znacznym stopniu samodzielnie dopasować edytor do własnych potrzeb.
Do opisu tego ćwiczenia laboratoryjnego dołączony jest plik, na którym będziesz mógł przećwiczyć działanie poznanych komend. Na pliku należy wykonać następujące operacje:
Year & A-side & B-side & Label \\ \hline 1947 & Milestones & Sippin' at Bell's & Savoy \\ \hline 1947 & Goin' to Mintons & Half Nelson & Savoy \\ \hline 1948 & Little Willie Leaps & Half Nelson & Savoy \\ \hline 1949 & Jeru & Godchild & Capitol \\ \hline 1949 & Move & Budo & Capitol \\ \hline .. & .. & .. & .. \\ \hline
Do dyspozycji studentów dostarczone są dwa kompilatory języka C na
komputerze diablo (Sun C w wersji 5.12 SunOS_sparc oraz GNU CC
w wersji 5.5.0, uruchamiane odpowiednio poleceniami cc
oraz
gcc
) oraz jeden na komputerze panamint (GNU CC w wersji 10.2.1
– polecenie gcc
). Poniższe przykłady pokazują działania na
komputerze diablo w oparciu o kompilator Sun C (aczkolwiek otrzymywane
w trakcie uruchamiania przykładów komunikaty o błędach / ostrzeżenia
mogą być nieco odmienne ze względu na różnice w wersji kompilatora
użytego w przykładach a aktualnie dostępnego). Polecamy ich
przećwiczenie także z wykorzystaniem kompilatora GNU CC (warto
zauważyć, że GNU CC dostępne na diablo i na panamincie też mogą dawać
komunikaty w nieco odmiennej postaci ze względu na różnice w wersji).
Niech w pliku o nazwie prog.c
znajduje się kod naszego programu (możesz utworzyć taki plik korzystając z edytora Emacs oczywiście:).
[john_doe@diablo:~]$ cat prog.c -n <- wyswietla zawartosc pliku numerujac linie 1 #include<stdio.h> 2 3 int main(){ 4 5 printf("Napis do wyswietlania\n") 6 7 return 0; 8 }
Kompilację takiego programu wykonujemy wpisując polecenie
[john_doe@diablo:~]$ cc prog.c prog.c: In function 'main': prog.c:7: error: expected ';' before 'return'Niestety jak widzimy kompilacja nie powiodła się – program zawiera błędy. Kompilator udziela nam następujących informacji:
main
(prog.c: In function 'main':
),
return
brakuje znaku
;
(prog.c:7: error: expected ';' before 'return'
).
return 0;
jest w porządku), natomiast korzystając ze wskazówki
kompilatora łatwo zauważyć, że rzeczywiście (w linii piątej) brakuje
średnika przed słowem kluczowym return
(kompilator zgłasza błąd
w momencie gdy „przestaje rozumieć'' kompilowany program – przyczyna
tego stanu może znajdować się wcześniej niż miejsce, w którym
kompilator to „zauważył''). Poprawienie błędu skutkuje poprawną
kompilacją i poprawnym działaniem programu wynikowego a.out
.
[john_doe@diablo:~]$ cat prog.c -n 1 #include<stdio.h> 2 3 int main(){ 4 5 printf("Napis do wyswietlania\n"); // dodano srednik 6 7 return 0; 8 } [john_doe@diablo:~]$ cc prog.c [john_doe@diablo:~]$ ./a.out Napis do wyswietlania [john_doe@diablo:~]$
Aby zapoznać się ze standardowymi komunikatami kompilatora, spróbujmy przeanalizować kilka błędów celowo wprowadzonych do poprzedniego programu.
main
[john_doe@diablo:~]$ cat prog.c -n 1 #include<stdio.h> 2 3 int main(){ 4 5 printf("Napis do wyswietlania\n"); 6 7 } [john_doe@diablo:~]$ cc prog.c prog.c: In function 'main': prog.c:7: warning: control reaches end of non-void function [john_doe@diablo:~]$ ./a.out Napis do wyswietlania [john_doe@diablo:~]$Program skompilował się poprawnie, wydaje się nawet działać tak jak chcieliśmy. Jednakże kompilator wygenerował ostrzeżenie (aczkolwiek używany przez Ciebie kompilator może być „bardziej pobłażliwy'' i nie poinformować o tej nieścisłości). Zgodnie z zawartą w pliku definicją funkcja
main
powinna zwracać wartość int
(jest typu
non-void
) a mimo to żadna wartość nie jest zwracana przed jej
zakończeniem (control
reaches
end
of
non-void
function
– brakuje linii w rodzaju return 0;
).
stdio
[john_doe@diablo:~]$ cat prog.c -n 1 2 3 int main(){ 4 5 printf("Napis do wyswietlania\n"); 6 7 return 0; 8 } [john_doe@diablo:~]$ cc prog.c prog.c: In function 'main': prog.c:5: warning: implicit declaration of function 'printf' prog.c:5: warning: incompatible implicit declaration of built-in function 'printf'W linii piątej użyta została funkcja
printf
, niestety
kompilator nie zna taj nazwy, gdyż nie jest to instrukcja języka C
tylko funkcja biblioteczna z biblioteki stdio
, której plik
nagłówkowy stdio.h
nie został dołączony, co powoduje, że
pojawia się ostrzeżenie. Mimo to cały proces tworzenia programu
wynikowego kończy się sukcesem, gdyż wywoływany na jego ostatnim
etapie linker automatycznie dołącza bibliotekę standardową
stdio
. Ale nie zawsze musi tak być. W przypadku
niestandardowych funkcji, czy funkcji bibliotecznych z bibliotek nie
dołączanych automatycznie program może się nie skompilować lub działać
niepoprawnie (jeśli chcesz „przetestować'' taki przypadek dodaj do
pliku zawierającego program linię
printf("Wartosc zwracana przez funkcje sqrt: %f\n",sqrt(3.0));
i skompiluj go najpierw poleceniem jak poprzednio (cc prog.c
),
następnie dodając do wywoływanego polecenia opcję -lm
(powodującą, że linker dołączy bibliotekę matematyczną – nie jest ona
dołączana automatycznie tak jak stdio
) i kolejno po dodaniu na
początku kompilowanego pliku linii #include<math.h>
(dołączenie
pliku nagłówkowego biblioteki matematycznej) – w pierwszym przypadku
program wynikowy nie zostanie utworzony, w drugim zostanie, ale może
działać niepoprawnie, dopiero w trzecim przypadku wszystko zadziała
jak należy).
[john_doe@diablo:~]$ cat prog.c -n 1 #include<stdio.h> 2 3 main(){ 4 5 printf("Napis do wyswietlania\n"); 6 7 return 0; 8 } [john_doe@diablo:~]$ cc prog.c prog.c:3: warning: return type defaults to 'int' [john_doe@diablo:~]$ ./a.out Napis do wyswietlania [john_doe@diablo:~]$Kompilator ponownie zwraca tylko ostrzeżenie. Jest ono natomiast dość znaczące, gdyż zostało przyjęte pewne założenia (że funkcja
main
będzie zwracała wartość całkowitą int
) – być może niezgodne
z naszym zamysłem. W starszych standardach języka C funkcje bez
określonego typu zostają domyślnie traktowane jako funkcje zwracające
wartość int
.
[john_doe@diablo:~]$ cat prog.c -n 1 #include<stdio.h> 2 3 float main(){ 4 5 printf("Napis do wyswietlania\n"); 6 7 return 0; 8 } [john_doe@diablo:~]$ cc prog.c prog.c:3: warning: return type of 'main' is not 'int'Kompilator przypomina, że funkcja
main
powinna zawsze zwracać
wartość int
. W systemie UNIX wartość zwracana przez
funkcję main
jest traktowana jako status zakończenia programu
(przyjmuje się, że zwracana wartość niezerowa świadczy o zakończeniu działania programu z błędem).
[john_doe@diablo:~]$ cat prog.c -n 1 #include<stdio.h> 2 3 main(){ 4 5 prinft("Napis do wyswietlania\n"); 6 7 return 0; 8 } [john_doe@diablo:~]$ cc prog.c prog.c: In function 'main': prog.c:5: warning: implicit declaration of function 'prinft' /tmp/ccY7jkFh.o: In function 'main': prog.c:(.text+0x11): undefined reference to 'prinft' collect2: ld returned 1 exit statusBłąd jest dość powszechny. Odpowiedź kompilatora wydaje się enigmatyczna. Najważniejsza informacja to: brak deklaracji dla funkcji
prinft
. Po takiej informacji, jeśli jesteśmy pewni,
że dołączono wszystkie nagłówki, warto przyjrzeć się komunikatowi
dokładniej (czasem trudno zauważyć różnicę między prinft
a printf
). W każdym razie, w tym przypadku proces kompilacji
przebiega do końca, jedynie z ostrzeżeniem o niejawnej deklaracji
funkcji prinft
(co oznacza brak jej deklaracji – kompilator
na podstawie sposobu wywołania funkcji, próbuje się „domyślić''
postaci jej deklaracji). Komunikat o błędzie generowany jest dopiero w procesie
konsolidacji (linker ld
próbuje odnaleźć potrzebną funkcję
w dostępnych bibliotekach, niestety bez powodzenia).
trojmian.c
. Omów strukturę realizowanego w nim algorytmu.
a
i b
równych odpowiednio -1
i 0
oraz dużych wartości
parametru c
, czy też a
równego 0
, zaś b
bardzo małego
a c
bardzo dużego).
This document was generated using the LaTeX2HTML translator Version 2019.2 (Released June 5, 2019)
The command line arguments were:
latex2html -html_version 3.2,latin2,unicode -split 0 -no_navigation PProg_lab_01
The translation was initiated on 2022-10-19