Odwracanie elementów w tablicy

Odwrócenie elementów w tablicy to zamiana ich miejscami. Ostatni element staje się pierwszym, pierwszy ostatnim, przedostatni drugim, drugi przedostatnim itd. Chcemy napisać metodę, która odwróci nam wszystkie elementy w przekazanej jako parametr tablicy liczb całkowitych.
01./**
02. * Odwracanie elementów w tablicy
03. * @author kodatnik.blogspot.com
04. */
05.public class OdwracanieElementow {
06.  
07. // metoda odwraca elementy w przekazanej jako parametr tablicy
08. public static void odwroc(int[] wejscie) {
09.   
10.  // indeks pierwszego elementu
11.  int poczatek  = 0;         
12.  // indeks ostatniego elementu
13.  int koniec = wejscie.length-1;
14.   
15.  // dopóki indeks początkowy jest mniejszy od indeksu końcowego
16.  while (poczatek < koniec) {
17.   // zamieniamy elementy
18.   int pomoc = wejscie[poczatek];
19.   wejscie[poczatek]  = wejscie[koniec];
20.   wejscie[koniec] = pomoc;
21.      
22.   // przesuwamy się w kierunku środka wektora zwiększając i zmniejszając odpowiednio indeksy
23.   poczatek++;
24.   koniec--;
25.  }
26. }
27.  
28. // metoda wyświetla zawartość tablicy przekazanej jako parametr na ekranie
29. public static void pokazTablice(int[] wejscie) {
30.  // każdy element znajdujący się w tablicy wyświetlamy na ekranie
31.  for(int x : wejscie) System.out.print (x + " ");
32.  System.out.println ();
33. }
34. 
35. public static void main(String[] args) {
36.  // tworzymy tablicę wypełniając ją od razu danymi
37.  int[] tablica = {4, 6, 1, 2, 3, 8, 7, 9, 5};
38.   
39.  // wyświetlamy tablicę na ekranie
40.  pokazTablice(tablica); 
41.   
42.  // odwracamy tablicę
43.  odwroc(tablica);
44. 
45.  // wyświetlamy odwróconą tablicę na ekranie
46.  pokazTablice(tablica); 
47. }
48.}
Uruchomiona aplikacja:
4 6 1 2 3 8 7 9 5 
5 9 7 8 3 2 1 6 4 
Powyższą metodę można przeciążyć, tworząc metodę odwracającą tylko fragment tablicy (elementy od indeksu początkowego do indeksu końcowego przekazanego jako parametr). Poniżej przeciążona wersja metody.
01.// metoda odwraca fragment tablicy (od indeksu poczatek do indeksu koniec
02. // w przekazanej jako parametr tablicy)
03. public static void odwroc(int[] wejscie, int poczatek, int koniec) {
04.   
05.  // dopóki indeks początkowy jest mniejszy od indeksu końcowego
06.  while (poczatek < koniec) {
07.   // zamieniamy elementy
08.   int pomoc = wejscie[poczatek];
09.   wejscie[poczatek]  = wejscie[koniec];
10.   wejscie[koniec] = pomoc;
11.      
12.   // przesuwamy się w kierunku środka wektora zwiększając i zmniejszając odpowiednio indeksy
13.   poczatek++;
14.   koniec--;
15.  }
16. }
Wywołanie odwroc(tablica, 3, 6) spowoduje odwrócenie elementów od indeksu trzeciego do szóstego.
4 6 1 2 3 8 7 9 5 
4 6 1 7 8 3 2 9 5 
Przeciążanie metod to tworzenie metod o takich samych nazwach ale o innej liście parametrów (pod uwagę brana jest ilość parametrów oraz ich typ).

Wyszukiwanie binarne

