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
Får jag fråga vart uppgiften kommer ifrån? :)
Vi diskuterade samma fråga här:
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.
Dracaena skrev:Får jag fråga vart uppgiften kommer ifrån? :)
Vi diskuterade samma fråga här:
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 !
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!