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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.