Przegląd języków programowania Dariusz Chrobak czerwca 017
Spis treści 1 Linux 1.1 Instalacja na nośniku pamięci USB............................ 1.1.1 Knoppix....................................... 1.1. LinuxMint/Ubuntu................................. 1. Przydatne programy i polecenia powłoki systemowej.................. 3 1.3 Skrypty powłoki bash................................... 6 1.4 Zadania........................................... 15 Język Tcl 16.1 Podstawowe polecenia................................... 16. Wejście wyjście programu................................ 1.3 Przykładowy program mnożenie macierzy........................4 Zadania........................................... 3 3 Język C 4 3.1 Struktura programu.................................... 4 1
Rozdział 1 Linux 1.1 Instalacja na nośniku pamięci USB Celem jest instalacja systemu operacyjnego Linux na nośniku pamięci USB (pendrive), tak by było możliwe trwałe zapisywanie zmian dokonywanych przez użytkownika. Zostaną przedstawione dwie możliwości związane z dystrybucjami: Knoppix, LinuxMint. 1.1.1 Knoppix Ze strony www.knoppix.org pobieramy obraz ISO aktualnej wersji systemu operacyjnego, który następnie nagrywamy na płytę DVD. Restartujemy komputer ładując Knoppix a z płyty DVD. Na pulpicie widać ikonę programu flash-knoppix tworzącego obraz systemu Knoppix w pamięci USB wraz z dodatkową partycją (tzw. overlay) przeznaczoną do trwałego przechowywania danych użytkownika. Należy uruchomić ten program i postępować zgodnie ze wskazówkami pojawiającymi się w kolejnych okienkach. 1.1. LinuxMint/Ubuntu Inny sprawdzony sposób utworzenia bootowalnej pamięci USB z partycją umożliwiającą przechowywanie danych użytkownika wykorzystuje dystrybucję LinuxMint (linuxmint.com) lub Ubuntu (www.ubuntu.com) oraz program mkusb. Pobieramy obraz ISO np. LinuxMint-Xfce i nagrywamy na płytę DVD. Xfce to lekkie środowisko graficzne (desktop environment) dla systemów uniksowych. Uruchamiamy system operacyjny z płyty DVD i aby zainstalować program mkusb musimy najpierw dodać nowe repozytorium. Otwieramy terminal i wykonujemy poniższe polecenia: > sudo add - apt - repository universe > sudo add -apt - repository ppa : mkusb / ppa > sudo apt - get update Teraz instalujemy program mkusb (poniżej trzy powiązane ze sobą programy): > sudo apt - get install mkusb mkusb - nox usb - pack - efi i uruchamiamy go poleceniem: > mkusb
ROZDZIAŁ 1. LINUX 3 Następnie wybieramy opcję d (tryb graficzny) i postępujemy zgodnie ze wskazówkami pojawiającymi się w kolejnych okienkach. Przydatne linki: help.ubuntu.com/community/mkusb calvin.me/create-persistent-ubuntu-16-04-live-usb-even-boots-ram 1. Przydatne programy i polecenia powłoki systemowej Powłoka systemowa (shell) jest programem pośredniczącym między użytkownikiem i systemem operacyjnym. Powłoka przyjmuje polecenia użytkownika i wyprowadza wynik ich działania. W większości systemów linuksowych otwarcie terminala uruchamia tekstową powłokę systemową bash (Bourne-Again Shell). Polecenia systemu operacyjnego lub inne programy uruchamiamy wpisując ich nazwy w wierszu poleceń, rozpoczynającego się od znaku $: użytkownik@ komputer ~/ Desktop $ 1. Pliki i katalogi: pwd Podaje ścieżkę do bieżącego katalogu. ls ls -l ls -la Wyświetla zawartość bieżącego katalogu. cd katalog cd.. cd ~ cd / Zmienia katalog (katalog=/scieżka/dostępu/do/katalogu). mkdir katalog Tworzy katalog. touch plik Zmienia datę dostępu do pliku lub datę jego ostatniej modyfikacji; tworzy plik kiedy ten nie istnieje. rm plik rm -r katalog rmdir katalog Usuwa pliki i katalogi.
ROZDZIAŁ 1. LINUX 4 cp plik1 plik cp plik katalog Kopiuje pliki i katalogi. mv plik1 plik mv plik katalog Przenoszenie lub zmiana nazwy plików i katalogów. cat plik Wyświetla zawartość pliku. less plik Wyświetla zawartość pliku. Umożliwia np. wyszukiwanie znaków. grep wzorzec plik Znajduje wiersze pliku pasujące do wzorca. nano plik Uruchamia prosty, tekstowy edytor plików.. Użytkownicy: whoami Podaje nazwę użytkownika. adduser użytkownik [ grupa ] Dodaje nowego użytkownika. Nawias kwadratowy oznacza argument opcjonalny. addgroup grupa Tworzy nową grupę. passwd [ użytkownik ] Zmiana hasła. users Wyświetla użytkowników systemu. 3. Prawa dostępu: chmod OGA plik Modyfikuje prawa do pliku. Pola O,G i A przyjmują wartości będące sumą liczb (r+w+x) odpowiadających prawom: do odczytu (r=4), do zapisu (w=) i do uruchomienia (x=1). Pole O dotyczy praw właściciela pliku, pole G dotyczy praw grupy użytkowników, do których należy właściciel pliku, a pole A dotyczy wszystkich użytkowników systemu.
ROZDZIAŁ 1. LINUX 5 chown właściciel [: grupa ] plik chown -R właściciel [: grupa ] katalog Zmienia właściciela i/lub grupę pliku. chgrp grupa plik chgrp -R grupa ścieżka 4. Procesy: Zmienia właściciela i/lub grupę pliku. ps ps -e Pokazuje procesy uruchomione przez użytkownika lub wszystkie procesy (-e). kill PID Zabija proces o identyfikatorze PID. polecenie & 5. Pomoc: Uruchamia polecenie w tle. man program Wyświetla o ile istnieje plik pomocy podręcznej dla programu. 6. Przekierowania i potoki poleceń: Standardowa komunikacja uruchomionego programu z otoczeniem odbywa się poprzez kanały: wejściowy (0), wyjściowy (1) i błędów (). Możliwe jest przekierowanie standardowego kanału do pliku: polecenie < plik Standardowe wejście to plik. polecenie > plik Przekierowanie standardowego kanału wyjścia do pliku. Zawartość pliku jest przedtem kasowana. polecenie >> plik Przekierowanie standardowego kanału wyjścia do pliku. końcu pliku. Dane są dopisywane na polecenie1 polecenie Kanał wyjściowy programu można łączyć z kanałem wejściowym innego programu.
ROZDZIAŁ 1. LINUX 6 1.3 Skrypty powłoki bash Instrukcje programowania powłoki bash można umieścić w pliku (skrypcie) i po ustawieniu odpowiednich uprawnień, skrypt można uruchomić tak jak każdy inny program. W pierwszym wierszu skryptu umieszczamy odwołanie do programu, który będzie interpretował (wykonywał) instrukcje umieszczone w kolejnych wierszach: 3 # To jest komentarz 4 5 # Polecenie echo wyprowadza łańcuch znaków na standardowe wyjscie. 6 echo Pierwszy skrypt 7 echo " Pierwszy skrypt " 8 echo Pierwszy skrypt Zmienną powłoki bash definiujemy w następujący sposób: 3 a= 4 5 b =" Wartość zmiennej a: $a" 6 echo $b 7 8 b= Wartość zmiennej a: $a 9 echo $b 10 11 echo " Ala ma kota " > plik. txt 1 c=$( cat plik. txt ) 13 echo $c Argumenty wywołania skryptu:./ skrypt [ arg1 [ arg [... argn ]]] można w nim wykorzystać, ponieważ są one wartościami predefiniowanych stałych: $0 : nazwa skryptu $1 - $9 : pierwsze 9 argumentów $# : liczba argumentów $@ : wszystkie argumenty $? : status wyjścia ostatnio wykonanego skryptu $$ : identyfikator bieżącego procesu $USER : nazwa użytkownika, który wywołał skrypt $HOSTNAME : nazwa komputera, na którym uruchomiono skrypt $SECONDS : liczba sekund od chwili wywołania skryptu $RANDOM : zwraca liczbę losową z zakresu 0-3767 $LINENO : zwraca bieżący wiersz skryptu
ROZDZIAŁ 1. LINUX 7 Zakres zmiennej: 3 z1 =1 4 export z = 5 6 echo $z1 7 echo $z 8 9 # Uruchomienie procesu pochodnego, terminala. 10 xterm 11 1 # W nowo otwartym oknie wykonaj polecenia : 13 # echo $z1 14 # echo $z Wejście użytkownika: 3 echo " Podaj nazwę :" 4 read x 5 echo " Twoja nazwa to: $x" inny sposób: 3 read -p " Podaj nazwę użytkownika :" x 4 read - sp " Podaj hasło :" y 5 6 echo 7 echo " Twoja nazwa to: $x" 8 echo " Twoja nazwa to: $y" jeszcze inny sposób: 3 # plik dane. txt : 4 # Ryszard Skórka 36 1988 5 # Jan Kowalski 45 1999 6 # Tomasz Adamski 45 1966 7 8 cat / dev / stdin sort -k 3,4 Wyrażenia arytmetyczne: instrukcja let:
ROZDZIAŁ 1. LINUX 8 let a =5+4 ; echo $a let " a = 5 + 4" ; echo $a let a ++ ; echo $a let " a = 4 * 5" ; echo $a z=3 let " a = $z + 30" ; echo $a instrukcja expr: expr 5 + 4 expr "5 + 4" expr 5+4 expr 5 \* $1 expr 11 % a=$( expr 10-3 ) ; echo $a instrukcja $((...)): a=$(( 4 + 5 )) ; echo $a a=$ ((3+5)) ; echo $a b=$(( a + 3 )) ; echo $b b=$(( $a + 4 )) ; echo $b b=$[ a + 3 ] ; echo $b b=$[ $a + 4 ] ; echo $b (( b++ )) ; echo $b (( b += 3 )) ; echo $b a=$(( 4 * 5 )) ; echo $a długość zmiennej: a= Hello World ; echo ${# a} b =4953 ; echo ${#b} liczby zmiennopozycyjne i kalkulator bc:
ROZDZIAŁ 1. LINUX 9 echo " scale =6; /3" bc -l Testy: W praktyce często stosuje się polecenie testujące: test wyrażenie lub [ wyrażenie ], które zwraca wartość logiczną: prawda (0) lub fałsz (1). Wyrażenie wyrażenie buduje się w oparciu o zasady przedstawione w pomocy podręcznej: man test. mkdir touch praca a. txt test -f a. txt ; echo $? # Czy a. txt jest plikiem regularnym? Wynik : 0 test -e a. txt ; echo $? # Czy a. txt istnieje? Wynik : 0 test -d a. txt ; echo $? # Czy a. txt jest katalogiem? Wynik : 1 test -f praca ; echo $? # Wynik : 1 test -e praca ; echo $? # Wynik : 0 test -d praca ; echo $? # Wynik : 0 [ -d praca ] ; echo $? # Wynik : 0 Instrukcja for: for zmienna in wartości ; do... done Przykład: 3 for a in ala ma kota ; do 4 echo " Drukuję plik : $a" 5 done 6 7 for a in $( ls ) ; do 8 echo " Drukuję plik : $a" 9 done Instrukcja while: while warunek ; do... done Przykład:
ROZDZIAŁ 1. LINUX 10 3 a=0 4 while [ $a - le 0 ] ; do 5 a=$(( a +=1 )) 6 echo " a = $a" 7 done 3 read -p " Podaj hasło : " -s haslo 4 echo 5 6 while [ " $haslo "!= " sekret " ] ; do 7 read -p " Niepoprawne hasło. Podaj hasło : " -s haslo 8 echo 9 done 10 11 echo " Twoje hasło : sekret " Instrukcja until: until warunek ; do... done Przykład: 3 a=0 4 until [ $a - gt 0 ] ; do 5 a=$(( a +=1 )) 6 echo " a = $a" 7 done 3 read -p " Podaj hasło : " -s haslo 4 echo 5 6 until [ " $haslo " = " sekret " ] ; do 7 read -p " Niepoprawne hasło. Podaj hasło : " -s haslo 8 echo 9 done 10 11 echo " Twoje hasło : sekret " Wykonywanie pętli przerywa instrukcja break. Aby przejść do następnej iteracji należy wydać polecenie continue.
ROZDZIAŁ 1. LINUX 11 Pętle w stylu języka C: for (( n=1 ; n <=10 ; n++ )) ; do... done ((n =1)) while ((n <=10)) ; do... ((n ++)) done ((n =1)) until ((n >10)) ; do... ((n=n +1)) done Instrukcje warunkowa if: if warunek ; then... elif warunek ; then... else... fi Przykład: 3 a=$1 4 if [ "$a" = 1 ] ; then 5 echo " Wprowadzono : 1" 6 elif [ "$a" = ] ; then 7 echo " Wprowadzono : " 8 else 9 echo " Nie wprowadzono liczb : 1, " 10 fi Instrukcje warunkowa case: case slowo in wzorzec1 )... instrukcje... ;; wzorzec )... instrukcje... ;;... *)... instrukcje... esac
ROZDZIAŁ 1. LINUX 1 Jeżeli slowo pasuje do któregoś ze wzorców, to wtedy wykonywane są odpowiednie instrukcje. Jeżeli slowo nie pasuje do któregoś ze wzorców, to wtedy wykonywane są instrukcje należące do przypadku *). Wzorzec może być listą wzorców oddzielonych znakiem. Wzorce tworzone są według następujących reguł: * - pasuje do dowolnego ciągu znaków? - pasuje do dowolnego pojedynczego znaku [...] - pasuje do jednego z podanych (...) znaków?( lista_ wzorców ) - pasuje do zera lub jednego wystapienia wzorca *( lista_ wzorców ) - pasuje do zera lub więcej wystapień wzorca +( lista_ wzorców ) - pasuje do jednego lub więcej wystapień wzorca @( lista_ wzorców ) - pasuje do jednego wystapienia wzorca!( lista_ wzorców ) - pasuje do wszystkiego chyba, że wystąpi wzorzec lista_ wzorców - zawiera wzorce oddzielone znakiem Przykład: 3 echo -n " Podaj liczbe [1,1]: " 4 read liczba 5 6 case " $liczba " in 7 "1") echo " Styczen " ;; 8 "") echo " Luty " ;; 9 "3") echo " Marzec " ;; 10 "4") echo " Kwiecien " ;; 11 "5") echo " Maj " ;; 1 "6") echo " Czerwiec " ;; 13 "7") echo " Lipiec " ;; 14 "8") echo " Sierpien " ;; 15 "9") echo " Wrzesien " ;; 16 "10") echo " Pazdziernik " ;; 17 "11") echo " Listopad " ;; 18 "1") echo " Grudzien " ;; 19 *) echo " Liczba poza zakresem." 0 esac Tablice: Tablice to zmienne, które przechowują różne wartości pod tą samą nazwą. konkretnej wartości wymaga użycia indeksu. # deklaracja tablicy 5 elementowej tablica =(1 3 9 " ala ma" kota ) Odwołanie do for i in $( seq 0 4 ) ; do echo ${ tablica [i]} done Ciekawe polecenie to: seq [start] [krok] stop, pozwalające generować sekwencje liczb całkowitych od start do stop co krok. Inny sposób deklaracji tablicy:
ROZDZIAŁ 1. LINUX 13 tablica [0]=1 tablica [1]=3 tablica []=9 tablica [3]=" ala tablica [4]= kota ma" for i in $( seq 0 4 ) ; do echo ${ tablica [i]} done Dostęp do wszystkich elementów tablicy: echo ${ tablica [*]} echo ${ tablica [@]} Liczba elementów tablicy: echo ${# tablica [*]} echo ${# tablica [@]} Proste menu i instrukcja select: 3 # Wybieramy 1,, 3 lub 4. 4 5 PS3 =" Wybierz opcję : " # Przetestuj skrypt bez tego wiersza 6 select opt in X Y Z Koniec ; do 7 if [ " $opt " = "X" ] ; then 8 echo " Wybrano $opt ( $REPLY )" 9 elif [ " $opt " = "Y" ] ; then 10 echo " Wybrano $opt ( $REPLY )" 11 elif [ " $opt " = "Z" ] ; then 1 echo " Wybrano $opt ( $REPLY )" 13 elif [ " $opt " = " Koniec " ] ; then 14 break 15 else 16 echo " Wybierz : 1,..., 4" 17 fi 18 done Funkcje: Funkcje to fragmenty kodu, do których odwołujemy się poprzez nazwę funkcji. # Deklaracja funkcji function nazwa_ funkcji {... instrukcje... }
ROZDZIAŁ 1. LINUX 14 nazwa_ funkcji () {... instrukcje... } # Wywołanie funkcji nazwa_ funkcji arg1 arg... Do funkcji można przekazać wartości argumentów: arg1, arg,..., uzyskując do nich dostęp tak jak w przypadku argumentów wywołania skryptu: $1, $,... #!/ bin / bash iloczyn () { a=$1 b=$ echo $(( a*b )) } wynik =$( iloczyn 5 ) echo $wynik W powyższym skrypcie zademonstrowano sposób jak funkcja może zwrócić wyliczoną wartość i jak przypisać ją innej zmiennej. Aby przerwać wykonywanie funkcji należy użyć instrukcji return kod_wyjścia, gdzie kod_wyjścia może być wartością zwracaną przez funkcję, jednak ma to sens o ile spodziewamy się, że 0<=kod_wyjścia<=55. Zmienne występujące wewnątrz funkcji mogą być lokalne, o ile ich deklaracja zostanie poprzedzona słowem local. Odczyt pliku: #!/ bin / bash echo " Podaj nazwe pliku do wyswietlenia :" read plik if [! -r $plik ]; then echo " Nie moge czytac z pliku : $plik " exit 1 fi cat $plik while read linia do echo $linia done Inny sposób: #!/ bin / bash
ROZDZIAŁ 1. LINUX 15 echo " Podaj nazwe pliku do wyswietlenia :" read plik if [! -r $plik ]; then echo " Nie moge czytac z pliku : $plik " exit 1 fi while read linia do echo $linia done < $plik 1.4 Zadania 1. Napisz skrypt, który oblicza wartość N! i następnie wyświetla odpowiedni komunikat, np. 4! = 4.. Napisz skrypt, który usuwa wszystkie pliki w zadanym katalogu (parametr wywołania skryptu), poza plikami wykonywalnymi. 3. Napisz skrypt pobierający trzy argumenty. Pierwsze dwa powinny być nazwami istniejących plików tekstowych (polecenie file). Trzeci argument powinien być nazwą nieistniejącego pliku. Jeżeli te warunki są spełnione, to zawartość dwóch pierwszych plików powinna być zapisana w trzecim pliku, który należy wcześniej utworzyć. 4. Napisz skrypt, który zapyta o ścieżkę do katalogu, a następnie zarchiwizuje (polecenie tar) jego zawartość do pliku o nazwie podanej przez użytkownika. 5. Napisz skrypt, który zapyta użytkownika o ścieżkę do katalogu, a następnie obliczy (polecenie wc) ilość wierszy i ilość znaków w każdym z plików tekstowych znajdujących się w wybranym katalogu.
Rozdział Język Tcl Więcej wiadomości o języku Tcl można znaleźć na stronie: www.tcl.tk/man/..1 Podstawowe polecenia Język Tcl (Tool Command Language) jest językiem interpretowanym. Interpreter języka Tcl to program tclsh. Plik źródłowy (skrypt) prostego programu może mieć postać: 3 puts " Pierwszy program " 4 puts " Pierwszy "; puts " program " 5 6 # komentarz 7 8 puts " Pierwszy \ 9 program " Komentarze rozpoczynamy znakiem #. Polecenia oddzielamy znakiem nowego wiersza lub średnikiem. Polecenie można kontynuować w następnym wierszu, o ile pierwsza część polecenia zostanie zakończona znakiem \. Zmienne proste: Zmienną definiujemy korzystając z polecenia set określając nazwę zmiennej i przypisując jej pewną wartość. Polecenie set zwraca wartość zmiennej. Nie jest konieczne deklarowanie typu zmiennej. 3 set x 10 4 set lan " Wartość x =" 5 6 puts $x 7 puts " Wartość x= $x" 8 puts " $lan$x " 9 puts { Wartość x= $x} 16
ROZDZIAŁ. JĘZYK TCL 17 Do wartości zmiennej odwołujemy się poprzedzając jej nazwę znakiem $. Łańcuch znaków może by zawarty wewnątrz nawiasów klamrowych {...} lub przy użyciu cudzysłowu.... Różnicę w stosowaniu wymienionych form prezentuje powyższy przykład. Umieszczenie odwołania do wartości zmiennej wewnątrz... spowoduje podstawienie aktualnej wartości zmiennej, natomiast umieszczenie odwołania do wartości zmiennej wewnątrz {...} nie spowoduje podstawienia wartości zmiennej. Mówimy o cytowaniu łańcucha znaków z podstawieniem lub dosłownie. Nawiasy kwadratowe [...] służą do cytowania poleceń, np: 3 puts [ set x 10] Zmienne tablicowe: Definicję zmiennej tablicowej i sposób odwoływania się do niej wyjaśni przykład: 3 set x (0) 10 4 set x (1) 11 5 set x () 1 6 set x (3) 13 7 8 set i 1 9 10 puts $x () 11 puts $x($i) Listy: Lista zawiera elementy oddzielone spacjami i ujęte w nawiasy klamrowe lub cudzysłów: 3 set lista { a b cd 11.0 {1 3}} 4 puts $lista Szereg operacji na listach można wykonać stosując następujące polecenia: 3 # polecenie list tworzy listę 4 set lista [ list a b cd 11.0 {1 3}]; puts $lista 5 6 # ilość elementów w liście 7 puts [ llenght $lista ] 8 9 # pobranie elementu listy 10 puts [ lindex $lista 0] 11 puts [ lindex $lista end -]
ROZDZIAŁ. JĘZYK TCL 18 1 puts [ lindex $lista end ] 13 14 # sortowanie elementów listy 15 puts [ lsort - increasing $lista ] 16 puts [ lsort - decreasing $lista ] 17 18 # dodawanie elementu na koniec listy 19 puts [ lappend lista { ala ma kota }] 0 1 # zamiana elementu listy puts [ lset lista 1 { ala ma kota }] 3 4 # inne plecenia : linsert, lsearch, lrange, lreplace Łańcuchy znaków: Łańcuch znaków to ciąg znaków ujęty w nawiasy klamrowe lub cudzysłów. Operacje na łańcuchach znaków wykonujemy przy pomocy polecenia string. 3 set str " Ala ma kota, kot ma robota." 4 5 puts [ string length $str ] 6 puts [ string reverse $str ] 7 puts [ string toupper $str ] 8 puts [ string tolower $str ] 9 puts [ string index $str ] 10 puts [ string first a $str ] 11 puts [ string first x $str ] 1 puts [ string range $str 1 10] 13 14 #... Wyrażenia matematyczne: Operatory dodawania, odejmowania, mnożenia i dzielenia (+, -, *, /) są takie jak zwykle. Potęgowanie wykonuje się przy pomocy funkcji pow(3,), co odpowiada działaniu 3 = 9. Aby obliczyć wartość wyrażenia matematycznego należy użyć polecenia expr. 3 set x [ expr *]; puts $x 4 set x [ expr /3]; puts $x 5 set x [ expr.0/3]; puts $x 6 set x [ expr./3]; puts $x 7 set x [ expr /3.0]; puts $x 8 set x [ expr /3,]; puts $x 9 set x [ expr * pow (,3)]; puts $x
ROZDZIAŁ. JĘZYK TCL 19 Dokumentacja języka Tcl zawiera informacje o innych funkcjach matematycznych (trygonometryczne, logarytmiczne, wykładnicze,...) i sposobie ich użycia. Wyrażenia logiczne: Wyrażenia zawierające operatory porównania (<, >, <=, >=, ==) generują jedną z dwóch wartości: true i false. Prawdzie logicznej odpowiadają liczby różne od zera. Zero odpowiada fałszowi. 3 puts [ expr 1 >] 4 puts [ expr 1 <] Operatory logiczne and i or są reprezentowane przez: && i. Znakiem negacji logicznej jest!. Wyrażenia logiczne można umieszczać w nawiasach okrągłych (...). Instrukcja warunkowa if: Znaczenie instrukcji warunkowej jest takie jak w innych językach programowania. Poniżej znajdują się przykłady jej użycia: 3 if { true } { puts Alamakota } 4 if { false } { puts Alamakota } 5 6 set x 17 7 set y 15 8 if {$x > $y} { 9 puts " X jest większe od Y" 10 } elseif { $x == $y} { 11 puts " X jest równe Y" 1 } else { 13 puts " X nie jest większe od Y" 14 } Klauzul elseif może być więcej niż jedna. Pętla for: Poniższy program definiuje dwa wektory (tablice) i oblicza ich iloczyn skalarny: 3 set MAX 10 4 for { set i 0} {$i < $MAX } { incr i} { 5 set a($i) [ expr $i] 6 set b($i) [ expr $i *] 7 } 8 9 for { set i 0} {$i < $MAX } { incr i} { 10 set c($i) [ expr $a($i )* $b($i )]
ROZDZIAŁ. JĘZYK TCL 0 11 } 1 13 set sum 0 14 for { set i 0} {$i < $MAX } { incr i} { 15 set sum [ expr $sum +$c($i )] 16 } 17 18 puts $sum Pętla while: Podobnie jak wyżej: 3 set MAX 10 4 set i 0 5 while {$i < $MAX } { 6 set a($i) [ expr $i] 7 set b($i) [ expr $i *] 8 incr i 9 } 10 11 set i 0 1 while { $i < $MAX } { 13 set c($i) [ expr $a($i )* $b($i )] 14 incr i 15 } 16 17 set sum 0 18 set i 0 19 while { $i < $MAX } { 0 set sum [ expr $sum +$c($i )] 1 incr i } 3 4 puts $sum Procedury: Procedurę definiuje polecenie proc. Do procedury można przekazać wartości jej argumentów. procedura może zwrócić wartość za pośrednictwem polecenia return. 3 proc suma { var } { 4 return [ expr $var +0] 5 } 6 7 set a 8 puts [ suma $a] 9 puts $a
ROZDZIAŁ. JĘZYK TCL 1 Jak widać wykonanie procedury suma nie powoduje zmiany wartości zmiennej a, ponieważ każda zmienna pojawiająca się w skrypcie Tcl ma określony zakres związany z poziomem wywołania procedury. Aby procedura mogła uzyskać dostęp do zmiennej zdefiniowanej na jednym z wyższych poziomów oraz aby mogła zmodyfikować jej wartość należy użyć polecenia upvar. 3 proc suma {a} { 4 upvar $a aa 5 set aa [ expr $aa +0] 6 } 7 8 set a 9 suma a 10 puts $a 3 proc iloczyn { a b} { 4 upvar $a aa 5 upvar $b bb 6 7 set sum 0 8 for { set i 0} {$i < 10} { incr i} { 9 set sum [ expr $sum + $aa ($i )* $bb ($i )] 10 } 11 return $sum 1 } 13 14 for { set i 0} {$i < 10} { incr i} { 15 set a($i) [ expr $i] 16 } 17 18 for { set i 0} {$i < 10} { incr i} { 19 set b($i) [ expr $i *] 0 } 1 puts [ iloczyn a b]. Wejście wyjście programu Program Tcl można uruchomić przekazując do niego listę wartości: 3 # oczekujemy dwóch wartości 4 if { $argc!= } { puts " Niepoprawna ilość argumentów."; exit }
ROZDZIAŁ. JĘZYK TCL 5 6 # wartości przekazane do skryptu przypisujemy zmiennym x i y 7 set x [ lindex $argv 0] 8 set y [ lindex $argv 1] 9 10 puts " Argumenty wywołania programu :" 11 puts $x 1 puts $y Rozmowa ze skryptem jest możliwa w trakcie jego wykonywania: 3 puts " Podaj liczbę :" 4 gets stdin liczba 5 6 puts stdout " Wprowadzono liczbę : $liczba " Polecenie gets pobiera dane ze standardowego wejścia stdin, a polecenie puts wyprowadza wartość zmiennej x na standardowe wyjście stdout. Identyfikator stdout można pominąć..3 Przykładowy program mnożenie macierzy 3 puts " ====================================================" 4 puts " Macierz A:" puts " Podaj liczbe wierszy :"; gets stdin wa 5 puts " Podaj liczbe kolumn :"; gets stdin ka 6 puts "" 7 puts " Macierz B:" 8 puts " Podaj liczbe wierszy :"; gets stdin wb 9 puts " Podaj liczbe kolumn :"; gets stdin kb 10 puts " ====================================================" 11 1 puts "" 13 14 if { $ka!= $wb } { 15 puts "!!! Liczba kolumn macierzy A różna od liczby wierszy macierzy B!!!" 16 exit 17 } 18 if { $ka == $wb } { 19 puts " Macierz C=A* B ma wymiar : $wa x $kb " 0 } 1 puts " Elementy macierzy A:" 3 set fmt " scan \ $wiersz " 4 for { set i 1} { $i <= $ka } { incr i} { set fmt [ string cat $fmt % f] } 5 set fmt [ string cat $fmt " "]
ROZDZIAŁ. JĘZYK TCL 3 6 for { set i 1} {$i <= $ka } { incr i} { set fmt [ string cat $fmt "A(\$i,$i) "] } 7 for { set i 1} {$i <= $wa } { incr i} { 8 puts " wiersz $i :"; gets stdin wiersz 9 if {[ eval $fmt ]!= $ka } { 30 puts "!!! Nieprawidłowa liczba kolumn!!!" 31 exit 3 } 33 } 34 35 puts "" 36 37 puts " Elementy macierzy B:" 38 set fmt " scan \ $wiersz " 39 for { set i 1} { $i <= $kb } { incr i} { set fmt [ string cat $fmt % f] } 40 set fmt [ string cat $fmt " "] 41 for { set i 1} {$i <= $kb } { incr i} { set fmt [ string cat $fmt "B(\$i,$i) "] } 4 for { set i 1} {$i <= $wb } { incr i} { 43 puts " wiersz $i :"; gets stdin wiersz 44 if {[ eval $fmt ]!= $kb } { 45 puts "!!! Nieprawidłowa liczba kolumn!!!" 46 exit 47 } 48 } 49 50 for { set i 1} {$i <= $wa } { incr i} { 51 for { set j 1} {$j <= $kb } { incr j} { 5 set C($i,$j) 0.0 53 for { set k 1} {$k <= $ka } { incr k} { set C($i,$j) [ expr $C($i,$j )+ $A($i,$k )* $B( 54 } 55 } 56 57 puts "" 58 59 puts " Macierz C=A* B:" 60 for { set i 1} {$i <= $wa } { incr i} { 61 set str "" 6 for { set j 1} {$j <= $kb } { incr j} { 63 set str [ string cat $str "$C($i,$j) "] 64 } 65 puts $str 66 }.4 Zadania Napisz skrypty Tcl realizujące zadania z poprzedniego rozdziału.
Rozdział 3 Język C 3.1 Struktura programu Kod programu napisanego w języku C umieszczamy w pliku o rozszerzeniu.c. Przykładowy plik prg.c może wyglądać następująco: 1 /* Komentarz wielowierszowy 3 Plik prg.c 4 */ 5 6 // Komentarz jednowierszowy 7 8 # include < stdio.h > // Dyrektywy preprocesora 9 10 void czytaj (); // Deklaracje funkcji 11 void sortuj (); 1 void pisz (); 13 14 int main () // Funkcja main () 15 { 16 czytaj (); 17 sortuj (); 18 pisz (); 19 0 return 0; 1 } 3 void czytaj () { printf (" czytaj ()/ n ")} // Definicje funkcji 4 void sortuj () { printf (" czytaj ()/ n ")} 5 void pisz () { printf (" czytaj ()/ n ")} 4