Avatar billede mettegp Nybegynder
05. februar 2006 - 17:44 Der er 6 kommentarer

problematik Indsatte løkker

Jeg forsøger at programmere hammerslag i et auktionshus. Jeg har brugt iterator metoder til at iterere igennem budene.
Mit problem er hvorledes jeg skal komme ud af den indre while løkke som sammenligner tider, hvis der kommer et nyt bud. Som det er programmeret nu så gennemføres hele den indre while lykke når der kommer et bud.

den skriver
nyt bud 6000 kr.
første
anden
tredie, varen er solgt!

Hvis der nu kommer et bud mindt i hvordan bryder jeg så løkken og kommer ud i den yderste løkke, hvor så processen skal starte forfra.

if (varePaaAuktion.FoersteBud())
{
do
{
hoejesteBud = varePaaAuktion.GetCurrentBud();
                           
int counter = 0;

while(true)
{
DateTime nu = DateTime.Now;
Thread.Sleep(1000);

if (hoejesteBud.GetBudTidspunkt().AddSeconds(18) <= nu)
{
if (hammerslag != "tredie, varen er solgt!")
{
hammerslag = "tredie, varen er solgt!";
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, hammerslag);
}
}
else if (hoejesteBud.GetBudTidspunkt().AddSeconds(15) <= nu)
{
if (hammerslag != "anden!")
{
hammerslag = "anden!";
monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, hammerslag);
}
}
else if (hoejesteBud.GetBudTidspunkt().AddSeconds(10) <= nu)
{
if (hammerslag != "første!")
{
hammerslag = "første!";
Console.WriteLine(hammerslag);
                                        monitor.BroadcastServerBeskedTilKunde(kundeIPadresse, hammerslag);
}
}
counter++;
//end indre while løkke
                         
} while (varePaaAuktion.NaesteBud()); 


public bool FoersteBud()
        {
            aktueltBudIdx = 0;
            return (budCollection.Count > 0);
        }

//Post: Aktuelt bud (den som iterator peger på) returneret
public Bud GetCurrentBud()
{
return (Bud)budCollection[aktueltBudIdx];
}
 
//Post: Hvis der er flere bud, peger iterator på det næste
//      og der returneres true, ellers returneres false
public bool NaesteBud()
{
aktueltBudIdx++;
return (aktueltBudIdx < budCollection.Count);
}
Avatar billede sovsekoder Nybegynder
05. februar 2006 - 19:11 #1
eks. hvordan man kan komme ud af en while løkke (brug "break")
int i=10;
            while(true)
            {
                i--;
                if(i==0)
                    break;
               
            }
            Console.WriteLine("ude igen");
Avatar billede sovsekoder Nybegynder
05. februar 2006 - 19:13 #2
du kan også bruge "goto":
int i=10;
            while(true)
            {
                i--;
                if(i==0)
                    goto sovsekoder;
               
            }
sovsekoder:
            Console.WriteLine("ude igen");
Avatar billede sovsekoder Nybegynder
05. februar 2006 - 19:16 #3
generelt: typisk bruges break til at stoppe løkker (for, while...), og hvis break ikke kan løse det givne problem bruges goto (tilfælde hvor man skal ud af flere nestede løkker).
Avatar billede bitsch Nybegynder
06. februar 2006 - 16:06 #4
Men vær yderst varsom med brugen af goto!
Har du brug for goto, er det ofte et tegn på kode som bør omskrives.
Avatar billede mettegp Nybegynder
06. februar 2006 - 16:16 #5
Hej sovseKoder

Ja du må undskylde, men jeg er lidt ny indenfor området. Dit eksempel virker fint alene, men hvordan får jeg det til at virke sammen med min kode.
Hvis jeg initialiserer variablen counter til 18 og siger den skal break, når den har talt ned til 0 så går der 18 sekunder og den når at udskrive hele den indre while løkke. Det jeg prøver på er, hvis f.eks det første bud er kommet ind og den har nået og f.eks. skrive "første", så kommer der et nyt bud også skal den afbryde løkken og starte forfra med at tælle indtil den igen bliver afbrudt af et nyt bud. Her kan der jo være gået 2, 5 eller 12 sekunder.
Jeg skal på en eller anden måde have fat i det aktuelt højesteBud og dette bud skal afbrydes hvis der kommer et nyt bud, men hvordan "thats the question"???
Avatar billede sovsekoder Nybegynder
15. februar 2006 - 11:23 #6
aner ikke hvordan din kode virker, kan du ikke give noget pseud kode?

jeg vbille nok lave noget ala:

void SomeMethod()
{
    // Initialize default bet with default values
    highestBet = new Bet();

    while(highestBet.Accepted == false)
    {
        currentBet = GetCurrentBet();
        if(currentBet.Value > highestBet.Value)
        {
            highestBet = currentBet;
            highestBet.StartTime = DateTime.Now;
        }
       
        // Display the countdown details - accepted property set to true if
        // - we the bet has "timed out".
        Countdown(ref highestBet);
    }

    // highestBet Accepted if we are here...
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester