30 svar
103 visningar
erze7811 60
Postad: 22 nov 18:48

Låssystem sekvens

Hej, jag ska göra ett låssystem nedanför. Jag har börjat lite på uppgiften men har fastnat och kommer inte vidare. Detta är vad jag har kommit fram till hittills:

Laguna Online 22263
Postad: 22 nov 19:02

Din kod gör inget för att avgöra om en inmatning är felaktig. Ska det t.ex. vara möjligt att gå från 0 till 2?

erze7811 60
Postad: 22 nov 19:09

Nej det ska bara vara möjligt att gå från 0-1 och 1-2 osv men det är det jag inte kommer på hur jag ska avgöra om det är en felaktig inmatning.

Laguna Online 22263
Postad: 22 nov 19:12

Jag föreslår att koden ser ut ungefär så här:

if (strcmp(a, "unlock") == 0) {

      if (n == 0) {

           n = 1;

       } else {

          tala om för användaren att det är fel

       }

erze7811 60
Postad: 22 nov 19:20

och detta ska jag då göra på de 3 olika if funktion då och i else lägga till printf("invalid"); men jag måste också sätta in en printf("ok"); någonstans?

Är inte de fyra strcmp innan din while loop onödiga? Du sätter ju inget värde på a förrän du kommer in i while loopen. 

Vidare är det farligt att endast deklarera en variabel utan att initiera den.

Laguna Online 22263
Postad: 22 nov 19:41

"ok" kan man skriva ut när man gör quit, om det inte har blivit fel innan dess.

erze7811 60
Postad: 22 nov 19:57

okej, ska jag lägga till exempelvis a[8] = {0} isåfall?

Men nu blir det att den skriver invalid efter att jag har skrivit in någonting som inte är i rätt ordning, men programmet ska avgöra om det är ok eller inkorrekt efter jag har skrivit ett visst antal av orden och quit. Hur ska jag göra för att uppnå detta?

Dracaena Online 6565 – Moderator
Postad: 23 nov 18:38 Redigerad: 23 nov 19:03

Visa hur koden ser ut nu.

Du man kan initiera en array på följande vis (som följer det du gjorde i inlägget tidigare): 

char a[8] = "";
char a[8] = {0};
char a[8] = {0, 0, 0, 0, 0, 0, 0, 0};

alla dessa tre är ekvivalenta. 

erze7811 60
Postad: 23 nov 20:01

Du kan sätta en flagga om vi har gjort något invalid. 

Och sedan i quit så printar du invalid om flaggan är satt, annars printar du ok. 

Det kanske finns ett mer elegant sätt att göra det på?

erze7811 60
Postad: 23 nov 20:24

med flagga menar du då att jag typ ger flaggan två värden exempelvis 0 och 1 där ett av värdena gör att det blir sant och den andra gör det inte sant?

Ja precis. Typ något liknande:

#include <stdio.h>
#define INVALID 0
#define VALID   1

int main()
{
    int valid_sequence = VALID;
    
    if(valid_sequence == VALID)
        printf("Valid sequence");
    else
        printf("The given sequence is invalid.");

    return 0;
}

Du får så klart strukturera upp de. Nu har du bara två fall, så det räcker egentligen med en define.

erze7811 60
Postad: 23 nov 20:46

Okej men hur och vart ska jag sätta det i programmet och hur ska den avgöra om det är ok eller inte? För n kan gå från 0 -> 1 och 1 ->2 osv men inte motsatt håll.

Det är inte n du vill sätta. Istället för att printa i din while loop i alla conditions, så kan du göra det endast i quit. 

Du sätter alltså flaggan så fort vi har gjort något fult och skriver ut rätt meddelande i quit beroende på om flaggan är satt eller inte.

erze7811 60
Postad: 23 nov 20:58

Så någonting såhär?

Dracaena Online 6565 – Moderator
Postad: 23 nov 21:05 Redigerad: 23 nov 21:10

Ja, men istället för dina printf, så sätter du nu:

val_seq = INVALID;

Det blir enklare att visa dig om du skriver in koden med {:}

För min del är jag för lat om jag ska vara ärlig för att skriva av din kod. :)

erze7811 60
Postad: 23 nov 21:11 Redigerad: 23 nov 21:18
#include <stdio.h>
#include <string.h>

