OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 16:24

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 100 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6, 7  Další
Autor Zpráva
PříspěvekNapsal: 14.05.2020, 22:44 
Offline
Profík

Registrován: 15.01.2014, 20:08
Příspěvky: 782
Bydliště: Šlapanice
Has thanked: 129 times
Been thanked: 97 times
Panda38 píše:
Průšvih v C je zapomenutý maličký nenápadný středník za else, strašně blbě se pak hledá proč se program chová divně: if (ok) a = 5; else; ab = 10;
Nebo je veselé zapomenout uvést středník za deklarací třídy, překladač pak vyhazuje nelogické chyby o několik souborů dál.


Takže C(++) je taky středníkové peklo.

faraon píše:
Pascal má jednoprůchodový překladač, ....


Aha takže ta pošahaná struktura PACKALu je nutnost.

Martin1 píše:
To už nie je Pascal podľa Wirtha. GOTO a EXIT boli pridané pre lenivých programátorov.
M1


Zkus přepsat tento program tak aby nebylo potřeba GOTO či jiného cukříku.

Máš textový soubor s danou strukturou a setřízený, ze kterého potřebuješ dostat určitá data, u soboru nejsi schopen zjistit jak je dlouhý tj. kolik má řádku
Takto jsem to vyřešil já v MS FORTRANu 77.

Kód:
      open (unit=1,file=co1,status='OLD',err=100)                      ! při chybě se skočí na navěstí 100 tj. není zadaný soubor