Wyszukiwanie binarne optymalizuje algorytm poszukiwań do kilku kroków. Opiera się ono na podziale tablicy na dwie części i sprawdzeniu czy szukana wartość znajduje się na środku czy też jest mniejsza lub też większa od elementu środkowego. W zależności od wyniku szukamy dalej w lewej bądź też prawej części tablicy. Taki sposób jest analogiczny do wyszukiwania danych w książce telefonicznej czy też słowniku. Oczywiście tablica, w której szukamy musi być posortowana (w przykładzie wykorzystamy sortowanie przez wybieranie). Chcemy napisać metodę która umożliwi nam w sposób rekurencyjny odnalezienie w tablicy konkretnej wartości.
001.// wykorzystujemy klasę Scanner z pakietu java.util
002.import java.util.*;
003. 
004./**
005. * Wyszukiwanie binarne
006. * @author kodatnik.blogspot.com
007. */
008.public class WyszukiwanieBinarne {
009.  
010. // metoda sortuje elementy tablicy przekazanej jako parametr
011. public static void sortowaniePrzezWybieranie(int[] wejscie) {
012.  // zmienna przechowująca rozmiar tablicy
013.  int rozmiarTablicy = wejscie.length;
014.   
015.  // pętla przejścia przez wszystkie elementy tablicy
016.  for (int i = 0; i < rozmiarTablicy; i++){
017.   // zakladamy, ze element na pozycji i jest najmniejszy
018.   int min = wejscie[i];
019.   // zapisujemy indeks tego elementu
020.   int indeks = i;
021.    
022.   // szukamy w pozostałej części tablicy elementu mniejszego niz min
023.   for (int j = i; j < rozmiarTablicy; j++){
024.    // jesli jest taki, on staje się teraz elementam najmniejszym
025.    if(wejscie[j] < min) {
026.     min = wejscie[j];
027.     // zapisujemy jego indeks
028.     indeks=j;
029.    }
030.   }
031.   // zamieniamy miejscami elementy w tablicy
032.   // najmniejszy z aktualnym wskazywanym przez zmienną i
033.   wejscie[indeks] = wejscie[i];
034.   wejscie[i] = min;
035.  }
036. }
037. 
038. // metoda rekurencyjna szukająca w podanej jako parametr tablicy (od indeksu poczatek do indeksu koniec) wartości
039. // zwraca -1 jeśli szukana wartość nie występuje, lub indeks pierwszego wystąpienia szukanej wartości
040. // przekazana jako parametr tablica musi być wcześniej posortowana
041. public static int szukajBinarnie(int[] wejscie, int poczatek, int koniec, int szukana) {
042. 
043.  // sprawdzamy czy przekazana tablica nie jest jednoelementowa
044.  if( poczatek == koniec) {
045.   // jeśli tak sprawdzamy czy element nie jest tym, którego szukamy (zwracamy indeks elementu, lub -1)
046.   if (wejscie[poczatek] == szukana) return poczatek;
047.   else return -1;
048.  }
049. 
050.  if( poczatek > koniec)
051.   // jeśli poczatek jest większy od końca kończymy wyszukiwanie zwracając -1
052.   return -1
053.   
054.  // dzielimy tablicę na dwie części
055.  int srodek = (poczatek+koniec)/2;
056.  
057.  // sprawdzamy czy element środkowy nie jest szukanym (jeśli tak zwracamy jego indeks)
058.  if(wejscie[srodek] == szukana) return srodek;
059. 
060.  // jeśli nie, wywołujemy rekurencyjnie naszą metodę dla prawej bądź też lewej części tablicy
061.  if(wejscie[srodek] > szukana) return szukajBinarnie(wejscie, poczatek, srodek-1, szukana);
062.  else return szukajBinarnie(wejscie, srodek+1, koniec, szukana);
063. }
064.  
065. // metoda wyświetla zawartość tablicy przekazanej jako parametr na ekranie
066. public static void pokazTablice(int[] wejscie) {
067.  // każdy element znajdujący się w tablicy wyświetlamy na ekranie
068.  for(int x : wejscie) System.out.print (x + " ");
069.  System.out.println ();
070. }
071. 
072. public static void main(String[] args) {
073.  // tworzymy tablicę wypełniając ją od razu danymi
074.  int[] tablica = {4, 6, 1, 2, 3, 8, 7, 9, 5};
075.   
076.  // wyświetlamy tablicę nieposortowaną na ekranie
077.  System.out.print ("Tablica nieposortowana: " );
078.  pokazTablice(tablica); 
079.   
080.  Scanner sc = new Scanner(System.in);
081.  System.out.print ("Jaką wartość chcesz znaleźć w tablicy: " );
082. 
083.  // pobieramy od użytkownika liczbę
084.  int liczba = sc.nextInt();   
085. 
086.  // sortujemy tablicę
087.  sortowaniePrzezWybieranie(tablica); 
088.   
089.  // wyświetlamy tablicę posortowaną na ekranie
090.  System.out.print ("Tablica posortowana: " );
091.  pokazTablice(tablica);
092.   
093.  // wywołujemy metodę oraz zapisujemy to co zwróci
094.  int wynik = szukajBinarnie(tablica, 0, tablica.length-1, liczba);
095.   
096.  // jeśli wynik jest różny od -1 wyświetlamy informacje o indeksie, na którym została znaleziona wartość
097.  if (wynik != -1) System.out.println ("Liczba " + liczba + " została znaleziona w tablicy na indeksie: " + wynik);
098.  else System.out.println ("Liczba " + liczba + " nie została znaleziona w tablicy.");
099. }
100.}
Uruchomiona aplikacja (wartość znaleziona):
Tablica nieposortowana: 4 6 1 2 3 8 7 9 5 
Jaką wartość chcesz znaleźć w tablicy: 3
Tablica posortowana: 1 2 3 4 5 6 7 8 9 
Liczba 3 została znaleziona w tablicy na indeksie: 2
Uruchomiona aplikacja (wartość nie znaleziona):
Tablica nieposortowana: 4 6 1 2 3 8 7 9 5 
Jaką wartość chcesz znaleźć w tablicy: 17
Tablica posortowana: 1 2 3 4 5 6 7 8 9 
Liczba 17 nie została znaleziona w tablicy.

