Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Daria (dyskusja | edycje)
Poprawki po wizycie u Piotra
Daria (dyskusja | edycje)
Nie podano opisu zmian
 
(Nie pokazano 11 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 28: Linia 28:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska1(N:integer; A:array[1..N] of integer);
  '''program''' FlagaPolska1(N:integer; A:array[1..N] of integer);
//Tablica A jest wypełniona zerami i jedynkami
  '''const''' bialy = 0;
  '''const''' bialy = 0;
       czerwony = 1;
       czerwony = 1;
Linia 55: Linia 56:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska2(N:integer; A:array[1..N] of integer);
  '''program''' FlagaPolska2(N:integer; A:array[1..N] of integer);
//Tablica A jest wypełniona zerami i jedynkami
  '''const''' bialy = 0;
  '''const''' bialy = 0;
       czerwony = 1;
       czerwony = 1;
Linia 87: Linia 89:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska3(N:integer; A:array[1..N] of integer);
  '''program''' FlagaPolska3(N:integer; A:array[1..N] of integer);
//Tablica A jest wypełniona zerami i jedynkami
  '''const''' bialy = 0;
  '''const''' bialy = 0;
       czerwony = 1;
       czerwony = 1;
Linia 131: Linia 134:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska4(N:integer; A:array[1..N] of integer);
  '''program''' FlagaPolska4(N:integer; A:array[1..N] of integer);
//Tablica A jest wypełniona zerami i jedynkami
  '''const''' bialy = 0;
  '''const''' bialy = 0;
       czerwony = 1;
       czerwony = 1;
Linia 175: Linia 179:
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaTrojkolorowa(N:integer; A:array[1..N] of integer);
  '''program''' FlagaTrójkolorowa(N:integer; A:array[1..N] of integer);
  '''var''' m,r,w,pom : integer;
  '''var''' m,r,w,pom : integer;
  '''begin'''
  '''begin'''
Linia 200: Linia 204:
'''Rozwiązanie 2'''  
'''Rozwiązanie 2'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaTrojkolorowa(N:integer; A:array[1..N] of integer);
  '''program''' FlagaTrójkolorowa(N:integer; A:array[1..N] of integer);
  '''var''' m,r,w,pom : integer;
  '''var''' m,r,w,pom : integer;
  '''begin'''
  '''begin'''
Linia 226: Linia 230:


== Zadanie 3 (Najdłuższe plateau) ==
== Zadanie 3 (Najdłuższe plateau) ==
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 1,  długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0,  długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''  
'''Wskazówka 1'''  
Linia 236: Linia 240:
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau1(N:integer; A:array[1..N] of integer);
  '''program''' NajdłuższePlateau1(N:integer; A:array[1..N] of integer);
  '''var''' l,p,w,maks: integer;
  '''var''' l,p,w,maks: integer;
  '''begin'''
  '''begin'''
Linia 264: Linia 268:
'''Rozwiązanie 2'''  
'''Rozwiązanie 2'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau2(N:integer; A:array[1..N] of integer);
  '''program''' NajdłuższePlateau2(N:integer; A:array[1..N] of integer);
  '''var''' w,p,dl,maks: integer;
  '''var''' w,p,dl,maks: integer;
  '''begin'''
  '''begin'''
Linia 299: Linia 303:
'''Rozwiązanie 3'''  
'''Rozwiązanie 3'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau3(N:integer; A:array[1..N] of integer);
  '''program''' NajdłuższePlateau3(N:integer; A:array[1..N] of integer);
  '''var''' i,maks: integer;
  '''var''' i,maks: integer;
  '''begin'''
  '''begin'''
Linia 313: Linia 317:


== Zadanie 4 (Segment o maksymalnej sumie) ==
== Zadanie 4 (Segment o maksymalnej sumie) ==
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 1, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''   
'''Wskazówka 1'''   
Linia 419: Linia 423:
  '''end'''.
  '''end'''.
Ponieważ jest to rozwiązanie działające w czasie liniowym od N (p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy
Ponieważ jest to rozwiązanie działające w czasie liniowym od N (p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy
segmentu a maksymalnej sumie. To trzeba by udowodnić. Wrócimy do tego problemu w sekcji o niezmiennikach i logice Hoare'a.
segmentu a maksymalnej sumie. To trzeba by udowodnić. Temat ten będzie poruszany w module o niezmiennikach i logice Hoare'a.


''Koszt czasowy'': liniowy względem N
''Koszt czasowy'': liniowy względem N
Linia 445: Linia 449:
</div>
</div>
</div>
</div>
== Zadanie 5 (Część wspólna zbiorów) ==
== Zadanie 5 (Część wspólna zbiorów) ==
Dane są dwie tablice A i B typu array[1..N] of integer, N > 1. Obie są
Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu
zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.
zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.
Linia 457: Linia 462:
'''Rozwiązanie 1'''
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' CzescWspolna(N:integer; A,B:array[1..N] of integer);
  '''program''' CzęśćWspólna(N:integer; A,B:array[1..N] of integer);
//Tablice A i B są posortowane rosnąco
  '''var''' ia,ib: integer;
  '''var''' ia,ib: integer;
  '''begin'''
  '''begin'''
Linia 478: Linia 484:


== Zadanie 6 (Suma zbiorów) ==
== Zadanie 6 (Suma zbiorów) ==
Dane są dwie tablice A i B typu array[1..N] of integer, N > 1. Obie są
Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu
zbiorów wypisać (operacją write) sumę tych zbiorów.
zbiorów wypisać (operacją write) sumę tych zbiorów.
Linia 490: Linia 496:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Suma(N:integer; A,B:array[1..N] of integer);
  '''program''' Suma(N:integer; A,B:array[1..N] of integer);
//Tablice A i B są posortowane rosnąco
  '''var''' ia,ib: integer;
  '''var''' ia,ib: integer;
  '''begin'''
  '''begin'''
Linia 531: Linia 538:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Suma(N:integer; A,B:array[1..N] of integer);
  '''program''' Suma(N:integer; A,B:array[1..N] of integer);
//Tablice A i B są posortowane rosnąco
  '''var''' ia,ib: integer;
  '''var''' ia,ib: integer;
  '''function''' mniejsze(ia,ib: integer):boolean; //funkcja porównująca wartości w ia i ib
  '''function''' mniejsze(ia,ib: integer):boolean; //funkcja porównująca wartości w ia i ib
Linia 565: Linia 573:


== Zadanie 7 (Podciąg) ==
== Zadanie 7 (Podciąg) ==
Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 1. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]).
Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 0. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]).
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''  <div class="mw-collapsible-content" style="display:none">
'''Wskazówka 1'''  <div class="mw-collapsible-content" style="display:none">
Linia 574: Linia 582:
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Podciag(N,M:integer; A:array[1..N] of integer; B:array[1..M] of integer);
  '''program''' Podciąg(N,M:integer; A:array[1..N] of integer; B:array[1..M] of integer);
  '''var''' ia,ib: integer;
  '''var''' ia,ib: integer;
     istnieje: boolean;
     istnieje: boolean;
Linia 674: Linia 682:
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Przesun1(N,k:integer; A:array[1..N] of integer);
  '''program''' Przesuń1(N,k:integer; A:array[1..N] of integer);
  '''var''' i: integer;
  '''var''' i: integer;
   P: array[0..N-1] of integer;
   P: array[0..N-1] of integer;
Linia 695: Linia 703:
'''Rozwiązanie 2'''  
'''Rozwiązanie 2'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Przesun2(N,k:integer; A:array[1..N] of integer);
  '''program''' Przesuń2(N,k:integer; A:array[1..N] of integer);
// k > 1
  '''var''' dl_cyklu,ile_cykli: integer;
  '''var''' dl_cyklu,ile_cykli: integer;
  '''begin'''
  '''begin'''
Linia 726: Linia 735:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Przesun3(N,k:integer; A:array[1..N] of integer);
  '''program''' Przesun3(N,k:integer; A:array[1..N] of integer);
// k > 1
  '''begin'''
  '''begin'''
   OdwracanieTablicy(A,0,N-k-1);
   OdwracanieTablicy(A,0,N-k-1);
Linia 731: Linia 741:
   OdwracanieTablicy(A,0,N-1);
   OdwracanieTablicy(A,0,N-1);
  '''end'''.
  '''end'''.
Procedura Odwroc pochodzi z Zadania 8. Poprawność tego rozwiązania można uzasadnić poniższym rysunekiem. W pierwszej linii jest aryginalna tablica, a w kolejnych tablica po kolejnych wywolaniach procedury OdwracanieTablicy.
Procedura OdwracanieTablicy pochodzi z Zadania 8. Poprawność tego rozwiązania można uzasadnić poniższym rysunekiem. W pierwszej linii jest aryginalna tablica, a w kolejnych tablica po kolejnych wywolaniach procedury OdwracanieTablicy.
   a(0)    a(1)    ...        ...    a(N-k-1) a(N-k)    ...        a(N-1)
   a(0)    a(1)    ...        ...    a(N-k-1) a(N-k)    ...        a(N-1)
  a(N-k-1) a(N-k-2)  ...        ...    a(0)    a(N-k)    ...        a(N-1)
  a(N-k-1) a(N-k-2)  ...        ...    a(0)    a(N-k)    ...        a(N-1)
Linia 744: Linia 754:


== Zadanie 10 (Następna permutacja) ==
== Zadanie 10 (Następna permutacja) ==
Tablica A typu array[1..N] of integer zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną leksykograficznie [[permutację]]. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie.
Tablica A typu array[1..N] of integer, N > 0,  zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną leksykograficznie [[permutację]]. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie.


'''Przykład''' Dla N=3 kolejne permutacje w [[porządku leksykograficznym]] wyglądają nastepująco:
'''Przykład''' Dla N=3 kolejne permutacje w [[porządku leksykograficznym]] wyglądają nastepująco:
Linia 762: Linia 772:
'''Rozwiązanie 1'''   
'''Rozwiązanie 1'''   
<div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible-content" style="display:none">  
  '''program''' NastepnaPermutacja(N:integer; A:array[1..N] of integer);
  '''program''' NastępnaPermutacja(N:integer; A:array[1..N] of integer);
//Permutacja zapisana w A nie jest ostatnia leksykograficznie
  '''var''' i,k,pom: integer;
  '''var''' i,k,pom: integer;
  '''begin'''
  '''begin'''
Linia 786: Linia 797:
</div>
</div>


== Zadanie 11 (Segment o zadanej sumie)  ==
== Zadanie 11 (Segment o danej sumie)  ==
Tablica A typu array[1..N] of integer zawiera tylko liczby dodatnie. Napisz program który dla danego W typu integer sprawdza czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W<math>=A[l]+...+A[p-1]</math>).
Tablica A typu array[1..N] of integer, N > 0,  zawiera tylko liczby dodatnie. Napisz program który dla danego W typu integer sprawdza czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W<math>=A[l]+...+A[p-1]</math>).
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''   
'''Wskazówka 1'''   
Linia 799: Linia 810:
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' SegmentODanejSumie1(N,W:integer; A:array[1..N] of integer);
  '''program''' SegmentODanejSumie1(N,W:integer; A:array[1..N] of integer);
