poniedziałek, 10 kwietnia 2017

Spis algorytmów

Spis algorytmów


1. ALGORYTM OBLICZAJĄCY SUMĘ n KOLEJNYCH LICZB NATURALNYCH

2. Algorytm sprawdzający czy punkt P leży na prostej

3. Algorytm obliczający iloczyn kolejnych liczb naturalnych od 1 do n

4. Algorytm obliczający miejsce miejsce zerowe funkcji





9. Algorytm wyszukujący wartość max w ciągu liczb






15. Czy napis jest palindromem?








Liczby narcystyczne

Liczba narcystyczna, inaczej liczba Armstronga – jest to n-cyfrowa liczba naturalna, która jest sumą swoich cyfr podniesionych do potęgi n.

Lista kroków
Dane wejściowe:  liczba: int
Dane pomocnicze:  int n, i, pom, pom2, cyferki, suma : int
                                liczba: string
Dane wyjściowe:  suma: int, odpowiedź czy liczba jest narcystyczna

K01:   Wczytaj liczba
K02: Suma=0
K03: Cyferki=1
K04: Cyferki=strtoint(liczba)
K05: Wczytaj liczba
K06: n= liczba.size()
K07: i=0
K08: Dla i<=n-1 wykonuj od K09 do K12
K09: pom=strtoints(i,liczba)
K10: pom2=pow(pom,n)
K11: suma=suma+pom2
K12: i++
K13: Jeżeli suma==cyferki to Napisz "liczba jest narcystyczna", w przeciwnym wypadku Napisz "liczba nie jest narcystyczna"


Schemat blokowy

Rozwiązanie w C++

#include<iostream> 
#include<string>
#include<cmath>
#include<sstream>
using namespace std; 
int strtoint(string liczba) //tlumaczy string do int dla liczby
{
int rezultat;
istringstream convert(liczba);
convert>>rezultat;
return rezultat;
}
int strtoints(int i, string liczba) //tlumaczy string do int dla pojedynczych cyfr liczby
{
int rezultat;
string pom;
pom=liczba[i];
istringstream convert(pom);
convert>>rezultat;
return rezultat;
}
int main ()
int n; //dane
int i; 
int pom;
int pom2;
int cyferki;
int suma=0;
string liczba;
cout<<"Podaj liczbe:"<<endl; 
cin>>liczba; //Wczytanie zmiennej liczby
cyferki=1;
cyferki=strtoint(liczba);
n=liczba.size();
cout<<"n = "<<n<<endl;
for (i=0;i<=n-1; i++) //petla, ktora wyswietla pojedyncze cyfry liczby
{
pom=strtoints(i, liczba);
cout<<i+1<<" cyfra liczby: "<<pom<<endl;
pom2=pow(pom,n);
suma=suma+pom2; //suma jest zwiekszana o potęgę poszczególnej cyfry
}
cout<<"suma = "<<suma<<endl;
if (suma==cyferki)
{
cout<<"Liczba jest narcystyczna"<<endl;
}
else cout<<"Liczba nie jest narcystyczna"<<endl;
return 0; 
}


Rozwiązanie w EXCEL




Liczba wprowadzona na początku została podzielona na pojedyncze cyfry. Jest to widoczne w szóstym wierszu. Następnie skopiowano to do kolejnych komórek.
=JEŻELI(DŁ(C4)>10;WARTOŚĆ(FRAGMENT.TEKSTU(C4;DŁ(C4)-10;1));0)
Następnie cyfry te zostały podniesione do potęgi n, czyli ilości cyfr początkowej liczby.
Została wykorzystana poniższa formuła:
=DŁ(C4)
Na koniec program sumuje powyższe potęgi i sprawdza, czy ich suma jest równa liczbie wyjściowej.
=SUMA(D7:N7)
Jeżeli jest równa to początkowa liczba jest narcystyczna.
=JEŻELI(D8=C4;”Liczba jest narcystyczna”;”Liczba nie jest narcystyczna”)



Schemat Hornera

Schemat Hornera jest algorytmem służącym do bardzo szybkiego obliczania wartości wielomianu. Redukuje on ilość mnożeń do minimum.



Dany mamy wielomian stopnia n, gdzie n > 0

Lista kroków:
Specyfikacja:
Dane:
Liczba całkowita: n > 0 (stopień wielomianu).
n+1-elementowa tablica liczb rzeczywistych: A[0...n] (współczynniki wielomianu).
Liczba rzeczywista: x (wartość argumentu).
Wynik:
Wartość rzeczywista wielomianu stopnia n dla wartości argumentu x.

Schemat blokowy

Krok 1:Wczytaj wartości danych n, A[0...n], x.
Krok 2:Przypisz w = A[0].
Krok 3:Dla kolejnych wartości i: 1,2, ..., n, wykonuj krok 4.
Krok 4:Przypisz w = wx+A[i].
Krok 5:Wypisz wartość wielomianu: w. Zakończ algorytm.

