środa, 26 września 2012

Spotkanie 4: Rozwiązywanie problemów za pomocą komputera.

24.09.2012

Definicja algorytmu:

Algorytm – w matematyce oraz informatyce skończony ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. Słowo "algorytm" pochodzi od starego angielskiego słowa algorism, oznaczającego wykonywanie działań przy pomocy liczb arabskich (w odróżnieniu od abacism - przy pomocy abakusa), które z kolei wzięło się od nazwiska, które nosił Muhammad ibn Musa al-Chuwarizmi (أبو عبد الله محمد بن موسى الخوارزمي), matematyk perski z IX wieku.
Algorytm ma przeprowadzić system z pewnego stanu początkowego do pożądanego stanu końcowego. Badaniem algorytmów zajmuje się algorytmika. Algorytm może zostać zaimplementowany w postaci programu komputerowego.
Jako przykład stosowanego w życiu codziennym algorytmu podaje się często przepis kulinarny. Dla przykładu, aby ugotować bigos należy w określonej kolejności oraz odstępach czasowych (imperatyw czasowy) dodawać właściwe rodzaje kapusty i innych składników. Może istnieć kilka różnych przepisów dających na końcu bardzo podobną potrawę. Przykład ten ma wyłącznie charakter poglądowy, ponieważ język przepisów kulinarnych nie został jasno zdefiniowany. Algorytmy zwykle formułowane są w sposób ścisły w oparciu o język matematyki.
W niektórych krajach, jak USA, algorytmy mogą zostać opatentowane, jeżeli zostaną zaimplementowane w jakimś praktycznym celu. Niektórzy twierdzą, że patentowanie algorytmów spowalnia rozwój informatyki, bo jeden producent może uzyskać monopol, np. na pisanie oprogramowania tworzącego pewne typy plików (np. GIF). Wiele koncernów komputerowych prowadzi między sobą spory prawne dotyczące praw własności do niektórych patentów. Kontrargumentem jest tzw. prawo własności intelektualnej (jaką objęty jest np. utwór muzyczny, będący wytworem intelektu i pracy muzyka) zakładające, że program jest intelektualną własnością twórcy.

Problem kasjera

Opis problemu:

Problem kasjera – zagadnienie z dziedziny algorytmiki, problem polegający na wybraniu z danego zbioru monet o określonych nominałach takiej konfiguracji, by wydać żądaną kwotę przy użyciu minimalnej liczby monet. Jego rozwiązania są wykorzystywane w automatach z napojami, bankomatach itd.

Metody rozwiązywania:

a) lista kroków
Dane: Kwota pieniędzy do wydania, nominał banknotów i bilonu uporządkowane malejąco. 
Wyniki: Ilość poszczególnych nominałów banknotów i bilonu.
Krok 1: Ustalenie wartości początkowych. 
Krok 2: Sprawdzamy, ile razy najwyższy nominał mieści się w kwocie do wydania. 
Krok 3: Obliczamy resztę do wydania: poprzednia kwota - obliczona ilość * nominał.
Krok 4: Przechodzimy do niższego nominału.
Krok 5: Jeśli reszta do wydanie = 0 [stop] w przeciwnym razie powtarzamy kroki 2 - 4.

b) schematy blokowe



c) rozwiązanie w Excel

d) VBA 

e)Turbo Pascal
program wydawanie_reszty; uses crt; var reszta : longint;
begin
clrscr;
  writeln('podaj kwote: '); readln(reszta);  writeln;
  writeln(reszta div 200, ' banknotow 200zl');
  reszta:=reszta mod 200;
  writeln(reszta div 100, ' banknotow 100zl');
  reszta:=reszta mod 100;
  writeln(reszta div 50, ' banknotow 50zl');
  reszta:=reszta mod 50;
  writeln(reszta div 20, ' banknotow 20zl');
  reszta:=reszta mod 20;
  writeln(reszta div 10, ' banknotow 10zl');
  reszta:=reszta mod 10;
  writeln(reszta div 5, ' monet 5zl');
  reszta:=reszta mod 5;
  writeln(reszta div 2, ' monet 2 zl');
  reszta:=reszta mod 2;
  writeln(reszta, ' monet 1 zl');
  repeat until keypressed;
end.


program Reszta; {obliczenia w petli WHILE}
uses crt;
const N: Array [1..8] of integer = (200, 100, 50, 20, 10, 5, 2, 1);
var i,P,R: longint;
begin
clrscr;
Write('Podaj reszte do wyplacenia: ');
ReadLn(R);
i:=1;
while (R>0) do           {dopoki nie wydano calej reszty}
      begin
           if R>= N[i] then      {sprawdz czy mozna wydac danym nominalem}
              begin
                   P:= R div N[i];    {ile razy wydac dany nominal}
                   R:= R - (P*N[i]);  {zmniejsz reszte o wydany nominal}
                   WriteLn(N[i], ' x ', P); {wypisz wynik}
              end;
              inc(i);               {rozpatrz kolejny nominal}
      end;
repeat until keypressed;
end.

f) C++


//Wydawanie reszty, C++

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
  //tablica dostepnych nominalow
  int N[8]={200, 100, 50, 20, 10, 5, 2, 1};
  int R,P, i;

  cout << "Podaj reszte do wyplacenia: ";
  cin >> R;

  i=0;
  while (R>0)       //dopoki nie wydano calej reszty
  {
    if (R >= N[i])  //sprawdz czy mozna wydac danym nominalem
    {
      P=R / N[i];   //ile razy wydac dany nominal
      R=R-(N[i]*P); //zmniejsz reszte o wydany nominal
      cout << N[i] << " x " << P << endl; //wypisz wynik
    }
    i++;            //rozpatrz kolejny nominal
  }

  system("PAUSE");
  return 0;
}
 




Brak komentarzy:

Prześlij komentarz