Cvičenie č. 6 - Reťazce a práca so súbormi
Typ “char” a “string”
- char je špeciálný prípad celého čísla, ktoré pascal interpretuje ako jeden z 256 znakov ASCII tabuľky.
- string je reťazec char-ov. Jeho dĺžka je 255, ak nie je špecifikované inak.
Základné funkcie pre prácu s char-mi a string-ami
- chr(b:byte): char - funkcia, ktorá skonvertuje celočíselnú hodnotu b na typ char.
- ord(x): longint - funkcia, ktorá skonvertuje ľubovoľný ordinálny typ na celé číslo. Medzi ordinálne typy patria všetky celočíselné typy: integer, shortint, longint + char a ďaľšie.
- str(x; var s: string) - procedúra, ktorá do premennej s uloží reťazcovú reprezentáciu celého čisla x.
- val(s: string;var x; code: integer) - procedúra, ktorá vezme reťazec uložený v premennej s a uloží jeho celočíselnú reprezentáciu do premennej x. Ak nastane chyba, napr. reťazec na vstupe nereprezentuje číslo, tak uloží do premennej code index chybného znaku. Ak je všetko ok, do code vloží 0.
- length(s:string): integer - funkcia, ktorá vráti dĺžku reťazca s.
Príklady:
1.)
program kody;
var i : integer;
begin
for i:=0 to 255 do
writeln(i,': ', chr(i));
end.2.)
program opisovacVstupu;
var c : char;
begin
{ Nacitame kym nenarazime na koniec vstupu,
na klavesnici sa zada ako Ctrl + Z}
while not(EOF) do
begin
read(c);
write(c);
end;
end.3.)
program pracaSoStringami;
var str1, str2: string; {dlzka 255}
str3: string[10]; {dlzka 10}
c: char;
n: integer;
begin
readln(str1);
readln(str2);
writeln('Retazec str1:');
writeln(str1);
writeln('Konkatenacia str1 a str2');
writeln(str1 + str2);
writeln('Znak na pozicii 1 v retazci str1:');
c := str1[1];
writeln(c);
writeln('Dlzka str1:');
n:=length(str1);
writeln(n);
end.Úlohy
Je zadaný znak cifra?
Napíšte funkciu isDigit, ktorá dostane na vstup jeden char a vráti True ak ide o číslo a False inak.
Riešenie
function isDigit(c: char): boolean;
begin
isDigit := (c >= '0') and (c <= '9');
{ ekvivalentne mozeme podmienku napisat
ako (ord(c) >= ord('0')) and (ord(c) <= ord('9')) }
end;Caps Lock
Napíšte funkciu toUpperCase, ktorá dostane na vstup jeden char a ak ide o malé písmeno, tak ho prevedie na velké.
Riešenie
function toUpperCase(c: char): char;
begin
if (c >= 'a') and (c <= 'z') then
toUpperCase := chr(ord(c) - (ord ('a') - ord('A')))
else
toUpperCase := c;
end;Načítanie čísla
Napíšte si vlastnú funkcu toInt, ktorá dostane na vstup jeden reťazec s. Ak s predstavuje celé čislo, tak vráti jeho hodnotu ako integer, inak vráti -1.
Na zamyslenie:
- Ako by ste naprogramovali inverznú funkciu toString?
- Ako by ste upravili váš kód, ak by na vstup dostal číslo v binárnej sústave?
Riešenie
function toInt(s: string): integer;
var i: integer;
begin
i := 1;
toInt := 0;
while (i <= length(s)) and isDigit(s[i]) do begin
toInt := toInt * 10 + ord(s[i]) - ord('0');
inc(i);
end;
if i <> length(s) + 1 then
toInt := -1;
end;Prevod do dvojkovej sústavy
Napíšte funkciu dec2bin, ktorá dostane na vstup jedno číslo v desiatkovej sústave ako reťazec a vráti jeho binárnu reprezentáciu, tiež ako reťazec.
Riešenie
function dec2bin(num: integer): string;
var rem: integer;
begin
if num = 0 then begin
dec2bin := '0';
end else begin
dec2bin := '';
while num > 0 do begin
rem := num mod 2;
dec2bin := chr(ord('0') + rem) + dec2bin;
num := num div 2;
end;
end;
end;Práca so súbormi
Pre prácu s textovými súbormi sa používa dátový typ text, tzn. var f: text.
Základné príkazy pre prácu so súbormi:
- assign(f, cesta) - pripojí do premennej f súbor nachádzajúci sa na danej ceste. Cesta môže byť zadaná relatívne (vzhľadom k zložke z ktorej spúštate váš program) napr. in.txt alebo absolútne napr. C:\in.txt.
- reset(f) - otvorí súbor f pre čítanie.
- rewrite(f) - otvorí súbor f pre zápis, ak súbor už existoval, tak ho prepíše.
- append(f) - otvorí súbor f pre zápis, ak súbor už existoval, tak ďaľšie zápisy k nemu pripojí.
- EOF(f) - koniec vstupu súboru f.
- EOLN(f) - koniec riadku súboru f.
- read(f, x) - načítanie zo súboru f, funguje rovnako ako zo štandardného vstupu.
- write(f, x) - zapisovanie do súboru f, funguje rovnako ako do štandardného výstupu.
Príklad:
program skopirujSubor;
var c:char;
f:text;
g:text;
begin
assign(f,'in.txt');
assign(g,'out.txt');
reset( f );
rewrite( g );
while not EOF(f) do
begin
read(f,c);
write(g, c);
end;
close(f);
close(g);
end.Úlohy
Stiahnite si súbor numbers.txt (pre windows, pre linux/mac) a používajte ho ako vstup pre všetky úlohy v tejto časti.
Počet znakov
Spočítajte koľko znakov sa nachádza v súbore numbers.txt a toto číslo vypíšte na štandardný výstup.
Charakteristika distribúcie
Spočítajte základné charakteristiky distribúcie čísel, ktoré sa nachádzajú v súbore numbers.txt. Začnite postupne od najjednoduchších po tie zložitejšie:
- min a max
- priemer a rozptyl
- medián
- histogram - rozdelte interval [min, max] na niekoľko rovnakých častí a spočítajte koľko čísel zo súboru spadne do každej časti.
Výstupy vypisujte na štandardný výstup a aj do nejakého súboru.
Domáce úlohy
V CodEx-e nájdete svoje 2 povinné domáce úlohy: Palindromní věta a PPPPP 3.6 Soustavy.
Termín odovzdania: 15. 11. 2016 (23:59)
Hint pre PPPPP 3.6 Soustavy:
Najjednoduchšie riešenie tejto DÚ spočíva v úprave riešenia úlohy Načítanie čísla, tak aby ste boli schopný načítať číslo z ľubovolnej sústavy do integeru (tzn. do desiatkovej sústavy). Túto funkciu použijete na načítanie prvých dvoch čísel. Potom upravíte riešenie úlohy Prevod do dvojkovej sústavy tak, aby ste boli schopný previesť čislo v desiatkovej sústave do ľubovoľnej inej sústavy. Túto funkciu použijete na vypísanie výsledkov.
Príklad
Vstup: 5 11 2 101 7
- 11 v 5-kovej sústave je 6 v 10-kovej sústave
- 101 v 2-kovej sústave je 5 v 10-kovej sústave
- 6 + 5 = 11, 6 - 5 = 1, 6 * 5 = 30, 6 div 5 = 1
- čísla 11, 1, 30, 1 v 10-tkovej sústave sú čísla 14, 1, 42, 1 7-kovej sústave
Poznámka: Začnite premýšľať nad témou svojho zápočtového programu a svoje návrhy mi môžete začať posielať.