Förklara nästlade loopar

  • Thread starter Thread starter H4
  • Start date Start date

H4

Too legit to quit
Gick med
9 Aug 2004
Ort
Göteborg
Hoj
Ducati 1098S -07
Halloj! Lite fast här...

INPUT "Skriv en siffra"; n
FOR i = 1 to n
FOR j = 1 to i
PRINT i;
NEXT j
PRINT
NEXT i

Då blir det så här:

1
22
333
4444
55555
666666

Och så vidare beroende på vilken siffra man matar in i input. Men, någon som kan förklara rent pedagogiskt varför det blir så? Jag ser ingen struktur i det hela. Vad är det som gör att talet skrivs ut lika många gånger som talet självt?
 
Loopar m.m. brukar vara lättare att förstå om du formatterar koden lite (skriver med ____ för att formattera, forumet tog bort vanliga mellanslag)

INPUT "Skriv en siffra"; n

FOR i = 1 to n // upprepa n gånger, öka värdet av i från 1 tills det blir n

_____FOR j = 1 to i // upprepa lika många gånger som värdet av i, dvs yttre loopen
__________PRINT i; // skriv ut värdet av i, byt INTE rad
_____NEXT j // öka j med 1 och kör en gång till

_____PRINT // byt rad!

NEXT i // öka i med ett och kör en gång till
 
H4 skrev:
2439249 Halloj! Lite fast här...

INPUT "Skriv en siffra"; n
FOR i = 1 to n
FOR j = 1 to i
PRINT i;
NEXT j
PRINT
NEXT i

Då blir det så här:

1
22
333
4444
55555
666666

Och så vidare beroende på vilken siffra man matar in i input. Men, någon som kan förklara rent pedagogiskt varför det blir så? Jag ser ingen struktur i det hela. Vad är det som gör att talet skrivs ut lika många gånger som talet självt?

Satt lite och lekte runt i Qbasic. Nu förstår jag detta tror jag.

NEXT j hoppar till FOR j = 1 to i och skriver alltså print i; antal gånger som FOR j = 1 to i blir. Inga problem :tummenupp
 
Nu ska vi se...

Du matar in ett värde i variablen n.
Första for-loopen kommer då att köras n gånger. Variablen i kommer att räkna upp varje gång loopen "kör runt".

Innuti den första for-loopen har du ytterligare en for-loop. Denna loop kommer att - för varje varv den första (yttre) for-loopen gör - snurra så många gånger som variablen i anger. I den intre loopen görs en utskrift av aktuellt värde på i. Variablen j håller reda på hur många varv den inre loopen gör.

Kort sagt kan man säga att den "yttre" loopen anger hur många gånger den "inre" loopen ska köra, mha variablen i som uppdateras varje "yttre varv".

- n anges och yttre loopen startar.
- i sätts till 1
- inre for loopen startas och kör tills j = i, j sätts till 1 och i=1 så det blir bara en gång.
- i skrivs ut "1" (j=1)
- inre loopen klar
- ny rad skrivs ut

- yttre loopen startar om
- i räknas upp till 2
- inre for loopen startas och kör tills j = i, j sätts till 1 och i=2 så det blir två gånger.
- i skrivs ut "2" (j=1)
- i skrivs ut "2" (j=2)
- inre loopen klar
- ny rad skrivs ut

- yttre loopen startar om
- i räknas upp till 3
- inre for loopen startas och kör tills j = i, j sätts till 1 och i=3 så det blir tre gånger.
- i skrivs ut "3" (j=1)
- i skrivs ut "3" (j=2)
- i skrivs ut "3" (j=3)
- inre loopen klar
- ny rad skrivs ut

osv. tills i=n då programmet lämnar den yttre loopen och går vidare i programmet...som ju är slut därefter.

Nån som förstod det här??? :rolleyes:

H4 skrev:
2439796
NEXT j hoppar till FOR j = 1 to i och skriver alltså print i; antal gånger som FOR j = 1 to i blir. Inga problem :tummenupp
Exäcktly! :tummenupp
 
Last edited:
timm skrev:
2439823 Nu ska vi se...
Nån som förstod det här??? :rolleyes:

Exäcktly! :tummenupp

Förstod detta faktiskt :tummenupp Tack för att du la dig tid för att skriva det här inlägget.

En fråga:
print i; när första loopen körs (FOR i) stannar kvar, eller?

För tittar man på i = 1 to j

j = 5

Blir alltså 4 tal men tillsammans med print i; innan blir det 1 + 4 tal (om vi loopar för 5:e gången). Blev kanske lite rörigt nu, men hoppas att du förstår.
 
Last edited:
H4 skrev:
2439833 En fråga:
print i; när första loopen körs (FOR i) stannar kvar, eller?