Wyszukiwanie liniowe - sekwencyjne

Wyszukiwanie liniowe polega na sprawdzaniu kolejnych elementów tablicy i porównywaniu ich z szukaną wartością. Liczba porównań w najgorszym przypadku może osiągnąć rozmiar tablicy. Chcemy napisać metodę, która w podanej jako parametr tablicy znajdzie określoną wartość. W przypadku sukcesu metoda ma zwrócić indeks znalezionego elementu, a w przypadku nie znalezienia wartość -1.
01.// wykorzystujemy klasę Scanner z pakietu java.util
02.import java.util.*;
03. 
04./**
05. * Wyszukiwanie liniowe - sekwencyjne
06. * @author kodatnik.blogspot.com
07. */
08.public class WyszukiwanieLiniowe {
09.  
10. // metoda szukająca w podanej jako parametr tablicy wartości
11. // zwraca -1 jeśli szukana wartość nie występuje, lub indeks pierwszego wystąpienia szukanej wartości
12. public static int szukajLiniowo(int[] wejscie, int szukana) {
13.     
14.  // sprawdzamy kolejne elementy tablicy
15.  for (int i = 0; i < wejscie.length; i++) {
16.   // jeśli wartość elementu jest równa szukanej zwracamy indeks tego elementu
17.   if ( wejscie[i] == szukana) return i;
18.  }
19.  // jeśli po przejściu całej tablicy nie znaleźliśmy szukanej wartości zwracamy -1
20.  return -1;
21. }
22. 
23. // metoda wyświetla zawartość tablicy przekazanej jako parametr na ekranie
24. public static void pokazTablice(int[] wejscie) {
25.  // każdy element znajdujący się w tablicy wyświetlamy na ekranie
26.  for(int x : wejscie) System.out.print (x + " ");
27.  System.out.println ();
28. }
29. 
30. public static void main(String[] args) {
31.  // tworzymy tablicę wypełniając ją od razu danymi
32.  int[] tablica = {4, 6, 1, 2, 3, 8, 7, 9, 5};
33.   
34.  // wyświetlamy tablicę na ekranie
35.  System.out.print ("Nasza tablica: " );
36.  pokazTablice(tablica); 
37.   
38.  Scanner sc = new Scanner(System.in);
39.  System.out.print ("Jaką wartość chcesz znaleźć w tablicy: " );
40. 
41.  // pobieramy od użytkownika liczbę
42.  int liczba = sc.nextInt();   
43. 
44.  // wywołujemy metodę oraz zapisujemy to co zwróci do zmiennej wynik
45.  int wynik = szukajLiniowo(tablica, liczba);
46.   
47.  // jeśli wynik jest różny od -1 wyświetlamy informacje o indeksie, na którym została znaleziona wartość
48.  if (wynik != -1) System.out.println ("Liczba " + liczba + " została znaleziona w tablicy na indeksie: " + wynik);
49.  else System.out.println ("Liczba " + liczba + " nie została znaleziona w tablicy.");
50. }
51.}
Uruchomiona aplikacja (wartość znaleziona):
Nasza tablica: 4 6 1 2 3 8 7 9 5 
Jaką wartość chcesz znaleźć w tablicy: 7
Liczba 7 została znaleziona w tablicy na indeksie: 6
Uruchomiona aplikacja (wartość nie znaleziona):
Nasza tablica: 4 6 1 2 3 8 7 9 5 
Jaką wartość chcesz znaleźć w tablicy: 12
Liczba 12 nie została znaleziona w tablicy.

Paradoks dnia urodzin

