#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 ) Я принес код отсюда, и могу ли я просто применить ваш код здесь?