как я могу уменьшить то же самое, если-еще в c

#c

Вопрос:

Привет, я создаю программу для викторины по математике с помощью arduino, и когда я кодировал, у меня возникла проблема. В программе викторины должно быть много «если-еще» и «переключателей». Было бы неплохо, если бы вы дали мне знать, как уменьшить эти коды. Я не очень хорошо кодирую, поэтому было бы также неплохо, если бы вы могли прислать мне реальный сокращенный код 🙂 Я пытаюсь задать 30 вопросов, а код, который я опубликовал, предназначен только для 3 вопросов.. Большое спасибо!!

     switch (screen) {
        case 0: // welcome
            if (buttonState1 amp;amp; buttonState2) {
                screen = 1;
                delay(50);
            }

            break;

        case 1: // question one
            if(buttonState1 amp;amp; userAnswerOne == ""){ //store users answer
            userAnswerOne = "True";
               if(userAnswerOne == questionOneAnswer){ //check to see if answer is correct
                score = score   1;  
                digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(1000);
                digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
                delay(1000);                       // wait for a second
                screen = 2;  
                delay(50);                     
             }
               else{
                  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
                  delay(1000);                       // wait for a second
                  digitalWrite(10, LOW);    // turn the LED off by making the voltage LOW
                  delay(1000);        
                screen = 2;
                delay(50);                
              }
            }
            if(buttonState2 amp;amp; userAnswerOne == ""){
            userAnswerOne = "False";
               if(userAnswerOne == questionOneAnswer){ //check to see if answer is correct
                digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(1000);
                digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
                delay(1000);                       // wait for a second
                score = score   1;  
                screen = 2;  
                delay(50);  
             }
               else{
                  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
                  delay(1000);                       // wait for a second
                  digitalWrite(10, LOW);    // turn the LED off by making the voltage LOW
                  delay(1000);        
                screen = 2;
                delay(50);
              }
            }
            break;

        case 2: // question two
            if(buttonState1 amp;amp; userAnswerTwo == ""){ //store users answer
            userAnswerTwo = "True";
               if(userAnswerTwo == questionTwoAnswer){ //check to see if answer is correct
                digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(1000);
                digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
                delay(1000);                       // wait for a second
                score = score   1;  
                screen = 3;  
                delay(50);                     
             }
               else{
                  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
                  delay(1000);                       // wait for a second
                  digitalWrite(10, LOW);    // turn the LED off by making the voltage LOW
                  delay(1000);                       // wait for a second
                screen = 3;
                delay(50);                
              }
            }
            if(buttonState2 amp;amp; userAnswerTwo == ""){
            userAnswerTwo = "False";
               if(userAnswerTwo == questionTwoAnswer){ //check to see if answer is correct
                digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(1000);
                digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
                delay(1000);                       // wait for a second
                score = score   1;  
                screen = 3;  
                delay(50);  
             }
               else{
                  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
                  delay(1000);                       // wait for a second
                  digitalWrite(10, LOW);    // turn the LED off by making the voltage LOW
                  delay(1000); 
                screen = 3;
                delay(50);
              }
            }
            break;  

        case 3: // question three
            if(buttonState1 amp;amp; userAnswerThree == ""){ //store users answer
            userAnswerThree = "True";
               if(userAnswerThree == questionThreeAnswer){ //check to see if answer is correct
                digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(1000);
                digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
                delay(1000);                       // wait for a second
                score = score   1;  
                screen = 4;  
                delay(50);                     
             }
               else{
                  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
                  delay(1000);                       // wait for a second
                  digitalWrite(10, LOW);    // turn the LED off by making the voltage LOW
                  delay(1000); 
                screen = 4;
                delay(50);                
              }
            }
            if(buttonState2 amp;amp; userAnswerThree == ""){
            userAnswerThree = "False";
               if(userAnswerThree == questionThreeAnswer){ //check to see if answer is correct
                digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(1000);
                digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
                delay(1000);                       // wait for a second
                score = score   1;  
                screen = 4;  
                delay(50);  
             }
               else{
                  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
                  delay(1000);                       // wait for a second
                  digitalWrite(10, LOW);    // turn the LED off by making the voltage LOW
                  delay(1000);        
                screen = 4;
                delay(50);
              }
            }
            break;  

 

Комментарии:

1. Вам нужно начать учиться распознавать повторяющиеся шаблоны кода, которые можно с пользой инкапсулировать в определяемые пользователем функции, которые затем можно вызывать.

2. Вы часто повторяете код. Вы уже научились создавать функции ?

3. Я бы посоветовал вам подумать о том, чтобы изобрести свою собственную askQuestion() функцию, и, возможно, также blinkLED() .

4. Мне жаль.. Я студент, и сейчас мне нравится собирать уже готовые коды из разных мест, поэтому я не очень хорошо знаю коды.. Я думаю, мне следует учиться на базовом.. Но я должен скоро представить это в свою школу, было бы неплохо, если бы вы могли меня научить..

5. Вы изучали массивы? У вас может быть множество вопросов и еще один ответ, затем используйте общий код, чтобы задать вопрос и отметить ответ.

Ответ №1:

Не ответ на ваш вопрос, но у вас здесь другая проблема:

 userAnswerOne == ""
 

Это ошибка. Это не сработает, если вы сравните указатель с адресом строкового литерала "" . Он не сравнивает строки или не проверяет, пуста ли строка.

Вам нужно:

 !strcmp(userAnswerOne ,"")
 

или

 !userAnswerOne[0]
 

Ответ №2:

Мне пришлось сделать некоторые предположения об определениях переменных и т. Д.

Эти примеры были закодированы, но не скомпилированы и не протестированы.

Всякий раз , когда я вижу (например) int v1, v2, v3, ..., vN; , я рефакторирую массив: int v[N];

Ваши сравнения строк неверны [и даже не будут скомпилированы чисто]. Для сравнения строк используйте strcmp .

Существует много реплицированного кода, который можно переместить в [новые] функции


Вот первый разрез, который устраняет реплицированный код, но сохраняет switch :

 int screen;

int button[2];
const char *userans[4];
const char *questans[4];

// cmpeq -- compare two strings for equality
int
cmpeq(const char *lhs,const char *rhs)
{

    return (strcmp(lhs,rhs) == 0);
}

// ifstate -- check for button press and expected user answer
int
ifstate(int butno,int ansno,const char *ansexp)
{

    return button[butno] amp;amp; cmpeq(userans[ansno],ansexp));
}