C++
#include <iostream>
using namespace std;
int main(void){
int n;
cout<<"Podaj n: "; cin>>n;
float A[n];
float x;
float w;
int i;
//n++;
for(i=0;i<=n;i++){ cout<<"Podaj element nr "<<i<<": ";cin>>A[i];cout<<endl; }
w=A[0];
cout<<"Podaj x: "; cin>>x;
for (i=1;i<=n;i++) w=w*x+A[i];
cout<<"wynik: "<<w;
return 0;
}



Opracował: Jakub W.

Szyfr Cezara

Co to jest?
Zastępuje każdą literę tekstu jawnego inną, przesuniętą względem litery kodowanej o stałą liczbę pozycji w alfabecie.

Algorytm deszyfrowania tekstu zaszyfrowanego kodem Cezara
Wejście
Łańcuch tekstowy s zaszyfrowany kodem Cezara
Wyjście:
Tekst jawny
Elementy pomocnicze:
i  –  indeks, i N 
kod(x)  – zwraca kod litery x
znak(x)  – zamienia kod x na odpowiadający mu znak ASCII 

Lista kroków:
K01: Dla i = 0,1,...,|s| - 1 wykonuj K02...K03 ; przetwarzamy kolejne znaki tekstu 
K02:     Jeśli s[i] < "A" ∨ s[i] > "Z", to następny obieg pętli K01 ; pomijamy znaki nie będące literami A...Z 
K03:     s[i] ← znak(65 + (kod(s[i] - 42) mod 26) ; deszyfrujemy 
K04: Pisz s   
K05: Zakończ

Schemat blokowy

C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
  string z;
  int i;

// odczytujemy wiersz znaków
cout<<"Podaj tekst do zaszyfrowania ";
  getline(cin,z);

// zamieniamy małe litery na duże
// i kodujemy szyfrem cezara

  for(i = 0; i < z.length(); i++)
  {
    z[i] = toupper(z[i]);
    if((z[i] >= 'A') && (z[i] <= 'Z')) z[i] = char(65 + (z[i] - 62) % 26);
  }

// wypisujemy zaszyfrowany tekst

  cout << z << endl << endl;
  return 0;

Program w Excel


Projektujemy tabelę
1) Numerujemy kolejne litery alfabetu łacińskiego od 0 do 25 (zakres od c4:AB4)
2) Do komórki C4 wprowadzamy funkcję: =ZNAK(C5+65)
3) W 6 wierszu w komórce c6 wprowadzamy klucz będący numerem przesunięcia
4) W komórce C6 wprowadzono formułę, która obliczy nową wartość znaku

W komórki F16-Q16 należy wpisywać litery do zaszyfrowania
W następnym wierszu używamy funkcji: =KOD(komórka wiersz wyżej)-97
W wierszu 20 używamy funkcji: =ZNAK(F19+65) – za F19 wstawiamy komórkę wiersz wyżej, tak samo jak w kroku 2

Po kolei algorytm w Excelu
  • wycięcie literki z ciągu -funkcja
  •  zamieniasz litery na cyfrę -funkcja
  •  dodanie warunku. Chodzi o to, że np. litera 'z' ma numer 122, jeśli dodasz 3 (tak jak normalnie w cyfrze cezara) to dostałbyś znaczek '}' taki. więc musisz napisać, że jeśli ten kod litery > 122, to wracasz do początku etc.
  •  nowy kod – zamiana na literę
  •  wpisanie w komórkę wyjściową
  •  powtarzanie powyższego tyle razy, jaka jest długość słowa.

Opracował:Adam D.

Czy napis jest anagramem?

Anagram 
Anagram jest to wyraz (lub całe zdanie) powstały w wyniku przestawiania liter innego wyrazu, wykorzystując wszystkie jego litery. Pojęcie anagramu jest podstawowym pojęciem jakie należy sobie przyswoić, przed przystąpieniem do matury z informatyki. Zadania związane z anagramami trafiają się bardzo często i wszystkie są do siebie podobne.
Aby sprawdzić czy dany wyraz jest anagramem drugiego, należy sprawdzić czy ich długość jest taka sama. Następnie posortować obydwie zmienne za pomocą sortowania bąbelkowego. Jeżeli posortowane zmienne są takie same i mają taką samą długość, oznacza to że są anagramami.
Dla przykładu:
anagramem wyrazu karol jest wyraz rolka
anagramem wyrazu matura jest wyraz trauma.

Lista kroków:
  1. Początek algorytmu
  2. Wczytaj pierwsze słowo do zmiennej wyraz1
  3. Wczytaj drugie słowo do zmiennej  wyraz2
  4. Jeżeli długości zmiennych wyraz1 i wyraz2 są różne, to wyrazy nie są anagramami
  5. Posortuj bąbelkowo zmienną wyraz1 i zapisz do zmiennej wyraz1
  6. Posortuj bąbelkowo zmienną wyraz2 i zapisz do zmiennej słowo2
  7. Jeżeli wyraz1=wyraz2 to wyrazy są anagramami
  8. W przeciwnym wypadku nie są anagramami
  9. Koniec algorytmu