1     read (1,'(a,2x,i4,2x,a)',err=101)sou,poc,poz                     ! při chybě se skočí na navěstí 101 tj. není další záznam aneb konec souboru
      if (index(sou,t(1)).eq.0.and.index(sou,t(2)).eq.0.and.
     # index(sou,t(3)).eq.0.and.index(poz,t(1)).eq.0.and.index(poz,t(2))
     # .eq.0.and.index(poz,t(3)).eq.0)goto 1                           ! test za se má cenu zabývat daným řádkem

C     vlastí zpracování řádkům (jak se na to koukám tak by se do dalo napsat líp)

      goto 1                                                           ! skok na načtení dalšího řádku
101   blok1=0                                                          ! jdeme vyblit to co jsme vyseparovali

C      něco blijem (víme kolik tak jedem v cyklu)
C      pak tu máme duhy soubor s popisem taktéž seřízený, kdy obsahuje všechny varianty, ve vyseparovaných datech se všechny varianty nevisituji.

2      read(12,'(a)')y                                                 ! načte radek
       if (c5.eq.y(1:5))then                                           ! test zad je shoda

C        zpracování

       else
         goto 2                                                        ! pokut není tak načti další řadek
       end if

C      něco blijem dále

100   close(unit=1)                                                    ! pokut nebil soubor ke zpracování skočíme sem
      close(unit=12)                                                   ! zavření obou souborů
      end                                                              ! konec programu


jinak FORTAN 77 zná k GOTO, EXIT a ještě CYCLE kdy EXIT vyskočí z cyklu a CYCLE je vlastně END DO. Jinak po FORTRANu 66 zdědil FORTAN 77 aritmetické GOTO.

Už nevím, kde byl ten článek snad ROOT ?? No rozebíralo se tam GOTO aneb jak je to fuj příkaz ale bez GOTO nejde napsat složitěji program aneb občas je potřeba se vrátit, zkrátit cyklus atd. no v některých jazycích opravdu GOTO není jen se jmenuje jinak …

U FORTRANu 77 je u některých proměněných předem definován jejich typ teda pokut není deklarován co jsi tak metne pamatuji tak I, J, K, L, … jsou deklarovány jako INTEGER*2. Ale taky má FORTAN 77 možnost dát vedet překladači aby zkontroloval deklaraci všech proměněných ($DECLARE) kdy při překladu vypíše všechny nedeklarované proměnné a deklarované ale nepoužité proměnné. U větších programu používám.

Holt FORTRAN je pro programátory a PACKAL pro pojídače koláčů.

_________________
Ne všichni jsme měli z češtiny za jedna, aneb jsem dyslektik a dysgrafik.

http://www.sapi.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 14.05.2020, 23:27 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1554
Has thanked: 485 times
Been thanked: 634 times
Mám rozjednaný obchod s jiným sběratelem a nemůžu z toho spát (přijme mojí nabídku, nepřijme, odepíše vůbec...?)

Po přečtení tvých poznámek v kódu si nemůžu odpustit poznámku, že ne úplně dobře rozumím jazyku tvého kmene, ale i tak se pokusím to nějak sepsat, i když Fortran :A jsem nikdy neviděl (třeba se unavím a pudu spát)... Pseudokódem:

Kód:
var fSoubor1 = fopen{...);
if (fSoubor1 otevřen pro čtení ok){
    var sou,poc,poz;
    while (  freadf( fSoubor1, "definice tvého formátu", &sou, &poc, &poz ) == 3  ){
        if ( je splněna podmínka týkající se sou, poc a poz )(
            // vlastní zpracování aktuálního řádku
            // jak se na to koukám tak by se to fakt dalo napsat mnohem líp
        }
    fclose(fSoubor1); // uzavření souboru
    var blok1 = 0;
    // něco bliju (a iterátorem v cyklu je zřejmě blok1) :puke:
    var fSoubor2 = fopen(...);
    if (fSoubor2 otevřen pro čtení ok){ // tohle zřejmě nemáš ve svém kódu ošetřeno
        var y;
        while (  freadf( fSoubor2, "definice tvého formátu", &y ) == 1  )
            if ( je splněna podmínka týkající se y )(
                // vlastní zpracování řádku
            }
        fclose(fSoubor2); // uzavření souboru
    }
    // něco bliju dále :puke:
}


Kód jde pěkně shoda dolů (ne zamotaně jako špageta), odsazení ("vnoření") od okraje vizuálně napovídá, do jakých celků je rutina organizována. Cyklus by se dal náhle přerušit příkazem "break," případně nuceně přejít k další iteraci příkazem "continue" - goto tím pádem netřeba. Na druhou stranu, dlouhodobě říkám, že jedno dobře mířený goto vydá za pět breaků :-D

A aspoň si to po sobě příště přečti - "pokut nebil soubor ke zpracování" to jako fakt né :lol:

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
PříspěvekNapsal: 14.05.2020, 23:56 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
EC1045.01 píše:
...I, J, K, L, … jsou deklarovány jako INTEGER...
Tohle zůstalo z Fortranu v jazycích dodnes - je zvykem používat I a J jako čítače cyklů a K L M N přednostně jako celočíselné proměnné.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 00:04 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
Bez GOTO se opravdu dá obejít a nemusí být potřeba nikdy - místo toho používat podmínky, stavové flagy, funkce. Nebo v cyklu continue. GOTO je spíš projevem chybné konstrukce strukturovaného programu. Má velkou nectnost - je nejednoznačné v jakém stavu bude zásobník proměnných. A i překladači způsobuje problémy, protože v místě cílové adresy nemůže optimalizovat tok pořadí instrukcí, tak to zpomalí program i když se GOTO nepoužije.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 00:33 
Offline
Pan Štábní

Registrován: 12.05.2013, 22:24
Příspěvky: 1508
Bydliště: u Prahy
Has thanked: 44 times
Been thanked: 380 times
Citace:
"pokut nebil soubor ke zpracování" to jako fakt né :lol:

Ale on soubor ke zpracování opravdu pokuty nemlátil.


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 10:31 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Panda38 píše:
Bez GOTO se opravdu dá obejít a nemusí být potřeba nikdy
Suhlasim, uz som toho za tych par desiatok rokov v paskale a cecku naprogramoval spustu (vratane obrovskych komercnych projektov na stovky clovekorokov) a ani jedno jedine GOTO som nemusel nikdy pouzit. Na akykolvel algoritmus som si vzdy dokazal vystacit so standartnymi strukturovanymi prostriedkami daneho jazyka - switch for while until break continue.
Panda38 píše:
A i překladači způsobuje problémy, protože v místě cílové adresy nemůže optimalizovat tok pořadí instrukcí, tak to zpomalí program i když se GOTO nepoužije.
A hlavne (co mi najviac vadi), este ziadny (mne znamy) prekladac sa nedokazal vyrovnat s tym ked chcem pomocou GOTO skakat medzi procedurami / funkciami. Chapem preco je to tak (lebo stack frame a pod.), akurat ze tento nedostatok robi GOTO pre mna vo vecsine pripadov absolutne nepouzitelnym :(
dex píše:
Citace:
"pokut nebil soubor ke zpracování" to jako fakt né :lol:
Ale on soubor ke zpracování opravdu pokuty nemlátil.
;) :) :D :lol:


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 11:30 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1554
Has thanked: 485 times
Been thanked: 634 times
Busy píše:
switch for while until break continue.
Tybrďo, nebýt tam to continue, tak je to prakticky bez problému smysluplná věta :-D

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 13:08 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Tak moment, reagujete na
EC1045.01 píše:
GOTO či jiného cukříku.
a dulezite je ten cukrik. Ze ho nevnimate neznamena, ze jste ho nemeli. Jsou programy kde staci strukturovane programovani a programy, kde by to s GOTO bylo jednodusi, protoze jazyk neobsahuje jiny skryty zpusob jak GOTO (beru to ve smyslu skoku) neprimo udelat.

Mate vnorene cykly a ve vnitrnim zjistite ze jste uspesne neco dokoncili, treba nalezli reseni. Nevyskocite pokud to cele nedate do funkce a nepouzijete return, ale obaleni to funkci je uz rezije navic. Break vykakuje jen z nejvnitrnejsi smycky, break s parametrem kolik smycek opustit neexistuje. Jak to teda prekladaci reknete ze chcete udelat GOTO. Budete do kazde smycky pridavat jeste navic podminku. To je taky cukrik.

Vsechny programy jdou napsat bez GOTO (myslim teda Pascal a C ne Basic), ale nekdy to muze byt s GOTO efektivnejsi a i prehlednejsi. Kernel by nepouzival GOTO kdyby to pri osetreni chyb nebylo citelnejsi a efektivnejsi. Flame on. :)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 14:06 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1554
Has thanked: 485 times
Been thanked: 634 times
_dworkin píše:
Mate vnorene cykly a ve vnitrnim zjistite ze jste uspesne neco dokoncili, treba nalezli reseni. Nevyskocite pokud to cele nedate do funkce a nepouzijete return, ale obaleni to funkci je uz rezije navic. Break vykakuje jen z nejvnitrnejsi smycky, break s parametrem kolik smycek opustit neexistuje. Jak to teda prekladaci reknete ze chcete udelat GOTO. Budete do kazde smycky pridavat jeste navic podminku. To je taky cukrik.
Ano, přesně na tohle jsem narážel s "jedním dobře mířeným goto". Netřeba ani vnořený cyklus - bohatě postačuje kombinace for-switch (kde sice zabere continue, ale nezabere break). Já třeba goto s oblibou používám v rozsáhlejších WinAPI okenních procedurách, kdy si nevystačím s propadnutím do dalšího case (tři, čtyři zprávy mají končit stejně [typicky uživatelský vstup] - mohl bych si napsat společnou proceduru, jenže jak ji v rychlosti pojmenovat, do jakého shluku dalších procedur ji šoupnout, aby všechno bylo tak nějak "pohromadě",... jedním goto se problémy vyřeší tak nějak samy) :-)

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 20:39 
Offline
Profík

