String jest to typ tablicowy, którego każdy element jest typu znakowego (char).
Wartością zmiennej napisowej może być ciąg dowolnych znaków - maksymalnie 255 elementów.
Deklaracja zmiennej napisowej:
var identyfikator : string ;
Przykłady napisów:
a) napis pusty: ’ ’
b) napis - jeden znak: ’F’ , ’f’ , ’5’ , ’$’ , ’@’ , ’=’ , ’+’ , ’:’ , ’ ’
c) ciąg znaków: ’uczelnia’ , ’Politechnika Wrocławska’, ’rok 2, kierunek Zarządzanie... ’ , ’>=’
Wielkość zajmowanej pamięci operacyjnej przez zmienną napisową wynosi 256 bajtów.
Można zmniejszyć zapotrzebowanie na pamięć operacyjną poprzez ograniczenie długości napisów : var s1 : string [ 25 ] ; { napis do 25 znaków - zajmowana pamięć 25+1 bajtów }
var s2 : string [ 130 ] ; { napis do 130 znaków - zajmowana pamięć 130+1 bajtów }
Fu
nkcja Length ( st
r:string )
Długość napisu przypisanego pod zmienną
Funkcja UpCase (ch:char)
napisową str ; liczba znaków w ciągu
Zamiana małej litery (wartość ch) na dużą.
stanowiącym bieżącą wartość str.
st
r:string L
en g
th(str)
c h:char UpCase(ch)
''
0
'a'
'A'
'@'
1
'F'
'F'
'ZIM'
3
'3'
'3'
'Rok 1'
5
'$'
'$'
' '
' '
Łączenie napisów (stałych, wartości zmiennych):
a) operator dwuargumentowy +
lub
b) CONCAT ( arg1,arg2, ... )
str := 'Rok ' + '2010' +'/' +'2011'
str := Concat('Rok ', '2010', '/' , '2011')
str = 'Rok 2010/2011'
Length(str) = 13
str[1]='R'
str[2]='o'
str[4]=' '
str[9]='/'
str[13]='1'
UpCase(str[1]) = 'R'
UpCase(str[2]) = 'O'
UpCase(str[4]) = ' '
UpCase(str[9]) = '/'
UpCase(str[13]) = '1'
Przykład:
W poniższym programie przedstawiono różne sposoby deklaracji zmiennych tablicowych oraz odwołania do składowych tablicy (zapis/odczyt wartości do/z tablicy).
Program umożliwia wprowadzenie przychodów dla każdego dnia roku, a następnie: a) oblicza łączne przychody w każdym miesiącu;
b) wskazuje miesiąc o największym przychodzie (przy założeniu, że przychody miesięczne w obrębie roku są różnymi wartościami).
PAU - Pascal cz. 5
1 / 3
CONST
(***** def inicje st ałych *****)
max_miesiecy = 12 ;
max_liczba_dni = 31 ;
(***** deklaracje zm iennyc h *****)
VAR
(* DANE POMOCNICZE *)
nazwa_miesiaca : array [ 1.. max_miesiecy ] of string[11];
{ nazwy miesięcy }
max_dni : array [ 1.. max_miesiecy ] of byte;
{ liczba dni w miesiącu }
(* DANE *)
przychod : array [ 1.. max_miesiecy, 1..max_liczba_dni ] of real; { przychód dzienny w każdym miesiącu }
(* WYNIKI *)
suma_msc : array [1.. max_miesiecy ] of real;
{ suma przychodów w każdym miesiącu }
max_msc : byte;
{ numer miesiąca o największym przychodzie }
max_przychod : real;
{ ... i wartość tej kwoty }
odp
: char;
(* ZMIENNE POMOCNICZE *)
msc,
dz
: byte;
suma
: real;
BEGIN
{- wpisanie do tablicy nazw miesięcy }
nazwa_miesiaca[1]:='styczeń'; nazwa_miesiaca[2]:='luty'; ... nazwa_miesiaca[12]:='grudzień';
{- ustalenie dni w każdym miesiącu }
max_dni[1] := 31; max_dni[2] := 28; max_dni[3] := 31; max_dni[4] := 30; max_dni[5] := 31; max_dni[6] := 30; max_dni[7] := 31; max_dni[8] := 31; max_dni[9] := 30; max_dni[10] := 31; max_dni[11] := 30; max_dni[12] := 31; REPEAT { ustalenie dokładnej liczby dni dla lutego }
write ( 'Czy rok jest przestępny [T/N] ?'); Readln (odp) UNTIL (UpCase(odp)='T') OR (UpCase(odp)='N'); IF UpCase(odp)='T' THEN max_dni[2] := max_dni[2] + 1;
{- wprowadzanie przychodów dziennych dla każdego miesiąca }
FOR msc := 1 TO max_miesiecy DO
BEGIN
writeln('Wprowadzanie danych dla miesiąca: ', nazwa_miesiaca[msc]); FOR dz := 1 TO max_dni [msc] DO
BEGIN
write ( 'dzień ', dz, ': ' ); readln( przychod[msc,dz] ) END
END;
{- obliczenie łącznego przychodu w każdym miesiącu }
FOR msc := 1 TO max_miesiecy DO
BEGIN
suma := 0;
FOR dz := 1 TO max_dni[msc] DO suma := suma + przychod[msc,dz];
{ zapisanie wyników do tablicy }
suma_msc [msc] := suma
{ suma przychodów w miesiącu 'msc' }
END;
{- wskazanie miesiąca o największym przychodzie - założenie: przychody miesięczne są różnymi wartościami }
max_msc := 1;
{ zakładamy, że jest to styczeń... }
max_przychod := suma_msc [max_msc];
{ ... zapamiętujemy jego sumę przychodów }
FOR msc := 2 TO max_miesiecy DO
{ ...i sprawdzamy czy wartość }
IF max_przychod < suma_msc [msc] THEN
{ ... jest większa od sum w pozostałych miesiącach }
BEGIN
max_msc := msc;
max_przychod := suma_msc [msc]
END;
{- wyświetlenie wyników }
FOR msc := 1 TO max_miesiecy DO
writeln ( 'Przychód w miesiącu: ', nazwa_miesiaca[msc], ' wyniósł : ', suma_msc [msc]:0:2 ); writeln ( 'Największy przychód był w miesiącu: ', nazwa_miesiaca[max_msc], ' i wyniósł : ', max_przychod:0:2 ) END.
PAU - Pascal cz. 5
2 / 3
Typ wyliczeniowy
- jest to zbiór wartości nazwanych i uporządkowanych przez programistę,
- definiuje się przez wyliczenie jego wartości.
Na elementach zbioru nie wykonuje się operacji arytmetycznych.
TYPE
identyfikator = ( w1 , w2 , ... , wn ) ;
gdzie:
identyfikator - nazwa definiowanego typu danych
w1 , w2 , ... , wn - zbiór wartości definiowanego typu Przykłady:
dzien_tygodnia = ( pn, wt, sr, czw, pt, so, nie ) ; miesiac = ( styczen, luty, marzec, kwiecien, maj, czerwiec, lipiec, sierpien, wrzesien, pazdziernik, listopad, grudzien ) ; sport = ( plywanie, kolarstwo, maraton, skoki_narciarskie, bieg_narciarski, biatlon ) ; Typ okrojony definiuje się na podstawie wcześniej określonych typów porządkowych.
TYPE
Identyfikator = w1 . . wn ;
gdzie:
identyfikator - nazwa definiowanego typu danych
w1 , wn - wartości tego samego typu porządkowego oraz w1 ≤ wn Przykłady:
rok = 1 .. 5 ;
{ 1, 2, 3, 4, 5 }
dzien_roboczy
= pn .. pt ;
ocena = 2 .. 5 ;
{ 2, 3, 4, 5 }
kwartal_1
= styczen .. marzec ;
duze_litery = 'A' .. 'Z' ;
{ 'A', 'B', ..., 'Z' }
polrocze_1
= styczen .. czerwiec ;
sporty_zimowe
= skoki_narciarskie .. biatlon ;
Typ tablicowy
TYPE
identyfikator_typu1 = array [ idp .. idk ] of typ ; identyfikator_typu2 = array [ id1p .. id1k , ... , idNp .. idNk ] of typ ; Przykłady:
tablica
= array [ 1..10, 'A' .. 'Z' ] of real ;
str15
= string [15] ;
TNazwisko = string [25] ;
PAU - Pascal cz. 5
3 / 3