czwartek, 19 listopada 2015

Rozwiązywanie problemów informatyków

Problem kasjera - możemy się z nim spotkać kiedy jesteśmy w sklepie. Polega on na tym, że kasjer nie ma nam wydać reszty z tych nominałów, które posiada. Wtedy to rodzi się kłopot. Można go rozwiązać za pomocą wydawania algorytmu reszty.

LISTA KROKÓW:

Opis słowny algorytmu wydawania reszty.
Dane: Kwota pieniędzy do wydania, nominały 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 wydania = 0 [stop] w przeciwnym razie powtarzamy kroki 2 - 4

SCHEMATY BLOKOWE:



Program MS Excel: 


 PASCAL:

program Reszta; {obliczenia w petli WHILE}
uses crt;
cons

t 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.



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.


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;
}


VBA (Visual Basic for Applications)

Sub skomplikowany_program() ''''stworzenie funkcji celu i wzoru na prostą ograniczającą''' Range("b1") = "cel" Range("b2").Formula = "=sin(" & Cells(2, 3).Address & ")+ 1/2*" & Cells(2, 3).Address Range("c1") = "x=" Range("a4") = "prosta" Range("b4").Formula = "=-0.7*" & Cells(2, 3).Address & "+10" ''''stworzenie formuły, która będzie wykorzystywana przez Solvera jak warunek ograniczający''' Range("a6") = "warunek" Range("b5").Formula = "=" & Range("b2").Address & "-" & Range("b4").Address Range("c5") = "<" Range("d5") = 0 ''''stworzenie "pierwszej" kolumny Tabeli Danych (a więc x=0, x=0.2, x=0.4 ... x=10)''' Cells(10, 1) = 0 For i = 1 To 50 Cells(i + 10, 1) = Cells(i + 9, 1) + 0.2 Next i ''''zmiana szerokości kolumny''' Columns(2).ColumnWidth = 12 ''''dodanie tekstu i formuły w nagłówku "drugiej" kolumny Tabeli Danych''' Range("b8") = "funkcja celu" Range("b9").Formula = "=" & Range("b2").Address ''''dodanie tekstu i formuły w nagłówku "trzeciej" kolumny Tabeli Danych''' Range("c8") = "prosta" Range("c9").Formula = "=" & Range("b4").Address ''''stworzenie Tabeli Danych na podstawie 3 kolumn''' Range(Cells(9, 1), Cells(60, 3)).Table columninput:=Range("c2") ''''stworzenie wykresu na podstawie Tabeli Danych''' Charts.Add ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SetSourceData Source:=Sheets("Arkusz1").Range("A10:C60"), PlotBy _ :=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Arkusz1" ActiveChart.SeriesCollection(2).Select ''''wprowadzenie zadania optymalizacji do Solvera - maksymalizacja B2 poprzez zmianę C2''' solverreset solverok setcell:=Range("b2"), maxminval:=1, bychange:=Range("c2") ''''dodanie warunku ograniczającego - B5 to lewa strona, 1 to znak ≤, D5 to prawa strona''' solveradd cellref:=Range("b5"), relation:=1, formulatext:=Range("d5") solversolve userfin
ish:=True End Sub

Brak komentarzy:

Prześlij komentarz