Registrován: 15.01.2014, 20:08
Příspěvky: 782
Bydliště: Šlapanice
Has thanked: 129 times
Been thanked: 97 times
tomascz píše:

A aspoň si to po sobě příště přečti - "pokut nebil soubor ke zpracování" to jako fakt né :lol:


Z mého pohledu tam jsou všechny písmenka, diakritická znaménka a věta dává smysl. Jo to bít a být je pod mou rozlišovací schopností. Ten kousek klidně smolím i dvě hodiny a při tom šílím z automatických oprav MS WORD. A WORD všechno neodchytí.

tomascz píše:
Kód:
var fSoubor1 = fopen{...);
if (fSoubor1 otevřen pro čtení ok){
    var sou,poc,poz;
    while (  freadf( fSoubor1, "definice tvého formátu", &sou, &poc, &poz ) == 3  ){
        if ( je splněna podmínka týkající se sou, poc a poz )(
            // vlastní zpracování aktuálního řádku
            // jak se na to koukám tak by se to fakt dalo napsat mnohem líp
        }
    fclose(fSoubor1); // uzavření souboru
    var blok1 = 0;
    // něco bliju (a iterátorem v cyklu je zřejmě blok1) :puke:
    var fSoubor2 = fopen(...);
    if (fSoubor2 otevřen pro čtení ok){ // tohle zřejmě nemáš ve svém kódu ošetřeno
        var y;
        while (  freadf( fSoubor2, "definice tvého formátu", &y ) == 1  )
            if ( je splněna podmínka týkající se y )(
                // vlastní zpracování řádku
            }
        fclose(fSoubor2); // uzavření souboru
    }
    // něco bliju dále :puke:
}



No jo pokut jde mít vnořené příkazy tj. podmínka v příkazu muže být příkaz tak to se dají dělat kouzla. Ve FORTRANu 77 je nově zaveden DO WHILE (podmínka) jenže v podmínce platí stejná pravidla jak pro IF takže jen proměnné a konstanty. I pokut by parametr ERR=návěští byl ERR=proměnná (vracelo by se např. TRUE a FALSE) tak to by moc ničemu nepomohlo.

Panda38 píše:
Bez GOTO se opravdu dá obejít a nemusí být potřeba nikdy - místo toho používat podmínky, stavové flagy, funkce. Nebo v cyklu continue. GOTO je spíš projevem chybné konstrukce strukturovaného programu. Má velkou nectnost - je nejednoznačné v jakém stavu bude zásobník proměnných. A i překladači způsobuje problémy, protože v místě cílové adresy nemůže optimalizovat tok pořadí instrukcí, tak to zpomalí program i když se GOTO nepoužije.
.

No přemýšlel jsem, celí den zda by se dalo nějaké to GOTO z FORTRANu 77 odstranit a došel k závěru, že jen v některých vyjmečných případech a to jen za cenu (velkého) zkomplikování algoritmu a tím pádem k znepřehlednění.

Pokut jde o ty cukříky tak mezi ně patří i různé CYCLE, EXIT, BREAK aneb je to trochu komplikovanější GOTO.

Pro zajímavost jak by vypadal tento podprogram v něčem kde GOTO je spíše relikt než nutnost.
Trochu úvod do toho co to má dělat a proč to je zrovna tak jak to je. FORTRAN 77 ve kterém to je napsané v základu překládá pro 8086/87 nebo s parametrem pro 80286/80287 s dalším parametrem doplní knihovnu co nahradí fyzický matematický koprocesor. Takže do paměti se nevleze moc dat tak se to řeší přes soubory. Daný podprogram spojuje soubory podle šablony aneb DSD a současně název šablony je i název výstupního DSS, těch šablon je vícero a obsahuji seznam datových souborů součástek aneb DSS. Hlavní program po seznamu šablon ještě přidává *VSE* kdy se pak provedou všechny šablony. Pokut se v šabloně narazí na řádek složen ze samých pomlček tak následnicí DSS se budou odečítat.

V kanále 2 je výstupní soubor, ze kterého se bere popis a zobrazí se na Console. V kanále 1 je šablona, v kanále 3 je vstupní soubor. Kanály U1 a U2 jsou pomocné pracovní sobory a hvězdička je vstup/výstup na Consoli.

První DSS se rovnou překopíruje do pomocného souboru na kanále U1, další DSS na kanále 3 se porovná s daty na kanále U1, pokut se objeví dva shodné řádky tak se sloučí a výsledek se uloží na kanál U2, jinak ve kterém kanále (3 nebo U1) jsou „menší“ data tak s toho kanálu se uloží data na kanál U2. Pokut se narazí na konec v některém z kanálů 3 nebo U1 tak se zbytek druhého kanálu do kopíruje do kanálu U2. Jakmile jsou oba sobory na koci tak se prohodí čísla pomocných kanálu U1 a U2 a celá mašinerie muže začít nanovo. Pokut se v šabloně narazí na konec tak se zbyteček prohodí čísla pomocných kanálu U1 a U2 obsah z kanálu U2 překopíruje do výstupního soboru na kanálu 2 to zbytečné prohození je asi pohrobek nějaké předchozí verze nebo mi nedocvakli nějaké souvislosti, aneb stačilo to překopírovat z kanálu U1.

To „27,‘[něco‘“ tj. „ESC,‘[něco‘“ je ovládaní kurzoru a barev pomoci ovladače ANSI.SYS, IFBRK je dodělaná funkce na čtení klávesnice, u proměnné TYP se počet položek dědí z hlavního programu proto ta hvězdička v deklaraci, S je čilo šablony, ne VER je "číslo" verze programu a v CO je co se zrovna provádí v tomto případe tam bude SPOJ. IF si neporadí s polem textových proměnných tak je to potřeba překopírován do pomocné proměnné, v daném případě TY.

Kód:
C ***************************** SPOJ ***********************************

      subroutine spoj(typ,s,ver,co)
      integer*2 i,l,k,s,p,u,u1,u2,poc,poc1,j,pocet
      character typ*20(*),ver*15,co*10,ty*20,poznamka*20,nic*50
      character sou*20,poz*20,sou1*20,poz1*20
      ty=typ(s)
      if (ty.eq.'*VSE*') then
         k=1
         l=s-1
      else
         k=s
         l=s
      end if
      do i=k,l
         u1=10
         u2=11
         open(unit=u1)
         open(unit=u2)
         write(*,'(1x,2(a1,a))')27,'[2J',27,'[0m'
         write(*,'(1x,a)')ver
         write(*,'(1x,2(a1,a),a,(a1,a))')
     #    27,'[3;36H',27,'[1;37m','PROGRAM E',27,'[0m'
         write(*,'(/,36x,a)')co
         ty=typ(i)
         write(*,'(1x,a1,a,i2.2,2a)')
     #           27,'[6;',(80-len_trim(ty)+2)/2,'H',ty
         ty=typ(i)
         ty=ty(1:len_trim(ty))//'.dss'
c        CLOSE (unit=1)
         OPEN (unit=2,file=ty,status='OLD',err=100)
         read(2,'(a)')poznamka
         write(*,'(1x,a1,a,i2.2,2a,a1,a,//)')
     #     27,'[7;',(80-len_trim(poznamka)+2)/2,'H',poznamka,27,'[0m'
         read(2,'(a)')nic
         ty=typ(i)
         ty=ty(1:len_trim(ty))//'.dsd'
         p=0
         j=0
         OPEN (unit=1,file=ty,status='OLD',err=100)
1        read(1,'(a)',err=100)ty
         if (ty.eq.'--------------------')then
           p=1
           goto 1
         end if
         ty=ty(1:len_trim(ty))//'.dss'
         write(*,'(2x,a,\)')ty
         rewind u1
         rewind u2
         OPEN (unit=3,file=ty,status='OLD',err=100)
         read(3,'(a)')nic
         read(3,'(a)')nic
         if (j.eq.0)then
2          read(3,'(a,2x,i4,2x,a)',err=1)sou,poc,poz
           write(u1,'(a,2x,i4,2x,a)')sou,poc,poz
           j=1
           goto 2
         end if
         read(3,'(a,2x,i4,2x,a)',err=101)sou,poc,poz
         if (p.eq.1)poc=-poc
         read(u1,'(a,2x,i4,2x,a)',err=102)sou1,poc1,poz1
3        if (sou.eq.sou1.and.poz.eq.poz1)then
            poc=poc+poc1
            write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
            read(3,'(a,2x,i4,2x,a)',err=111)sou,poc,poz
            if (p.eq.1)poc=-poc
            read(u1,'(a,2x,i4,2x,a)',err=112)sou1,poc1,poz1
         else if (sou.eq.sou1.and.poz.lt.poz1)then
            write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
            read(3,'(a,2x,i4,2x,a)',err=102)sou,poc,poz
            if (p.eq.1)poc=-poc
         else if (sou.lt.sou1)then
            write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
            read(3,'(a,2x,i4,2x,a)',err=101)sou,poc,poz
            if (p.eq.1)poc=-poc
         else
            write(u2,'(a,2x,i4,2x,a)')sou1,poc1,poz1
            read(u1,'(a,2x,i4,2x,a)',err=102)sou1,poc1,poz1
         end if
         goto 3
101      write(u2,'(a,2x,i4,2x,a)')sou1,poc1,poz1
111      read(u1,'(a,2x,i4,2x,a)',err=103)sou1,poc1,poz1
         write(u2,'(a,2x,i4,2x,a)')sou1,poc1,poz1
         goto 111
102      write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
112      read(3,'(a,2x,i4,2x,a)',err=103)sou,poc,poz
         write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
         goto 112
103      u=u1
         u1=u2
         u2=u
         goto 1
100      rewind 2
         write(2,'(a)')poznamka
         write(2,'(a,12x,a)')'soucastka','pocet'
         s=0
         pocet=0
         u=u1
         u1=u2
         u2=u
         rewind u2
4        read(u2,'(a,2x,i4,2x,a)',err=104)sou,poc,poz
         write(2,'(a,2x,i4,2x,a)')sou,poc,poz
         s=s+poc
         pocet=pocet+1
         goto 4
104      write(*,'(1x,2(a1,a),a,17x,i4,1x,i6)')
     #     27,'[21;10H',27,'[37;1m','Secteno: ',pocet,s
         CLOSE (unit=1)
         CLOSE (unit=2)
         CLOSE (unit=3)
         CLOSE (unit=u1)
         CLOSE (unit=u2)
      end do
      write(*,'(1x,a1,a,4(a1,2a),\)')
     # 27,'[25;62H',27,'[1;31m','N',27,'[0m','navrat ',
     # 27,'[1;31m','K',27,'[0m','onec '
5     k=0
      do while (k.eq.0)
         k=ifbrk()
      end do
      if (k.eq.107.or.k.eq.75) then
         write(*,'(1x,a1,a)')27,'[0m'
         stop'KONEC programu E'
      else if (k.eq.78.or.k.eq.110) then
         return
      end if
      goto 5
      end

_________________
Ne všichni jsme měli z češtiny za jedna, aneb jsem dyslektik a dysgrafik.

http://www.sapi.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 21:20 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1100
Has thanked: 100 times
Been thanked: 157 times
Kód:
1        read(1,'(a)',err=100)ty
         if (ty.eq.'--------------------')then
           p=1
           goto 1
         end if
V cecku bych to psal nejak takto... jen by ta EXIt cast byla na citelneji jednom radku, takze by ani zapis nebyl delsi.
Kód:
DO     
   read(1,'(a)',err=100)ty
   if (ty.ne.'--------------------') THEN
      EXIT
   ENDIF
   p=1
END DO

Tohle je nekonecna smycka?
Kód:
2          read(3,'(a,2x,i4,2x,a)',err=1)sou,poc,poz
           write(u1,'(a,2x,i4,2x,a)')sou,poc,poz
           j=1
           goto 2

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
PříspěvekNapsal: 15.05.2020, 21:55 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1554
Has thanked: 485 times
Been thanked: 634 times
EC1045.01 píše:
tomascz píše:

A aspoň si to po sobě příště přečti - "pokut nebil soubor ke zpracování" to jako fakt né :lol:


Z mého pohledu tam jsou všechny písmenka, diakritická znaménka a věta dává smysl. Jo to bít a být je pod mou rozlišovací schopností. Ten kousek klidně smolím i dvě hodiny a při tom šílím z automatických oprav MS WORD. A WORD všechno neodchytí.

Sorry za poznámku, teď jsem všimnul tvého statusu tady fóru :-(

EC1045.01 píše:
No jo pokut jde mít vnořené příkazy tj. podmínka v příkazu muže být příkaz tak to se dají dělat kouzla. Ve FORTRANu 77 je nově zaveden DO WHILE (podmínka) jenže v podmínce platí stejná pravidla jak pro IF takže jen proměnné a konstanty. I pokut by parametr ERR=návěští byl ERR=proměnná (vracelo by se např. TRUE a FALSE) tak to by moc ničemu nepomohlo.

Ok, upřímně netuším co všechno Fortran 66, resp. Fortran 77, vlastně dokážou (Btw, existuje taky Fortran 88 nebo Fortran 99? Zdá se že měli tendenci se trefovat do "hezkých" letopočtů :-)) Ta jeho krypto-syntaxe je poměrně děsivá, takže pro člověka, kterej se narodil "po" Fortranu 77 je to poměrně divoký ten program dešifrovat :-)

Smyslem týhle off-topic diskuze asi nebylo tě zdrcat za to, na co jsi zvyklej - spíš jenom přesvědčit o výhodách trochu pozdějších jazyků, hlavně co se přehlednosti (a údržby) jejich kódu týče.

Abych se za sebe tedy vrátil k původnímu topicu - někdy možná ve čtvrtý nebo pátý třídě (1992/93) jsem si přepisoval a následně na BT-100 tisknul algoritmy na kresbu zajímavých (dnes bych ještě dodal "vektorových") obrázků v Basicu pro ZX Spectrum. Osud tomu chtěl, abych si je schoval, takže sdílím (papíry jsou už odpovídajícím způsobem zežloutlé). Našel jsem i známou Počítačovou motlitbu, přepisovanou tehdy do Poster Makeru. Btw donedávna na dveřích naší bytovky visela cedule "ZAVÍRAT" tisknutá taky na BT-100 možná někdy kolem roku 1994 a "vyšperkovaná" grafickými rámečky dodávanými jako součást Poster Makeru. Měnily se dveře a já u toho bohužel nebyl, takže ceduli jsem si nemohl schovat "na památku" :-( Aspoň teda ta vektorová grafika. Plus asi dvacet dalších papírů s dobovými programy poplatnými mému věku :-D Někdy třeba oskenuju a nasdílím až bude čas :-)

Btw, "buď vůle tvích příkazů" !! Njn... :lol:


Obrázek

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
PříspěvekNapsal: 16.05.2020, 03:02 
Offline
Profík

Registrován: 15.01.2014, 20:08
Příspěvky: 782
Bydliště: Šlapanice
Has thanked: 129 times
Been thanked: 97 times
_dworkin píše:
Tohle je nekonecna smycka?
Kód:
2          read(3,'(a,2x,i4,2x,a)',err=1)sou,poc,poz
           write(u1,'(a,2x,i4,2x,a)')sou,poc,poz
           j=1
           goto 2


Ne při chybě při čtení to skočí na navěstí 1. Chybou v toto případě je to že narazí na konec souboru, ze kterého se čte, aneb to je to ERR=navěstí obdobně v příkazech OPEN pokut se nepovede otevřít soubor se zadanými parametry. Jinak těch „nekonečných“ smyček je tam více.


tomascz píše:
EC1045.01 píše:
tomascz píše:

A aspoň si to po sobě příště přečti - "pokut nebil soubor ke zpracování" to jako fakt né :lol:


Z mého pohledu tam jsou všechny písmenka, diakritická znaménka a věta dává smysl. Jo to bít a být je pod mou rozlišovací schopností. Ten kousek klidně smolím i dvě hodiny a při tom šílím z automatických oprav MS WORD. A WORD všechno neodchytí.

Sorry za poznámku, teď jsem všimnul tvého statusu tady fóru :-(


Jo ten status jsem tam doplnil až teď abych měl klid. :oops:


Jo také jsem po letech chvíli koukal, co jsem tím chtěl říct ta „šílenost“ je někdy z přelomu tisíciletí ale počátky budou o několik let dříve. V letech 1999/2000 jsem bil na vojně, takže jsme cca sejně staří a ten FORTRAN jsem pochytl od otce. Jinak je to z programu na evidenci součástek co jsem si psal a pomoci těch ESC sekvencí tam mám udělané i vkládaní dat kdy se text roluje cca u prostřed obrazovky v rozsahu 10 řádku a je to ještě pěkně barevné, to vkladaní dat bylo původně cca 3x delší než mi došlo, že se to dá cele napsat efektivněji. Jinak v podobném duchu jsou tam řešeny opravy dat a prohlížení a hledání.

Syntaxe FORTRANu 77 je ješte svázaná s děrnýmy štítky takže pokut je první znak „C“ je celí řádek komentář. Pozice 1 až 5 je pro návěští, na pozici 6 „cokoli“ kromě mezery říká, že jde o pokračování předchozího řádku. Pro zápis programu je pozice 7 až 72. V pozicích 7 až 72 se komentář píše za vykřičník, od 73 do 80 pozice je určeno pro čísla řádků programu, používalo se to na děrných štítcích ale to číslování řádků je nepovinné, aneb překladač je ignoruje. To číslování bylo kvůli tomu, aby možno sestavit program nazpět pokut by někdo vysypal krabici štítků s vyděrovaným programem. Ten pevný formát „ruší“ Fotran 90?, FORTRAN 80 je trochu osekaný (nemá datový typ COMPLEX a mám pocit i DUBLE PRECISION) FORTRAN 66 pro CP/M. jinak je ještě FORTRAN IV, FORTRAN II, FORTRAN M minimálně pod CP/M což je „NEWADA“ FORTRAN aneb minimalistická vrze. Pak jsou tu moderní verze Fortranu počínaje Fotran 90?, Fortran 2009? , …
FORTRAN 77 je první FORTRAN co umí pracovat s textem. Pokut se nepletu tak specifikace FORTRANu 77 vyšla v roce 1978.

ty=ty(1:len_trim(ty))//'.dss', toto provede připojení přípony „.dss“ k „ty“ kdy funkce „len_trim(x)“ vratí délku textu aneb poslední nemezerový znak řetězce „x“ u textového řetězce jde určit která část se má použít a to je (počáteční pozice : koncová pozice) v daném případe je to první a ta co vrátí funkce „len_trim(x)“. ty dvě „//“ říkají že se má dojit ke spojení.
U READ i WRITE je to stejné, v závorkách (vnějších) je odkut/kam a „formát“, za závorkami je seznam proměnách či prostý text. Ten formát jde zapsat dveřmi způsoby a to bud jako návěští kdy pak někde v programu potřeba napsat příkaz „format“ s konkrétním návěštím kdy je v závorkách onen seznam nebo místo návěští se ten formát uzavře do apostrofu. Aneb toto
Kód:
       write(*,'(1x,a1,a,i2.2,2a,a1,a,//)')27,'[7;',(80-len_trim(poznamka)+2)/2,'H',poznamka,27,'[0m'

provede úplně to samé co toto
Kód:
       write(*,123)27,'[7;',(80-len_trim(poznamka)+2)/2,'H',poznamka,27,'[0m'
123    format(1x,a1,a,i2.2,2a,a1,a,//)

Jen s tím rozdílem že ten formát jde použit pro vícero příkazu.

Co ten formát říká „1x“ je kolik bude mezer v daném případě jedna, „a1“ že bude „text“ ale ten se má zobrazit jako jeden znak v daném případě se 27 vezme jako ESC (1B HEX). „a“ bude text, „i2.2“ bude číslo typu integer a zobrazí se na dvě platné číslice a to pouze do dvou pozic tj. pouze kladná čísla. A ty lomítka způsobí, že se bude pokračovat s dalším výpisem o dva řady níže, být tam opačné lomítko tak se kurzor zůstane za posledním výpisem (stejné se středníkem v BASICu). Pak tam jde dělat násobnosti tj. „a,a,a“ jde zapsat „3a“ nebo „a,f6.3,a,f6.3“ jede zapsat jako „2(a,f6.3)“

Podmínky při IF nebo DO WHILE:
.LT. menší než
.LE. . menší než nebo rovno
.EQ. rovno
.NE. nerovno
.GT. větší než
.GE. větší než nebo rovno
A logické
.NOT. .AND. .OR. XOR. .EQV. .NEQV. a ještě .TRUE. .FALSE.

A ještě kousek výtvoru ve FORTRAN 77
Kód:
C ******************************** Vkladani dat ************************

      if (co.eq.' Vkladat') then
      nula=0
      write(*,'(1x,a1,2a,6x,a,7x,a,8x,a)')27,'[8;12H','PORADI',
     # ' SOUCASTKA','POCET','POZNAMKA'
      kolik=1
      radek=9
11    radek=radek+1
      if (kolik.gt.9) then
         radek=10
         do i=pocet-8,pocet
            write(*,'(1x,a1,a,i2.2,a,a1,a,i3,2(a1,a),a,a1,a,i4,a1,2a)')
     #     27,'[',radek,';15H',27,'[30;41m',i,27,'[2C',27,'[30;42m',
     #     sou(i),27,'[2C',poc(i),27,'[2C',poz(i)
            radek=radek+1
         end do
      end if
      pocet=pocet+1
      if (pocet.eq.1000)then
         write(*,'(1x,a1,a,i2.2,a,a1,2a,\)')27,'[',radek,';17H',
     #    27,'[31;40m','PREKROCEN MAXIMALNI POCET DAT neco zmackni'
         k=0
         do while (k.eq.0)
            k=ifbrk()
         end do
         goto 10
      end if
      kolik=kolik+1
      write(*,'(1x,a1,a,i2.2,a,a1,a,i3,a1,a,20x,a1,a,i4,a1,a,20x,
     # 3(a1,a),\)')27,'[',radek,';15H',27,'[30;41m',pocet,27,'[2C',
     # 27,'[2C',nula,27,'[2C',27,'[48D',27,'[30;42m',27,'[s'
      read(*,'(a)') sou(pocet)
      call velpis(sou(pocet))
      if(sou(pocet).eq.'KONEC')then
            goto 10
      end if
      poz1='                    '
      mez='                    '
      if(novy.eq.0)then
         rewind 2
         read(2,'(a)')nic
         read(2,'(a)')nic
128     read(2,'(a,2x,i4,2x,a)',err=127)souc1,pocet1,poz1
         if(souc1.eq.sou(pocet))then
            poz2=poz1(1:19)//'* '
            goto 127
         else
            poz1='                    '
            poz2='                    '
         end if
         goto 128
      end if
127   write(*,'(1x,a1,2a,2(a1,a),\)')
     #  27,'[u',sou(pocet),27,'[2C',27,'[s'
      read(*,*)poc(pocet)
      write(*,'(1x,a1,a,i4,2(a1,a),\)')
     #  27,'[u',poc(pocet),27,'[2C',27,'[s'
      write(*,'(1x,2(a1,a),i2.2,2a,2(a1,a),i2.2,a,\)')
     # 27,'[30;41m',27,'[',radek,';48H',poz2,27,'[30;42m',
     # 27,'[',radek,';48H'
      read(*,'(a)')poz(pocet)
      if(poz(pocet).eq.mez)poz(pocet)=poz1
      call malpis(poz(pocet))
      write(*,'(1x,a1,2a)')27,'[u',poz(pocet)
      goto 11
10    write(*,'(1x,a1,a)')27,'[0m'
      pocet=pocet-1
      call setrit (sou,poc,poz,pocet)
      goto 15

_________________
Ne všichni jsme měli z češtiny za jedna, aneb jsem dyslektik a dysgrafik.

http://www.sapi.cz/


Nahoru
 Profil  
 
PříspěvekNapsal: 16.05.2020, 09:07 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
EC1045.01 píše:
...Jo ten status jsem tam doplnil až teď abych měl klid. :oops: ...
To je dobře že jsi to doplnil, je rozdíl zda je člověk jen nedbalý (=potřebuje kritiku aby se zlepšil) nebo zda to opravdu neumí.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 16.05.2020, 15:46 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
A odkud vlastne byly ty obrazky z prvního prispevku? Také z nejakeho casopisu? Nebo knihy? Nebo je puvod zcela neznamy?

Nejake ty 3d grafy jsem tenkrat na 8 bitech videl, ale tyhle carove obrazky ne, a vypada to zajimave. A přitom takovy skoro jednoduchy způsob generovani.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 100 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6, 7  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 5 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz