1 / 93

1. Programtervezés

1. Programtervezés. Mit értünk programtervezésen?. A leendő program szerkezetének megalko-tása A program elemeinek megfelelő sorrendben való összerakása A szerkezetnek több szintje lehet átfogó szerk.: függvények, eljárások, alprogramok

luna
Download Presentation

1. Programtervezés

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 1. Programtervezés

  2. Mit értünk programtervezésen? • A leendő program szerkezetének megalko-tása • A program elemeinek megfelelő sorrendben való összerakása • A szerkezetnek több szintje lehet • átfogó szerk.: függvények, eljárások, alprogramok • finomszerkezet: változók, műveletek (utasítás-sorok, ciklusok, döntési szerkezetek) • Elkülönül a kódírástól (kódolástól)

  3. A programozás főbb lépései • A probléma meghatározása, felmérése (specifikáció) • A megvalósítás (implementáció) • tervezés • kódolás • tesztelés • dokumentálás

  4. Mi indokolja a tervezés szükségességét? • Megbízhatóság • Ha egy programot megfelelően terveztünk meg, akkor elvileg megfelelően kell működnie • Költségek • A jó terv lecsökkenti az idő-, és ezáltal költségigé-nyes, tesztelései fázist • Karbantartás • A jól megtervezett programot egyszerűbb módosítani

  5. 1.0. Strukturált programozás

  6. A strukturált programozás jelenti valamennyi ma használatos programtervezési módszer alapját • Széles körben elfogadott az a nézet, hogy a strukturált programozás a programfejlesztés egyetlen lehetséges módja • Alapelve: a programok összesen háromféle építőelemből állnak össze (Dijkstra): • szekvenciák (utasítássorok) • döntési szerkezetek (elágazások v. szelekciók) • iterációk (ismétlődő részek v. ciklusok) • A goto utasítás használata kerülendő • A strukturált programozás gyakran a felülről lefelé történő elvonatkoztatást, tervezést is jelenti • Több szint, egymásba ágyazás. • Absztrakció • Lokális adatok

  7. Szabvány (Federal Standard 1037C) • structured programming: A technique for organizing and coding computer programs in which a hierarchy of modules is used, each having a single entry and a single exit point, and in which control is passed downward through the structure without unconditional branches to higher levels of the structure. Three types of control flow are used: sequential, test, and iteration.

  8. Építőelemek • Minden építőelemnek csak egy belépési, illetve kilépési pontja van • egy sem tartalmaz háromnál több alapelemet • a belépési pont az algoritmuselemek elején, a kilépési pont a végén található

  9. Strukturált programozási nyelvek • Az 1970-es évektől, amikor a strukturált programozás népszerű technikává vált, olyan új programozási nyelvek születtek, melyek támogatták, hangsúlyozták a módszer alkalmazását. • A legismertebbek ezek közül: Pascal, Ada

  10. Strukturált programozás vs.goto • Bohm, Jacopini: a goto utasítás segítségével megírt bármely program megírható pusztán a strukturált programozás alapelemeinek használatával is • A strukturált programozás, mint módszer általánosan elfogadott, de nincs vizsgálat, bizonyíték arra, hogy hatékonyabb, jobb • A program karbantarthatóságát vizsgáló kísérletek a strukturált programozás melletti eredménnyel zárultak • Vessey, Weber: „a strukturál programozás használ-hatóságát alátámasztó érvek meglehetősen gyengék” (megbízható kísérletek hiánya)

  11. További érvek a goto mellőzésére ......while a > 0 do......endwhile... Világos írásmód és kifejezőerő ... ... címke: ... ... if a > 0 goto címke ... A bal oldali kódot felülről lefelé olvasva nem világos, hogy mi a címke szerepe, sőt több goto utasítás is ugorhat ugyanezen címkére. A goto több, egymástól lényegesen különböző cél megvalósítására is használható (elágazás, ciklus, ciklusból való kilépés, eljáráshívás), ezért kicsi a kifejezőereje. Világosabb kódot kapunk, ha a megfelelő egyedi nyelvi elemet használ-juk. Könnyebb a programok helyességének bizonyítása (minden program-elemnek csak egy belépési, ill. kilépési pontja van).

  12. Érvek a goto használata mellett • A goto is része a programozási nyelvek eszközkészletének, ha megtiltjuk a használatát, a programozó elől elvesszük a lehetőséget, hogy értelmesen felhasználja. • Hibakezelés (a programegység belsejéből egy hibakezelő rutinra ugorhatunk, így az egységnek több kilépési pontja lesz). • Növelhető a teljesítmény • Néha kifejezetten természetes a goto használata • (Donald Knuth: lazább megkötés a strukturált programozásra)

  13. A vitaindító cikk: • Dijkstra, E.W.: Go to statement considered harmfulCommunications of the ACM, Vol. 11, No. 3, 1968 • Az első tankönyv: • Dahl, Dijkstra, Hoare: Structured Programming, 1972 • A hatékonyság vizsgálata: • Schneiderman: Software Psychology: Human Factors in Computer and Information Systems, 1980 • Vessey, Weber: Research on Structured Programming: an empiricist’s evaluation, 1984

  14. 1.1. A feladat funkcionális felbontása

  15. Műveletek - fokozatos finomítás • Ez a tervezési módszer a megírandó program által végrehajtott műveletekre összpontosít. • Első lépés: a megtervezni kívánt program feladatának megfogalma-zása • Majd egyszerűen (magyarul) leírjuk azt a műveletsort, amit a programnak végre kell majd hajtania • Ezután a műveleteket fokozatosan finomítjuk, míg el nem érjük a kellő részletezettséget • Ez általában akkor következik be, amikor a műveletek már a használni kívánt programnyelv elemeivel is leírhatók • A műveletsor egyes lépéseit tekinthetjük egy-egy eljárásnak, az elemi lépéseket pedig utasításoknak.

  16. Példa - kávéfőző robot • A feladat első leírása csinálj egy csésze kávét • Leírás egyszerűbb műveletekkel forralj vizetvegyél elő egy csészéttegyél kávét a csészébeönts rá vizetadj hozzá tejetadj hozzá cukrot ízlés szerint • A fenti lista minden egyes eleméről pontosabban leírjuk, hogy mit is jelent • A finomítást a kellő részletezettségig elvégezzük

  17. Álkód (pszeudokód) • Azt a nyelvet, amit a probléma leírására használunk álkódnak (pszeudokódnak) vagy programtervezési nyelvnek (Program Design Language, PDL) hívjuk. • A végeredmény értelmes magyar mondatok sorozata, melyek valamennyien egy-egy igével kezdődnek • Tartalmazhat valódi programozásból átvett szerkezeteket is (pl if…then…else… vagy while)

  18. Például a „forralj vizet” eljárás felbontása elemibb utasításokra gyújts be a teáskanna aláwhile a víz nem forr do fütyöréssz egy dallamotendwhilekapcsold le a fűtést a kanna alatt • Az „adj hozzá cukrot ízlés szerint” eljárás részletezése például a következő lehet if kell bele cukor then tegyél cukrot a csészébe keverd megendif

  19. Példa - videojáték • Pattogó labdát ütögetve egy falat kell lebontanunk (ld. mellékelt program) • A képernyőt egy tömbön keresztül kezeljükke: array[1..50,1..80,1..2]of char • A labda koordinátáit az xlabda és ylabda tárolja.

  20. Általános logikai leírás videojáték rajzold meg az oldalfalakat rajzold meg az ütőt a kezdőpozícióbanwhile akar valaki játszani do rajzold meg a falat játszd a játékot jelenítsd meg a legjobb eredménytendwhile A konkrét részleteket itt még általános utasítások fedik el, mely lehetővé teszi, hogy tanulmányozzuk, módosítsuk a tervet anélkül, hogy az apróbb részletekkel kellene törődnünk. Például észrevesszük, hogy hiányzik még a legjobb eredmény kezelése

  21. videojáték rajzold meg az oldalfalakat rajzold meg az ütőt a kezdőpozícióban legjobb eredmény := 0while akar valaki játszani do eredmény := 0 rajzold meg a falat játszd a játékotif eredmény > legjobb eredmény then legjobb eredmény := eredményendif jelenítsd meg a legjobb eredménytendwhile

  22. Ha az eredmény ezen a szinten már kielégítő, nekiállhatunk az egyes lépések részletesebb kidolgozásának • Vegyük a „játszd a játékot” eljárást: játszd a játékotmaradék labdák := 4while maradék labdák > 0 do játssz a labdával csökkentsd eggyel a maradék labdák számátendwhile • Megjelent egy újabb eljárás („játssz a labdával”), melyet illik részletesebben is leírni

  23. játssz a labdávalrajzolj egy új labdátwhile a labda játékban van do vizsgáld meg a labda helyzetét mozgasd a labdát mozgasd az ütőtendwhiletöröld a labdát a képernyőről • Készítsük még el a ciklus három eljárásá-nak részletezését

  24. vizsgáld meg a labda helyzetétellenőrizd, hogy játékban van-e még a labda ellenőrizd, hogy eltalálta-e a határfalak valamelyikét ellenőrizd, hogy eltalálta-e az ütőt ellenőrizd, hogy nekiütközött-e egy téglának ellenőrizd, hogy eltalálta-e az határfalak valamelyikétif a labda bármelyik oldafalnál van then XLépés := - XLépésendifif a labda a felső határon van then YLépés := - YLépésendif ellenőrizd, hogy nekiütközött-e egy téglánakif ke[YLabda+YLépés, XLabda+XLépés] egy tégla helye then ke[YLabda+YLépés, XLabda+XLépés] := üres növeld az eredményt eggyel YLépés := -YLépés vonj le egyet a maradék téglák számábólif maradék téglák száma = 0 then rajzolj falat endifendif

  25. mozgasd a labdáttöröld a labdát a régi helyénXLabda := XLabda + XLépésYLabda := YLabda + YLépéske[YLabda, XLabda, 1] := "o„ mozgasd az ütőtif billentyű = "q" then mozdulj balra endifif billentyű = "w" then mozdulj jobbra endif mozdulj balratöröld az ütőtif ütő helyzete > bal oldali fal + 1 then ütő helyzete := ütő helyzete – 1endifrajzold meg az ütőt

  26. A módszer elemzése, értékelése • Ahhoz, hogy a tervezés bármely szintjén megértsük a rendszer működését, nem kell pontosan ismernünk az alacsonyabb szintek működését. • Tudnunk kell, hogy az alacsonyabb szintek mit csinálnak, de azt nem, hogy hogyan. • Két út: • szintről-szintre történő finomítás (breadth first) • egy ágnak a lehető legnagyobb részletességgel való kifejtése (depth first) • A pszeudokód minden részletét a strukturált programozás szabályainak betartásával írunk le. • A módszer erős akaratot igényel.

  27. Az adatok csak a másodhegedűs szerepét játsszák • Rugalmasság: több terv is alkotható egy problémára • A funkcionális felbontás módszerének Dijkstra és Wirth nevéhez fűződik • Az 1960-as években a strukturált programo-zással párhuzamosan fejlődött • Felülről lefelé építkező tervezési módszer • Gyakran nevezik lépésenkénti finomításnak is • Nem vált kereskedelmi termékké, az egyete-meken született, kevésbé kidolgozott, mint más eljárások

  28. A funkcionális felbontás mint tervezési módszer első-sorban a program által végzett műveletekre összponto-sít, így olyan területeken alkalmazható elsősorban, ahol ezek a műveletek egyértelműek, és központi szerepet töltenek be. Pl: numerikus problémák, soros folyamatok irányítása. • Használható a program alacsony szintű finomszerkeze-tének és egészen magas szintű, átfogó szerkezetének kialakítására. • A funkcionális felbontás támaszkodik a tervező fantázi-ájára és szakmai képességeire. • Tág teret ad a kreativitásnak (ez gyengeség is) • Nem szisztematikus módszer, nincsenek benne jól meg-határozott tervezési lépések. • A módszert az „érdeklődőknek”, a programozást élvezőknek találták ki.

  29. Összefoglalva • A funkcionális felbontás egy, a strukturált programozás elveire támaszkodó általános célú tervezési módszer, mely több különböző logikai szerkezet kialakítását teszi lehetővé, ezzel teremt néhány kérdést: • Honnan vesszük az ötleteket? • Hogyan választunk a különböző lehetséges tervek közül? • Honnan fogjuk tudni, hogy a legjobb, az igényeknek leginkább megfelelő tervet állítottuk elő? • Sokan azt állítják, hogy a funkcionális felbontás nem nevezhető „komoly” tervezési módszernek.

  30. 1.2. A Michael Jackson programtervezési módszer JSP – Jackson Structured Programming

  31. Alapfilozófia Egy program logikai szerkezete egyértelműen előállítható az általa kezelt vagy előállított adatok szerkezete alapján. Pl: A bemenetről érkező pozitív számokat adjuk össze. A számsort egy negatív szám zár le. 4 6 12 5 -22 A bemenő adatokban ismétlődés tapasztalható, így a programban is lennie kell egy ismétlődő szakasznak. Tehát a bemenő adatok szerkezetéből kiindulva vontunk le egy, a program szerkezetére vonatkozó következtetést.

  32. Példa: Rajzolja ki a program a következő ábrát a karakteres képernyőre: * ************* *** * Első lépés: az adatszerkezet elemzése – adatszerkezet-diagram Kép Felső fél Közép Alsó fél * * Vonal Vonal • A rajzolandó ábra egy felső részből, egy középső kihagyásból és egy alsó részből áll • A felső és az alsó rész is ismétlődő sorokat tartalmaz

  33. Általánosságban a diagram jelölései a következőket jelentik: Tartalmaz: A tartalmazza B-t Ismétlés: A objektum 0 vagy több B objektum sorozata A A B * B Sorozat: A valójában egy B és egy C sorozata A B C

  34. Vegyük észre, hogy az adatszerkezetet a logikai felépítésben felülről lefelé haladva (egyre fino-mítva) írjuk le. • Az adatszerkezet elkészítése után a következő lépés annak programszerkezetté történő át-alakítása • Ez könnyű, hiszen a programszerkezetnek pontosan tükröznie kell a feldolgozni kívánt adatok szerkezetét • Programszerkezeti diagram

  35. Kép fel-dolgozása Programszerkezeti diagram: Felső fél fel-dolgozása Közép fel-dolgozása Alsó fél fel-dolgozása * * Vonal fel-dolgozása Vonal fel-dolgozása • A diagram értelmezése: • A program mint egész (a diagram legfelső doboza) tartalmazza (vonalak a dobozok között) bizonyos utasítások egy sorozatát (egy szinten elhelyezkedő dobozok) • Egyes programösszetevőket néha ismételten is végre kell hajtani (csillag a doboz sarkában)

  36. A következő lépés, hogy tetszőleges sorrendben leírjuk mindazokat az elemi műveleteket, amelyeket a programnak végre kell hajtania (ez a legkevésbé meghatározott eleme ennek a tervezési módszernek) • A példánkban a lista az alábbi műveleteket tartalmazza: • n darab csillag nyomtatása • üres sor nyomtatása • s darab szóköz nyomtatása • s növelése • s csökkentése • n növelése • n csökkentése • n és s kezdeti beállítása

  37. Kép fel-dolgozása • A következő lépésben az elemi műveletek el kell helyeznünk a program szerkezeti diagramjának megfelelő pontjain Felső fél fel-dolgozása Közép fel-dolgozása Alsó fél fel-dolgozása 8 8 • n darab csillag nyomtatása • üres sor nyomtatása • s darab szóköz nyomtatása • s növelése • s csökkentése • n növelése • n csökkentése • n és s kezdeti beállítása * * Vonal fel-dolgozása Vonal fel-dolgozása 2 6 5 3 1 7 4 3 1

  38. Utolsó lépés: a programszerkezet-diagram pszeudokóddá való alakítása n és s beállításawhile vannak még sorok do s darab szóköz kinyomtatása n darab csillag kinyomtatása s csökkentése n növeléseendwhileüres sor nyomtatásan és s beállításawhile vannak még sorok do s darab szóköz kinyomtatása n darab csillag kinyomtatása s növelése n csökkentéseendwhile

  39. Összefoglalva a tervezés lépéseit • Felrajzoljuk a feldolgozandó adatok szerkezetét ábrázoló diagramot • Elkészítjük az ennek megfelelő programszerke-zet-diagramot • Leírjuk azoknak az elemi műveleteknek a listáját, amelyeket a programnak végre kell hajtani • Elhelyezzük ezeket a műveleteket a program szerkezetét leíró diagramban • Előállítjuk a program vázlatos logikai szerkezetét

  40. Programszerkezet-diagram az elemi műveletekkel Számok fel-dolgozása Számok Példa: Adjunk össze egy számsorozatot, melynek a végét egy negatív szám jelzi! Adatszerkezet-diagram Negatív szám Törzs fel-dolgozása Negatív szám feldolgozása Törzs 3 * * Szám fel-dolgozása 4 Szám 2 1 1. szám beolvasása2. szám hozzáadása az összeghez3. az összeg kezdeti beállítása4. az összeg kiíratása

  41. Átalakítás pszeudokóddá: összeg := 0while a szám nem negatív do a szám beolvasása a szám hozzáadása az összeghezendwhilea szám kiírása A logikai szerkezet felírása a diagram alapján mechanikusan történt, nem tökéletes. A Jackson tervezési módszer csak a program logikai vázát segít megadni, a finomabb részletek kidolgozásában nem segít. A kód helyesen: összeg := 0a szám beolvasásawhile a szám nem negatív do a szám hozzáadása az összeghez a szám beolvasásaendwhilea szám kiírása

  42. Példa: Egy soros elérésű fájl személyek rekordjait tartalmazza. Számoljuk meg, hogy a lista hány férfit és hány nőt tartalmaz! Adatszerkezet-diagram Pszeudokód fájl megnyitása számlálók beállítása while a fájlnak nincs vége do egy bejegyzés olvasása if bejegyzés = férfi then férfiak számlálójának növelése else nők számlálójának növelése endif endwhile a számlálók értékének kiírása a fájl bezárása Fájl Fájlvége Törzs * Bejegyzés   Nő Férfi Látható, hogy az alternatívákra utaló, -rel jelölt dobozok if…then…else szerkezetként jelennek meg a kódban.

  43. Példa:http://en.wikipedia.org/wiki/Jackson_Structured_ProgrammingPélda:http://en.wikipedia.org/wiki/Jackson_Structured_Programming • As an example, here is how a programmer would design and code a run length encoder using JSP. • A run length encoder is a program which takes as its input a stream of bytes. It outputs a stream of pairs consisting of a byte along with a count of the byte's consecutive occurrences. • Run length encoders are often used for crudely compressing bitmaps. • With JSP, the first step is to describe the structure of a program's inputs. A run length encoder has only one input, a stream of bytes which can be viewed as zero or more runs. Each run consists of one or more bytes of the same value. This is represented by the following JSP diagram. Például: input - 5 5 5 5 12312 12 12 output – 5 4 123 1 12 3

  44. The run length encoder input

  45. The second step is to describe the structure of the output. The run length encoder output can be described as zero or more pairs, each pair consisting of a byte and its count. In this example, the count will also be a byte. The run length encoder output

  46. The next step is to describe the correspondences between the operations in the input and output structures.

  47. In this example, there is no structure clash, so the two structures can be merged to give the final program structure.

  48. At this stage the program can be fleshed out by hanging various primitive operations off the elements of the structure. Primitives which suggest themselves are • read a byte • remember byte • set counter to zero • increment counter • output remembered byte • output counter • The iterations also have to be fleshed out. They need conditions added. Suitable conditions would be • while there are more bytes • while there are more bytes and this byte is the same as the run's first byte and the count will still fit in a byte

  49. If we put all this together, we can convert the diagram and the primitive operations in to C, maintaining a one-to-one correspondence between the code and the operations and structure of the program design diagram. #include <stdio.h>#include <stdlib.h> int main(int argc, char *argv[]) { int c; c = getchar(); while (c != EOF) { int count = 1; int first_byte = c; c = getchar(); while (c != EOF && c == first_byte && count < 255){ count++; c = getchar(); } putchar(first_byte); putchar(count); } return EXIT_SUCCESS; }

  50. A módszer elemzése, értékelése • A Jackson tervezési módszer alapelve szerint egy program logikai felépítését alapvetően az határozza meg, hogy milyen adatokat akarunk vele feldolgozni. • A napjainkban használatos módszerek közül valószínűleg a legrendszerezettebb, jól elkülöníthető lépések sorozatából áll. • Nem támaszkodik a programozó „megérzéseire” (viszont kreativitást igényel) • Néhány könnyen átlátható alapelvre épít (strukturált programo-zás, az adatszerkezet és a feldolgozó program szerkezete közötti szoros kapcsolat) • Könnyen tanítható • Következetes (egy adott feladatnál két ember valószínűleg ugyanarra fog jutni) • Egyszerű, könnyen használható • Programozási nyelv független

More Related