För tittar man på i = 1 to j

j = 5

Blir alltså 4 tal men tillsammans med print i; innan blir det 1 + 4 tal (om vi loopar för 5:e gången). Blev kanske lite rörigt nu, men hoppas att du förstår.
Ärligt talat förstår jag inte ett skvatt vad du undrar nu.:pannkyss

"print i" görs i den inre loopen, så många gånger som variablen i. Medan den inre loopen håller på och printar ut i en massa gånger händer det ju inget med den yttre loopen.
Först när den inre loopen är klar så fortsätter den yttre att räkna upp i med ett, sen börjar den inre snurra igen och printa.

Bara som onödigt exempel, minuträknare (eller sekund-dito) på en digitalklocka kan du få ihop så här:

Code:
for a=0 to 5
  for b=0 to 9
     print a
     print b
  next b
  print   (ny rad)
next a
print "Klart"
bör ge någon i stil med:

ab
--
00
01
02
...
08
09
10
11
12
13
....
58
59
Klart


första siffran är yttre räknaren "a" och andra siffran är inre räknaren "b". Hänger du mä? :)
 
Okaj, tack! :)

Ungefär det jag frågade efter... fast konstigt formulerat.
 
Code:
/*
 * Program to compute an approximation of pi
 * by Brian Westley, 1988
 * (requires pcc macro concatenation; try gcc -traditional-cpp)
 */

#define _ -F<00||--F-OO--;
int F=00,OO=00;
main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_
}
;)
 
ft skrev:
2440089
Code:
/*
 * Program to compute an approximation of pi
 * by Brian Westley, 1988
 * (requires pcc macro concatenation; try gcc -traditional-cpp)
 */
;)
Neeej!! Inte bidrag till "obfuscated c-coding contest" :näsblod :crash

:lol

edit: Kontar med ett morse-kods-program eftersom jag fick reda på att mitt radioamtörtillstånd fortfarande gäller.

Code:
#define	DIT	(
#define	DAH	)
#define	__DAH	++
#define DITDAH	*
#define	DAHDIT	for
#define	DIT_DAH	malloc
#define DAH_DIT	gets
#define	_DAHDIT	char
_DAHDIT _DAH_[]="ETIANMSURWDKGOHVFaLaPJBXCYZQb54a3d2f16g7c8a90l?e'b.s;i,d:"
;main			DIT			DAH{_DAHDIT
DITDAH			_DIT,DITDAH		DAH_,DITDAH DIT_,
DITDAH			_DIT_,DITDAH		DIT_DAH DIT
DAH,DITDAH		DAH_DIT DIT		DAH;DAHDIT
DIT _DIT=DIT_DAH	DIT 81			DAH,DIT_=_DIT
__DAH;_DIT==DAH_DIT	DIT _DIT		DAH;__DIT
DIT'\n'DAH DAH		DAHDIT DIT		DAH_=_DIT;DITDAH
DAH_;__DIT		DIT			DITDAH
_DIT_?_DAH DIT		DITDAH			DIT_ DAH:'?'DAH,__DIT
DIT' 'DAH,DAH_ __DAH	DAH DAHDIT		DIT
DITDAH			DIT_=2,_DIT_=_DAH_;	DITDAH _DIT_&&DIT
DITDAH _DIT_!=DIT	DITDAH DAH_>='a'?	DITDAH
DAH_&223:DITDAH		DAH_ DAH DAH;		DIT
DITDAH			DIT_ DAH __DAH,_DIT_	__DAH DAH
DITDAH DIT_+=		DIT DITDAH _DIT_>='a'?	DITDAH _DIT_-'a':0
DAH;}_DAH DIT DIT_	DAH{			__DIT DIT
DIT_>3?_DAH		DIT			 DIT_>>1 DAH:'\0'DAH;return
DIT_&1?'-':'.';}__DIT DIT			DIT_ DAH _DAHDIT
DIT_;{DIT void DAH write DIT			1,&DIT_,1 DAH;}
Välkommenterad och fin kod! :tummenupp
 
Last edited:
Fyfan vad dåligt det går :mad:

Skriv med användning av DO WHILE-satsen ett program som skriver ut talen 1,-2,3,-4...,-24,25.

HUR I HELVETE funkar detta? :argpådato Hoppas någon pallar att skriva koden så får jag titta och fundera på detta alltså...
 
í=0

do i=i+1
print i
while i<26

eller nåt liknande, har inte pysslat med basic på bra många år

Sorry läste din fråga fel, men det går väl att ändra lite så rätt tal ploppar ut
 
Last edited:
H4 skrev:
2445049 Fyfan vad dåligt det går :mad:

