Turbo Pascal. Programowanie

Turbo Pascal.
Programowanie

Autor: Tomasz M. Sadowski
Format: B5, stron: 136

Copyright © 1996 by Wydawnictwo Helion
wersja spakowana

helion.pl

Ulepszamy dalej

Nie trzeba chyba nikogo przekonywać, że porządny program powinien umieć sam zapytać użytkownika o wartość promienia i obliczyć pole bez konieczności uciążliwego poprawiania i kompilowania tekstu. W tym celu należałoby wypisać na ekranie odpowiednie pytanie (co już potrafisz zrobić), a następnie wprowadzić z klawiatury wartość promienia i wykorzystać ją do obliczenia pola koła ze wzoru . Ba, łatwo powiedzieć: ale jak wprowadzić jakąś wartość do programu i gdzie ją przechować?

Rozwiązaniem tego problemu jest użycie zmiennej. Podobnie jak w matematyce, zmienna symbolizuje pewną wartość, czyli może być traktowana jako swego rodzaju pojemnik, do którego wkładamy np. liczbę (wartość promienia). "Fizycznie" wartość zmiennej umieszczana jest gdzieś w pamięci komputera i może być zlokalizowana poprzez adres, czyli numer odpowiedniej komórki pamięci. Ponieważ posługiwanie się adresami jest niezbyt wygodne, Pascal umożliwia odwoływanie się do zmiennej za pomocą nazwy, będącej zwykłym identyfikatorem (informacje na temat identyfikatorów znajdziesz na stronie 27). Dodatkową informacją, niezbędną do ustalenia sposobu posługiwania się zmienną i jej reprezentacji w pamięci, jest typ - w naszym przypadku będzie to typ zmiennoprzecinkowy, odpowiadający wartości rzeczywistej (real).

Ponieważ kompilator tłumaczy tekst źródłowy programu na bezpośrednio wykonywalną przez komputer postać wynikową, musi wiedzieć jak reprezentować daną zmienną w pamięci i jak się z nią obchodzić. Niezbędne jest zatem zadeklarowanie każdej używanej w programie zmiennej, czyli przekazanie kompilatorowi informacji o jej nazwie i typie. Do deklarowania zmiennych służy specjalne słowo kluczowe var (ang. variable - zmienna), zaś składnia deklaracji ma postać

  var
    lista-nazw : typ-1;
    lista-nazw : typ-2 ...

przy czym lista-nazw to ciąg nazw zmiennych tego samego typu rozdzielonych przecinkami. Aby zadeklarować kolejną grupę zmiennych (innego typu), nie musisz ponownie używać słowa var; wystarczy dopisać pod spodem nową listę i podać nazwę typu.

Ostatnim wymaganiem, o którym musisz pamiętać, jest umieszczanie wszystkich deklaracji przed częścią operacyjną programu: ponieważ bezpośrednio wykorzystuje ona zadeklarowane obiekty, muszą one zostać opisane przed jej rozpoczęciem.

Po zadeklarowaniu można już "normalnie" korzystać ze zmiennej, czyli nadawać jej wartość, wykorzystywać w wyrażeniach lub wyprowadzać na ekran monitora. Musisz jednak pamiętać, że sama deklaracja nie nadaje zmiennej sensownej wartości, a jedynie informuje kompilator o jej istnieniu i właściwościach. Przed użyciem zmiennej musisz koniecznie nadać jej wartość (zainicjalizować ją) przez wprowadzenie jej wartości z klawiatury lub za pomocą tzw. instrukcji przypisania.

Żeby dłużej nie teoretyzować, zademonstrujmy nową wersję naszego programu:

  program Pole_kola;
  { Program oblicza pole koła o promieniu 5 }
  { Promień wprowadzany jest z klawiatury }
     
  var { deklaracja zmiennych }
    r : real; { promień koła - zmienna rzeczywista }
   
    begin 
    writeln('Program oblicza pole kola'); 
    write('Podaj promien kola: '); 
    readln(r); { odczytaj zmienną }
      { z klawiatury }
    write('Pole = '; Pi*r*r:8:3); { oblicz i wypisz }
    readln; { pole koła }
  end.

Zapewne zauważyłeś już w programie znaną Ci z poprzedniego rozdziału procedurę readln. Tutaj pełni ona inną (właściwie swoją zasadniczą) funkcję, a mianowicie odczytuje wartość zmiennej r z klawiatury. Składnia procedury readln jest następująca:

readln[(zmienna, zmienna...)];

i wygląda podobnie, jak dla "odwrotnej" procedury writeln, z tą drobną różnicą, że argumentami readln mogą być jedynie zmienne. Dlaczego? Procedura readln pobiera z klawiatury (a ściślej rzecz biorąc, z tzw. wejścia programu) pewną wartość i musi ją gdzieś umieścić. Wartość może zostać umieszczona w zmiennej, czyli gdzieś w pamięci, nie może jednak zostać zapisana w wyrażeniu, które jest jedynie zapisem pewnej operacji i nie posiada lokalizacji w pamięci komputera. Podobnie niedopuszczalne będzie użycie jako argumentu stałej lub (o zgrozo!) operatora.