#define INVALID 0
#define VALID 1

int main ()
{


    char a[8] = { 0 };

    int n = 0;

    int val_seq = VALID;



    while (1) {

        scanf ("%s", a);

        if (strcmp (a, "unlock") == 0) {

            if (n == 0) {

                n = 1;

            } else {
                printf ("invalid\n");
            }
        }


        if (strcmp (a, "open") == 0) {

            if (n == 1) {

                n = 2;

            } else {
                printf ("invalid");
            }
        }


        if (strcmp (a, "close") == 0) {

            if (n == 2) {

                n = 3;

            } else {
                printf ("invalid");
            }
        }

        if (strcmp (a, "quit") == 0) {

            if (val_seq == VALID)

                printf ("ok");

            else

                printf ("invalid");

            break;

        }

    }


    return 0;

}

Kod inklistrad i {:} och indenterad för att göra det enklare att läsa. /Dracaena

erze7811 60
Postad: 23 nov 21:12

Menar du att jag ska byta ut de printf som jag har gjort // framför?

Dracaena Online 6565 – Moderator
Postad: 23 nov 21:16 Redigerad: 23 nov 21:19

 

#include <stdio.h>
#include <string.h>

#define INVALID 0
#define VALID 1

int main ()
{


    char a[8] = { 0 };

    int n = 0;

    int val_seq = VALID;



    while (1) {

        scanf ("%s", a);

        if (strcmp (a, "unlock") == 0) {

            if (n == 0) {

                n = 1;

            } else {
                val_seq = INVALID;
            }
        }


        if (strcmp (a, "open") == 0) {

            if (n == 1) {

                n = 2;

            } else {
                val_seq = INVALID;
            }
        }


        if (strcmp (a, "close") == 0) {

            if (n == 2) {

                n = 3;

            } else {
                val_seq = INVALID;
            }
        }

        if (strcmp (a, "quit") == 0) {

            if (val_seq == VALID)

                printf ("ok");

            else

                printf ("invalid");

            break;

        }

    }


    return 0;

}
erze7811 60
Postad: 23 nov 21:23

Okej, men nu när jag testar de olika imput/output så fungerar alla förutom denna som blir invalid när jag kör programmet:

Dracaena Online 6565 – Moderator
Postad: 23 nov 21:26 Redigerad: 23 nov 21:29

Kan du se varför det blir fel? :)

Denna buggen existerade innan också.

Prova gå igenom två iterationer när du tar unlock

erze7811 60
Postad: 23 nov 21:34

lite osäker vad som är fel, har det något att göra med n?

Dracaena Online 6565 – Moderator
Postad: 23 nov 21:38 Redigerad: 23 nov 21:42

När vi kör unlock för första gången så sätter vi n=1n=1, nu kör vi unlock igen, men eftersom n=1n=1 så körs else blocket. Även om vi nu kör en valid sekvens, så har vi redan triggat flaggan. 

Vi har alltså inte tagit hänsyn till att man kan gå:

current_state \rightarrow current_state

Utan programmet utgår ifrån att vi alltid går till en ny:

current_state \rightarrow next_state


Om vi ritar ett tillståndsdiagram ser det för tillfället ut så här:

Allt annat är invalid, men det borde egentligen vara:

Notera att jag inte skrev ut "quit" eftersom den inte tillger något till problemet.

erze7811 60
Postad: 23 nov 21:45

om jag lägger till ett eller i if sasten och gör att kravet blir att n== 0 || n==1 kan det lösa problemet isåfall?

Ja, det löser unlock. 

Hur blir det för de andra två? :)

erze7811 60
Postad: 23 nov 21:50

för open borde det då bli:

n== 1 || n== 2

och för close:

n== 2 || n== 3?

prova :)

Vad tycker den nu att alla 4 blir? 

erze7811 60
Postad: 23 nov 21:56

Programmet funkar helt korrekt nu!

Tack så mycket för all hjälp!

Kul att vi var till hjälp, lycka till! :)

anders_k Online 91
Postad: 26 nov 21:38

Det är direkt farligt att skriva

scanf("%s",a);

Det finns ingen som helst kontroll på hur lång strängen får vara. Du borde åtminstone skriva

scanf("%7s",a);

Svara Avbryt
Close