Skriv med användning av DO WHILE-satsen ett program som skriver ut talen 1,-2,3,-4...,-24,25.

HUR I HELVETE funkar detta? :argpådato Hoppas någon pallar att skriva koden så får jag titta och fundera på detta alltså...
Nu var det ju iofs tusen år sen jag gjorde något i qbasic, men även om syntaxen blir fel så hoppas jag du förstår principen. :)
Code:
var count
var value
count = 1  // Sätt startvärden
value = 1

do
   print value   // Skriv värdet
   print ","       // Skriv kommatecken ?
   value = value+1   // Öka räknaren till nästa runda
   value = -value     // och negera räknaren (om negativt blir det pos och tvärtom)
   count = count+1  // Öka antal-räknaren
while (count < 26)
Något sånt kanske. Går säkert att lösa på andra sätt också, t.ex med enbart en variabel, men det är fredagkväll och då kostar vi på oss lite lyx! :fyllisar
 
Men det är meningen att vi ska göra det på ett annat sätt utan alla value grejer som du använder dig av. Hur gör man då?

Tack för att du är så hjälpsam.
 
H4 skrev:
2446263 Men det är meningen att vi ska göra det på ett annat sätt utan alla value grejer som du använder dig av. Hur gör man då?

Tack för att du är så hjälpsam.

"value" är ju bara ett variabelnamn. Du skulle lika gärna kunna kalla den för "i" eller "kalle"

Code:
var count
var kalle
count = 1  // Sätt startvärden
kalle = 1

do
   print kalle         // Skriv värdet
   print ","            // Skriv kommatecken ?
   kalle = kalle+1   // Öka räknaren till nästa runda
   kalle = -kalle     // och negera räknaren (om negativt blir det pos och tvärtom)
   count = count+1  // Öka antal-räknaren
while (count < 26)
 
H4 skrev:
2445049 Fyfan vad dåligt det går :mad:

Skriv med användning av DO WHILE-satsen ett program som skriver ut talen 1,-2,3,-4...,-24,25.

HUR I HELVETE funkar detta? :argpådato Hoppas någon pallar att skriva koden så får jag titta och fundera på detta alltså...

Code:
int counter = 1;
do {
   System.out.println(counter + ", ");
   if(counter>=0)
      counter = -(counter + 1);
   else
      counter = -(counter - 1);
} while(counter<26)

Ett exempel till, utan extra variabler.


Det här borde väl fungera det med, helt utan variabler (även om man kan diskutera om en parameter är en variabel). Tyvärr helt utan do-while också... :)

Code:
public void iterate(int i) {
  if(i != 0) {
    if(i > 0) {
      iterate(-(i-1));
    } else {
      iterate(-(i+1));
    }
    System.out.println(i + ", ");
  }
}

iterate(26);

Mvh,
/Fredrik - vågar vägra basic och fördriver tid till em-kaffet
 
Last edited:
ft skrev:
2464318
Code:
 (även om man kan diskutera om en parameter är en variabel).

[/QUOTE]

En parameter är inte en variabel. Man kan däremot använda en variabel som parameter. En parameter skulle däremot lika gärna kunna vara en konstant eller en pekare eller en referens..
 
H4 skrev:
2445049 Fyfan vad dåligt det går :mad:

Skriv med användning av DO WHILE-satsen ett program som skriver ut talen 1,-2,3,-4...,-24,25.

HUR I HELVETE funkar detta? :argpådato Hoppas någon pallar att skriva koden så får jag titta och fundera på detta alltså...

Nu var det längesen jag fipplade med qbasic. (mest C nu för tiden)

Följande kod borde funka ypperligt iaf.
Code:
DIM x AS INTEGER

x = 1

DO

 IF x MOD 2 THEN
    PRINT x; ", ";
 ELSE
    PRINT -x; ", ";
 END IF

 x = x + 1

LOOP WHILE x < 26
 
Last edited:
Nyheter
Yamaha R7-vinnarens rapport: ”Ett riktigt monster på kurviga landsvägar!”

På MC-mässan i vintras anor...

Nisse Hedlund bortgången

Den legendariske motorkonst...

En dag på dragstrippen

Efter att ha varit aktiv so...

Steve McQueens Scott Squirrel till salu

Detta Scott Flying Squirrel...

Dags för Strängnäs Bike Show!

Sista lördagen i augusti är...

Bikeweekend på Kjula denna helg

Den 22-23 augusti är det da...

Motorcycle Inferno #8

Den 5 september blir Laxhol...

Tiotusentals körde Mälaren Runt

Lördagen den 15 augusti gen...

Mälaren Runt fyller 40 år

Nu på lördagen den 15 augus...

Steve Holcombe klar för GGN!

Pressmeddelande 2026-08-10 ...

Back
Top