Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  149 25483
Sitat av Markus
Jeg fant ut at jeg skulle prøve å løse oppgave nummer en i posten til trådstarter. Jeg valgte å skrive det i javascript, siden det var det som virket enklest akkura da. Det er litt upraktisk, kanskje, men det var gøy å løse oppgaven.

http://markus.navhost.com/gjetting.html
Vis hele sitatet...
Litt dritt at man ikke kommer ut av siden før man har gjettet riktig da
cromoglic:

Feilen er ganske strukturell jah! =P
du må huske innslag i teksten etter hver "if", "while" også hvidere.
Jeg ville også brukt "input()" fremfor "raw_input()", siden raw_input mange steder. siden raw gjør tallene dine om til bokstaver som dataen ikke forstår, viss du skjønner hva jeg mener.

Kode

# -*- coding: cp1252 -*-
import os, time, sys


validaccounts = {}
validaccounts['205672375314'] = "Ola Normann"
validaccounts['151829803742'] = "Kari Normann"
saldo = 1000



print "Hei, og velkommen til DinMinibank!"
print "Dato og tid:" + " " + time.ctime()
print "Vennligst skriv inn ditt kontonummer."


Kontonummer = raw_input("Skriv inn dit kontonummer, 12 siffer: ") 
loop = 1
while loop == 1:
    if validaccounts.has_key(Kontonummer):
        print "Velkommen," + " " + validaccounts[Kontonummer]
        print "Her er din brukermeny:"
        print "Tast 1 for uttak."
        print "Tast 2 for innskudd."
        print "Tast 3 for saldo."
        choice = input("Ønsket valg: ")
        if choice == 1:
            loop2 = 1
            print "Uttaksmeny."
            print "Skriv inn ønsket uttak"
            print "Husk at maksimalt beløp tilgjengelig for uttak er kr. 10.000"
            while loop2 == 1:
                uttak = input("Ønsket uttak: ")
                if uttak <= 10000:
                    print "Valgt uttak: kroner" ,uttak #merk endringer
                    print "Vennligst ta ditt minibankkort, og så pengene"
                    saldo = saldo - uttak
                    loop = 1
                    loop2 = 0
                elif uttak > 10000:
                    print "Ugyldig uttak."
                    loop2 = 1
        elif choice == 2:
                loop3 = 1
                print "Innskuddsmeny."
                print "Skriv inn ønsket innskudd"
                print "Husk at maskimalt beløp tilgjengelig for innskudd er kr. 50.000"
                while loop3 == 1:
                    innskudd = input("Ønsket innskudd: ")
                    if innskudd <= 50000:
                        print "Valgt innskudd: " ,innskudd
                        print "Vennligst legg pengene i skuffen som skyves ut"
                        print "Husk at vi kun aksepterer sedler!"
                        saldo = saldo + innskudd
                        loop = 1
                        loop3 = 0
                    elif innskudd > 50000:
                        print "Ugyldig innskudd"
                        loop3 = 1
        elif choice == 3:
            print saldo
            loop = 1
den er litt bedre nå, nå kan vi sette inn og ta ut penger. Men Kari og Ola har samme saldo, whatsoever
Hadde hvert kult å få til passord og greier, også klikker pcen min viss jeg skriver feil kontonummer =P
Sist endret av Lizzard; 22. mars 2008 kl. 22:44.
Ingen som ville prøvd å løse oppgaven i Java? Hadde selv tenkt å starte med den i ettermiddag.
tobiasmt: Jeg vil lære meg Java, så vi får se om noen tiår, når jeg kanskje har orket å begynne:P
Lizzard: takk Det funka Prøvde med en PIN-kode også, men det ble for krevende for meg akkurat da. Ulik saldo er ennå et mål.
m0b
m0b's Avatar
DonorAdministrator
Ok, jeg syntes det minibank-programmet var litt interessant. Så jeg satte av et par timer til implementering og testing. Det er svært mange måter å løse dette på, men skreiv det i håp om at noen kanskje kunne finne dette interessant og/eller lærerikt.

Målet med dette er at minibanken skal være dynamisk og enkel å kunne bygge ut videre for all mulig funksjonalitet man skulle kunne ønske seg. Det skal også være mulig å koble til minibanken over internett (typisk med putty i raw mode).

Blir kun å dra med enkelte eksempler fra kildekoden i denne posten, det blir for mye å gi alt her, dere kan laste ned hele sourcen fra adressen. Den er også skrevet i C#, ikke php slik kodeeksemplene sier. Jeg anbefaler dessuten at dersom dere vil leke med dette, så bruker dere PuTTY, satt i Raw mode

Fullstendig kode kan lastes ned fra http://80.65.51.238/~kenwi/minibank/MiniBank.rar

http://91.205.187.69/~kenwi/minibank/putty.png

Jeg kan også nevne at jeg har satt opp en server som står på 62.92.122.25 port 2471 som dere kan teste på. Programmet tar ikke høyde for brukerimput som ikke er skrevet inn korrekt, så dere trenger sikkert ikke være så altfor kreative med akkurat dét.

Planlegging og implementasjon
Jeg har en hovedklasse jeg kaller Server, denne inneholder all statisk data i systemet. Denne inneholder for eksempel en liste over alle kontoer som eksisterer i systemet, og alle kontoenes verdier og eiere.

Det skal være en dynamisk meny, jeg skal kunne skreddersy nye menyer og sette opp hvilken funksjonalitet de enkelte menyene tilbyr. Dette betyr at jeg er nødt til å lage en klasse som beskriver en meny, og jeg er også nødt til å lage klasser som beskriver funksjonaliteten til de enkelte kommandoene i menyen.

Jeg tenker i utgangspunktet to menyer, men jeg har muligheten til kjapt og enkelt lage så mange jeg har lyst til, men så mange undernivå som jeg overhodet ønsker.
  • Login
    • Vis penger på konto
    • Sett inn penger på konto
    • Overfør penger fra konto til en annen konto
    • Vis kontoer
    • Quit
  • Lag konto
  • Vis kontoer
  • Quit

Hver av disse tingene representerer en kommando, kommandoen er en klasse som inneholder en konstruktør og en funksjon som heter Execute(). Dette er likt for alle kommandoer. Dette betyr at jeg kan iterere igjennom en liste med kommandoer og utføre samme funksjonen på alle objektene. Høres flott ut? Greit.