//Tablica A zawiera tylko liczby dodatnie
  '''var''' l,p,suma: integer;
  '''var''' l,p,suma: integer;
     znalezione: boolean;
     znalezione: boolean;
Linia 835: Linia 847:
<div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible-content" style="display:none">  
  '''program''' SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer);
  '''program''' SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer);
//Tablica A zawiera tylko liczby dodatnie
  '''var''' l,p,suma: integer;
  '''var''' l,p,suma: integer;
     znalezione: boolean;
     znalezione: boolean;
Linia 841: Linia 854:
   '''else''' '''begin'''
   '''else''' '''begin'''
     l:=1; p:=1;
     l:=1; p:=1;
     suma:=A[1];
     suma:=0;
     '''while''' (suma <> W) '''and''' (p <= N) '''do'''
     '''while''' (suma <> W) '''and''' (p <= N) '''do'''
       '''if''' suma < W '''then''' '''begin''' //jeśli suma jest za mała to przesuwamy prawy koniec segmentu
       '''if''' suma < W '''then''' '''begin''' //jeśli suma jest za mała to przesuwamy prawy koniec segmentu
        suma:=suma+A[p];
         p:=p+1;
         p:=p+1;
        suma:=suma+A[p];
       '''end'''
       '''end'''
       '''else''' '''begin''' //jeśli za duża to przesuwamy lewy koniec segmentu
       '''else''' '''begin''' //jeśli za duża to przesuwamy lewy koniec segmentu
        suma:= suma-A[l];
         l:=l+1;
         l:=l+1;
        suma:= suma-A[l];
       '''end''';
       '''end''';
       znalezione:=(suma=W);
    '''while''' (suma > W) '''do''' '''begin'''          //jeśli suma nadal za duża to próbujemy ją zmniejszyć
       suma:= suma-A[l];
      l:=l-1;
    '''end''';
    znalezione:=(suma=W);
   '''end''';  //else
   '''end''';  //else
   '''if''' znalezione '''then''' write('W tablicy A istnieje segment o sumie W);  
   '''if''' znalezione '''then''' write('W tablicy A istnieje segment o sumie W);  
  '''end'''.
  '''end'''.
Ponieważ jest to rozwiązanie działające w czasie liniowym od N (l+p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy
Ponieważ jest to rozwiązanie działające w czasie liniowym od N (l+p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy
segmentu a maksymalnej sumie. To trzeba by udowodnić. Wrócimy do tego problemu w sekcji o niezmiennikach i logice Hoare'a.
segmentu a maksymalnej sumie. To trzeba by udowodnić. Wrócimy do tego problemu w module o niezmiennikach i logice Hoare'a.


''Koszt czasowy'': liniowy względem N
''Koszt czasowy'': liniowy względem N
Linia 865: Linia 882:


== Zadanie 12 (Głosowanie większościowe) ==
== Zadanie 12 (Głosowanie większościowe) ==
Dana jest tablica A typu array[1..N] of integer, N > 1. Sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskaż go.
Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskaż go.


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Linia 876: Linia 893:
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Glosowanie1(N:integer; A:array[1..N] of integer);
  '''program''' Głosowanie1(N:integer; A:array[1..N] of integer);
  '''var''' i,j,ile,indeks_lidera: integer;
  '''var''' i,j,ile,indeks_lidera: integer;
  '''begin'''
  '''begin'''
Linia 905: Linia 922:
'''Rozwiązanie 2'''  
'''Rozwiązanie 2'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Glosowanie2(N,W:integer; A:array[1..N] of integer);
  '''program''' Głosowanie2(N,W:integer; A:array[1..N] of integer);
  '''var''' ile,i,kand,lider: integer;
  '''var''' ile,i,kand,lider: integer;
  '''begin'''
  '''begin'''
Linia 919: Linia 936:
       '''end''';
       '''end''';
   '''end''';
   '''end''';
   ile:=0; //sprawdzamy czy kandydat a jest liderem
   ile:=0; //sprawdzamy czy kandydat jest liderem
   '''for''' i:=1 '''to''' '''do'''  
   '''for''' i:=1 '''to''' '''do'''  
     '''if''' A[i]=kand '''then''' ile:=ile+1;  
     '''if''' A[i]=kand '''then''' ile:=ile+1;  
Linia 936: Linia 953:


== Zadanie 13 (Arytmetyka liczb wielocyfrowych) ==
== Zadanie 13 (Arytmetyka liczb wielocyfrowych) ==
Liczby wielocyfrowe będą reprezentowane w tablicach typu liczba=array[0..N-1] of integer w taki sposób, że najmniej znacząca cyfra jest pod indeksem 0. Rozpatrujemy liczby przy podstawie b > 1. Napisz procedury obliczające:
Liczby wielocyfrowe będą reprezentowane w tablicach typu liczba=array[0..N-1] of integer, N > 1, w taki sposób, że najmniej znacząca cyfra jest pod indeksem 0. Rozpatrujemy liczby przy podstawie b > 1. Napisz procedury obliczające:
# sumę liczb A i B do C. Jeśli wynik nie zmieści się w C to wartość C nie ma znaczenia. Zmienna przepełnienie wskazuje czy do niego doszło czy nie.
# sumę liczb A i B do C. Jeśli wynik nie zmieści się w C to wartość C nie ma znaczenia. Zmienna przepełnienie wskazuje czy do niego doszło czy nie.
# różnicę A i B do C. Jeśli wynik miałby byc liczbą ujemną to wartość C nie ma znaczenia. Zmienna ujemny wskazuje jaki jest znak wyniku.
# różnicę A i B do C. Jeśli wynik miałby byc liczbą ujemną to wartość C nie ma znaczenia. Zmienna ujemny wskazuje jaki jest znak wyniku.
Linia 951: Linia 968:
Poniżej treści procedur Suma, Roznica, Iloczyn:
Poniżej treści procedur Suma, Roznica, Iloczyn:
   
   
  '''procedure''' Suma(A,B:liczba, var C:liczba, var:przepelnienie:boolean);
  '''procedure''' Suma(A,B:liczba, var C:liczba, var:przepełnienie:boolean);
//Sumujemy liczby zapisane w A i B do C; zmienna przepełnienie staje się true gdy wynik nie mieści się w C.
  '''var''' p: integer;
  '''var''' p: integer;
  '''begin'''
  '''begin'''
Linia 963: Linia 981:
     '''else''' p:=0;
     '''else''' p:=0;
   '''end''';
   '''end''';
   przepelnienie:=(p=1);
   przepełnienie:=(p=1);
  '''end''';
  '''end''';
''Koszt czasowy'': liniowy względem N
''Koszt czasowy'': liniowy względem N


''Koszt pamięciowy'': stały
''Koszt pamięciowy'': stały
  '''procedure''' Roznica(A,B:liczba, var C:liczba, var:ujemny:boolean);
  '''procedure''' Różnica(A,B:liczba, var C:liczba, var:ujemny:boolean);
//Odejmujemy od liczby zapisanej w A liczbę z B. Wynik zapisujemy w C, zmienna ujemny informuje o znaku wyniku.
  '''var''' p: integer;
  '''var''' p: integer;
  '''begin'''
  '''begin'''
Linia 986: Linia 1005:
''Koszt pamięciowy'': stały
''Koszt pamięciowy'': stały
  '''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba);
  '''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba);
//Iloczyn liczb zapisanych w A i B zapisujemy w C.
  '''var''' p,i,j: integer;
  '''var''' p,i,j: integer;
  '''begin'''
  '''begin'''

Aktualna wersja na dzień 13:02, 20 lip 2006

Ta strona zawiera podstawowe zadania na tablice.

Ogladaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__


Zadanie 1 (Flaga polska)

Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Podaj algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony czerwone, potem białe. Robot może wykonywać dwa rodzaje operacji:

  • Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n)
  • Z(i,j) - zamienia żetony z i-tej i j-tej urny (1 ≤ i,j ≤ n)

Uwagi:

  1. Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz.
  2. Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1.
  3. Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Wskazówka 3

Rozwiązanie 3

Wskazówka 4

Rozwiązanie 4

Pytanko 1

Pytanko 2


Zadanie 2 (Flaga trójkolorowa)

Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie.

Wskazówka 1

Rozwiązanie 1

Rozwiązanie 2

Zadanie 3 (Najdłuższe plateau)

Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Pytanko 1

Inna wersja zadania

A co było gdyby tablica była posortowana ?

Wskazówka 3

Rozwiązanie 3

Zadanie 4 (Segment o maksymalnej sumie)

Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Wskazówka 3

Rozwiązanie 3

Wskazówka 4

Rozwiązanie 4

Rozwiązanie 5

Zadanie 5 (Część wspólna zbiorów)

Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.

Wskazówka 1

Rozwiązanie 1

Zadanie 6 (Suma zbiorów)

Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) sumę tych zbiorów.

Wskazówka 1

Rozwiązanie 1

Pytanko 1

Wskazówka 2

Rozwiązanie 2

Zadanie 7 (Podciąg)

Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 0. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]).

Wskazówka 1

Rozwiązanie 1

Zadanie 8 (Odwracanie tablicy)

Dana tablica A typu array[0..N-1] of integer, N > 1. Napisz program odwracający kolejność elementów w A.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Zadanie 9 (Przesunięcie cykliczne)

Dana tablica A typu array[0..N-1] of integer, N > 1, i liczba naturalna k > 1. Napisz program realizujący przesunięcie cykliczne w prawo o k pól, czyli przesuwający zawartość pola A[i] na A[(i+k) mod N] dla każdego i < N.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Wskazówka 3

Rozwiązanie 3

Zadanie 10 (Następna permutacja)

Tablica A typu array[1..N] of integer, N > 0, zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną leksykograficznie permutację. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie.

Przykład Dla N=3 kolejne permutacje w porządku leksykograficznym wyglądają nastepująco:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

Wskazówka 1

Rozwiązanie 1

Zadanie 11 (Segment o danej sumie)

Tablica A typu array[1..N] of integer, N > 0, zawiera tylko liczby dodatnie. Napisz program który dla danego W typu integer sprawdza czy w A istnieje segment o sumie W (czyli czy istnieją l, p takie, że W=A[l]+...+A[p1]).

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Zadanie 12 (Głosowanie większościowe)

Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskaż go.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Zadanie 13 (Arytmetyka liczb wielocyfrowych)

Liczby wielocyfrowe będą reprezentowane w tablicach typu liczba=array[0..N-1] of integer, N > 1, w taki sposób, że najmniej znacząca cyfra jest pod indeksem 0. Rozpatrujemy liczby przy podstawie b > 1. Napisz procedury obliczające:

  1. sumę liczb A i B do C. Jeśli wynik nie zmieści się w C to wartość C nie ma znaczenia. Zmienna przepełnienie wskazuje czy do niego doszło czy nie.
  2. różnicę A i B do C. Jeśli wynik miałby byc liczbą ujemną to wartość C nie ma znaczenia. Zmienna ujemny wskazuje jaki jest znak wyniku.
  3. iloczyn A i B do C (C powinno być tablicą dwa razy dłuższą niż A i B, żeby móc pomieścić wynik).

Rozwiązanie 1