• 1
  • 2
2023-07-24, 08:05
  #1
Bannlyst
Jttegamla basic kod som jag hittade p ngonstans p ntet. Hur skulle ni skriva om denna kod i C , s den gick att kompilera med GCC och kra p terminalen i Linux / Mac OS.

Kod:
5 REM Mandelbrot
10 X1=59:Y1=21
20 I1=-1:I2=1:R1=-2:R2=1
30 S1=(R2-R1)/X1:S2=(I2-I1)/Y1
40 FOR Y=0 TO Y1
50 I3=I1+S2*Y
60 FOR X=0 TO X1
70 R3=R1+S1*X:Z1=R3:Z2=I3
80 FOR N=0 TO 30
90 A=Z1*Z1:B=Z2*Z2
100 IF A+B>4 THEN GOTO 130
110 Z2=2*Z1*Z2+I3:Z1=A-B+R3
120 NEXT N
130 IF N=31 THEN PRINT " "; ELSE PRINT CHR$(62-N);
140 NEXT X
150 PRINT
160 NEXT Y
170 END
Citera
2023-07-24, 10:50
  #2
Medlem
Lund-NoGo-zones avatar
S st basic-kod omskriven i C blir, med gotos som man aldrig anvnder annars, och olsbar utan indentering. Ngot med basic gr att man instinktivt gr spagetti-kod.

Hr lnk till Dijkstras klassiska Gotos considered harmful, skriven redan 1968.
https://en.wikipedia.org/wiki/Considered_harmful
__________________
Senast redigerad av Lund-NoGo-zone 2023-07-24 kl. 10:52.
Citera
2023-07-24, 11:43
  #3
Medlem
Citat:
Ursprungligen postat av Lund-NoGo-zone
S st basic-kod omskriven i C blir, med gotos som man aldrig anvnder annars, och olsbar utan indentering. Ngot med basic gr att man instinktivt gr spagetti-kod.

Hr lnk till Dijkstras klassiska Gotos considered harmful, skriven redan 1968.
https://en.wikipedia.org/wiki/Considered_harmful

Ngot sger mig att om man behver frga ngon fr att verstta ett trivialt program till C s har det nog heller inte s stor betydelse om det blir spaghettikod heller - det r ju inte s att man kommer underhlla den koden sjlv nd utan man kommer frga ngon annan ven d...

Fr vrigt s r det inte "goto" som r problemet utan problemet r ofrmga att frst vari problemet ligger. Finns mer n en programmerare dr ute som dogmatiskt sger att man inte skall anvnda "goto" och som i nsta stund uppfinner nya stt att skriva spaghettikod.
__________________
Senast redigerad av prostetnic 2023-07-24 kl. 11:45.
Citera
2023-07-24, 11:52
  #4
Medlem
Lund-NoGo-zones avatar
Citat:
Ursprungligen postat av prostetnic
Ngot sger mig att om man behver frga ngon fr att verstta ett trivialt program till C s har det nog heller inte s stor betydelse om det blir spaghettikod heller - det r ju inte s att man kommer underhlla den koden sjlv nd utan man kommer frga ngon annan ven d...

Fr vrigt s r det inte "goto" som r problemet utan problemet r ofrmga att frst vari problemet ligger. Finns mer n en programmerare dr ute som dogmatiskt sger att man inte skall anvnda "goto" och som i nsta stund uppfinner nya stt att skriva spaghettikod.
Jo, problemet med GOTO r mycket riktigt att den som anvnder detta gr det av bekvmlighet och visar att han inte riktigt satt sig in i problemet med vad han ska lsa. Utan provar lite hipp som happ och DR fungerade koden! Vilket inte r ett bra stt att koda.

Ngon datatidning gjorde en kodanalys av apples frsta IOS. Tnkt dig 1 miljon GOTOs. man frstr varfr de stora firmorna har 1000-tals programmerare. Fr att rtta de andra 1000 programmerarnas fel. IOS hade kunnat skrivas av 5 genier och blivit perfekt, men det fungerar inte s.
Citera
2023-07-24, 11:56
  #5
Citat:
Ursprungligen postat av prostetnic
Ngot sger mig att om man behver frga ngon fr att verstta ett trivialt program till C s har det nog heller inte s stor betydelse om det blir spaghettikod heller - det r ju inte s att man kommer underhlla den koden sjlv nd utan man kommer frga ngon annan ven d...

Fr vrigt s r det inte "goto" som r problemet utan problemet r ofrmga att frst vari problemet ligger. Finns mer n en programmerare dr ute som dogmatiskt sger att man inte skall anvnda "goto" och som i nsta stund uppfinner nya stt att skriva spaghettikod.
Faktiskt r "riktig" spagettikod relativt svr att stadkomma utan goto.

Med riktig menar jag otyg i den hr stilen

Kod:
10 if x>10 goto 50
15 print "begin"
20 if y<0 goto 45 
30 print y
40 if y>10 goto 60
45 print "error"
47 goto 70
50 if y<10 goto 30
60 if x=5 goto 20
70 if x=6 goto 15
80 exit
Citera
2023-07-24, 12:19
  #6
Medlem
nerdnerds avatar
Citat:
Ursprungligen postat av 53280
Jttegamla basic kod som jag hittade p ngonstans p ntet. Hur skulle ni skriva om denna kod i C , s den gick att kompilera med GCC och kra p terminalen i Linux / Mac OS.

Kod:
5 REM Mandelbrot
10 X1=59:Y1=21
20 I1=-1:I2=1:R1=-2:R2=1
30 S1=(R2-R1)/X1:S2=(I2-I1)/Y1
40 FOR Y=0 TO Y1
50 I3=I1+S2*Y
60 FOR X=0 TO X1
70 R3=R1+S1*X:Z1=R3:Z2=I3
80 FOR N=0 TO 30
90 A=Z1*Z1:B=Z2*Z2
100 IF A+B>4 THEN GOTO 130
110 Z2=2*Z1*Z2+I3:Z1=A-B+R3
120 NEXT N
130 IF N=31 THEN PRINT " "; ELSE PRINT CHR$(62-N);
140 NEXT X
150 PRINT
160 NEXT Y
170 END
Ser ut som ABC80 eller liknande? Nostalgi!

Koden r iaf hyfsat ltt att frst om man frstr lite om Mandelbrotmngden. Den ritar upp hela mngden p en skrm som r 60 22 "pixlar" s det blir en ganska grovkornig Mandelbrot. Snarare en ganska liten "ASCII art". ndra X1 och Y1 till antalet kolumner och rader som funkar p din skrm.

S1 och S2 r skalfaktorer fr x resp y, s jag tycker att de istllet borde ha hetat SX resp SY. Och Z1 och Z2 r realdel resp imaginrdel i det komplexa talet z som itereras enl definitionen av Mandelbrotmngden, s jag tycker att de borde ha hetat ZR resp ZI. Men ok, det kan man vl leva med.

Har undringar om rad 130.

PRINT-kommandot r ju det som skriver ut tecknet. Hur vet den var den r p skrmen? Verkar bara skriva direkt till hger om senaste utmatade tecknet. Bra att knna till om man vill f C att skriva i samma position.
Dremot verkar det ensamma PRINT-kommandot p rad 150 ge en radframmatning.

Och det som skrivs ut r CHR$(62-N) dr N r antalet iterationer innan det avbryts av ett villkor p z, eller max 30. Antar att CHR$(62-N) ger det tecken som har 62-N som ASCII-kod. Med N mellan 1 och 30 blir nog inte det s snyggt, med t ex siffror och parenteser och punkter och grejer. Vill du gra ngot liknande i C vill du nog snarare anvnda olika frger beroende p N -- hur man nu gr det i C.

----

En annan id n att porta till C r att lgga in den hr koden i en programmerbar rknare med ngon Basic-dialekt, t ex TI84 etc. Kan behvas ngon mindre ndring som br vara rtt enkel.
Citera
2023-07-24, 12:31
  #7
