Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2023-07-24, 08:05
  #1
Medlem
53280s avatar
Jättegamla basic kod som jag hittade på någonstans på nätet. Hur skulle ni skriva om denna kod i C , så den gick att kompilera med GCC och köra 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
Avstängd
Lund-NoGo-zones avatar
Så söt basic-kod omskriven i C blir, med gotos som man aldrig använder annars, och oläsbar utan indentering. Något med basic gör att man instinktivt gör spagetti-kod.

Här länk 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å söt basic-kod omskriven i C blir, med gotos som man aldrig använder annars, och oläsbar utan indentering. Något med basic gör att man instinktivt gör spagetti-kod.

Här länk till Dijkstras klassiska Gotos considered harmful, skriven redan 1968.
https://en.wikipedia.org/wiki/Considered_harmful

Något säger mig att om man behöver fråga någon för att översätta 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 underhålla den koden själv ändå utan man kommer fråga någon annan även då...

För övrigt så är det inte "goto" som är problemet utan problemet är oförmåga att förstå vari problemet ligger. Finns mer än en programmerare där ute som dogmatiskt säger att man inte skall använda "goto" och som i nästa stund uppfinner nya sätt att skriva spaghettikod.
__________________
Senast redigerad av prostetnic 2023-07-24 kl. 11:45.
Citera
2023-07-24, 11:52
  #4
Avstängd
Lund-NoGo-zones avatar
Citat:
Ursprungligen postat av prostetnic
Något säger mig att om man behöver fråga någon för att översätta 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 underhålla den koden själv ändå utan man kommer fråga någon annan även då...

För övrigt så är det inte "goto" som är problemet utan problemet är oförmåga att förstå vari problemet ligger. Finns mer än en programmerare där ute som dogmatiskt säger att man inte skall använda "goto" och som i nästa stund uppfinner nya sätt att skriva spaghettikod.
Jo, problemet med GOTO är mycket riktigt att den som använder detta gör det av bekvämlighet och visar att han inte riktigt satt sig in i problemet med vad han ska lösa. Utan provar lite hipp som happ och DÄR fungerade koden! Vilket inte är ett bra sätt att koda.

Någon datatidning gjorde en kodanalys av apples första IOS. Tänkt dig 1 miljon GOTOs. man förstår varför de stora firmorna har 1000-tals programmerare. För att rätta 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
Medlem
SvenHelsings avatar
Citat:
Ursprungligen postat av prostetnic
Något säger mig att om man behöver fråga någon för att översätta 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 underhålla den koden själv ändå utan man kommer fråga någon annan även då...

För övrigt så är det inte "goto" som är problemet utan problemet är oförmåga att förstå vari problemet ligger. Finns mer än en programmerare där ute som dogmatiskt säger att man inte skall använda "goto" och som i nästa stund uppfinner nya sätt att skriva spaghettikod.
Faktiskt är "riktig" spagettikod relativt svår att åstadkomma utan goto.

Med riktig menar jag otyg i den här 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
Jättegamla basic kod som jag hittade på någonstans på nätet. Hur skulle ni skriva om denna kod i C , så den gick att kompilera med GCC och köra 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 lätt att förstå om man förstår lite om Mandelbrotmängden. Den ritar upp hela mängden på en skärm 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 skärm.

S1 och S2 är skalfaktorer för x resp y, så jag tycker att de istället borde ha hetat SX resp SY. Och Z1 och Z2 är realdel resp imaginärdel i det komplexa talet z som itereras enl definitionen av Mandelbrotmängden, så jag tycker att de borde ha hetat ZR resp ZI. Men ok, det kan man väl leva med.

Har undringar om rad 130.

PRINT-kommandot är ju det som skriver ut tecknet. Hur vet den var den är på skärmen? Verkar bara skriva direkt till höger om senaste utmatade tecknet. Bra att känna till om man vill få C att skriva i samma position.
Däremot verkar det ensamma PRINT-kommandot på rad 150 ge en radframmatning.

Och det som skrivs ut är CHR$(62-N) där 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 göra något liknande i C vill du nog snarare använda olika färger beroende på N -- hur man nu gör det i C.

----

En annan idé än att porta till C är att lägga in den här koden i en programmerbar räknare med någon Basic-dialekt, t ex TI84 etc. Kan behövas någon mindre ändring som bör vara rätt enkel.
Citera
2023-07-24, 12:31
  #7
Medlem
nerdnerds avatar
Googlade lite och hittade en sajt med liknande kod i "alla" programmeringsspråk, 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 svår att åstadkomma utan goto.

Med riktig menar jag otyg i den här 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 fått tag på min kod?

GOTO ska man ju helst inte använda, men jag vet iaf en bank där det används systematiskt i deras COBOL-koder för att snabbt ta sig ur loopar när det blir generalknas.
Citera
2023-07-24, 13:08
  #9
Medlem
nerdnerds avatar
Hittade också en manual på nätet om just Basic på ABC80.
Den påstår att semikolon efter printkommandot hindrar radframmatning. Vilket verkar stämma med koden.
Citera
2023-07-24, 13:09
  #10
Medlem
PissBusss avatar
Citat:
Ursprungligen postat av SvenHelsing
Faktiskt är "riktig" spagettikod relativt svår att åstadkomma utan goto.

Nej, knappast. GOTO är bara andra ledet i en förgrening i exekveringen. Att GOTO inte längre är explicit betyder inte att mekanismen tagits bort.

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

Du kan lära dig mer om Dijkstras resonemang och det här ämnet här: https://www.youtube.com/watch?v=z43bmaMwagI .
Citera
2023-07-24, 13:26
  #11
Medlem
SvenHelsings avatar
Citat:
Ursprungligen postat av nerdnerd
Men wtf, hur har du fått tag på min kod?

GOTO ska man ju helst inte använda, men jag vet iaf en bank där det används systematiskt i deras COBOL-koder för att snabbt ta sig ur loopar när det blir generalknas.
Jepp. Det används även i C för just det syftet. I alla fall i nästlade loopar eftersom break bara tar dig ur en nivå.

Det används också för att städa upp vid fel.

En bra grundregel är att bara hoppa framåt med goto. Aldrig någonsin bakåt.

Citat:
Ursprungligen postat av PissBuss
Nej, knappast. GOTO är bara andra ledet i en förgrening i exekveringen. Att GOTO inte längre är explicit betyder inte att mekanismen tagits bort.

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

Du kan lära dig mer om Dijkstras resonemang och det här ämnet här: https://www.youtube.com/watch?v=z43bmaMwagI .
Min poäng är att om man inte använder goto så blir det förhållandevis svårt att hoppa in i mitten av ett kodblock. Jag utmanar dig att skriva om koden jag skrev utan att använda 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 poäng är att om man inte använder goto så blir det förhållandevis svårt att hoppa in i mitten av ett kodblock. Jag utmanar dig att skriva om koden jag skrev utan att använda goto.

Det är ca. alltid svårt, eller så är det trivial kod av ringa omfång.

Snutten du visade är trivial kod av ringa omfång, man ser hela och kan följa referenserna nästan utan att flytta blicken. Det är också i princip lätt att konvertera den till en 'state machine' i ca. vilket annat högnivåspråk 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