C++
include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
bool anagram(string wyraz1, string wyraz2)
{
    if (wyraz1.length()!=wyraz2.length())
        return false;   // dlugosc sie nie zgadza
    // sortujemy babelkowo obydwa stringi
    for (int i = 0; i<wyraz1.length()-1; i++)
    {
        for (int j = 0; j<wyraz2.length()-1; j++)
        {
            if (wyraz1[j]>wyraz1[j+1])
                swap(wyraz1[j], wyraz1[j+1]);
            if (wyraz2[j]>wyraz2[j+1])
                swap(wyraz2[j], wyraz2[j+1]);
        }
    }
  return wyraz1==wyraz2; //zwracamy true lub false
}
int main()
{
    string wyraz1, wyraz2;
    cout << "Podaj wyraz pierwszy" << endl;
    cin >> wyraz1;
    cout << "Podaj wyraz drugi" << endl;
    cin >> wyraz2;
    cout << anagram(wyraz1, wyraz2) << endl;
    system("PAUSE");
    return 0;
}

Excel
Jak sprawdzić czy dane słowo jest anagramem w Excelu?
1. Po wprowadzeniu wartości z treścią pierwszego i drugiego wyrazu należy wyodrębnić z wyrazu litery, które tworzą ten wyraz. tą operację wykonujemy za pomocą instrukcji "FRAGMENT TEKSTU" którą stosujemy w kolejnych komórkach kolumny M.

=FRAGMENT.TEKSTU($C$3;1;1)

Analogicznie postępujemy z drugim wyrazem.
2. Pierwszy wyodrębniony wyraz skopiować do komórki C9 (uwaga wkleić tylko wartość a nie formułę). Wklejanie odbywa się za pomocą  makra.
3. Tworzenie makra
a. Rysujemy prostokąt, dodajemy mu tekst o treści "wklej pierwszy wyraz"
b. Uruchamiamy opcję rejestracji makra
c. Wybieramy narzędzie: Deweloper >> Zarejestruj makro
d. Nazywamy makro "Skopiuj1"
e. Nacisnąć "ok"
f. Ustawić się w C9
g. Wykonać kopiowanie z wklejeniem wartości
h. Zatrzymaj makro (z narzędzia Deweloper)
4. Analogicznie postępujemy z drugim wyrazem
5. Utworzyć makro które będzie sortować dane od A do Z w analogiczny sposób dla obydwu wyrazów
6. Projektujemy funkcję która sprawdzi czy wyrazy składają się z takich samych liter
=JEŻELI(C10=E10;0;1)
7. Na końcu należy podsumować (funkcja SUMA, która podsumowuje wyniki)
=SUMA(G10:G23)
8. Wypisujemy funkcję JEŻELI sprawdzającą czy wyrazy składają się z takich samych liter

=JEŻELI(G24=0;"TAK - wyrazy tworzą anagram";"NIE- wyrazy nie są anagramami")

Opracował: Szymon G.

Czy napis jest palindromem?

// post w trakcie tworzenia

Zamiana ułamka dziesiętnego na zwykły

Zasady zmiany
Ułamki dziesiętne zamieniamy na ułamki zwykłe, zapisując je za pomocą kreski ułamkowej, tak jak się czyta. W wyniku zostawia się ułamek nieskracalny tzn. w miarę możliwości należy skrócić ułamek.
C++
#include<iostream>
using namespace std;
int main()
{
  float num, origNum, rem = 1;
  int den = 1, i, count=0, gcd=1;
cout << "wprowadz cyfre dziesietna: ";
 cin >> origNum;
num = origNum - static_cast<int>(origNum);  
 if (num > 0.1)
    {
        while ( (rem > 0.1) )
        {
            num = num * 10;
            rem = num - static_cast<int>(num);
            count++;
        }

      for (i = 1; i <= count; i++)  
        {
            den = den * 10;
        }                                                             
for (i = 2; i <= num|| i<=rem; i++)
        {
            if( (static_cast<int>(num) % i == 0) && (den % i == 0) )
            {
                gcd = i;
            }   
        }

        cout << (static_cast<int>(origNum)) << " and " << (static_cast<int>(num))/gcd << "/" << den/gcd;
    }
    else
        cout << (static_cast<int>(origNum));

    return 1;   
}

Program w Excel


Wpisujemy w pole C7 liczbe dziesiętną która automatycznie zamienia nam liczbe dziesiętną w ułamek zwykły.

Opracował: Daniel Gleba

Zamiana systemu dziesiątkowego na binarny

