webForumDet fria alternativet

loop stop eller fortsätt....

39 svar · 1 149 visningar · startad av Coper

CoperMedlem sedan mars 2002554 inlägg
#1

...

Marcus EMedlem sedan maj 20021 466 inlägg
#2

Grafiskt eller kommandobaserat gränssnitt? Utvecklingsmiljö? Operativsystem?

Exakt vilken del är det du vill ha hjälp med?

Principen ser ut så här:
upprepa
{
Räkna ut uppgiften och skriv ut svaret
Fråga om upprepning (t.ex. getch om kommandobaserat)
Avbryt upprepningen om svaret var nej
}

CoperMedlem sedan mars 2002554 inlägg
#3

...

CoperMedlem sedan mars 2002554 inlägg
#4

...

Marcus EMedlem sedan maj 20021 466 inlägg
#5

Jag kan posta lite kod, men jag vet inte om du har någon nytta av den, eftersom du inte kan C++ så bra. Bättre vore om du kunde köpa en bok och lära dig C och C++.

Detta är i.af. C.

#include <stdio.h>
#include <conio.h>

int main()
{
   for(;;)
   {
      // Gör uppgiften
      printf("Färdig? ");
      int c = getch();
      if(c == 'j' || c == 'J') break;
   }
}
PeWMedlem sedan juni 200010 432 inlägg
#6

Gaaaaaah!

"break" är bannade i loopar, ett solklart minus om det vore en tenta ;)

Bättre med:

#include <stdio.h>
#include <conio.h>

int main()
{ 
   int c = 'j';
   while(c=='j' || c=='J')
   {
      // Gör uppgiften
      printf("Färdig? ");
      int c = getch();
      if(c == 'j' || c == 'J');
   }
}
Marcus EMedlem sedan maj 20021 466 inlägg
#7

Varför är break bannad? goto vet jag om att man inte får använda, men break var något nytt.

Tyvärr har jag vant mig vid att alltid använda break, så det blir svårt att avvänja sig vid det, bara för att man inte får använda det.

Jag har dessutom aldrig gjort någon tenta i programmering.

PeWMedlem sedan juni 200010 432 inlägg
#8

Marcus E skrev:

Varför är break bannad? goto vet jag om att man inte får använda, men break var något nytt.

Tyvärr har jag vant mig vid att alltid använda break, så det blir svårt att avvänja sig vid det, bara för att man inte får använda det.

Jag har dessutom aldrig gjort någon tenta i programmering.

Motiveringen är att eftersom man vanligtvis nästlar loopar, traverserar strukturer och bygger ganska komplexa saker så ökar man felmöjligheterna med break... och hamnar i svårlokaliserade felsituationer. Det är dålig kodning - kort och gott ;)

Däremot kan ju break användas till andra saker...

BrimbaMedlem sedan dec. 19995 875 inlägg
#9

Annars fungerar det såhär också :)

main()
{ 
   bool loop = true;

   while(loop)
   {
      // Gör uppgiften
      printf("Färdig? ");
      int c = getch();
      if(c == 'j' || c == 'J');
         loop = false;
   }
}
Marcus EMedlem sedan maj 20021 466 inlägg
#10

Bästa alternativet

PeW skrev:

Motiveringen är att eftersom man vanligtvis nästlar loopar, traverserar strukturer och bygger ganska komplexa saker så ökar man felmöjligheterna med break...

Vet man om att loopen inte kommar bli mer komplex än vad den är, kan man använda break tills vidare.

T.ex. vid en enkel sökning. Alla dessa tre exempel gör exakt samma sak. Är 3-an bäst för att varken return eller break används i loopen? Själv anser jag att 1-an är bäst, eftersom den ger enklast kod. Eller är ett fjärde alternativ bättre?

1.
for(int i = 0; i < len; i++)
    if(element[i] == find) return i;
return -1;

2.
int i;
for(i = 0; i < len; i++)
    if(element[i] == find) break;

a)
return i == len ? -1 : i;

b)
if(i == len)
   return -1;
else
   return i;

3.
int fi = -1;
for(i = 0; i < len && f == -1; i++)
    if(element[i] == find) fi = i;
return fi;

Är det dåligt att komprimera kod som i 2a?

PeWMedlem sedan juni 200010 432 inlägg
#11

Om du kör med return förutsätter du ju att du avslutar funktionen/metoden... och är det så, så är det fridens.

Är det dåligt att komprimera kod som i 2a?

Nej, varför skulle det vara det? Det enda är isf läsbarheten som blir klurigare. De fel man menar kan uppstå med "hopp" kod och oändliga loopar är de logiska felen... och som redan sagts så är det med avseende på större programstrukturer och varför då inte ta upp det redan nu?

*En fjärde variant skulle isf vara med pekare och en femte med en generell iterator, en sjätte kan ju vara en rekursiv funktion

Det är väl beroende på hur strukturen ser ut som man ska traversera och söka i, som det hänger på.

Men i de kurser jag läst är det lika illa med break i loopar som med goto, just m.h.t att man ska programmera med minimal felmarginal och tidskomplexitet och att det ska kunna leda till stora program utan ändringar i delfunktioner ;)

Har man byggt vad man anser vara små strukturer/algoritmer och "inte varit så noga med just denna funktionalitet", är de kanske rent av olämpliga att implementera med andra och stört omöjliga att avlusa ihop med varandra pga logiska fel.

ToonsterMedlem sedan feb. 20001 590 inlägg
#12

Vet man om att loopen inte kommar bli mer komplex än vad den är, kan man använda break tills vidare.

For loopar bör endast användas när man ska iterera ett känt antal gånger, därför ska man aldrig hoppa ur den iterationen.

I exemplen du visar, så är det while-satsen som är given, och där kan break användas.

Håller med PeW, minus i protokollet, minst lika illa som ett Goto statement...

/T

BeatboxMedlem sedan okt. 20013 217 inlägg
#13
#include <stdio.h>
#include <conio.h>

int main()
{ 
   int c;

   do
   {
      // Gör uppgiften
      printf("Färdig? Tryck j");
   } while ((c = getch()) != 'j'))
}
CoperMedlem sedan mars 2002554 inlägg
#14

...

Marcus EMedlem sedan maj 20021 466 inlägg
#15

getch är inte standard, utan en funktion som följer med de flesta kompilatorer för Windows. Jag förutsätter att man använder Windows om man inte anger något annat.

Sök på nätet. T.ex. http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&frame=right&th=5bed60265fdd041b&seekm=77nnlm%24ocs%242%40callisto.clark.net#link1

CoperMedlem sedan mars 2002554 inlägg
#16

...

PeWMedlem sedan juni 200010 432 inlägg
#17

Prova "getchar" ist för "getch" :)

CoperMedlem sedan mars 2002554 inlägg
#18

...

Marcus EMedlem sedan maj 20021 466 inlägg
#19

Cooper: I länken jag skickade finns det andra inlägg som handlar om getch i Linux.

Du har glömt semikolon efter "} while ((c = getchar()) != 'j'))".

Försök att korta ned ditt felmeddelande. "Entering directory" är inte något fel. Felmeddelandet är:
"main.cpp: In function `int main ()':
main.cpp:34: parse error before `)' "

CoperMedlem sedan mars 2002554 inlägg
#20

...

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)