Jeg starter med å lage klassen som heter Server, denne tar imot tilkoblinger fra klienter og aksepterer disse. Lager et nytt objekt fra klassen som heter MainMenu, denne er den første menyen som blir presentert til en bruker. Konstruktøren til MainMenu tar med en Socket som parameter, slik at jeg kan få en referanse til klienten som har koblet til. MainMenu tar også med seg en referanse til listen over kontoer som eksisterer. Dette er fordi jeg vil ønske å gjøre endringer på kontoene videre i menyene.

En tråd opprettes og utfører funksjonen Process() mot den klienten som akkurat koblet til. Dette betyr at jeg har mange brukere som kan koble til, og alle vil i bunn og grunn ha tilgang til å endre på listen over kontoer.

Kode

    while( true )
    {
        // Aksepter tilkoblingen til en klient
        Socket socket = listener.AcceptSocket();
        
        if( socket.Connected )
        {
            Debug.WriteLine( "Client Connected" );

            MainMenu menu = new MainMenu( socket, accounts );
            Thread thread = new Thread( new ThreadStart( menu.Process ) );                        
            
            thread.Start();
        }
    }
Slik Process() funksjonen i MainMenu fungerer er følgende:
1: Send meny til brukeren
2: Ta imot input, utfør funksjonen Parse().

Parse() Går igjennom listen over kommandoer som er tilknyttet MainMenu og kjører funksjonen Execute() på kommandoen som er skrevet inn.

Kode

    public string Parse( string command )
    {
        // Fjern newline fra kommandoen og hvilken kommando brukeren har kjørt
        command = command.Replace( Environment.NewLine, "" );
        int num = 0;
        foreach( IMenuItem item in children )
        {
            num++;
            if( command.Equals( num.ToString() ) )
            {
                // Kjør kommandoen
                item.Execute();

                // Ingen flere kommandoer skal avfyres
                break;
            }
        }            
        // Returner menyen tilbake til klienten
        return this.ToString();
    }
Jeg viser dere en liten del av konstruktøren til MainMenu, og her er kommandoene som er puttet inn i den.

Kode

    public MainMenu( Socket socket, List<Account> accounts )
    {
        // ...

        // Slenger med accounts som referanse, vi ønsker å dra med Accounts 
        children.Add( new MenuItemLogin( socket, accounts ) );
        children.Add( new MenuItemCreateAccount( socket, accounts ) );
        children.Add( new MenuItemDisplayAccounts( socket, accounts ) );

        children.Add( new MenuItemQuit( socket ) );
    }
Et lite eksempel her er kommandoen Quit som er med i MainMenu. Som dere kan se så har den fått med seg en referanse fra MainMenu (som igjen har fått referansen sin fra Server-klassen). Dette betyr at jeg har en link mellom klienten og Quit-kommandoen, og jeg kan dermed utføre funksjonen Close() på socketen og stenge ned tilgangen til nøyaktig denne brukeren. Artig?

Kode

    // Klassen arver fra MenuItem og implementerer Interfacet IMenuItem
    class MenuItemQuit : MenuItem, IMenuItem
    {
        private Socket client;

        // Referanse til klienten så man kan sende data tilbake,
        // ta også med hvilken tekst itemet skal ha, send tilbake til base-klassen
        public MenuItemQuit( Socket client ) 
            : base( "Quit" )
        {
            this.client = client;
        }

        // All logikk som skal inn i kommandoen
        public void Execute( )
        {
            client.Close();
        }
    }
Så for å vise at jeg kan lage et ny menyklasse (med arv fra MainMenu, fordi klassene skal ha samme type funksjonalitet) veldig enkelt drar jeg med menyen som blir presentert til brukeren når han har logget inn. Legg også merke til at jeg har med kommandoen MenuItemQuit slik jeg hadde i toppmenyen. Eksemplet viser at jeg kjapt og enkelt kan skreddersy alle menyene mine, og lage så mange og avanserte jeg kan tenke meg fram til. Dette betyr at det selvfølgelig blir mye mye mer kode enn om jeg hadde laget systemet rett fram, men også at systemet blir veldig mye mer dynamisk!

Kode

    // Denne klassen arver fra MainMenu og vi kan derfor skreddersy denne
    // menyen med å supplere de forskjellige kommandoene som den skal vise
    class LoggedinMenu : MainMenu
    {
        // Brukeren som er logget inn
        private Account account;

        public LoggedinMenu( Socket socket, List<Account> accounts, Account account )
        {
            this.socket = socket;
            this.account = account;
            this.accounts = accounts;

            children.Add( new MenuItemViewBalance( socket, accounts, account ) );
            children.Add( new MenuItemDeposit( socket, account ) );
            children.Add( new MenuItemWireTransfer( socket, accounts, account ) );
            children.Add( new MenuItemDisplayAccounts( socket, accounts ) );
            children.Add( new MenuItemQuit( socket ) );
        }
    }
Så, la oss begynne å leke litt med serveren. Jeg starter med å koble opp mot den med PuTTY ( i RAW-mode), jeg lager meg en konto som heter m0b, og logger inn med denne. Deretter setter jeg inn 1337 på kontoen og ser etterpå hvor mye penger som er inne på kontoen.

Kode

1 Login
2 Create Account
3 List Accounts
4 Quit
Input: 2
Please specify username: m0b
1 Login
2 Create Account
3 List Accounts
4 Quit
Input: 1
Please specify username: m0b
You are now logged in as m0b
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input: 2
Value: 1337
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input: 1
Your account balance: 1337
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input:
Ser dermed at å legge inn penger på en konto funker helt utmerket. Det neste jeg gjør er å koble meg opp med en til klient med PuTTY og lager enda en ny konto jeg kaller idlemob. Ser på hvilke kontoer som eksisterer. Som forventet så ser jeg nå to kontoer, idlemob og m0b. Sjekker kontobalansen på idlemob også. Som forventet er det ingen penger der.

Kode

1 Login
2 Create Account
3 List Accounts
4 Quit
Input: 2
Please specify username: idlemob
1 Login
2 Create Account
3 List Accounts
4 Quit
Input: 1
Please specify username: idlemob
You are now logged in as idlemob
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input: 4
--- Accounts ---
  m0b
  idlemob
----------------
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input: 1
Your account balance: 0
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input:
Det er nå det kanskje kan bli litt moro. Jeg går tilbake til m0b-kontoen min med 1337 spenn og overfører 539 spenn til idlemob.