Pokrewna procedura read stosowana jest znacznie rzadziej; różnica między nią a readln sprowadza się (podobnie jak dla write i writeln) do tego, iż po odczytaniu swoich argumentów readln przechodzi do następnego wiersza danych wejściowych, a read nie. Procedura read używana jest głównie do czytania danych z plików (o których później), zaś jej użycie do wprowadzania danych z klawiatury może doprowadzić do niespodziewanych efektów, dlatego też na razie lepiej jej unikać.

Pora powiedzieć coś więcej na temat typów. Typ zmiennej określa jej wewnętrzną reprezentację w pamięci komputera (liczbę bajtów zajmowanych przez zmienną, zakres dopuszczalnych wartości i dokładność reprezentacji) oraz zestaw operacji, które można na niej wykonywać. Kilkanaście standardowych typów dostępnych w Turbo Pascalu opiszemy w poniższej tabeli. Z wyjątkiem typu string, wszystkie one należą do tzw. typów prostych (nie dających się rozbić na prostsze typy).

Tablica 1. Najważniejsze typy dostępne w Turbo Pascalu

Nazwa
Znaczenie
Zakres wartości
Przykład
integer
liczba całkowita ze znakiem
-32768..+32767
-14574
real
liczba rzeczywista
2.9*10-39..1.7*1038
1.23245e17
char
znak
znaki o kodach 0..255
'a'
string
napis (łańcuch, ciąg znaków)
ciąg do 255 znaków
'Napis'
boolean
wartość logiczna
prawda (true) lub fałsz (false)
false
word
słowo
0..65535
56412
byte
bajt
0..255
127
shortint
krótka liczba całkowita ze znakiem
-128..+127
-13
longint
długa liczba całkowita ze znakiem
-2147483648..+2147483647
-1986734234
single
krótka liczba rzeczywista
1.5*10-45..3.4*1037
3.14e01
double
długa liczba rzeczywista
5.0*10-324..1.7*10308
-1.8e+234
extended
bardzo długa liczba rzeczywista
3.4*10-4932..1.1*104932
4.5e2345
comp
bardzo długa liczba całkowita
-9.2*1018..9.2*1018
6e12
pointer
wskaźnik
0000h:0000h..FFFFh:FFFFh
$1234:ABCD

Cztery pierwsze typy wymienione w tabeli stanowią podstawowy zestaw, którym będziesz posługiwał się podczas pisania programów. Typy całkowite (integer, word, shortint, byte, longint), typ znakowy (char) oraz logiczny (boolean) tworzą z kolei grupę tzw. typów porządkowych (ang. ordinal types), w ramach których określona jest relacja porządku (czyli kto przed kim, a kto po kim).

Typy całkowite używane są w programach do reprezentacji liczników, adresów i indeksów tablic oraz zawartości komórek pamięci (byte i word). Pamiętaj, że ze względu na specyficzną reprezentację wewnętrzną liczb całkowitych przekroczenie zakresu dopuszczalnego dla danego typu powoduje "przeskoczenie" na drugi koniec zakresu (np. dodanie 1 do 32767 da w wyniku -32768). Efekt ten zwykle nie jest sygnalizowany przez kompilator i może prowadzić do dość dziwacznego zachowania programów. Aby go uniknąć, możesz zastosować pojemniejszy typ (np. longint).

Drugą obszerną grupę tworzą typy rzeczywiste, przeznaczone do przechowywania wartości niecałkowitych i realizacji większości bardziej złożonych obliczeń matematycznych. W większości przypadków zadowalające rezultaty osiąga się przy użyciu liczb typu real, jednak dla poprawy dokładności, powiększenia zakresu wartości i przyspieszenia obliczeń warto odwołać się do jednego z pozostałych typów. Ich wykorzystanie wymaga zadeklarowania użycia w programie tzw. koprocesora arytmetycznego (specjalnego układu przeznaczonego do operowania na liczbach rzeczywistych, dostępnego jako oddzielny układ lub wbudowanego w procesory 486DX i "lepsze") albo tzw. emulatora, czyli specjalnego podprogramu "udającego" koprocesor. Aby było możliwe odwołanie się do koprocesora, należy włączyć opcję Numeric Processing - 8087/80287 w polu dialogowym Options-Compiler, zaś włączenie emulacji realizuje znajdująca się poniżej opcja Emulation. Alternatywą jest umieszczenie w programie tzw. dyrektyw kompilatora, mających odpowiednio postać {$N+} i {$E+}.

Typy znakowy i łańcuchowy wykorzystywane są do reprezentowania napisów i wszelkiej informacji "słownej". Typ boolean pozwala na przechowywanie wartości logicznych, wykorzystywanych do sterowania działaniem programu, zaś typ wskaźnikowy (pointer) używany jest w operacjach na zawartości pamięci komputera (nieco dziwny zapis $1234:ABCD oznacza adres komórki pamięci w postaci szesnastkowej, sygnalizowanej znakiem $).

Na tym zakończymy ten krótki rozdział. Na kolejnych kilku stronach zajmiemy się wyrażeniami i ich elementami składowymi, zaś w charakterze ćwiczenia proponuję Ci zmodyfikowanie naszego programu tak, by obliczał on pole trójkąta na podstawie wprowadzonej z klawiatury długości podstawy i wysokości.

Zapamiętaj

Poprzedni | Spis treści | Następny | Wersja spakowana |