
Kurs programowania w TP - część 1
Raper3d
Witam w pierwszej części kursu Pascala. Nauka będzie prowadzona oczywiście od najprostszych rzeczy. Jeśli nie masz zielonego pojęcia o programowaniu to czytaj dalej, gdyż kurs jest między innymi dla takich właśnie. Jeśli chcecie więcej info na temat Pascala a nawet C++ i Asemblera, to looknijcie na moją stronę - www.raper3d.prv.pl i proszę - naciśnijcie na logo bankiera jak się tylko takowe pojawi. Tyle słowem wstępu, zapraszam do lektury!
1. Praca z kompilatorem Ja osobiście posiadam popularny kompilator firmy Borland. Jest on bardzo dobry i używa go większość osób kodujących w Pascalu. Po włączeniu go pojawia się od razu plik "NONAME00.PAS". Zapiszmy go i od razu dajmy mu jakąś sensowną nazwę. Naciskamy na F2 i wpisujemy np. "Program1.pas". Wszystkie pozostałe komendy macie w menu "File". Dobra, nie będę się więcej rozpisywał.
2. Pierwszy program! Napiszmy swój pierwszy program który będzie po prostu pisał na ekranie "Pierwszy program":
Begin
Write('Pierwszy program');
End. Od słowa Begin zaczynamy właściwy program, a End go zakończamy. Jak zapewne zauważyliście wyrazy mają biały kolor, gdyż są to słowa kluczowe. Z czasem będziemy poznawać ich coraz więcej. Teraz objaśnimy tą drugą linijkę. Otóż KAŻDY napisany przez nas program od razu ma zainicjowany moduł SYSTEM. Znajdują się w nim pewne procedury w tym procedura write. W cudzysłowie wstawiamy nasz tekst. Jakbyśmy zamiast write napisali writeln, to program przeszedłby do następnej linijki. Dobra, naciśnij CTRL+F9 program się skompiluje, czyli przerobi się na EXE i uruchomi. Uuu, coś szybko nie? Dopisz przed końcem programu Readln. Teraz program poczeka na naciśnięcie Entera. A Twój program leży sobie w katalogu /Units.
3. Inicjacja modułów i moduł CRT Mówiliśmy już o module system, ale teraz zainicjujemy inne, pożyteczne moduły, a potem nauczymy się je tworzyć. Na początek dajmy moduł CRT. Wpiszcie na początku programu: uses crt. Jeśli macie potem problemy i wyskakuje wam: "Runtime Error 200:Division by Zero" to skaczcie na moją stronę do działu RE200. A oto procedury modułu CRT:
----Clrscr---- Procedura czyści ekran ----ClrEol---- Procedura Wymazuje wszystkie znaki od miejsca, w którym znajduje się kursor, do końca linii
----Delay---- Procedura zatrzymuje program na określoną liczbę milisekund
uses crt;
begin
delay(5000);
write('PC');
end. ----DelLine---- Procedura usuwa linie, w której znajduje sie kursor
----GotoXY---- Procedura ustawia kursor w danej pozycji
----Sound,Nosound---- Procedury: włączają i wyłączają dźwięk. Np:
program dzwiek;
begin
sound(300); {1}
delay(2000); {2}
nosound; {3}
end. Objaśnienie: {1} Spiker włącza dźwięk o podanej częstotliwości {2} Zatrzymaj program na dwie sekundy {3} Procedura wyłącza dźwięk
----ReadKey---- Procedura zwraca ostatnio wciśnięty klawisz. Np.:
program klawisze;
var
kl:char; {1}
begin
kl:=readkey; {2}
repeat until kl:=chr(27); {3}
end. Objaśnienie: {1} Zmienne znakowe musza być typu "char" {2} Zmienna kl jest = ostatnio wciśnięty klawisz {3} Czekaj aż zostanie wciśnięty kod ASCII o kodzie chr(27), czyli ESC
----Textcolor---- Zmienia kolor tekstu np.:
uses crt;
begin
clrscr;
textcolor(1);
writeln('Kolorowy text to jest to!');
repeat until keypressed;
end. ----Textbackground---- Zmienia kolor tła np:
uses crt;
begin
clrscr;
textbackground(4);
writeln('Gowno');
repeat until keypressed;
end. ----Textmode---- Zmienia styl tekstu np.:
uses crt;
begin
clrscr;
textmode(CO40);
write('Jaja');
end. ----Window---- Procedura tworzy nowe okno (wszystkie operacje będą wykonywane w tym właśnie oknie) np.:
uses crt;
begin
textcolor(15);
textbackground(2);
window(12,12,20,20);
clrscr;
write('Napisz cos: ');
readln;
end. 4. Zmienne i stałe Jakbyś chciał dodać dwie liczby to musiałbyś je najpierw zapamiętać co nie? Tak samo jest z programem: musi te liczby gdzieś zapamiętać. Do tego służą zmienne. Nie będę oryginalny i napiszę: zmienna jest to taka szufladka w pamięci komputera, którą możesz dowolnie przenosić, dodawać coś do niej, odejmować itp. Zmienne deklarujemy tak:
Var
Nazwa_zmiennej:typ; A oto typy zmiennych i ich przedziały:
Czyli pierwszy przykład:
Var
Zmienna:integer; Teraz zróbmy, aby to użytkownik podał, ile zmienna ma wynosić:
...
Write('Podaj wartość zmiennej: ');
Readln(zmienna);
Writeln('Wartość zmiennej wynosi: ',zmienna);
... Ale możemy wpisać jedynie liczby, bo inaczej program wskaże błąd (potem powiemy jak go zwalczyć). Ale zamiast tego użyj innego typu zmiennej, mianowicie STRING. Teraz możesz wpisywać co chcesz, ale nie możesz tej zmiennej dodawać itd.
Teraz czas na stałe. Stała ma cały czas określoną wartość, której NIE MOŻNA zmienić. Deklaracja stałej wygląda tak:
Const
Nazwa_stałej=wartość; Czyli np.
Const
Liczba=20; Lub:
Const
Liczba=(20*5)-34; 5. Warunki Omówię prosto istotę warunków. Są one po to, by np. gdy liczba jest większa niż 10 to wpisać coś tam, a jeśli mniejsza to wpisać coś innego. Pierwszy warunek: if...then. Składnia:
If warunek then instrukcja1
Else instrukcja2; Jeśli warunek się spełni, to instrukcja1. W przeciwnym wypadku instrukcja2. Dajmy jakiś przykład:
...
If liczba<20 then writeln('Cool')
Else writeln('Bad!'); Teraz czas na drugi warunek: case...of...end
Case...warunek...of...end Najlepiej dajmy jakiś przykładzik:
uses crt;
var
wybor:byte;
begin
clrscr;
readln(wybor);
case wybor of
1: begin
writeln('Wcisnales 1');
end;
2: begin
writeln('Wcisnales 2');
end;
repeat until keypressed;
end. Bardzo dobrym ćwiczeniem będzie rozgryzienie tego algorytmu. Lecz co tam, i tak prawie wszystko podałem na talerzu.
6. Pętle Pętelki służą do wykonywania instrukcji ileś tam razy aż do spełnienia jakiegoś warunku. Pętli wyróżniamy kilka rodzajów:
repeat...until Przykład:
Var
Liczba:byte;
Begin
Repeat
Write('Podaj liczbę: ');
Readln(liczba);
Until liczba=0; {1}
End. Ta pętla będzie trwać, dopóki użytkownik nie wpisze liczby 0( {1} ).
For...to
For...downto Jest to chyba najczęściej stosowana przeze mnie pętla. Najpierw spójrz na przykład, a potem sobie omówimy.
uses crt;
var
i:integer;
begin
clrscr;
for i:=1 to 10 do writeln('Ala ma kota'); {1}
repeat until keypressed;
end. {1} Zmienna i będzie za każdym razem zwiększana o 1, aż osiągnie wartość 10. Jakbyśmy chcieli aby zmienna malała, wpisujemy zamiast "to" "downto".
while...do Jakby co, to ja z tej pętli w ogóle nie korzystam i jakoś nie mogę znaleźć w niej zastosowania. Ale jak mus to mus, muszę ją opisać.
program petla3;
uses crt;
var
liczba:byte;
begin
clrscr;
liczba:=1;
while liczba<13 do {1}
begin
writeln(liczba);
liczba:=liczba-1;
end;
repeat until keypressed;
end. {1} Dopóki zmienna liczba jest mniejsza od 13 dopóty program wykonuje procedury zawarte po słowie "do" pisze zawartość zmiennej liczba.
Trochę takie sztywne opisanie, ale zrozumcie - jest już 2:30 i naprawdę nie chce mi się pisać :(.
7. Procedury i funkcje
Procedury i funkcje są bardzo przydatne: jeśli chcemy coś wywołać kilka razy to lepiej pisać tylko nazwę procedury a nie cały kod no nie?
program procedury;
uses crt;
procedure Pascal; {1}
begin
writeln('Procedura Pascal działa!');
end;
begin
clrscr;
pascal; {2}
repeat until keypressed;
end.
end. {1} procedure nazwa_procedury; - składnia procki {2} wywołujemy procedurę jej nazwą
Oczywiście w procedurach można podawać parametry, które podaje się tak samo jak przy funkcjach. Teraz nadszedł wielki(?) czas na funkcje. Otóż funkcja różni się od procedury tym, że musi zwracać jakąś wartość. Spójrz:
var
a,b:byte;
function dupa(c,d:byte):integer; {1}
begin
dupa:=(c*d); {2}
end;
begin
readln(a,b);
writeln(dupa(a,b)); {3}
end. {1} function nazwa(parametry):typ_funkcji - składnia funkcji {2} funkcja dupa będzie zwracać mnożenie dwóch parametrów {3} wydrukowanie na ekranie(hyhy) mnożenia dwóch liczb(za pomocą funkcji ofkoz)
8. Tablice Uwaga, dla niektórych temat tablic jest baaaardzo trudny. Ja sam miałem z tym pewne problemy, ale mam nadzieję, że sobie poradzicie. Aha, przeczytajcie sobie to kilka razy! Załóżmy, że chcesz aby program wczytał xywki swoich kolegów, a następnie wypisał je w odwrotnej kolejności. Ty napisałbyś tak:
Var
Xywa1,xywa2,xywa3,xywa4:string
Begin
Readln(xywa1);
Readln(xywa2);
Readln(xywa3);
Readln(xywa4);
Writeln;
Writeln(xywa4);
Writeln(xywa3);
Writeln(xywa2);
Writeln(xywa1);
End. Dobra, trochę pisania jest nie? To teraz na spokojnie napisz, by program wpisał 2001 xywek i wypisał w odwrotnej kolejności. Dobra, możesz już wstać :))). Ale z pomocą przyjdą nam tablice. Lookaj na dół:
Var
Xywa:array[1..4] of integer;
Begin
Readln(xywa[1]);
Readln(xywa[2]);
Readln(xywa[3]);
Readln(xywa[4]);
Writeln;
Writeln(xywa[4]);
Writeln(xywa[3]);
Writeln(xywa[2]);
Writeln(xywa[1]);
End. Na razie niewiele się nam zmieniło. Teraz tylko deklaracja tablicy:
Nazwa:array[początek...koniec_tablicy] of typ; Nazwa[x] - gdzie x to numer komórki tablicy.
Teraz zastosujemy słynną pętle for.
Var
Xywa:array[1..400] of integer; {Zwiększył się zasięg nie?}
I :integer;
Begin
For i:=1 to 400 do readln(xywa[i]);
For i:=400 downto 1 do writeln(xywa[i]);
End. A teraz pytanie: jak tu można zastosować stałe? Pomęcz się trochę, a potem zobacz na dół:
Const
Ilosc=400;
Var
Xywa:array[1..ilosc] of integer; {Zwiększył się zasięg nie?}
I :integer;
Begin
For i:=1 to ilosc do readln(xywa[i]);
For i:=ilosc downto 1 do writeln(xywa[i]);
End. Jeśli jednak nadal tego nie czaisz to poczytaj sobie to parę razy i przećwicz. Jest to oczywiście podstawowa wiedza o tablicach. Są jeszcze tablice dwuwymiarowe, tak zwane macierze. Deklaruje się je tak:
Macierz:array[1..10,1..10] of integer; Macierz[3,4] - a tak się odwołujemy do komórki. Pobawcie się tym, nudne jak cholera ale się pobawcie, bo na wszelkich olimpiadach informatycznych największy nacisk nakładają na tablice.
9. Operacje na plikach i katalogach... ...czyli usuwanie, tworzenie itd. Tekst w całości ściągnięty z mojej strony(sorry, ale po co mam dwa razy pisać to samo?).
PLIKI I KATALOGI
PLIKI TEKSTOWE
====Assign==== Komenda ta przyporządkuje zmiennej plikowej jakiś plik. Od tej pory operacje na tej zmiennej będą operacjami na tym pliku. Składnia: ASSIGN(zmienna_plikowa,'nazwa'); Gdzie: zmienna_plikowa to zmienna typu: TEXT-plik tekstowy FILE-plik FILE OF BYTE-plik w bajtach nazwa-pelna nazwa pliku
====Reset==== Istrukcja otwiera plik. Skladnia: RESET(zmienna_plikowa);
====Rewrite=== Instrukcja tworzy plik i otwiera go do zapisu. Skladnia: REWRITE(zmienna_plikowa);
====Append==== Instrukcja ta otwiera plik do dopisania. Skladnia: APPEND(zmienna_plikowa);
====Close==== Instrukcja ta zamyka plik. Skladnia: CLOSE(zmienna_plikowa);
====Zapis i odczyt otwartego pliku==== a) Skladnia do zapisu pliku: WRITE(zmienna_plikowa,dana); Gdzie: dana to wartosc ktorej zostanie przypisana
b) Skladnia do odczytu pliku: READ(zmienna_plikowa,dana); Gdzie: dana to zmienna do ktorej zostanie zapisane odczytane dane
====Erase==== Instrukcja sluzy do kasowania pliku. Skladnia: ERASE(zmienna_plikowa);
====EOF==== Funkcja ta zwraca dwie wartosci: a) TRUE-gdy wskaznik znajduje sie na koncu pliku b) FALSE-w przeciwnym wypadku Skladnia: EOF(zmienna_plikowa); Przyklad:
program pliki;
uses crt;
var
plik:text;{zmienna plikowa}
linia:string;
begin
clrscr;
assign(plik,'pliki.txt');
reset(plik);
repeat
readln(plik,linia);
writeln(linia);
until eof(plik);
close(plik);
end. ====Filesize==== Funkcja zwraca wielkosc pliku w bajtach. Skladnia: FILESIZE(zmienna_plikowa);
====Rename==== Instrukcja ta zmienia nazwe pliku. Skladnia: RENAME(zmienna_plikowa,'nowa nazwa');
===========Podsumuwujacy program=========== Czas teraz na napisanie programu podsumujacego instrukcje plikowe. Bedzie to program, ktory zapisze haslo w pliku, a nastepnie spyta sie o nie.
{$i-} {1}
program haslo;
uses crt;
var
haslo :string;
linia :string;
plik :text;
procedure zle_haslo;
begin
clrscr;
writeln('ZLE HASLO!!');
end;
procedure dobre_haslo;
begin
clrscr;
writeln('Dybre haslo!!!');
end;
procedure zapisz_haslo;
begin
clrscr;
Write('Podej haslo: ');
readln(haslo);
assign(plik,'d:\password.gk'); {2}
rewrite(plik);
writeln(plik,haslo); {3}
repeat until keypressed;
close(plik); {4}
end;
procedure podaj_haslo;
begin
clrscr;
write('Podej haslo dostepu: ');
readln(haslo);
assign(plik,'d:\password.gk'); {5}
reset(plik);
readln(plik,linia);
if linia=haslo then dobre_haslo {6}
else zle_haslo; {7}
repeat until keypressed;
close(plik);
end;
begin
clrscr;
assign(plik,'d:\password.gk');
reset(plik);
readln(plik,linia);
if linia<>'' then podaj_haslo
else zapisz_haslo; {8}
{$i+} {9}
end. Objaśnienie: {1} Ta dyrektywa wyłącza obsługę błędów {2} To będzie plik gdzie będzie zapisane hasło {3} Zapisuje hasło do pliku {4} Koniecznie zamykamy plik! {5} Otwieramy plik z zapisanym już hasłem {6} Jeśli linia, czyli pierwsza linia pliku jest taka sama jak hasło wtedy włącz procedurę dobre_haslo... {7} ...w przeciwnym wypadku włącz procedurę zle_haslo {8} Jeśli linia jest różna niż zero tekstu wtedy podaj_haslo; W przeciwnym wypadku zapisz_haslo; {9} Ta dyrektywa wyłącza obsługę błędów
PLIKI
Pliki "normalne" różnią się trochę od tekstowych. Nie będę się tutaj rozpisywał na nowo tylko objaśnię różnicę. Pliki "normalne" przydają się kiedy chcemy coś zapisać w pliku i żeby nikt nie zobaczył co tam jest (bez szyfrowania!). Więc lecimy z tym koksem!
====Zmienna plikowa==== Zmienna plikowa to FILE a nie TEXT!
====Reset==== Zamiast RESET wpisujemy RESET(PLIK,1); Tak samo jest z close, erase itd.
====Redln==== Zamiast READLN(PLIK,KASA); wpisujemy: BLOCKREAD(PLIK,KASA,parametr);
====Writeln==== To samo co readln tylko że zamiast BLOCKREAD wpisujemy BLOCKWRITE
====Podsumuwujący program==== Napiszmy teraz program z użyciem zmiennych plikowych.
program pliki;
uses crt;
var
plik:file;
kasa:integer;
procedure zapisz;
begin
assign(plik,'c:\spoko.txt');
rewrite(plik,1);
blockwrite(plik,kasa,2);
close(plik);
end;
procedure odczytaj;
begin
assign(plik,'c:\spoko.txt');
reset(plik,1);
blockread(plik,kasa,2);
close(plik);
writeln(kasa);
end;
begin
clrscr;
readln(kasa);
zapisz;
readln;
clrscr;
odczytaj;
readln;
end.
OPERACJE NA KATALOGACH
====ChDir==== Instrukcja ta ustawia biezacy katalog. Skladnia: CHDIR(sciezka);
====MkDir==== Instrukcja ta tworzy katalog. Skladnia: MkDir(nazwa_katalogu);
====RmDir==== Instrukcja kasuje katalog(musi byc pusty). Skladnia: RMDIR(nazwa_katalogu);
====Getdir==== Funkcja ta zwraca aktualny katalog. Skladnia: GETDIR(dysk,zmienna); Gdzie: dysk-dysk z ktorego zostanie odczytany biezacy katalog: 0-biezacy 1-A 2-B 3-C itd. zmienna-zmienna typu string do ktorej zostanie przypisany biezacy katalog
Np.:
program katalogi;
uses crt;
var
s:string;
begin
getdir(0,s);
writeln(s);
repeat until keypresed;
end.
Oki, koniec części pierwszej. Spotkamy się(mam nadzieję) w kolejnym numerze NoName. A tam możecie się spodziewać:
- Rekordy - Obiekty Tablice wskaźnikowe - Opis modułu DOS czyli wiadomo o co chodzi - Kończymy podstawy, potem przechodzimy do grafiki, asemblera i może jakiegoś viruska napiszemy :]]].
Wszelkie sugestie, pytania itd. słać na rapper3d@poczta.onet.pl(przez dwa p!). Oraz looknijcie czasem na www.raper3d.prv.pl.
Raper3d
e-mail: rapper3d@poczta.onet.pl


|