Wstęp do programowania/Pliki/Ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pch (dyskusja | edycje)
Pch (dyskusja | edycje)
Linia 14: Linia 14:


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
Najprostsze rozwiązanie polega na policzeniu liczby linii w jednym i drugim pliku, a potem porównaniu tych liczb.
Najprostsze rozwiązanie polega na policzeniu liczby wierszy w jednym i drugim pliku, a potem porównaniu tych liczb.
</div>
</div>
</div>}}
</div>}}


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''function''' LiczLinie(f:Text):integer;
  '''function''' LiczWiersze(f:Text):integer;
  // f otwarty plik tekstowy
  // f otwarty plik tekstowy
  '''var''' c:character;
  '''var''' c:character;
Linia 31: Linia 31:
     l:=l+1;
     l:=l+1;
   '''end''';
   '''end''';
   LiczLinie:=l;
   LiczWiersze:=l;
  '''end'''; // LiczLinie
  '''end'''; // LiczWiersze
   
   
  '''function''' RownoLinijne(s1,s2:string):boolean;
  '''function''' RownoWierszowe(s1,s2:string):Boolean;
  '''var''' f1,f2:Text;
  '''var''' f1,f2:Text;
  '''begin''' // RownoLinijne
  '''begin''' // RownoWierszowe
   assign(f1,s1);
   assign(f1,s1);
   assign(f2,s2);
   assign(f2,s2);
   reset(f1);
   reset(f1);
   reset(f2);
   reset(f2);
   RownoLinijne:=LiczLinie(f1)=LiczLinie(f2);
   RownoLinijne:=LiczWiersze(f1)=LiczWiersze(f2);
   close(f1);
   close(f1);
   close(f2);
   close(f2);
  '''end'''; // RownoLinijne
  '''end'''; // RownoWierszowe


Zaletą tego rozwiązania jest możliwość powtórnego wykorzystania funkcji LiczLinie do innych celów, a wadą konieczność czytania obu plików, nawet gdy jeden jest bardzo mały, a drugi bardzo duży.  
Zaletą tego rozwiązania jest możliwość powtórnego wykorzystania funkcji LiczWiersze do innych celów, a wadą konieczność czytania obu plików, nawet gdy jeden jest bardzo mały, a drugi bardzo duży.  
</div>
</div>
</div>}}
</div>}}


{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
Można też wczytywać po jednej linii z każdego pliku, aż któryś z nich się nie skończy.
Można też wczytywać po jednym wierszu z każdego pliku, aż któryś z nich się nie skończy.
</div>
</div>
</div>}}
</div>}}


{{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  '''function''' RownoLinijne(s1,s2:string):boolean;
  '''function''' RownoWierszowe2(s1,s2:string):Boolean; //s1,s2, to ścieżki dostępu do plików f1 i f2
  '''var''' f1,f2:Text;
  '''var''' f1,f2:Text;
   c:character;
   c:character;
Linia 65: Linia 65:
   reset(f2);
   reset(f2);
   '''while''' '''not''' (eof(f1) '''or''' eof(f2)) '''do''' '''begin'''
   '''while''' '''not''' (eof(f1) '''or''' eof(f2)) '''do''' '''begin'''
    '''while''' '''not''' eoln(f1) '''do'''
     readln(f1); //korzystamy tu z semantyki Readln, która połyka resztę wiersza i przechodzi do nowego.
      read(f1,c);
     readln(f1);
    '''while''' '''not''' eoln(f2) '''do'''
      read(f2,c);
     readln(f2);
     readln(f2);
   '''end''';
   '''end''';
   RownoLinijne:=eof(f1) '''and''' eof(f2);
   RownoWierszowe2:=eof(f1) '''and''' eof(f2);
   close(f1);
   close(f1);
   close(f2);
   close(f2);
  '''end'''; // RownoLinijne
  '''end'''; // RownoWierszowe2


Czytamy po jednej linii z każdego pliku, aż co najmniej jeden z nich się skończy. Jeśli okazało się, że skończyły się oba naraz - mają tę samą liczbę linii. Jeśli skończył się tylko jeden - ten drugi musi być dłuższy.
Czytamy po jednym wierszu z każdego pliku, aż co najmniej jeden z nich się skończy. Jeśli okazało się, że skończyły się oba naraz - mają tę samą liczbę wierszy. Jeśli skończył się tylko jeden - ten drugi musi być dłuższy.
</div>
</div>
</div>}}
</div>}}

Wersja z 22:32, 8 sty 2012

To są zadania na pliki.

Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__

W poniższych zadaniach zakładamy, że eof(f) implikuje eoln(f).


Zadanie 1

Napisz funkcję sprawdzającą, czy dwa pliki tekstowe o podanych nazwach mają tę samą liczbę wierszy.

Wskazówka 1

{{{3}}}

Rozwiązanie 1

{{{3}}}

Wskazówka 2

{{{3}}}

Rozwiązanie 2

{{{3}}}

Zadanie 2

Napisz procedurę, która skopiuje plik tekstowy f na g, modyfikując go w następujący sposób: bezpośrednio po każdym słowie należy wstawić koniec wiersza, a nowy wiersz rozpocząć od nowego słowa (spacje i puste wiersze należy pomijać).

Słowem (w tym zadaniu) nazywamy dowolny maksymalny spójny ciąg znaków niezawierający spacji i znaków końca wiersza. Nie zakładamy niczego o długości słów.

Wskazówka 1

{{{3}}}

Rozwiązanie 1

{{{3}}}

Rozwiązanie 2

{{{3}}}

Zadanie 3 (Usuwanie komentarzy)

Napisz procedurę usuwającą komentarze z pliku tekstowego zawierającego program w Pascalu.

Komentarze oznaczone są przez { ... } lub (* ... *). Należy przy tym uważać, by nie usuwać komentarzy znajdujących się wewnątrz napisów (oznaczonych przez ' ... ')

Wskazówka 1

{{{3}}}

Rozwiązanie 1

{{{3}}}