// dopulse -- pulse the led
void
dopulse(int ledno)
{

    // turn the LED on (HIGH is the voltage level)
    digitalWrite(ledno, HIGH);
    delay(1000);

    // turn the LED off by making the voltage LOW
    digitalWrite(ledno, LOW);

    // wait for a second
    delay(1000);
}

void
newstate(void)
{
    int cmpflg;

    switch (screen) {
    case 0:  // welcome
        if (button[1] amp;amp; button[2]) {
            screen = 1;
            delay(50);
        }
        break;

    case 1:  // question one
        // store users answer
        if (ifstate(1,1,"")) {
            userans[1] = "True";

            cmpflg = cmpeq(userans[1],questans[1]);
            score  = cmpflg;
            dopulse(cmpflg ? 7 : 10);
            delay(50);

            screen = 2;
        }

        if (ifstate(2,1,"")) {
            userans[1] = "False";

            cmpflg = cmpeq(userans[1],questans[1]);
            score  = cmpflg;
            dopulse(cmpflg ? 7 : 10);
            delay(50);

            screen = 2;
        }
        break;

    case 2:  // question two
        if (ifstate(1,2,"")) {
            userans[2] = "True";

            cmpflg = cmpeq(userans[2],questans[2]);
            score  = cmpflg;
            dopulse(cmpflg ? 7 : 10);
            delay(50);

            screen = 3;
        }

        if (ifstate(2,2,"")) {
            userans[2] = "False";

            cmpflg = cmpeq(userans[2],questans[2]);
            score  = cmpflg;
            dopulse(cmpflg ? 7 : 10);
            delay(50);

            screen = 3;
        }
        break;

    case 3:  // question three
        if (ifstate(1,3,"")) {
            userans[3] = "True";

            cmpflg = cmpeq(userans[3],questans[3]);
            score  = cmpflg;
            dopulse(cmpflg ? 7 : 10);
            delay(50);

            screen = 4;
        }

        if (ifstate(2,3,"")) {
            userans[3] = "False";

            cmpflg = cmpeq(userans[3],questans[3]);
            score  = cmpflg;
            dopulse(cmpflg ? 7 : 10);
            delay(50);

            screen = 4;
        }
        break;
    }
}

int
main(void)
{

    while (1)
        newstate();

    return 0;
}
 

Вот версия, которая устраняет switch и просто увеличивает screen . Он может обрабатывать произвольное количество вопросов:

 int screen;                         // current question number

int button[2];                      // button press staet

#define NQUEST      20
const char *userans[NQUEST];        // user answers
const char *questans[NQUEST];       // correct answers to questions

// cmpeq -- compare two strings for equality
int
cmpeq(const char *lhs,const char *rhs)
{

    return (strcmp(lhs,rhs) == 0);
}

// dopulse -- pulse the led
void
dopulse(int ledno)
{

    // turn the LED on (HIGH is the voltage level)
    digitalWrite(ledno, HIGH);
    delay(1000);

    // turn the LED off by making the voltage LOW
    digitalWrite(ledno, LOW);

    // wait for a second
    delay(1000);
}

// dotest -- test answer
int
dotest(void)
{
    int press;

    do {
        press = (button[1] || button[2]);

        // user has not pressed any button
        if (! press)
            break;

        // user has pressed true or false
        int truebut = button[1];
        if (truebut)
            userans[screen] = "True";
        else
            userans[screen] = "False";

        int cmpflg = cmpeq(userans[screen],questans[screen]);
        score  = cmpflg;

        dopulse(cmpflg ? 7 : 10);
        delay(50);

        screen  = 1;
    } while (0);

    return press;
}

// wait for user to _release_ buttons
void
wait_buttons_up(void)
{
    while (button[1] || button[2]) {
        // update button state [by reading port if necessary ...
    }
}

int
main(void)
{

    // fill in correct answers ...
    for (screen = 1;  screen <= NQUEST;    screen)
        questans[screen] = "False";
    questans[3] = "True";
    questans[7] = "True";
    questans[11] = "True";
    // ...

    // welcome -- wait for _both_ buttons to be pressed
    while (1) {
        if (button[1] amp;amp; button[2]) {
            screen = 1;
            delay(50);
            break;
        }
    }

    wait_buttons_up();

    screen = 1;
    while (1) {
        if (dotest())
            wait_buttons_up();
    }

    return 0;
}
 

Комментарии:

1. Вау, спасибо за ваш код.. не могли бы вы, пожалуйста, проверить этот полный код? ссылка( pastebin.com/Vt8RctM5 ) Я принес код отсюда, и могу ли я просто применить ваш код здесь?