System binarny, inaczej dwójkowy -pozycyjny system liczbowy, w którym podstawą jest liczba 2. Do zapisu liczb potrzebne są tylko dwie cyfry: 0 i 1.
Używał go już John Napier w XVI wieku, przy czym 0 i 1 zapisywał jako a i b. Ojcem nowoczesnego systemu binarnego nazywany jest Gottfried Wilhelm Leibniz, autor opublikowanego w 1703 roku artykułu Explication de l'Arithmétique Binaire.

Wykorzystanie systemu binarnego 
Powszechnie używany w elektronice cyfrowej, gdzie minimalizacja liczby stanów (do dwóch) pozwala na prostą implementację sprzętową odpowiadającą zazwyczaj stanom wyłączony i włączony oraz zminimalizowanie przekłamań danych. Co za tym idzie, przyjął się też w informatyce.

System dziesiątkowy
Pozycyjny system liczbowy, w którym podstawą jest liczba 10; do zapisu liczb stosuje się 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Liczby zapisuje się jako ciąg cyfr, z których każda jest mnożnikiem kolejnej potęgi liczby 10. Niekiedy dla poprawy czytelności cyfry grupuje się po trzy (Okcydent) lub cztery (część Orientu). Część całkowitą i ułamkową oddziela separator dziesiętny.

Zmiana systemu dziesiątkowego na binarny
Liczba którą będziemy konwertować to 67. Sposób jest następujący: liczbę dzielimy przez 2 i jeżeli wynik będzie z resztą: zapisujemy 1, jeżeli nie - zapisujemy 0. Następnie znowu dzielimy przez 2 to co zostało z liczby, ale bez reszty. Taki proces trwa, aż zostanie 0 (zero). Otrzymane zera i jedynki zapisujemy w odwrotnej kolejności. Wyjaśni się to wszystko na konkretnym przykładzie. Zatem do dzieła: 67:2 |133:2 |116:2 |08:2 |04:2 |02:2 |01:2 |1   Co daje 1000011. Jak widzimy, wynik zgadza się. Widać również, że zawsze na samym końcu po podzieleniu będzie 0, zatem ostatnia liczba jest równa 1. Jeden podzielić na dwa zawsze wyjdzie 0,5 zatem wynik z resztą. Co za tym idzie - pierwsza cyfra w zapisie dwójkowym jest ZAWSZE RÓWNA 1. Nie tylko matematycznie można to udowodnić. W elektronice, również musi być taka postać rzeczy. Przyjęliśmy bowiem, że dla komputera brak przepływu prądu oznacza "0", natomiast przepływ prądu - "1". Sygnał zatem nie może zaczynać się od "0", gdyż jest to brak sygnału. Procesor nie wie, czy sygnał już się zaczął, czy jeszcze nie. Początek musi być "1" (jest sygnał).

Wg mnie najprostszym sposobem jest Dzielić za każdym razem przez 2 i wpisywać resztę 1 lub 0. Przykład: liczba 125 w systemie binarnym to 1111101 gdyż: 125:2=62 reszty 1 (62,5czyli 62 i 63 = 125) 62:2 = 31 reszty 0 31:2 = 15 reszty 1 15:2 = 7 reszty 1 7:2 = 3 reszty 1 3:2 = 1 reszty 1 1:2 = 0 reszty 1. Teraz wynik czytamy OD DOŁU DO GÓRY, czyli 1111101.
Teraz zamiana liczb binarnych na dziesiętną: Zaczynając od tyłu zapisujemy każdą potęgę liczby 2 zaczynając od 1 (1 2 4 8 16 32 64 128, itd) a następnie możymy odpowiednio wartości przez 0 lub 1. Następnie sumujemy wartości. Np 11101100 = 236 gdyż: lecąc od tyłu: 0*1 + 0*2 + 1*4 + 1*8 + 0*16 + 1*32 + 1*64 + 1*128 = 4+8+32+64+128= 236.
Co to jest system dwójkowy? Mówiąc najprościej jest to taki system, który do zapisu informacji wykorzystuje tylko 2 cyfry: 0 i 1, gdzie 0 oznacza brak impulsu a 1 oznacza przepływ impulsu. 

Kroki:
W pierwszej kolejności wpisuję liczbę jaką chcę zamienić, w tym przypadku jest to liczba 191919. Następnie tworzę dwie tabelki: LICZBA oraz RESZTA. Przechodzimy w komórkę A5 która będzie podstawą naszego rozwiązania. Pobieramy wybraną wcześniej liczbę, czyli wpisujemy w komórkę A5 komendę =G5 (czyli komórkę w której znajduje się nasza liczba). Kolejnym krokiem będzie przejście w niższą komórkę gdzie wpisujemy komendę: =JEŻELI(ORAZ(A5<>0;A5<>"");LICZBA.CAŁK(A5/2);"")  Teraz przechodzimy do obliczenia reszty. Wchodzimy w komórkę B5 w której wpisujemy komendę:
=JEŻELI(ORAZ(A5<>0;A5<>"");MOD(A5;2);"")       
Ostatnim krokiem jest po prostu skopiowanie obu komórek, aż dojdziemy do wartości 0. Naszym wynikiem jest liczba: 101110110110101111        

