listopad 2018

Data ostatniej modyfikacji:
2019-07-4

Tematem przewodnim edycji maj 2017/2018 były łańcuchy. W łańcuchach można odwoływać się do poszczególnych znaków w napisie. Stanowi to pewne ograniczenie, bo co zrobić w sytuacji, gdy mamy kolekcję elementów tego samego typu, które składają się z więcej niż jednego znaku?

Tutaj przychodzi nam z pomocą tablica (ang. array). Odwoływanie się do elementów tablicy odbywa się podobnie jak w przypadku łańcuchów przez indeks. Numeracja indeksu również zaczyna się od 0. Gdzie zatem tkwi różnica? Otóż w przeciwieństwie do łańcuchów tablice mogą być wierszowe (jeden wymiar), prostokątne (dwa wymiary), prostopadłościenne (trzy wymiary) oraz wyżej wymiarowe. W tablicach poszczególne elementy są adresowane przez ciąg indeksów zgodny z wymiarem tablicy (patrz przykłady). Rozmiar tablicy, czyli liczba jej elementów, jest albo ustalony z góry (tablice statyczne), albo może się zmieniać w trakcie wykonywania programu (tablice dynamiczne).

Przykład 1

#include <iostream>
using namespace std:
int main
()

{

int tablica[3]; //definicja tablicy wierszowej, statycznej o nazwie 'tablica' zawierającej 3 elementy
tablica[0] = 15;
tablica[1] = -33;
tablica[2] = 2018;

    //lub szybciej
   char
array[] = {"M","a","t","u","r","a"};   /* tablica wierszowa, statyczna o nazwie 'array' z
zadeklarowaną zawartością, elementy tupu char musimy podać w cudzysłowach, na podstawie zawartości kompilator automatycznie nada wielkość tablicy: 6 */

  cout<< "Drugi element tablicy to: " << tablica[1] << endl;
  cout
<< "Piąty element drugiej tablicy to: " << array[4] << endl;

return 0;

}

Drugi element tablicy to -33.
Piąty element drugiej tablicy to r.

Próba odwołania się do tablica[4] jest błędna, ponieważ numeracja zaczyna się od 0. Spowoduje to awaryjne zakończenie działania programu!

 Przykład 2

#include <iostream>
using namespace std:
int
main()

{

int liczby_pierwsze[3][5] = {{2,3,5,7,11},{13,17,19,23,29},{31,37,41,43,47}};

   /* lub szybciej: int liczby_pierwsze[3][5] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47} - jest to tablica prostokątna o nazwie 'liczby_pierwsze', statyczna z zadeklarowaną zawartością */
 

int pierwszy_index, drugi_index;

  cout<< "Podaj liczbe wierszy"  << endl;
 
cin >> pierwszy_index;

  cout<< endl << " Podaj liczbe kolumn" << endl;
 
cin >> drugi_index;

  double przyklad[pierwszy_index][drugi_index];      /* lub szybciej: - jest to tablica dwuwymiarowa o nazwie 'przykład', również statyczna */

  przykład[0][0] = 3,14;  //odwoływanie się do poszczególnych elementów
  przykład[0][1] = 1,73;
  przykład[0][2] = 1,41;  //itd

return 0;

}

Tablica wierszowa reprezentuje w matematyce ciąg lub wektor (jego współrzędne), a prostokątna reprezentuje macierz.

A co z tablicami dynamicznymi? Przykładem implementacji tablicy dynamicznej np. w C++ jest klasa VECTOR, która reprezentuje tablice, ale w momencie kompilacji nie posiada zadeklarowanej wielkości.

 

Uwaga. Celem poniższych zadań jest znalezienie ciekawych, autorskich rozwiązań, a nie korzystanie z wbudowanych funkcji różnych bibliotek, które wypaczą sens tych zadań.

Zad. 1. Napisz program, który daną tablicę posortuje leksykograficznie:

string portal[] = {"Wroclawski","Portal","Matematyczny","matematyka","jest","ciekawa"};.

Zad. 2. Co wyświetli poniższy fragment kodu?

string sylaby[7][7]= {”e”,”pa”,”mno”,”wy”,”kwa”,”pro”,”dzia”,“ciag”,”pi”,”troj”,”ma”,”te”,”tu”,
”ze”,"sto”,”cyr”,”la”,"ra”,”a”,”ta”,”po”,“pa”,”te”,”ryt”,”go”,”ma”,”te”,”nie”,“go”,”ma”,”dla”,”ras”,
”bo”,"twier”,”kiel”,"kier”,”me”,”ra”,”ta”,”dze”,”sa”,”wa”,“ko”,”nie”,”la”,”drat”,”ny”,”ciez”,”nie”
};

for (int i=0;i<7;i++)
{
     for (int j=0;j<7;j++)
     {
         if (((((i+2)*(j+2))%(i+j+2)) == 8 || (((i+2)*(j+2))%(i+j+2)) == 9))
               cout<<sylaby[i][j];
     }
}

cout<< " ";

for (int l=0;l<7;l++)
{
     for (int m=0;m<7;m++)
     {
         if (((((l+2)*(m+2))%(l+m+2)) == 1))
               cout<<sylaby[l][m];
     }
}