Paradoks dnia urodzin związany jest z odpowiedzią na pytanie ile osób jest potrzebnych do tego, żeby prawdopodobieństwo, iż przynajmniej dwie z nich mają urodziny tego samego dnia było większe od 0,5. Odpowiedź jest zaskakująca, wystarczy 23 osoby. Chcemy napisać metodę która wykona n prób i zwróci nam średnią liczbę osób, dla których spełniony jest nasz warunek (dwie z nich mają urodziny tego samego dnia). Dla uproszczenia daty urodzin będziemy zapisywać w 365 elementowym wektorze wartości logicznych.
01.// wykorzystujemy klasę Scanner z pakietu java.util
02.import java.util.*;
03. 
04./**
05. * Paradoks dnia urodzin
06. * @author kodatnik.blogspot.com
07. */
08.public class ParadoksDniaUrodzin {
09. 
10. // metoda zwraca średnią liczbę osób dla n prób (parametr wywołania)
11. // potrzebnych do tego aby dwie z nich miały tego samego dnia urodziny
12. public static double paradoks(int liczbaProb) {
13.   
14.  // zmienne okreslające ilość dni w roku oraz licznik osób
15.  int n = 365;
16.  int licznik = 0;
17.   
18.  // wykonujemy tyle prób ile chce użytkownik
19.  for (int i =0; i< liczbaProb; i++) {
20.   // tworzymy wektor z poszczególnymi dniami roku (domyślnie false)
21.   boolean[] dzienUrodzin = new boolean[n];
22.      
23.   // w pętli działającej dotąd, aż nie znajdziemy dwóch osób z taką samą datą urodzin
24.   while (true) {
25.    // zwiększamy licznik osób o jeden
26.    licznik++;
27.    // losujemy liczbę z zakresu od 0 do 364 (indeksy tablicy)
28.    int los = (int) (n * Math.random());
29.     
30.    // jeśli jest już osoba o takim samym dniu urodzin kończymy pętlę
31.    if (dzienUrodzin[los]) break;
32.    // jeśli nie wpisujemy true w odpowiedni dzień
33.    dzienUrodzin[los] = true;
34.   }
35.  }
36.  // zwracamy średnią liczbę osób (wszystkie / liczba prób)
37.  return ((double) licznik) / liczbaProb;
38. }
39. 
40. public static void main(String[] args) {
41. 
42.  Scanner sc = new Scanner(System.in);
43.  System.out.print ("Podaj liczbę prób: " );
44.   
45.  // pobieramy od użytkownika liczbę prób
46.  int liczba = sc.nextInt();
47.   
48.  // wyświetlamy na ekranie średnią liczbę osób dla wszystkich prób
49.  System.out.println("Średnia liczba osób: " + paradoks(liczba));
50.   
51.   
52. }
53.}
Uruchomiona aplikacja:
Podaj liczbę prób: 100
Średnia liczba osób: 23.01

Sprawdzamy poprawność numeru PESEL

PESEL to Powszechny Elektroniczny System Ewidencji Ludności. Za pomocą sumy kontrolnej możemy sprawdzić czy numer PESEL jest poprawny. Budowa numeru PESEL jest następująca: 1-2 cyfra - ostatnie dwie cyfry roku urodzenia, 3-4 cyfra - dwie cyfry miesiąca urodzenia, 5-6 cyfra - dwie cyfry dnia urodzenia, 7-10 cyfra - liczba porządkowa z oznaczeniem płci (parzysta - kobieta, nieparzysta - mężczyzna), 11 cyfra - suma kontrolna. Sam algorytm sprawdzania sumy kontrolnej polega na obliczeniu sumy przemnożonych cyfr z numeru PESEL (od 1 do 10) przez odpowiednie wagi (1,3,7,9,1,3,7,9,1,3). Wynik jest dzielony modulo 10, odejmowany od 10 i jeszcze raz dzielony modulo 10. Cyfra którą dostaniemy powinna być zgodna z 11 cyfrą numeru PESEL.
01.// wykorzystujemy klasę Scanner z pakietu java.util
02.import java.util.*;
03. 
04./**
05. * Sprawdzenie sumy kontrolnej w numerze PESEL
06. * @author kodatnik.blogspot.com
07. */
08.public class Pesel {
09.  
10. // metoda sprawdza poprawność numeru PESEL na podstawie sumy kontrolnej
11. // zwraca true dla poprawnych i false dla niepoprawnych numerów
12. public static boolean sprawdz(String pesel){
13.  // zakładamy tablicę z wagami
14.  int[] wagi = {1, 3, 7, 9, 1, 3, 7 ,9 ,1 ,3};
15. 
16.  // sprawdzamy długość PESEL'a, jeśli nie jest to 11 zwracamy false
17.  if (pesel.length() != 11) return false;
18.   
19.  // zakładamy zmienną będącą sumą kontrolną
20.  int suma = 0;
21.   
22.  // liczymy w pętli sumę kontrolną przemnażając odpowiednie
23.  // cyfry z PESEL'a przez odpowiednie wagi
24.  for (int i = 0; i < 10; i++)
25.     suma += Integer.parseInt(pesel.substring(i, i+1)) * wagi[i];
26.   
27.  // pobieramy do zmiennej cyfraKontrolna wartość ostatniej cyfry z PESEL'a  
28.  int cyfraKontrolna = Integer.parseInt(pesel.substring(10, 11));
29. 
30.  // obliczamy cyfrę kontrolną z sumy (najpierw modulo 10 potem odejmujemy 10 i jeszcze raz modulo 10)
31.  suma %= 10;
32.  suma = 10 - suma;
33.  suma %= 10;
34.   
35.  // zwracamy wartość logiczną porównania obliczonej i pobranej cyfry kontrolnej
36.  return (suma == cyfraKontrolna);
37.   
38. }
39.  
40. public static void main(String[] args){
41.   
42.  Scanner sc = new Scanner(System.in);
43.  System.out.print ("Podaj numer PESEL: " );
44.   
45.  // pobieramy od użytkownika PESEL
46.  String pesel = sc.nextLine();
47.   
48.  // wyświetlamy na ekranie informacje o poprawności sumy kontrolnej PESEL
49.  System.out.println("Twój PESEL jest " + ((sprawdz(pesel)) ? "poprawny." : "niepoprawny"));
50. 
51. }
52.}
Uruchomiona aplikacja:
Podaj numer PESEL: 85032208451
Twój PESEL jest poprawny.
Powyższy algorytm nie sprawdza numeru PESEL pod względem nieprawidłowych danych (niewłaściwe numery miesięcy, dni). Zauważ PESEL: 66666666666 jest traktowany jako poprawny!
Dla określenia różnych lat (wieków) urodzenia dodaje się do numeru miesiąca następujące wartości: lata 1800-1899 - 80, lata 1900-1999 - 0, lata 2000-2099 - 20 itd.