Rozwiązanie w Excel:
                       

Opracował: Michał A.


Algorytm Newtona-Raphsona

Interpretacja geometryczna pierwiastka kwadratowego 
Szukamy długości boku kwadratu o zadanym polu, poprzez jego przybliżanie kolejnymi prostokątami o tym samym polu.

Ponieważ dana figura ma być kwadratem więc wartości x i p/x powinny być sobie równe. Jeśli nie są, to szukane rozwiązanie jest położone między nimi, czyli możemy przyjąć, że jest to średnia arytmetyczna tych dwóch wielkości.A zatem możemy wyznaczyć kolejne przybliżenia pierwiastka.
 
Mamy za zadanie obliczyć wartość pierwiastka kwadratowego z liczby dodatniej
Nie możemy jednak posłużyć się funkcją standardową SQRT. Na szczęście jeden z takich przepisów został podany ponad 300 lat temu przez Newtona i Raphsona. Przepis Newtona – Raphsona: Jako pierwsze przybliżenie bierzemy np.1, a jako kolejne – wyrażenie: średnią arytmetyczną z poprzedniego przybliżenia i liczby podzielonej przez poprzednie przybliżenie.
Skończymy ciąg obliczeń wtedy, gdy różnica między kolejnymi przybliżeniami będzie nie większa niż podana dokładność.

Wzór na ciąg kolejnych przybliżeń ma postać:
Lista kroków:
  1. Pobieramy wartość liczby podpierwiastkowej p oraz dokładność obliczeń Eps
  2. Przyjmujemy pierwsze przybliżenie poszukiwanego rozwiązania np. x=1
  3. Jeśli |x – p/x|<=Eps  to idziemy do 6.
  4. Obliczamy kolejne przybliżenie x:= (x+p/x)/2
  5. Przechodzimy do 3.
  6. Wypisujemy wartość x.
  7. Koniec

Schemat blokowy:
C++
#include <iostream> 
#include <math.h>   
using namespace std;   
int main() 
{     
float A,a;     
float eps = 0.0001;         
cin >> A;     
a = A/2;         
while(fabs(A/a-a)>eps)     
{         
a = (A/a+a)/2;    
 }         cout << a;     
return 0; 
}

Program w Excel




Opracował: Mateusz Cz.


Algorytm Euklidesa

Algorytm Euklidesa -algorytm wyznaczania największego wspólnego dzielnika dwóch liczb (NWD). Został opisany przez greckiego matematyka, Euklidesa w jego dziele „Elementy”, w księgach siódmej oraz dziesiątej
NWD - największy wspólny dzielnik (ang. GCD - Greatest Common Divisor) liczb a i b jest największą liczbą naturalną, która jednocześnie dzieli a i b bez reszty.
Euklides zauważył, że NWD liczb a i b dzieli również ich różnicę.

Schemat blokowy


C++

#include <iostream>
#include <cmath>
using namespace std;
int main(int argc, char ** argv)
{
int a, b, c;
cin >> a;
cin >> b;
if (a != b)
{
while (a%b != 0)
{
c = a;
a = b;
b = c % b;
}
cout << b << endl;
}
else
cout << a << endl;
}

Rozwiązanie w Excel

W komórkach  F4 i F5 wpisujemy  dowolne liczby  „a” i „b”
W komórki arkusza wpisano formuły:
A3=F4  ;
B3=F5 ; 
C3=JEŻELI(B3=0;A3;"") 
A4=JEŻELI(ORAZ(B3>0;B3<>"");B3;"")  - kopiujemy wprowadzoną formułę do wiersza np. 300
B4=JEŻELI(ORAZ(B4>0;B4<>"");MOD(A4;B4);"")  - kopiujemy wprowadzoną formułę do wiersza np. 300

Jeżeli w kolumnie „C” pojawi się liczba to jest ona NWD  naszych liczb „a” i „b”

Opracował: Eliasz M.

Czy liczba jest pierwsza?

Test pierwszości to algorytm określający, czy dana liczba jest pierwsza, czy złożona. Nie jest to równoważne znalezieniu jej rozkładu na czynniki pierwsze. W obecnej chwili nie są znane efektywne algorytmy rozkładu na czynniki pierwsze, natomiast testy pierwszości można przeprowadzać bardzo szybko.
 Metoda naiwna
Najprostszy test pierwszości wygląda następująco: dla danej liczby n należy sprawdzić, czy dzieli się ona kolejno przez 2, 3, aż do n−1. Jeśli przez żadną z nich się nie dzieli, oznacza to, że jest pierwsza.

