Skocz do zawartości

Sprawdzenie kodu programu - pomoc


Zawor

Pomocna odpowiedź

Witam to mój pierwszy post.

Prosił bym o sprawdzenie czy kod programu wykona to co przedstawiłem na algorytmie.

Opis działania:

Program zaczyna działać START i na początku robi coś 10 razy aż czas>10 lub T>55 lub T>80.

Przy spełnieniu jednego z warunków ma przestać działać i przeskoczyć do miejsca oznaczonego PRACA i nigdy już nie wykonywać operacji z pierwszej część programu.

I teraz ma zacząć działać druga część programu z trzema oddzielnymi założeniami:

1 T>30 & T<55

2 T>55

3 T<30

Program niema wrócić już nigdy do miejsca oznaczonego START.

Nie jest ważne co będzie program robił tylko to czy moje założenia z algorytmu i opisu są dobrze zapisane w kodzie.

int czas;
int T; //odczyt temeperatury

void setup(){
czas=0;
}
void loop(){
start:
  if (czas>10 || T>55 || T>80){
  goto praca;
  }
  else{
  //tu program wykonuje operacje
  czas++;
  goto start;
  }
praca:
  if(T>30 && T<55){
    //tu program wykonuje operacje
    goto praca;
  }
  if(T>55){
    //tu program wykonuje operacje
    goto praca;
  }
  if(T<30){
    //tu program wykonuje operacje
    goto praca;
  }

}

Link do komentarza
Share on other sites

Moim zdaniem powinieneś przemyśleć sobie dokładniej ten algorytm, a w szczególności:

1. Jeżeli T>80 to przecież jest też większe od 55, po co sprawdzać dwa warunki?

2. Co program ma robić (w pętli praca) dla T=30 i dla T=55. Obecny nie robi nic, bo te wartości nie łapią się do żadnego if-a.

3. Podczas sprawdzania wartości T w pętli "praca" nie musisz testować 3 warunków. Jeżeli 2 pierwsze nie będą spełnione, automatycznie możesz wykonać - już bez sprawdzania - czynności dla przedziału trzeciego.

No i co do samego programu: szkoda, że nie doczytałeś podręcznika C do rozdziału o instrukcjach "while" lub "do". Twój program wygląda jak praca przedszkolaka który miał napisać wierszyk o krówce a zna tylko 100 wyrazów. Czy masz jakieś konotacje z programowaniem w języku assemblera? Tam "goto" (czyli skok) jest typową instrukcją, ale w C nie musisz jej praktycznie w ogóle używać. A w takim trywialnym algorytmie na pewno potrzebna nie jest ani jedna:

int czas; 
int T; //odczyt temperatury 

void setup() { 
czas=0; 
} 

void loop() { 
 while (czas<10 && T<55) { 
 //tu program wykonuje operacje 
 czas++; 
 } 
 while(1) {
   if (T<=30) { 
   //tu program wykonuje operacje dla dolnego zakresu
   } 
   else
     if(T>=55) { 
     //tu program wykonuje operacje dla górnego zakresu
     } 
     else { 
     //tu program wykonuje operacje dla środkowego zakresu
     } 
 }
} 

I nie traktuj forum jak darmowego kompilatora. Przecież możesz ten kod wrzucić do swojego Arduino (bo na tę platformę to wygląda), uzupełnić o wypisywanie komunikatów przez serial port i samemu sprawdzić, czy napisałeś poprawny program nadając konkretne wartości zmiennej T.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Troszkę się pomyliłeś marek1707,

nie

while (czas<10 && T<55) {
 //tu program wykonuje operacje
 czas++;
 }

a

while (czas<=10 && T<=55) {
 //tu program wykonuje operacje
 czas++;
 }

bo do praca program przechodzi przy czas > 10 i T > 55.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Zastąpiłbym pierwszy while forem:

for(int czas = 0; czas < 10 && T < 55; czas++) {
     //tu program wykonuje operacje
}

A przy okazji: Nigdzie wcześniej nie widziałem else if pisanego w 2 linijkach. Ja bym tamten kawałek sformatował tak:

if (T<=30) {
   //tu program wykonuje operacje dla dolnego zakresu
} else if(T>=55) {
   //tu program wykonuje operacje dla górnego zakresu
} else {
   //tu program wykonuje operacje dla środkowego zakresu
}

EDIT: Zauważ że po pierwszym else nie ma otwieranej klamry, nie widzę powodu żeby zwiększać wcięcie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.