Zad. 3. Często programista zamin przystąpi do wpisywania kodu, musi najpierw wymyślić algorytm postępowania. Dlatego napisz program, który dla poniższej tablicy wyświetli napis: "wroclawski portal matematyczny".

string sylaby2[7][7]= {“pi”,”pra”,”wroc”,”hi”,”twier”,”pier”,”wy”,“ta”,”sred”,”pro”,”dze”,”dzie”,
”wiast”,"e”,“law”,”go”,"pa”,”ski”,”kier”,”ko”,”por”,“li”,”klad”,”tal”,”per”,”sto”,”nij”,”ma”,“wa”,
”dzi”,"ras”,”ka”,"bo”,"nia”,”te”,“nik”,”ra”,”nie”,”bo”,”wo”,”nie”,”na”,“kat”,”ka”,”ma”,”tycz”,”ny”,
”la”,”ma”
};

 

Wyniki: 

Dziękujemy wszystkim, którzy powrócili do ligi po przerwie
wakacyjnej. Serdecznie witamy nowych uczestników.

W listopadzie wyniki prezentują się następująco:

  • 3 pkt. - Andrzej Piasecki - administrator IT z Oleśnicy
  • 2,5 pkt. - Krystyna Lisiowska - redaktor z Warszawy
  • 2 pkt. - Tomasz Tomiczek - nauczyciel z Lipowej
 
Po dwóch miesiącach trwania Ligi czołówka wygląda następująco:
  • 6 pkt. - Andrzej Piasecki
  • 5,5 pkt. - Krystyna Lisiowska
  • 4 pkt. - Tomasz Tomiczek
  • 3 pkt. - Michał Żłobicki
 
 
Odpowiedzi: 

Zad. 1. Przykładowy kod sortujący leksykograficznie (słownikowo), może wyglądać następująco:

string wielkie (string napis)
{
   int i, j;
   string small = "abcdefghijklmnopqrstuvwxyz";
   string capital = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   string wynik = napis;
   for (i=0; napis[i] != '\0'; i++)
      {
         for (j=0; j<26 && napis[i] != small[j]; j++);
         if (j<26)
            wynik[i] = capital[j];
      }
   return wynik;
}

int main()
{
     string portal[] = {"Wroclawski","Portal","Matematyczny","matematyka","jest","ciekawa"};
     string napis;
     for (int i=0;i<5;i++)
         for (int j=0;j<5;j++)
             if (wielkie(portal[j]) > wielkie(portal[j+1]))
                {
                     napis = portal[j];
                     portal[j] = portal[j+1];
                     portal[j+1] = napis;
                }
     for (int i=0;i<6;i++)
          cout<<portal[i]<<" ";
}

W porądku słownikowym nie rozróżniamy pomiędzy małymi i wielkimi literami, dlatego poprawnie posortowana tablica wierszowa portal powinna wzglądać następująco:

portal[] = {"ciekawa","jest",""Matematyczny","matematyka","Portal",Wroclawski"};

Powyżej bardzo ciekawe rozwiązanie jednego z uczestników, które wykorzystuje pomysł z października.

Zad. 2. Poniższy fragment kodu wyświetli nazwę słynnego twierdzenia: twierdzenie Pitagorasa.

Zad. 3. Przykładowy algorytm zwracający zadany napis może mieć następującą skłanię:

 string sylaby2[7][7]= {“pi”,”pra”,”wroc”,”hi”,”twier”,”pier”,”wy”,“ta”,”sred”,”pro”,”dze”,”dzie”,
”wiast”,"e”,“law”,”go”,"pa”,”ski”,”kier”,”ko”,”por”,“li”,”klad”,”tal”,”per”,”sto”,”nij”,”ma”,“wa”,
”dzi”,"ras”,”ka”,"bo”,"nia”,”te”,“nik”,”ra”,”nie”,”bo”,”wo”,”nie”,”na”,“kat”,”ka”,”ma”,”tycz”,”ny”,
”la”,”ma”
};
for (int i=0;i<7;i++)
{
     for (int j=0;j<7;j++)
     {
         if (((i+1)*(k+1))%((7-i)+(7-k)) == 3)
               cout<<sylaby[i][j];
     }
}

lub rozwiązanie nadesłane przez uczestniczkę:

{string sylaby2[7][7]= {"pi","pra","wroc","hi","twier","pier","wy","ta","sred","pro","dze","dzie",

"wiast","e","law","go","pa","ski","kier","ko","por","li","klad","tal","per","sto","nij","ma","wa",
"dzi","ras","ka","bo","nia","te","nik","ra","nie","bo","wo","nie","na","kat","ka","ma","tycz","ny",
"la","ma"};

int ile;
ile=1;
for (int i=0;i<7;i++)
{
     for (int j=0;j<7;j++)
     {
 
       if ((((i+3)*(j+3))%(i+j+30))==7 || (((i+3)*(j+3))%(i+j+30))==15
||
            (((i+3)*(j+3))%(i+j+30))==23 || (((i+3)*(j+3))%(i+j+30)) == 30)
               {   cout<<sylaby2[i][j]
                    ile++;
                    if (ile==4 || ile==6) cout<< " ";
               }
     }
}

 

Powrót na górę strony