Zamiast testować wszystkie liczby do n−1, wystarczy sprawdzić podzielność n przez liczby mniejsze lub równe sqrt(n).
Kolejne udoskonalenie polega na sprawdzaniu podzielności n jedynie przez liczby pierwsze mniejsze lub równe sqrt(n). Ich listę łatwo możemy uzyskać metodą sita Eratostenesa. Metoda ta wciąż wymaga wykonania dużej liczby (sqrt(n)) dzieleń, co oznacza, że już dla 50-cyfrowych liczb pierwszych jest niewykonalna na współczesnych komputerach


Lista kroków:

K01:g ← [√n]
K02:Dla i = 2,3,...,g wykonuj krok K03
K03: Jeśli n % i = 0, to pisz NIE i zakończ
K04:Pisz TAK
K05:Zakończ

Schemat blokowy
Program w C++
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;

bool czy_pierwsza(int n)
{
  if(n<2)
    return false;

 int g;
  g=sqrt(n);

  for(int i=2;i<=g;i++)
    if(n%i==0)
      return false; 
  return true;
}

int main()
{
  int n;

  cout<<"Podaj liczbe: ";
  cin>>n;

  if(czy_pierwsza(n))
    cout<<"Liczba "<<n<<" jest pierwsza"<<endl;
  else
    cout<<"Liczba "<<n<<" nie jest pierwsza"<<endl;

  return 0;
}

Rozwiązanie w Excel


W komórce E5 podajemy liczbę, której pierwszość chcemy zbadać.
Do komórki H5 należy wpisać formulę:

=JEŻELI(LUB(E5=2;E5=1);"Liczba pierwsza";JEŻELI(ORAZ(MOD(E5;WIERSZ(ADR.POŚR("2:"&ZAOKR.GÓRA(E5^0,5;0))))<>0);"Liczba pierwsza";"Liczba nie jest pierwsza"))

W komórce H5 pojawi się informacja czy liczba jest pierwsza.

Opracował: Maciej G. 

wtorek, 4 kwietnia 2017

Algorytm wyszukujący wartość max w ciągu liczb

// post w trakcie tworzenia

Pierwiastki równania kwadratowego

Równanie kwadratowe posiada następującą postać:
x2 + bx + c = 0,  a ≠ 0
gdzie x to poszukiwana niewiadoma, a a, b, c to współczynniki równania.
Pierwiastkiem równania jest taka wartość niewiadomej x, która podstawiona w jej miejsce do równania spełnia je. Równanie kwadratowe często posiada dwa pierwiastki rzeczywiste. Jeśli istnieje tylko jedna taka liczba, to mówimy, iż jest ona pierwiastkiem podwójnym.

Lista kroków

Specyfikacja: 
Dane: a, b, c є R (a≠0)
Wynik:  x₁, x₂ ϵR


K0: Wczytaj dane: a, b i c;
K1: Jeżeli D>0 to x₁=(-b-√delta)/2a, x₂=(-b+√delta)/2a;
K2: Jeżeli D=0 to x₁= x₂= -b/2a
K3: Jeżeli D<0 to równanie nie ma rozwiązania.

Schemat blokowy



Rozwiązanie w C++

#include <iostream>
#include <math.h>
using namespace std;
int main()
   double a, b, c, delta, x1, x2;
    cout << "Podaj wspolczynnik a rownania kwadratowego: "; cin >> a;
    cout << "Podaj wspolczynnik b rownania kwadratowego: "; cin >> b;
    cout << "Podaj wspolczynnik c rownania kwadratowego: "; cin >> c;
    delta = b * b -( 4 * a * c );
    if ( delta < 0 )
    { 
       cout << "Rownanie nie ma rozwiazania";
        return 0;
      }
    if (delta == 0 )
    { 
       cout << "Rownanie ma jedno rozwiazanie ";
        cout << "x_0 = " <<- b /( 2 * a );
        return 0; 
    }
    delta = sqrt( delta );
    if ( b > 0 )
    { 
        x1 =( - b - delta ) /( 2 * a );
        x2 = c /( a * x1 );
     }
    else
    {  
        x2 =( - b + delta ) /( 2 * a );
        x1 = c /( a * x2 );
    }
    cout << "Rownanie ma dwa rozwiazania: ";
    cout << "x_1 = " << x1 << "   x_2 = " << x2;
    return 0;
}


Rozwiązanie w Excelu



1. W pola zaznaczone kolorem zielonym wpisujemy wartości współczynników trójmianu: 
     a w B2, b w D2 i c w F2. 
    Reszta pól jest wypełniana automatycznie jako wynik działania formuł. 

2. Komórka D5 wylicza wartość Δ równą b- 4ac.
Wpisana formuła to: =POTĘGA(D2;2)-4*B2*F2

3. Komórka D6 to pierwiastek z tej wartości, 
czyli =PIERWIASTEK(D5)

4. Komórka D8 wylicza pierwiastek  X1 = (- b - √Δ)/2a.
W arkuszu wygląda to tak: =(-D2-D6)/(2*B2)

5. Analogicznie komórka D10 wylicza
pierwiastek X2 = (- b + √Δ)/2aczyli =(-D2+D6)/(2*B2)

