4 svar
98 visningar
Khyar 6
Postad: 27 nov 2022 16:04 Redigerad: 27 nov 2022 16:05

Tillstånd

Hej, mitt problem är att jag har noll koll på hur man ska börja,  skulle vara tacksam om jag får hjälp. 

Du ska skriva ett program som tar emot kommandon från ett dörr/låssystem, och ska skriva ut om sekvensen kommandon är korrekt eller inte. Kommandona kommer in som textsträngar, och ska exekveras i följande ordning:

unlock → open → close

Ditt program ska skriva ut ok om sekvensen är korrekt, men invalid om den inte är ok. Om programmet tar emot kommandot quit ska det avslutas.

Input                        Output

unlock                      ok 
open
close
quit

 

Input                        Output

open                          invalid
unlock
quit

Fermatrix 7841 – Fd. Medlem
Postad: 27 nov 2022 16:09

Får jag fråga vart uppgiften kommer ifrån? :)

Vi diskuterade samma fråga här:

https://www.pluggakuten.se/trad/lassystem-sekvens/

anders_k 237
Postad: 27 nov 2022 17:15 Redigerad: 27 nov 2022 17:18

Börja med att ha en lista av kommandon som är giltliga.

char* syntax[] = {"unlock","open","close","quit", NULL};

Sen identifierar du kommando m.h.a. av listan

int sequenceOk = 1; 
int commandNr = -1;
int prevCommandNr = -1;
char command[256];
while (fgets(command, sizeof(command), stdin) != NULL && sekvensOk)
{
  commandNr = -1;
  for (int k = 0; syntax[k] != NULL; ++k)
  {
    if (!strncmp(syntax[k], command, strlen(syntax[k]))
    {
      commandNr = k;
      break;
    }
  }
   
  // om du har ett commandNr >= 0 har du ett giltligt index av kommandot.
  // annars var det något ogiltligt.

  // om commandNr == 3 då skall du avsluta loopen direkt, om sekvensOk 
  // fortfarande == 1 är sekvensen OK. 
  // ...Förmodar här att ingen sekvens är giltligt också.
  
  // nu skall du kolla på vad föregående commandNr var för att ta
  // reda på om den nya commandNr är giltligt, om inte,
  // sätt sekvensOk till 0

  // om det inte finns något prevCommandNr dvs det är -1 kolla om det är
  // rätt kommando dvs unlock

  ...

  prevCommandNr = commandNr;
}

// skriv ut resultatet baserat på sekvensOk

Jag tycker det är lite svårt att förklara detta utan att avslöja för mycket, så sorry om jag skrev för mycket. 

Khyar 6
Postad: 27 nov 2022 17:30
Dracaena skrev:

Får jag fråga vart uppgiften kommer ifrån? :)

Vi diskuterade samma fråga här:

https://www.pluggakuten.se/trad/lassystem-sekvens/

Själv läser jag till datateknik i universitetet och har uppgiften som en del av en större inlämning :)

Tack för hjälpen !

Khyar 6
Postad: 27 nov 2022 19:50
anders_k skrev:

Börja med att ha en lista av kommandon som är giltliga.

char* syntax[] = {"unlock","open","close","quit", NULL};

Sen identifierar du kommando m.h.a. av listan

int sequenceOk = 1; 
int commandNr = -1;
int prevCommandNr = -1;
char command[256];
while (fgets(command, sizeof(command), stdin) != NULL && sekvensOk)
{
  commandNr = -1;
  for (int k = 0; syntax[k] != NULL; ++k)
  {
    if (!strncmp(syntax[k], command, strlen(syntax[k]))
    {
      commandNr = k;
      break;
    }
  }
   
  // om du har ett commandNr >= 0 har du ett giltligt index av kommandot.
  // annars var det något ogiltligt.

  // om commandNr == 3 då skall du avsluta loopen direkt, om sekvensOk 
  // fortfarande == 1 är sekvensen OK. 
  // ...Förmodar här att ingen sekvens är giltligt också.
  
  // nu skall du kolla på vad föregående commandNr var för att ta
  // reda på om den nya commandNr är giltligt, om inte,
  // sätt sekvensOk till 0

  // om det inte finns något prevCommandNr dvs det är -1 kolla om det är
  // rätt kommando dvs unlock

  ...

  prevCommandNr = commandNr;
}

// skriv ut resultatet baserat på sekvensOk

Jag tycker det är lite svårt att förklara detta utan att avslöja för mycket, så sorry om jag skrev för mycket. 

Nej det är lugnt, tack så mycket!

Svara
Close