Sortowanie szybkie - QuickSort

Sortowanie szybkie działa na zasadzie podziału tablicy na dwie części. Jedna z nich zawiera elementy o wartościach mniejszych, a druga elementy o wartościach większych od wartości elementu dzielącego (ang. pivot). Jako element dzielący można wybrać element środkowy, element pierwszy lub element ostatni. Każda z części tak podzielonej tablicy jest poddawana od nowa algorytmowi sortowania szybkiego.
01./**
02. * Sortowanie szybkie - QuickSort
03. * @author kodatnik.blogspot.com
04. */
05.public class SortowanieSzybkie {
06. // metoda zamienia miejscami elementy o indeksach i oraz j
07. // w tablicy przekazanej jako parametr
08. private static void zamien(int[] wejscie, int i, int j) {
09.  int temp = wejscie[i];
10.  wejscie[i] = wejscie[j];
11.  wejscie[j] = temp;
12. 
13.  
14. // metoda dzieli tablicę (od indeksu p do indeksu k) na dwie części
15. // - elementy mniejsze od wybranego elementu
16. // - elementy większe od wybranego elementu
17. private static int podzial(int[] wejscie, int p, int k) {
18.  
19.  // wybieramy element wg którego będziemy dzielić
20.  // np. element ostatni
21.  int element = wejscie[k];
22.   
23.  // ustalamy zakres na którym będziemy operować
24.  int i = p;
25.  int j = k - 1;
26.   
27.  // pętla wyszukuje kolejne elementy większe i mniejsze od
28.  // elementu dzielącego (zmienna element)
29.  while(i <= j) {
30.   while (wejscie[i] <= element && i < k) i++;
31.   while (wejscie[j] > element && j > p) j--;
32.    
33.   // jeśli elementy są na niewłaściwych pozycjach zamieniamy je
34.   if (i < j) zamien(wejscie, i, j);
35.   // jeśli indeksy się zrównają kończymy pętlę
36.   if (i == j) break;
37.  }
38.    
39.  // na końcu wstawiamy element dzielący na właściwą pozycję
40.  zamien(wejscie, i, k);
41.     
42.  // i zwracamy tę pozycję
43.  return i;
44. }
45.  
46. // metoda sortuje elementy tablicy przekazanej jako parametr
47. // dodatkowo w jej wywołaniu podajemy indeks pierwszego i ostatniego elementu
48. public static void sortowanieSzybkie(int[] wejscie, int i, int j) {
49. 
50.  // jeśli indeksy są równe lub niepoprawne zakończ działanie
51.  if ( j <= i ) return;
52. 
53.  // dzielimy tablicę na części, indeks miejsca podziału zapisujemy w zmiennej os (oś)
54.  int os = podzial(wejscie, i, j);
55.   
56.  // rekurencyjnie dokonujemy posortowania lewej i prawej części naszej tablicy
57.  sortowanieSzybkie(wejscie, i, os-1);
58.  sortowanieSzybkie(wejscie, os+1, j); 
59. }  
60.  
61. // metoda wyświetla zawartość tablicy przekazanej jako parametr na ekranie
62. public static void pokazTablice(int[] wejscie) {
63.  // każdy element znajdujący się w tablicy wyświetlamy na ekranie
64.  for(int x : wejscie) System.out.print (x + " ");
65.  System.out.println ();
66. }
67. 
68. public static void main(String[] args) {
69.  // tworzymy tablicę wypełniając ją od razu danymi
70.  int[] tablica = {4, 6, 1, 2, 3, 8, 7, 9, 5};
71.   
72.  // wyświetlamy tablicę na ekranie
73.  pokazTablice(tablica);
74.  // sortujemy tablicę
75.  sortowanieSzybkie(tablica, 0, tablica.length-1);
76.  // wyświetlamy posortowaną tablicę na ekranie
77.  pokazTablice(tablica); 
78. }
79.}
Optymalizacja algorytmu polega na właściwym doborze elementu dzielącego. Najczęściej dokonuje się tego poprzez jego losowy wybór, bądź też wyznaczenie mediany z rozpatrywanych elementów.
Uruchomiona aplikacja:
4 6 1 2 3 8 7 9 5 
1 2 3 4 5 6 7 8 9 

Suma cyfr w liczbie rekurencyjnie

W jednym z wcześniejszych postów liczyliśmy sumę cyfr w liczbie za pomocą iteracji. Poniżej rozwiązanie tego zadania z wykorzystaniem rekurencji.
01.// wykorzystujemy klasę Scanner z pakietu java.util
02.import java.util.*;
03. 
04./**
05. * Suma cyfr w liczbie rekurencyjnie
06. * @author kodatnik.blogspot.com
07. */
08.public class SumaCyfr {
09.  
10. // metoda sumaCyfr zwraca sumę cyfr liczby
11. // przekazanej jako parametr jej wywołania
12. public static int sumaCyfr(int liczba) {
13. 
14.  // jesli liczba mniejsza od 10 zwróć ją (warunek kończący wywołania rekurencyjne)
15.  if (liczba < 10)
16.   return liczba;
17. 
18.  // w przeciwnym razie bierzemy ostatnią cyfrę (modulo 10) plus rekurencyjne
19.  // wywołanie naszej metody z parametrem będącym liczbą bez ostatniej cyfry
20.  return (liczba % 10) + sumaCyfr(liczba / 10);
21. }
22.  
23. public static void main(String[] args){
24.   
25.  Scanner sc = new Scanner(System.in);
26.  System.out.print ("Podaj liczbę: " );
27.   
28.  // pobieramy od użytkownika liczbę
29.  int liczba = sc.nextInt();
30.   
31.  // wyświetlamy na ekranie sumę cyfr w liczbie
32.  System.out.println("Suma liczb: " + sumaCyfr(liczba));
33. 
34. }
35.}
Uruchomiona aplikacja:
Podaj liczbę: 12345
Suma liczb: 15

Ciąg Fibonacciego rekurencyjnie i iteracyjnie

Ciąg Fibonacciego to ciąg liczb naturalnych określony wzorem f(n)=f(n-1)+f(n-2) dla danych f(0)=0 i f(1)=1. Chcemy napisać metodę obliczającą n-ty wyraz tego ciągu. Zastosujemy rozwiązanie rekurencyjne (metoda fibR()) oraz iteracyjne (metoda fibI()).
01.// wykorzystujemy klasę Scanner z pakietu java.util
02.import java.util.*;
03. 
04./**
05. * N-ty element ciągu Fibonacciego rekurencyjnie i iteracyjnie
06. * @author kodatnik.blogspot.com
07. */
08.public class CiagFibonacciego {
09.  
10. // metoda zwraca n-ty element ciągu Fibonacciego
11. // wersja rekurencyjna
12. public static int fibR(int n) {
13.   
14.  if (n < 2) return n; // jeśli n<2 zwracamy n (dla zera 0 dla jedynki 1)
15.   
16.  return fibR(n-1) + fibR(n-2); // jeśli nie to zwracamy sumę elementu poprzedniego i jeszcze wcześniejszego
17. }
18.  
19. // metoda zwraca n-ty element ciągu Fibonacciego
20. // wersja iteracyjna 
21. public static int fibI(int n) {
22.  int elementA = 0; // zmienne pomocnicze symbolizujące
23.  int elementB = 1; // element poprzedni B i jeszcze wcześniejszy A
24.   
25.  int wynik = 0; // zmienna wynik, pod którą podstawimy obliczoną wartość
26.   
27.  if (n < 2) return n; // jeśli n<2 zwracamy n (dla zera 0 dla jedynki 1)
28.    
29.   // jeśli nie to liczymy n=ty element ciagu
30.   for(int i = 2; i <= n; i++){
31.    wynik = elementA + elementB; // pod wynik podstawiamy sumę poprzednich elementów
32.    elementA = elementB; // modyfikujemy zmienne przechowujące
33.    elementB = wynik;  // dwie ostatnie wartości
34.   }
35.   
36.  return wynik; // zwracamy wynik
37. }
38.  
39. public static void main(String[] args) {
40.   
41.  Scanner sc = new Scanner(System.in);
42.  System.out.print ("Który element ciągu Fibonacciego chcesz obliczyć: " );
43. 
44.  // pobieramy od użytkownika liczbę
45.  int n = sc.nextInt();
46. 
47.  // wyświetlamy na ekranie obliczony element
48.  System.out.println( n + "-ty element ciągu Fibonacciego (rekurencja) wynosi: " + fibR(n));
49.  System.out.println( n + "-ty element ciągu Fibonacciego (iteracja) wynosi: " + fibI(n)); 
50.  
51. }
52.}
Uruchomiona aplikacja:
Który element ciągu Fibonacciego chcesz obliczyć: 10
10-ty element ciągu Fibonacciego (rekurencja) wynosi: 55
10-ty element ciągu Fibonacciego (iteracja) wynosi: 55
Rozwiązanie rekurencyjne jest bardzo kosztowne. Sprawdź czas wykonania jednej i drugiej metody dla dużych n, bądź też liczbę rekurencyjnych wywołań potrzebnych do takich obliczeń.

Dodajemy Wykop do Bloggera

Wykop to serwis do którego możemy dodawać ciekawe strony. Każda dodana informacja jest oceniana i dyskutowana przez społeczność internautów. Od niej zależy czy dany wpis będzie popularny czy też nie. Jednym ze sposobów wzbogacenia Bloggera o możliwość dodawania wpisów do wykopu jest mój gadżet Podziel się. W tym poście przedstawię drugą możliwość. Na stronie wykopywarki mamy dostępne kilka kodów, które można umieścić bezpośrednio w szablonie naszej strony. Informacja o osobach, które również uznały nasz post za ciekawy (wykopały go) będzie na bieżąco aktualizowana. Pytanie tylko gdzie go wkleić. Możliwości jest kilka, albo na początku treści posta, albo w jego nagłówku, albo pod postem. Przyjrzyjmy zatem się standardowej wykopywarce (duża ikona z ilością wykopów). Zmodyfikujmy trochę kod tak, aby edytor Bloggera przyjął go bez zastrzeżeń.
01.<script language='javascript'>
02.var wykop_url=location.href;
03.var wykop_title=document.title;
04.var wykop_desc=encodeURIComponent('Podaj opis');
05.var widget_bg='FFFFFF';
06.var widget_type='normal';
07.var widget_url='http://www.wykop.pl/widget.php?url='+(wykop_url)+'&amp;title='+(wykop_title)+'&amp;desc='+(wykop_desc)+'&amp;bg='+(widget_bg)+'&amp;type='+(widget_type);
08.document.write("<div style='float: right;'><iframe border='0' frameborder='0' scrolling='no' src='"+widget_url+"' style='border:none;width:72px;height:65px;overflow:hidden;margin:0;padding:0;'/></div>");
09.</script>
Dodałem dodatkowo umiejscowienie ikony (prawa strona - <div style='float: right;'>) oraz zamieniłem kilka znaków, które powodują błędy Bloggera. Mając już kod, spróbujmy go dodać do naszych postów, a dokładnie do tytułu posta. Logujemy się do Bloggera, wybieramy Układ/Edytuj kod HTML. Zaznaczamy Rozszerz szablony widżetów. W podglądzie źródła naszego szablonu szukamy (Ctrl+F) następującego fragmentu:
1.<b:includable id='post' var='post'>
2.  <div class='post hentry uncustomized-post-template'>
Wklejamy poniżej zmodyfikowany kod wykopu. Wszystko funkcjonuje prawidłowo przy wyświetlonych pojedynczych wpisach. Na stronie głównej naszego bloga ikonka wykopu będzie niestety starała się dodać adres bloga, a nie poszczególnych postów, więc....wykorzystamy wyrażenie warunkowe, które będzie dodawało wykopywarkę tylko na stronach postów, a nie na stronie głównej.
1.<b:if cond='data:blog.pageType != "index"'>
2. Nasz zmodyfikowany kod wykopu
3.</b:if>
Efekt widoczny na moim blogu. Oczywiście możemy zmienić miejsce dodania ikony jak i również jej położenie (do prawej, do lewej, na środku itd.). Na przykład dodanie ikony do treści posta, to odnalezienie w szablonie następującego kodu:
1.<div class='post-body entry-content'>
...i wstawienie poniżej tego co poprzednio. Sposób ten umożliwia, w zależności od naszych preferencji, dodanie ikon/linków do dowolnych serwisów (zobacz np. serwis Wyczaj to)
Jeśli nie odpowiada nam duża ikona to możemy wybrać z wykopywarki kod obsługujący wersję compact.

Podziel się - gadżet do Bloggera

Często na blogach mamy możliwość dodania czytanego posta do serwisów społecznościowych takich jak Wykop czy Twitter. W Bloggerze jedyną normalną możliwością skorzystanie z tej formy promocji bloga jest pasek nawigacyjny (Navbar). Niestety nie jest on lubiany przez twórców blogów jak i również jego oferta serwisów jest minimalna (brak jakiegokolwiek rodzimego serwisu). Gdy nie ma tego czego potrzebujemy, musimy wziąć sprawy w swoje ręce. Napisałem prosty gadżet do Bloggera umożliwiający podzielenie się blogiem/postem w serwisach społecznościowych. Dodatek dostępny jest w ogólnodostępnym katalogu gadżetów Bloggera. Jak go dodać. Logujemy się do Bloggera, wybieramy Układ/Elementy strony. Na pokazanym widoku naszego bloga, klikamy Dodaj gadżet. Otworzy się okienko z możliwością wyboru i dodania gadżetu. Wybieramy Więcej gadżetów w pole wyszukiwania wpisujemy Podziel się (patrz obrazek). Po znalezieniu gadżetu możemy go dodać klikając ikonkę z plusem.



Dodatkowo możemy dokonać prostej konfiguracji wpisując inny tytuł, położenie ikonek oraz serwisy, które mają być obsługiwane (klikając aktualizacja, nasze ustawienia odświeżą się). Gadżet dostosuje do wybranych parametrów swoją wysokość.


Po dodaniu do bloga możemy umiejscowić go albo z boku (Sidebar) albo w dowolnym innym miejscu (wystarczy przeciągnąć prostokąt z gadżetem w inne miejsce układu strony). Wersja online gadżetu obok.
W zależności od tego czy jesteśmy na stronie głównej bloga czy też czytamy post, do serwisu społecznościowego trafi odpowiednio adres URL bloga, tytuł bloga, opis bloga lub też adres URL posta, tytuł posta.
Jeśli korzystasz z Bloggera w wersji angielskiej, to po kliknięciu Add a Gadget w pole wyszukiwania wpisz Sociable.

Aktualizacja: 15-02-2010
Dodana obsługa Google Buzz.

Aktualizacja: 01-04-2010
Poprawiona obsługa Wykopu.

Dodajemy Favicon do Bloggera

Standardowo Blogger udostępnia dla blogów pomarańczową ikonkę pojawiającą się przy pasku adresu naszej przeglądarki, Nic nie stoi na przeszkodzie, aby ją zmienić na własną bardziej oddającą treść naszego bloga. Plik ikony powinien mieć rozmiary 16x16 pikseli. Domyślny format to ICO (większość przeglądarek obsługuje również poprawnie pliki PNG i GIF). Do skonwertowania pliku graficznego do pliku ICO możemy wykorzystać darmowy program IrfanView, bądź też poszukać darmowych ikonek w sieci. Idealnie do tego nadaje się wyszukiwarka Google (wybieramy grafika/wyszukiwanie zaawansowane/określamy rozmiar 16x16). Wybrany obrazek musimy umieścić na serwerze i dokonać zmian w kodzie naszego szablonu (nadpisać domyślne ustawienia Bloggera). Logujemy się do Bloggera, wybieramy Układ/Edytuj kod HTML. W podglądzie źródła naszego szablonu szukamy (Ctrl+F) następującego fragmentu:
1.<b:include data='blog' name='all-head-content'/>
Jest to fragment odpowiedzialny za utworzenie zawartości nagłówka naszej strony. Poniżej powyższego kodu dopisujemy linijkę:
1.<link href='Adres URL pliku ikonki' rel='shortcut icon'
2.type='image/vnd.microsoft.icon'/>
Gdzie Adres URL pliku ikonki to ścieżka dostępu do naszej ikonki (pliku z rozszerzeniem .ico). Efekt widoczny jest na moim blogu (zobacz w pasku tytułu przeglądarki).
Ikonki mogą być również animowane. Wykorzystywany jest do tego celu format GIF.
Rozmiar ikonki może być większy (np. 32x32 czy 48x48). Przeglądarka odpowiednio przeskaluje sobie nasz plik.

Zmieniamy tytuł strony w Bloggerze

Standardowo tytuł pojedynczego postu w Bloggerze jest umieszczany w kolejności (tytuł bloga + tytuł postu). Większość wyszukiwarek internetowych opiera swoje wyniki między innymi na tytule strony. Spróbujmy zatem zmienić kolejność elementów (najpierw tytuł posta, potem tytuł bloga). Logujemy się do Bloggera, wybieramy Układ/Edytuj kod HTML. W podglądzie źródła naszego szablonu szukamy (Ctrl+F) następującego fragmentu:
1.<title><data:blog.pageTitle/></title>
Jest to fragment odpowiedzialny za stworzenie tytułu strony. Zamieniamy go z następującym kodem:
1.<b:if cond='data:blog.url == data:blog.homepageUrl'>
2.<title><data:blog.pageTitle/></title>
3.<b:else/>
4.<title><data:blog.pageName/> | <data:blog.title/></title>
5.</b:if>
Dajemy Zapisz i gotowe. Powyższy fragment będzie tworzył tytuł strony w zależności od tego czy jesteśmy na stronie głównej (tytuł bloga) czy też na stronie konkretnego posta (tytuł posta | tytuł bloga). Oczywiście znak rozdzielający tytuły możemy wybrać dowolnie (w przykładzie jest to pionowa kreska). Efekt widoczny jest na moim blogu (zobacz w pasku tytułu przeglądarki).
Wszystkie tagi, z których możesz korzystać w swoim szablonie (np. <data:blog.title/> - tytuł bloga) znajdziesz tutaj (język ang.).

Popularne posty