Opracował Emil Barnowski

Liczba a podniesiona do potęgi n-tej

Podstawowe pojęcia związane z potęgowaniem

a= b

n - wykładnik potęgi
a - podstawa potęgi
b - wynik potęgowania


Specyfikacja algorytmu


Dane: liczba, potega     //należą do N
           i                         // licznik pętli
           tym                   // wartość tymczasowa, do chwilowego zapamiętania wartości potęgi 
Wynik: wynik potęgowania


Lista kroków

K01: Wczytaj liczba
K02: Wczytaj potega // wykładnik potęgi
K03: Dla i=0 do potęga-1 WYKONUJ K04
K04: liczba = tym*liczba; i++;
K05: Wypisz wartość liczba


Rozwiązanie w C++
#include <iostream>
using namespace std;
int main()
{
int tym,i,liczba,potega;
cout<<"\n\tPodaj liczbe: ";
cin>> liczba;                           //Wczytywanie danych z klawiatury
tym=liczba;
cout<<"\tPodaj stopien potegi: ";
cin>> potega;
system("cls");
for(i=0;i<potega-1;i++)                 //Obliczanie potęgi za pomocą tabeli
{
  liczba=tym*liczba;
}
cout<<"\n\t"<<tym<<" do potegi "<<potega<<" wynosi "<<liczba;         //Wyświetlanie wyników
cin.ignore();
getchar();
return 0;
}

Rozwiązanie w EXCEL


W arkuszu kalkulacyjnym EXCEL zaprojektowano zestawienie, w którym użytkownik podaj potęgowaną liczbę (B4) oraz wykładnik potęgi (F4).

Uwaga! Excel liczy wartość potęgowanej liczby maksymalnie dla wykładnika o wartości 20

Następnie utworzono tabelę, w której pokazano kolejne wartości liczby z B4 podnoszone do potęgi od 1 do wartości wykładnika zapisanego w F4.
W komórce E7 wpisano formułę: =JEŻELI(D7<=$F$4;B7^D7;""), którą skopiowano aż do komórki E26.
W komórce E27 wstawiono formułę obliczająca wartość maksymalną w kolumnie E, tj. =MAX(E7:E26). Będzie ona potrzebna do wyświetlenia odpowiedzi w wierszu 9.
Otóż w komórce ... wprowadzono formułę: =WYSZUKAJ.PIONOWO(F4;D7:E26;2)
która wyświetla w odpowiedzi wyszukaną maksymalną wartość kolumny E.

Zastosowano również formatowanie warunkowe dla wartości z kolumny E wg wzoru


Opracował Marcin Sz. 




wtorek, 14 marca 2017

Czy liczba jest pierwsza?

Algorytm sprawdzający czy liczba jest liczbą pierwszą?

Najprostszy test pierwszości wygląda następująco: dla danej liczby n należy sprawdzić, czy dzieli się ona kolejno przez 2, 3, aż do n−1. Jeśli przez żadną z nich się nie dzieli, oznacza to, że jest pierwsza.

Optymalizacja
Zamiast testować wszystkie liczby do n−1, wystarczy sprawdzić podzielność n przez liczby mniejsze lub równe sqrt(n).

Lista kroków

Specyfikacja algorytmu
Wejście:
n –  liczba naturalna badana na pierwszość, n > 1

Wyjście:
TAK, jeśli n jest pierwsze lub NIE w przypadku przeciwnym.

Elementy pomocnicze:
g – granica sprawdzania podzielności p, g należy do N
i – kolejne podzielniki liczby n, i należy do N

K01         g ← [√n]
K02         Dla i = 2,3,...,g wykonuj krok K03
K03         Jeśli n % i = 0, to Wypisz "NIE" i zakończ
K04         Wypisz "TAK"
K05         Zakończ


Schemat blokowy


Program w C++

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
bool czy_pierwsza (int n)
{
  if (n<2)  return false;
  int g;
  int i;
  g=sqrt(n); // sqrt - pierwiastek kwadratowy 
  for (i=2;i<=g;i++)
    if (n%i==0)     return false; 
  return true;
}
int main()
{
  int n; // sprawdzana liczba
  cout<<"Podaj liczbe: ";
  cin>>n;

  if (czy_pierwsza(n)) //lub czy_pierwsza(n)==1
    cout<<"Liczba "<<n<<" jest pierwsza"<<endl;
  else
    cout<<"Liczba "<<n<<" nie jest pierwsza"<<endl;
  return 0;
}


sobota, 11 marca 2017

Algorytm sprawdzający czy ciąg jest rosnący

Algorytm sprawdzający czy ciąg jest rosnący


Algorytm sprawdza, czy wyraz następny jest większy od poprzedniego. Jeżeli kolejny element ciągu jest większy od poprzedniego, to ciąg jest rosnący.

List kroków

