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”};
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
- 6 pkt. - Andrzej Piasecki
- 5,5 pkt. - Krystyna Lisiowska
- 4 pkt. - Tomasz Tomiczek
- 3 pkt. - Michał Żłobicki
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",
if ((((i+3)*(j+3))%(i+j+30))==7 || (((i+3)*(j+3))%(i+j+30))==15
||