Medlem
nerdnerds avatar
Googlade lite och hittade en sajt med liknande kod i "alla" programmeringssprk, inkl C och en massa Basic-dialekter.

https://rosettacode.org/wiki/Mandelbrot_set
Citera
2023-07-24, 13:03
  #8
Medlem
nerdnerds avatar
Citat:
Ursprungligen postat av SvenHelsing
Faktiskt r "riktig" spagettikod relativt svr att stadkomma utan goto.

Med riktig menar jag otyg i den hr stilen

Kod:
10 if x>10 goto 50
15 print "begin"
20 if y<0 goto 45 
30 print y
40 if y>10 goto 60
45 print "error"
47 goto 70
50 if y<10 goto 30
60 if x=5 goto 20
70 if x=6 goto 15
80 exit
Men wtf, hur har du ftt tag p min kod?

GOTO ska man ju helst inte anvnda, men jag vet iaf en bank dr det anvnds systematiskt i deras COBOL-koder fr att snabbt ta sig ur loopar nr det blir generalknas.
Citera
2023-07-24, 13:08
  #9
Medlem
nerdnerds avatar
Hittade ocks en manual p ntet om just Basic p ABC80.
Den pstr att semikolon efter printkommandot hindrar radframmatning. Vilket verkar stmma med koden.
Citera
2023-07-24, 13:09
  #10
Medlem
PissBusss avatar
Citat:
Ursprungligen postat av SvenHelsing
Faktiskt r "riktig" spagettikod relativt svr att stadkomma utan goto.

Nej, knappast. GOTO r bara andra ledet i en frgrening i exekveringen. Att GOTO inte lngre r explicit betyder inte att mekanismen tagits bort.

Kod:
if ($switch) {
    run_this();
} else {
    run_that();
}

Du kan lra dig mer om Dijkstras resonemang och det hr mnet hr: https://www.youtube.com/watch?v=z43bmaMwagI .
Citera
2023-07-24, 13:26
  #11
Citat:
Ursprungligen postat av nerdnerd
Men wtf, hur har du ftt tag p min kod?

GOTO ska man ju helst inte anvnda, men jag vet iaf en bank dr det anvnds systematiskt i deras COBOL-koder fr att snabbt ta sig ur loopar nr det blir generalknas.
Jepp. Det anvnds ven i C fr just det syftet. I alla fall i nstlade loopar eftersom break bara tar dig ur en niv.

Det anvnds ocks fr att stda upp vid fel.

En bra grundregel r att bara hoppa framt med goto. Aldrig ngonsin bakt.

Citat:
Ursprungligen postat av PissBuss
Nej, knappast. GOTO r bara andra ledet i en frgrening i exekveringen. Att GOTO inte lngre r explicit betyder inte att mekanismen tagits bort.

Kod:
if ($switch) {
    run_this();
} else {
    run_that();
}

Du kan lra dig mer om Dijkstras resonemang och det hr mnet hr: https://www.youtube.com/watch?v=z43bmaMwagI .
Min pong r att om man inte anvnder goto s blir det frhllandevis svrt att hoppa in i mitten av ett kodblock. Jag utmanar dig att skriva om koden jag skrev utan att anvnda goto.
__________________
Senast redigerad av SvenHelsing 2023-07-24 kl. 13:51.
Citera
2023-07-24, 14:07
  #12
Medlem
PissBusss avatar
Citat:
Ursprungligen postat av SvenHelsing
Min pong r att om man inte anvnder goto s blir det frhllandevis svrt att hoppa in i mitten av ett kodblock. Jag utmanar dig att skriva om koden jag skrev utan att anvnda goto.

Det r ca. alltid svrt, eller s r det trivial kod av ringa omfng.

Snutten du visade r trivial kod av ringa omfng, man ser hela och kan flja referenserna nstan utan att flytta blicken. Det r ocks i princip ltt att konvertera den till en 'state machine' i ca. vilket annat hgnivsprk som helst, men inte speciellt trevligt i praktiken eftersom du har lagt in evigt loopande i den.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in