K01   Wczytaj n, szukana, T[0…n-1],
K02  Licznik pętli przyjmuje wartość 0,
K03  Dla i < n-1 wykonaj krok od K04 do K06
K04 Sprawdź czy T[i] >= T[i+1],
K05   Jeśli tak to napisz „NIE”, w przeciwnym razie 
K06 Jeśli nie to i = i+1,  Wypisz „TAK”.


Schemat blokowy

Rozwiązanie w C++

#include <iostream>
using namespace std;

int main() 
{
int n; //liczba elementów ciągu
cout << "Podaj liczbe elementow: "; cin >> n;

int t[n]; //tablica t - jednowymiarowa, n-elementowa
// wprowadzenie elementów ciągu do tablicy
for (int i=0; i<n; ++i) 
{
  cout << "Podaj element nr " << (i+1) << ": ";
  cin >> t[i];
}

// sprawdzanie, czy elementy w tablicy t są posortowane rosnąco 
bool rosnace = true;
for (int i=1; i<n; ++i) if (t[i-1] >= t[i]) rosnace = false;

// wypisanie wyniku
if (rosnace) cout << "Tablica jest rosnaca!" << endl; 
else cout<<"Ciag nie jest rosnacy "<<endl;
}

Rozwiązanie w arkuszu kalkulacyjnym EXCEL
Aby rozwiązać algorytm sprawdzający czy ciąg jest rosnący zaprojektowano arkusz, w którym użytkownik musi wprowadzić wartości 5 dowolnych elementów ciągu (do komórek leżących w zakresie B8:B12). 
Następnie w kolumnie C wprowadzono formułę wykorzystującą funkcję logiczną JEŻELI, która sprawdza czy element n+1 jest większy ni jego poprzednik n. 
=JEŻELI(B9>B8;"rosnący";"nie rosnący")
W kolumnie D sprawdzana jest wartość ciągu znaków z kolumny C. Ponownie wykorzystano funkcję logiczną Jeżeli:
=JEŻELI(C8="rosnący";0;1)
W komórce I7 wprowadzono formułę obliczającą sumę wartości w kolumny D
=SUMA(D8:D12)
Ostateczny wynik, który podaje informacje czy ciąg jest rosnący wyświetlany jest w komórce D15
=JEŻELI(I7=0;"CIĄG LICZB JEST ROSNĄCY";"CIĄG LICZB NIE JEST ROSNĄCY")

Opracowała: Ada Sz.






Algorytm obliczający miejsce miejsce zerowe funkcji

Algorytm obliczający miejsce miejsce zerowe funkcji

Nazwa funkcji liniowej pochodzi stąd, iż jej wykres jest linią prostą.
Wzór funkcji liniowej: 
f(x)=ax+b

Żeby narysować wykres funkcji liniowej, wystarczy wyznaczyć dwa punkty, które do niego należą.


Współczynnik kierunkowy „a”

Funkcja liniowa jest rosnąca jeżeli a > 0.
Funkcja liniowa  jest malejąca jeżeli a < 0.
Funkcja liniowa jest stała jeżeli a = 0.


Wyraz wolny „b”
Wyraz wolny jest również wartością funkcji liniowej w punkcie 0.



Miejsce zerowe
Miejsce zerowe funkcji liniowej obliczamy przyrównując wzór funkcji do zera.
0 = f(x) <=> 0 = ax + b


Lista kroków

K01  Wczytaj a i b
K02        Jeśli a<>0 , to idź do K06
K03
                x0  := - b/a
K04   Napisz " x0 = ", x0
K05  Zakończ
K06       Jeżeli b<>0  to Napisz "Równanie ma nieskończenie wiele rozwiązań" 
              w przeciwnym razie Napisz "Brak miejsca zerowego"
K07      Zakończ


Schemat blokowy

Rozwiązanie w C++
#include<iostream>
using namespace std;
int main()
{
  float a;
  float b;
  float x;
  float y;
cout << "         Rozwiazuje rownanie liniowe\n";
cout << "                  y=ax+b\n\n\n\n\n";      
  cout << "Podaj a: ";
  cin >> a;
  cout << "Podaj b: ";
  cin >> b;
cout<<"\n--------------------------------\n\n";
  if(a!=0) 
  {
  x=-b/a; 
   cout<<"x = "<<x;
  }
else
{
if(b!=0) cout<<"Rownanie nie ma rozwiazan";
else cout<<"Rownanie ma nieskonczenie wiele rozwiazan";
}
cout<<"\n";  
  }

Rozwiązanie w arkuszu kalkulacyjnym EXCEL



Aby w arkuszu kalkulacyjnym EXCEL obliczyć miejsce zerowe funkcji należy zastosować formułę, wykorzystującą funkcję logiczną „JEŻELI”.
W komórce C11 wpisano formułę:
=JEŻELI(B6=0;JEŻELI(B7=0;"Funkcja ma nieskończenie wiele miejsc zerowych.";"Funkcja nie ma miejsc zerowych.");-B7/B6)

Opracował Mikołaj M.