Kode

Your account balance: 1337
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input: 3
Please specify destination account: idlemob
Please specify amount to wire: 539
You successfully wired 539 to idlemob
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input:
Såååå... Tilbake til sessionen jeg har gående med brukeren idlemob, sjekker saldoen.

Kode

Your account balance: 0
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input: 1
Your account balance: 539
1 View balance
2 Deposit
3 Wire transfer
4 List Accounts
5 Quit
Input:
Kjempegreier!

Det som er artig her er jo selvfølgelig at dette blir værende på serveren til jeg slår den av. Jeg kan altså koble meg til med putty, gjøre ting, koble av, og koble til igjen å resume ved å logge inn på brukeren.

http://91.205.187.69/~kenwi/minibank/putty2.png
Sist endret av m0b; 14. mai 2009 kl. 20:04.
Sikkerhetsklarert
Trådstarter
Hadde jeg bare skjønt halvparten av det der m0b, så hadde jeg vært fornøyd.
klasse, konstruktør og funksjoner.. Sier meg så lite

Men hvor i koden er det du faktisk skriver ut menyen? ser ikke Console.WriteLine(); noe sted..
m0b
m0b's Avatar
DonorAdministrator
Vel, nå sender den over TCP/IP over socketen til klienten. Det er Putty som tar seg av alt output som klient. Dette er en server/klient modell, så for å kunne benytte seg av dette så må du bruke et klientapplikasjon som Putty
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Pjukern
Men hvor i koden er det du faktisk skriver ut menyen? ser ikke Console.WriteLine(); noe sted..
Vis hele sitatet...
Eg er tilbøyeleg til å gjette på at han skriver til en socket istadenfor til konsollet, uten å ha studert koden...
Sikkerhetsklarert
Trådstarter
Skjønte at man må inn med en klient, men ser heller ikke noen plass der du skriver til denne socket`n.

Nå blei jeg kicket ut derifra også.. hehe var jo godt på vei til å ta alle pengene dine..
m0b
m0b's Avatar
DonorAdministrator
Jeg slo den av nå, orket ikke ha den kjørende akkurat nå. Et typisk eksempel der jeg sender informasjon tilbake til klienten (skriver til socketen) er

Kode

    string data = "Please specify username: ";
    socket.Send( Encoding.ASCII.GetBytes( data ) );
Sikkerhetsklarert
Trådstarter
ok.. få leke meg litt med dette når jeg kommer hjem...

Man kan selv endre på hvilken port etc man vil at den skal lytte på?
m0b
m0b's Avatar
DonorAdministrator
Jada, det kan du selv helt fint endre i Server.cs
Sikkerhetsklarert
Trådstarter
Har kikket på kilden din opp og ned i mente nå.. Men finner virkelig ikke der du skriver til og fra socket.. Du har jo feilmeldinger som vises når man oppgir feil navn på konto etc.. disse finner jeg ikke igjen i noen av filene (server, program mainmenu eller loggedinmenu)

Er vant til å lese små snutter der alt er i samme fil, dette var jo delt opp i klasser og funksjoner til de grader, og da er det vanskelig for en nybegynner å se rekkefølgen i programmet.

Tenkte jeg skulle leke meg litt med en "server" som folk kan koble til på, og kjøre f.eks "guessing game" som jeg nevnte på side 1 i denne tråden...
ikke nødvendigvis med Putty.. forsøkte med telnet, men det ble bare tull da du har den "newline" fiksen der.. slik at med Windows sin telnetklient så sendes det linjeskift for hver bokstav..
m0b
m0b's Avatar
DonorAdministrator
Jepp, det du i såfall må gjøre er å lese inn til buffer med += med én og én char når den får input, og sende inn kommandoen når den treffer på newline.

I tillegg, når det kommer til telnet så bør du returnere samme bokstaven som du har skrevet inn, ellers vil du ikke se noe output. (skal være måter å forhindre dette i telnet, men det huskeg jeg ikke helt hvordan gjøres)

Ja, jeg har lagt opp programmet i forskjellige klasser for å kunne modulisere programmet. Du ser på hvilken måte dette gjør hele sulamitten meget dynamisk?

Hvis du ser i MenuItems folderen, så finner du alle MenuItem klassene. Det er i disse jeg leser og skriver til socketen. Se for eksempel i MenuItemDeposit.cs.
▼ ... over en måned senere ... ▼
Løste oppgave 1 slik i Windows Powershell:


Kode

$tilfeldig = New-Object System.Random
$tilfeldigtall = $tilfeldig.next(0,100)
Write-Host 'Tipp hvilket tall datamaskinen tenker på'
$tall = Read-Host 'Velg et tall mellom 0 og 100'
$antall=1
do 
{
if ($tall -gt $tilfeldigtall)
{$tall = Read-Host "Tipp lavere"
$antall ++
}
elseif ($tall -lt $tilfeldigtall)
{$tall = Read-Host "Tipp høyere"
$antall ++
}
}
until ($tall -eq $tilfeldigtall)
Write-Host 'Gratulerer, du gjettet riktig på' $antall  ' forsøk!'

Eksempel:
http://80.203.207.194/temp/eksempel.jpg
▼ ... noen uker senere ... ▼
Sitat av Pjukern


-1-
Lag et program som tar et tall mellom 0 og 100.
Programmet skal så la deg gjette på hvilket tall den "tenker" på. Den skal så gi tilbakemelding til deg om du må gjette høyere eller lavere.


Vis hele sitatet...
I qickbasic blir det feks slik

tall = INT(RND(1) * 100)
teller = 0
10 teller = teller + 1
INPUT t
IF t = tall THEN GOTO 100
IF t < tall THEN PRINT "for lite"
IF t > tall THEN PRINT "for stort"
GOTO 10
100 PRINT " rett på"; teller; " forsøk"
END

Sitat av Pjukern

-2-
Veldig lik oppgaven over, men her er det du som skal tenke på et tall, og programmet skal gjette. Du gir tilbakemelding til programmet om det skal gjette høyere eller lavere. Her vil jeg også ha med at den teller antall forsøk, så da er det om å gjøre å finne ut hvordan du kan få den til å gjette tallet på færrest mulig forsøk.
Vis hele sitatet...
INPUT "skriv inn tall", tall
teller = 0
ltall = 0
stall = 100

10 teller = teller + 1
ttall = INT(ltall + (stall - ltall) / 2)
IF ttall < tall THEN ltall = ttall
IF ttall > tall THEN stall = ttall
IF ttall = tall THEN GOTO 100
PRINT ttall
GOTO 10
100 PRINT "rett på "; teller; " forsøk "
END
Kan kaste ut et par oppgaver jeg og:

-1-
Lag et program som genererer en tabell (array) med 20 tilfeldige tall og sorterer tabellen (skriv ut før og etter).

-2-
Lag et program som generer en tilfeldig 10x10 ruters labyrint der du manøvrerer mellom rutene ved å velge opp, ned, venstre eller høyre (tekstbasert). 2 av rutene skal være feller som dreper deg og 1 skal være utgangen av labyrinten. Du "ser" kun den ruten du står i ved at programmet sier om ruten er normal (velg neste), felle (game over) eller utgangen.
Sist endret av rune420; 2. juni 2008 kl. 16:45.
Altså, til dere som skriver servere i sockets: Dette er ikke relevante oppgaver til de som starter med programmering. Tenk litt over det, det er nokså avansert for de som nettopp har tatt fatt rundt "Learning C++"-boka si som skriver spørrespill med konsollen.
Wannabe-mod-holdning.
m0b
m0b's Avatar
DonorAdministrator
Såvidt jeg har fått med meg er det kun jeg som skreiv noe her med sockets og antar derfor at meldingen er ment til meg. Nå var det heller ikke akkurat meningen at den skulle gå direkte til folk som er totalt nybegynnere, men heller som en ressurs for de på et senere stadie når det kommer til litt mer avanserte områder. Samtidig et eksempel på hvordan threading og sockets kunne blandes samen i en søt binærsuppe.
Bigger than Jesus
Sgt. Pepper's Avatar
Her er min kode:P

Kode

var theNumber:Number = Math.round(100*Math.random());
trace(theNumber);

question.text =  "Velg et nummer mellom 0 og 100. kan du gjette det?";

addEventListener(KeyboardEvent.KEY_UP, checkAnswer);

function checkAnswer(evt:KeyboardEvent) {
	trace(answer.text);
	if (theNumber.toString() == answer.text) {
		trace("well done!");
	}
}

yourname = raw_input("Please type in your name here: ")


yournumber = raw_input("A random number from 0 to 100: ")

if yournumber < thenumber:
    print "LOL!, du må nokk lavere jah:)"
if yournumber > thenumber:
    print "LOL!, du må nokk lavere jah:)"
if yournumber == thenumber:
    print "Amazing, yourname!!"
    print "Fy faen, du er god du tok rektigt nummer."
    print "You are victorious my lord!"

*/
Sist endret av Sgt. Pepper; 6. juni 2008 kl. 10:31.
▼ ... mange måneder senere ... ▼
De kunne sikkert blitt løst mer effektivt, men her er min løsning i C++.


Sitat av Pjukern Vis innlegg
-1-
Lag et program som tar et tall mellom 0 og 100.
Programmet skal så la deg gjette på hvilket tall den "tenker" på. Den skal så gi tilbakemelding til deg om du må gjette høyere eller lavere.
Vis hele sitatet...

Kode

#include <iostream>
#include <ctime> 
#include <cstdlib>

using namespace std;


// Funksjon som genererer of returnerer et tilfeldig tall
int random()
{	
	int a;
	srand ( time(NULL) );			
	a = rand() % 100 + 1;
	return a;
}

// Hovedfunksjon
int main(){
	int guessthis;
	guessthis = random();
	int temp;
										// Henter inn tall fra bruker
	cout << "Gjett hvilket tall jeg tenker på(0-100): "; cin >> temp;

	while(temp != guessthis)			// Er tallet riktig?
	{
		if(temp < guessthis)			// Tallet er for lavt
			cout << "Det var for lite, prov igjen: ";
		else							// Ellers er det for høyt
			cout << "Det var for høyt, prov igjen: ";
		cin >> temp;					// Leser inn på nytt
	}
	cout << "Du traff riktig tall!! :D\n\n";
	system("PAUSE");
	return 0;
}
Sitat av Pjukern Vis innlegg
-2-
Veldig lik oppgaven over, men her er det du som skal tenke på et tall, og programmet skal gjette. Du gir tilbakemelding til programmet om det skal gjette høyere eller lavere. Her vil jeg også ha med at den teller antall forsøk, så da er det om å gjøre å finne ut hvordan du kan få den til å gjette tallet på færrest mulig forsøk.
Vis hele sitatet...

Kode

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cctype>

using namespace std;

//Deklarerer funksjoner
char les_kommando();
int randomize(int const MIN, int const MAX);

//Hovedfunksjon
int main(){					
	char svar = 0;						//Initsialiserer div variabler
	int tempmin = 1;
	int tempmax = 100;
	int first = randomize(tempmin, tempmax);
	int teller = 0;

	cout << "Tenk pa et tall mellom 1 og 100 så skal jeg prove a gjette.\n";
	cout << "Er det: " << first;

	while(svar != 'R'){					//Kjører så lenge ikke riktig
	teller++;
	svar = les_kommando();
	if (svar == 'R')					//Riktig med en gang
		break;

		switch (svar){
			case 'L':					//Tallet er for lavt
						tempmin = first;
						first = randomize(tempmin, tempmax);// Genererer nytt tall
						cout << "Hm... Er det " << first;
						break;
				
			case 'H':					//Tallet er for høyt
						tempmax = first;
						first = randomize(tempmin, tempmax);// Genererer nytt tall
						cout << "Hm... Er det " << first;
						break;
	
			default:   cout << "\nFeil!  Ukjent kommando gitt\n"; 
						break;                              // Ulovlig kommando:  
		}
	}

	cout << "Jippi!!!! Klarte det pa " << teller << " forsok\n";
	system("PAUSE");
	return 0;
}


char les_kommando()  {       //  Henter ett ikke-blankt upcaset tegn:
  char ch;
  cout << "\n\nSkriv R for riktig, H for for hoyt, L for for lavt: ";
  cin >> ch;   cin.ignore();
  return toupper(ch);
}

int randomize(int const MIN, int const MAX)			 //  Henter ett tilfeldig tall mindre enn b
{	
	int tall;
	int range;
	srand ( time(NULL) );
	range = (MAX-MIN)+1;
	tall = MIN + int(range*rand()/(RAND_MAX + 1.0));
	return tall;
}


Edit: Sorry, la ikke merke til at jeg dro opp en gammel tråd. jaja...
Sist endret av trond89; 9. desember 2008 kl. 18:05.
Jeg slenger ut samme oppgave, bare at det skal gjøres omvendt. Du bestemmer et tall (32 bit unsigned range) som programmet skal klare å gjette seg fram til, og på minst mulig antall forsøk. Brukeren signaliserer "for høyt" eller "for lavt".

Programmet vet hva som er maks og minimumsverdi, enten ved 32bit unsigned range, eller ved brukers input. Finn en fin framgangsmåte (den er veldig enkel) for å senke antall forsøk.
Sist endret av m0b; 9. desember 2008 kl. 18:18.
Sitat av |d13m0b Vis innlegg
Jeg slenger ut samme oppgave, bare at det skal gjøres omvendt. Du bestemmer et tall (32 bit unsigned range) som programmet skal klare å gjette seg fram til, og på minst mulig antall forsøk. Brukeren signaliserer "for høyt" eller "for lavt".

Programmet vet hva som er maks og minimumsverdi, enten ved 32bit unsigned range, eller ved brukers input. Finn en fin framgangsmåte (den er veldig enkel) for å senke antall forsøk.
Vis hele sitatet...
Her er mitt forslag. Er sikkert den mest rotete koden dere har sett. menmen. Er bare å kopiere inn i en kompiler å kjøre. Skulle hatt en spoilertag her på nff.

Du kunne ikke funnet et enklere tall? :P

Skrevet i c++

Kode

// Forklaring på løsning på bunnen
// double blir brukt fordi det er den eneste som klarer å håntere ett så stort tall.
// det var ikke det første jeg prøvde..........
// Koden er ikke korrekturlest så vennligst overse skrivefeil :p

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cctype>
#include <iomanip>

using namespace std;

//Deklarerer funksjoner
char les_kommando();
double halverer(double min, double max);

//Hovedfunksjon
int main(){					
	char svar = 0;								//Initsialiserer div variabler
	double tempmin = 0;							// Minste verdi
	double tempmax = 4294967294;				// Største verdi
	double first;					// Første gjetning
	int teller = 0;								// Teller antall forsøk


												//  Endre Max min verdier?
	cout << "Vil du legge til Min max verdi selv? (y/n): ";
	svar = les_kommando();
		if( svar == 'Y')						// Hvis ja, endre max og min
	{
		cout << "Legg inn minimumsverdi(" << setprecision(0) << fixed << tempmin <<  '/' 
			 << setprecision(0) << fixed <<tempmax <<  "): "; cin >> tempmin;
		cout << "Legg inn maximumsverdi(" << setprecision(0) << fixed <<tempmin << '/' 
			 <<  setprecision(0) << fixed <<tempmax <<"): "; cin >> tempmax;
	}
	first = halverer(tempmin, tempmax);			// Definerer first på grunnlag av 
												//		max og min verdi
												//  Begynner med første gjetning
	cout << "Tenk pa et tall mellom " << setprecision(0)<<fixed <<tempmin <<  " og " 
		 << setprecision(0)<<fixed <<tempmax <<  " så skal jeg prove a gjette.\n";
	cout << "Er det: " << first;

												//  Gjetter
	while(svar != 'R'){							//  Kjører så lenge ikke riktig
	teller++;
	cout << "\n\nSkriv R for riktig, H for for hoyt, L for for lavt: ";
	svar = les_kommando();
	if (svar == 'R')							//  Riktig med en gang
		break;

		switch (svar){
			case 'L':							//  Tallet er for lavt
						tempmin = first;
						first = halverer(tempmin, tempmax);// Halverer verdien		
						cout << "Er det: " << first;
						break;
				
			case 'H':							//  Tallet er for høyt
						tempmax = first;
						first = halverer(tempmin, tempmax);// Halverer verdien
						cout << "Er det: " << first;
						break;
	
			default:   cout << "\nFeil!  Ukjent kommando gitt\n"; 
						break;                  // Ulovlig kommando:  
		}
	}
	cout << "Jippi!!!! Klarte det pa " << teller << " forsok\n";
	system("PAUSE");
	return 0;
}



char les_kommando()  {							//  Henter ett ikke-blankt upcaset tegn:
  char ch;
  cin >> ch;   cin.ignore();
  return toupper(ch);
}

double halverer(double  min, double max)		//  Henter ett tilfeldig tall mindre enn b
{	
	double tall;
	tall = (min+max)/2;
	return tall;
}

// Den mest effektive løsningen er å ta gjenomsnittet av minste og største verdi
// og bruke den verdien du får til neste gjetning.
Får ikke min python kode til å fungere

import random
number = random.randint(0,100)
navn = input("Hva heter du?: ")
print("klarer du å gjette tallet "+_navn+"?")
your = input("Det er et tall mellom 0 og 100: ")

if your > number:
print("Tallet er lavere enn ditt")

if your < number:
print("Tallet er høyere enn ditt")

if your == number:
print("Gratulerer!")


Den klager over;
if your > number:
TypeError: unorderable types: str() > int()

Men your og number skal jo egentlig være tall da?
Sist endret av bjørnar; 10. desember 2008 kl. 00:52.
Synes dette er en ganske grei nybegynneroppgave(Funker hvertfall i matlab):

1.Lag en funksjon som tar inn en tabell med lengde og høyde (m,n) og skriver ut summen av de indre "cellene". Dvs. den dropper det ytterste "laget".
med fruktkjøtt.
Tias's Avatar
Crew

Kode

import random
number = random.randint(0,100)
navn = raw_input("Hva heter du?: ")
print("klarer du å gjette tallet "+navn+"?")
your = input("Det er et tall mellom 0 og 100: ")

if your > number:
	print("Tallet er lavere enn ditt")

if your < number:
	print("Tallet er høyere enn ditt")

if your == number:
	print("Gratulerer!")
Prøv denne i stedet, bjørnar. Du må bruke raw_input for strenger.
Sitat av Zepplin Vis innlegg
1.Lag en funksjon som tar inn en tabell med lengde og høyde (m,n) og skriver ut summen av de indre "cellene". Dvs. den dropper det ytterste "laget".
Vis hele sitatet...
Kan du spesifisere input litt mer?
Jeg bruker hvertfall:

Kode

array(
    array(1,2,3),
    array(2,3,1),
    array(3,1,2)
    )
Takk Tias
Prøvde først med raw_input men så fikk jeg error (var sikkert pga no annet jeg gjorde galt) så derfor tenkte jeg at de hadde droppet raw_input i python 3.0 så jeg søkte på det og fant at man skulle bruke input istedenfor :P Men jeg må ha misforstått.

Endelig funker det

import random
number = random.randint(0,100)
navn = input("Hva heter du?: ")
print("klarer du å gjette tallet "+navn+"?")
your = int(input("Det er et tall mellom 0 og 100: "))

if your > number:
print("Tallet er lavere enn ditt")

if your < number:
print("Tallet er høyere enn ditt")

if your == number:
print("Gratulerer!")
Vis hele sitatet...
Skal lese om loop og sånnt nå
Sist endret av bjørnar; 10. desember 2008 kl. 19:55. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
En loop må du ha med bjørnar.
Nå går det ikke så bra som du kansje oppdager.

Hint.
while your !=number: #while starter en loop,kjører så lenge "your" ikke er lik number.

hint1.
før loop your = None eller your = 0
Sist endret av snippsat; 10. desember 2008 kl. 20:03.
med fruktkjøtt.
Tias's Avatar
Crew
bjørnar: Hmm, du har helt rett, raw_input forsvinner vekk fra 3.0. Er du sikker på at du kjører 3.0 og ikke 2.5?
The Freak: tenkte vel at den tar inn en tabell ala:
4 2 5 8
9 8 2 1
4 2 1 5
8 4 1 2

Her skal ta de fire innerste tallene sumeres. Finnes et helt drøss av slike oppgaver til gamle eksamener i Matlab, så om det ønskes kan jeg vel legge ut et par. Er blant annet oppgaver der du skal lage et sudoku brett.

Eksamen jeg nettopp hadde gikk ut på at du får inn en kvadratisk tabell der hver celle kan ikke holde en bakterie. Representeres av 1 = inneholder og 0 = blant celle. Husker jeg rett skal man sørge for at hver bakterie med mer enn 3 nabobakterier (Altså mer enn 3 bakterier i cellen rundt den) skal forsvinne pga overbefolkning. Har en blank celle nøyaktig 3 naboer vil det oppstå en ny celle osv. Output skal da være en ny tabell der alle cellene er sjekket og omgjort, mener det ligner et slags 123-spill.
Hei! Hvilket program må jeg bruke for å kunne programmere?
Kommer vel helt an på hva du vil lære.

C++ som jeg prøver meg så smått på nå trenger du vel bare en compiler såvidt jeg vet.
Da kan du blant annet bruke:
http://www.bloodshed.net/devcpp.html
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Zepplin Vis innlegg
Eksamen jeg nettopp hadde gikk ut på at du får inn en kvadratisk tabell der hver celle kan ikke holde en bakterie. Representeres av 1 = inneholder og 0 = blant celle. Husker jeg rett skal man sørge for at hver bakterie med mer enn 3 nabobakterier (Altså mer enn 3 bakterier i cellen rundt den) skal forsvinne pga overbefolkning. Har en blank celle nøyaktig 3 naboer vil det oppstå en ny celle osv. Output skal da være en ny tabell der alle cellene er sjekket og omgjort, mener det ligner et slags 123-spill.
Vis hele sitatet...
Høres ut som klassikeren Game of Life. Den er ikkje så dum å gjere, for det finst bokstavelig talt hauger og dunger av eksempelimplementasjoner som du kan bruke for å lære alternative strategier.
Sant, var Game of Life den het Oppgavene er ofte oppdelt i mindre deler der du f.eks. skriver en kode for å utføre operasjonen i en 3x3 tabell, for så å bruke denne i en større tabell. Bare et tips om noen ønsker å utføre en lignende oppgave, gjorde det hvertfall lettere for meg.
Startet så vidt å lese litt om python i går, og prøvde meg på oppgaven i den første posten. Hvordan kan jeg få programmet til å starte på nytt når jeg gjetter riktig tall? Si gjerne i fra hvis det er noe jeg burde gjøre annerledes ellers i koden også

Kode

import random
print
print
print
print "Datamaskinen har valgt et tilfeldig tall mellom null og hundre,"
a = random.randint(0, 100)
c = float(raw_input("du skal gjette hva tallet er:   "))
print
loop = 1
d = 1
while loop == 1:

    if c < a:
        print "Dessverre,"
        c = float(raw_input("tallet er h0yere enn det du gjettet, pr0v igjen:   "))
        d = d + 1
        print

    elif c > a:
        print "Desverre,"
        c = float(raw_input("tallet er lavere enn det du gjettet, pr0v igjen:   "))
        d = d + 1
        print

    elif c == a:
        print "Gratulerer! Du gjettet riktig, du brukte", d, "fors0k."
        loop = 0

Kode

#
# -*- coding: utf-8 -*-
# (Du kan prøve med # -*- coding: iso-8859-1 -*- hvis Ø fremdeles ikke funker.
import random
print
print
while 1: # Mens 1 er 1, gjør dette.
	print
	print "Datamaskinen har valgt et tilfeldig tall mellom null og hundre,"
	a = random.randint(0, 100)
	c = float(raw_input("du skal gjette hva tallet er:   "))
	print
	loop = 1
	d = 1
	while loop == 1:

	    if c < a:
	        print "Dessverre,"
	        c = float(raw_input("tallet er høyere enn det du gjettet, prøv igjen:   "))
	        d = d + 1
	        print

	    elif c > a:
	        print "Desverre,"
	        c = float(raw_input("tallet er lavere enn det du gjettet, prøv igjen:   "))
	        d = d + 1
	        print

	    elif c == a:
	        print "Gratulerer! Du gjettet riktig, du brukte", d, "forsøk."
	        loop = 0
Du kan putte alt inn i en loop.
Bruk forresten bedre navn på variablene enn a,b,c.
▼ ... noen måneder senere ... ▼
Noen (meget) enkle oppgaver i C++? Akkurat starta
Her har du et par stjålet fra O'Reilly - Practical C++ Programming:

Skriv et program for å konvertere metriske enheter til amerikanske enheter.

Skriv et program som kan regne med datoer. F.eks. antall dager mellom 6/1/90 og 8/3/92

Skriv et program som regner ut hvor lang tid det tar å overføre en fil på x MB hvis du har en fart på 960 byte/s.

Skriv et program som legger til MVA, runder av til nærmeste krone, og finner ut om det er et primtall.

Skriv et program som tar en serie med nummer og finner antall positive tall, og antall negative tall.
første oppgave: http://84.202.26.80/tilfeldig_tall.pl

vil skryte på megselv at jeg er litt for 1337 til sånne ting xD
Takk, The Freak skal hive meg på:
Skriv en variant av battleships hvor datamaskinen fra starten plasserer et visst antall skip i en array, så input-er du koordinater du vil skyte på, og prøver å skyte ned skipene på færrest mulig skudd.

Eks: en 8x8 grid, display en ramme rundt med 1 2 3 4 5 6 7 8 og a b c d e f g h, så inputter du f. eks 2g eller g2, så vil den skyte et skudd der, plasser en X om du traff noe og en . om du ikke traff.


Edit: Denne er kanskje litt komplisert, men veldig mye kan gjøres enkelt og så forbedres på etterhvert som man blir flinkere. I tillegg får man et produkt man kan vise fram og være litt stolt av, i stedet for "Hey se jeg kan regne ut celsius fra farenheit" "Åh, det kan google også". Jeg er villig til å gi veiledning på denne oppgaven om noen ønsker det.
Sist endret av Pantheon; 19. februar 2009 kl. 20:20.
▼ ... over en uke senere ... ▼
Queen of Blades
Jonta's Avatar
DonorCrew
Tenkte jeg skulle foreslå en litt vanskeligere oppgave:

Lag et program/skript som regner ut hvor mange forskjellige typer sudoku som finnes. Rotasjon gjelder som samme sudoku, det samme gjør speiling om både horisontal og vertikal akse. I tillegg er tallene irrelevante. Det betyr at denne:
http://bildr.no/image/356667.jpeg

er den samme som denne:
http://bildr.no/image/356668.jpeg

(6 tilsvarer 3, og 9 tilsvarer 5).

En idé jeg har om oppgaven; først finn ut alle mulige kombinasjoner, for så å trekke ifra duplikater.

Reglene for sudoku kan vel de fleste, og de skal selvfølgelig følges. Det som menes i denne oppgaven er sudoku 9*9 (lag gjerne 6*6 om du føler for det).

Jeg er forresten interessert i tallet folk kommer fram til.

(Jeg hadde tenkt å slenge på "som gir nok informasjon til å kunne løses" (som altså ikke er et komplett sudokubrett, men et med huller i), men innser at dette kanskje blir i meste laget med tanke på at det vil finnes ørten varianter av hvert eneste eksisterende brett.)
▼ ... noen måneder senere ... ▼
sindre@puse.cat:~$
Synderen's Avatar
Fant denne siden med en rekke oppgaver som må løses, du må løse hver oppgave for å kunne gå videre til neste oppgave.
http://www.pythonchallenge.com/
Du trenger ikke å bruke pythong, det går fint med andre språk.
Tja, du trenger Python til f.eks. den oppgaven med pickle. Men du kan jo bare ta det du må i Python og resten med noe annet.
▼ ... noen måneder senere ... ▼
Jeg har bruk for et program som gjør noe helt spesifikt, og er helt sikker på at det allerede finnes, men hva det skal gjøre er ikke spesielt vanskelig (etter hva jeg forstår), så her er en oppgave for de som ikke har noe bedre å gjøre på:

Jeg ønsker et program som sletter alle filer i en gitt mappe som er eldre enn ett gitt antall, minutter,timer eller dager når man kjører programmet. Feks, hvis jeg starter programmet sletter det alle filene i "c:\logg" som er eldre enn 14 dager.

Programmet skal være kommandolinjebasert og om det kan ta parameter fra en configfil for å sette den opp til å gjøre flere slike oppgaver etterhvert hadde vært fint. Hvis ikke går parameter per kommandolinje også helt fint.
Sist endret av meitemark; 26. oktober 2009 kl. 01:43.
Du får se om det er noe i den stilen du trenger meitemark.
Vet ikke hvor godt du kjenner python.
For og kjøre fra kommandolinen <python f_remove.py>
For og kjøre det med argument(sys.argv[1]) <python f_remove.py c:/tmp/>

Kode

#! /usr/bin/Python
# ---|snippsat|---
# f_remove.py

import os, glob, time, sys

def file_remove(root, xdate):
    '''
    Function to remove file by there date/last modified-date
    possible to take variabls to command line
    sys.argv[0] name of this script sys.argv[1] first argument....
    '''
    print '-'*30
    for folder in glob.glob(root):
        print folder
        #Remove now only txt,can use other file format eksp: .jpg
        for my_files in glob.glob(folder + '/*.txt'):        
            stats = os.stat(my_files)         
            lastmodDate = time.localtime(stats[8])  
            expDate = time.strptime(xDate, '%Y-%m-%d')
            print my_files, time.strftime("%m/%d/%y", lastmodDate)
            if  expDate > lastmodDate:
                try:
                    print 'Removing', my_files, time.strftime("(older than %m/%d/%y)", expDate)
                    #os.remove(my_files)  #For testing we do not remove files,but use line over to print result.
                except OSError:
                    print 'Could not remove', my_files
    print '-'*30 

root = 'C:/tmp/'     #Your folder
#root = sys.argv[1]  #Take path to command line
#root = 'D:/test/*'  #To Seek all sub folders use *

#Expiration date format YYYY-MM-DD
xDate = '2009-05-05'
#xDate = sys.argv[2] #Take Date to command line

#Call function
file_remove(root, xDate)
Test print med 2 filer eldere enn 2009-05-05

Kode

------------------------------
C:/tmp/
C:/tmp\122.txt 07/17/09
C:/tmp\2555.txt 07/17/09
C:/tmp\kkkkk.txt 12/24/08
Removing C:/tmp\kkkkk.txt (older than 05/05/09)
C:/tmp\linux.txt 12/22/08
Removing C:/tmp\linux.txt (older than 05/05/09)
C:/tmp\linux1.txt 10/26/09
C:/tmp\test.txt 10/26/09
------------------------------
Sist endret av snippsat; 27. oktober 2009 kl. 07:53.
▼ ... over en måned senere ... ▼
jeg har en oppgave til dere. lag en kalkulator med pluss, minus, gange og deling der man kan velge selv hvor mange tall man skal ha med i regnestykket.
Prøvde meg på oppgave 8 på denne siden.

Har kommet frem til dette, og det fungerer som bare det, men lurer på om det er noen annen måte å løse dette på?

Kode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TilbakeBetaling
{
    class Program
    {
        static void Main(string[] args)
        {
            int betalt,
                betalesMed,
                tilbake,
                tohundreLapp = 0,
                hundreLapp = 0,
                femtiLapp = 0,
                tjueKr = 0,
                tiKr = 0,
                femKr = 0,
                enKr = 0;
            double femtiØre = 0;

            string
                txtFemtiØre = " 50-ører ",
                txtEnKr = " 1-kronere \n",
                txtFemKr = " 5-kronere \n",
                txtTiKr = " 10-kronere \n",
                txtTjueKr = " 20-kronere \n",
                txtFemtiLapp = " 50-lapper \n",
                txtHundreLapp = " 100-lapper \n",
                txtToHundreLapp = " 200-lapper \n";

            Console.WriteLine("Sum som betales: ");
            betalt = int.Parse(Console.ReadLine());

            Console.WriteLine("Betales Med: ");
            betalesMed = int.Parse(Console.ReadLine());

            if (betalesMed < betalt)
            {
                Console.WriteLine("Du kan ikke betale med en enhet som er mindre enn summen som skal betales!");
            }
            else
            {
                tilbake = betalesMed - betalt;
                for (int i = 0; i < (tilbake * 2); i++)
                {
                    femtiØre = femtiØre + 1;
                    if (femtiØre == 2)
                    {
                        enKr = enKr + 1;
                        femtiØre = 0;
                        if (enKr == 5)
                        {
                            femKr = femKr + 1;
                            enKr = 0;
                            if (femKr == 2)
                            {
                                tiKr = tiKr + 1;
                                femKr = 0;
                                if (tiKr == 2)
                                {
                                    tjueKr = tjueKr + 1;
                                    tiKr = 0;
                                    if (tjueKr == 3)
                                    {
                                        femtiLapp = femtiLapp + 1;
                                        tiKr = tiKr + 1;
                                        tjueKr = 0;
                                        if (femtiLapp == 2)
                                        {
                                            hundreLapp = hundreLapp + 1;
                                            femtiLapp = 0;
                                            if (hundreLapp == 2)
                                            {
                                                tohundreLapp = tohundreLapp + 1;
                                                hundreLapp = 0;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (tjueKr == 2)
                {
                    if (tiKr == 1)
                    {
                        femtiLapp = femtiLapp + 1;
                        tjueKr = 0;
                        tiKr = 0;
                        if (femtiLapp == 2)
                        {
                            hundreLapp = hundreLapp + 1;
                            femtiLapp = 0;
                            if (hundreLapp == 2)
                            {
                                tohundreLapp = tohundreLapp + 1;
                                hundreLapp = 0;
                            }
                        }
                    }
                }
                if (femtiØre == 1)
                {
                    txtFemtiØre = " 50-øre \n";
                }
                if (enKr == 1)
                {
                    txtEnKr = " 1-kroner \n";
                }
                if (femKr == 1)
                {
                    txtFemKr = " 5-kroner \n";
                }
                if (tiKr == 1)
                {
                    txtTiKr = " 10-kroner \n";
                }
                if (tjueKr == 1)
                {
                    txtTjueKr = " 20-kroner \n";
                }
                if (femtiLapp == 1)
                {
                    txtFemtiLapp = " 50-lapp \n";
                }
                if (hundreLapp == 1)
                {
                    txtHundreLapp = " 100-lapp \n";
                }
                if (tohundreLapp == 1)
                {
                    txtToHundreLapp = " 200-lapp \n";
                }
                Console.WriteLine("Tilbake: \n" + tohundreLapp + txtToHundreLapp + hundreLapp + txtHundreLapp + femtiLapp + txtFemtiLapp + tjueKr + txtTjueKr + tiKr + txtTiKr + femKr + txtFemKr + enKr + txtEnKr + femtiØre + txtFemtiØre);
                Console.ReadLine();
            }
        }
    }
}
Sist endret av Ztratoz90; 14. desember 2009 kl. 19:38.
I et slikt tilfelle ville jeg valgt en litt mer objektorientert metode. Jeg ville opprettet en klasse (som enten arver fra en abstract basetype eller interface) for hver valutaenhet med verdiene som hver av de enhetene har. Hver klasse har to felt (Ett for verdi og ett for type(lapp,krone,øre)).

Jeg ville deretter opprettet et Dictionary med TKey lik string og TValue lik List<ValutaEnhet> (dette fordi man da kan hente ut .Count på korrekt type). Så legger jeg alle valutaenhetene i Dictionary med TKeyens verdi som teksten verdi+type. Da får man eksempelvis 50lapp, 20krone etc inn i Dictionary.

Dictionary sin oppgave i dette tilfellet vil være å inneholde de mulige valutaene som systemet kan betale tilbake med. Man fyller derfor opp Dictionary med alle valutaenhet-klassene man har laget. Disse legges inn i stigende rekkefølge, dette gjør at man til enhver tid vil kunne finne den største valutaen som det kan betales med, som element nummer 0. (Skjønt, dette MÅ ikke gjøres med dictionary. Det kan også gjøres med en generisk liste (List<ValutaType>))

Deretter beregner man ut restbeløpet med betalt - pris. Opprett en ny liste eller dictionary for å legge til objektene i. Man går deretter inn i en while-løkke og sjekker om restbeløpet er større enn element 0 i det første dictionary, hvis ja så kan man bruke en factory eller if-statement til å sjekke hvilken type første element er. Man oppretter så et objekt som er likt typen som ligger i element 0 (eller man kan klone det) og legger dette inn i det sekundære dictionary/list og trekker objektets verdi fra restbeløpet. Hvis element 0 er større enn restbeløpet, så fjerner man det fra det opprinnelige dictionary.

Når dette er gjort, er det bare å gå igjennom den sekundære listen/dictinary og telle antall objekter (Count) av hver type og slenge på rett suffiks for antall objekter av én type.

Har ikke tid til å skrive koden, men slik jeg ser det skal det være rimelig fram. Håper dere skjønner hva jeg mener, om ikke så kan jeg skrive eksempelkode for det jeg beskriver.