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ť.