Emlékeztetők Számítástechnika 10. Daróczy László Akinek javítania kell Excel-t, tegye meg, ki van adva a lap ki hogyan áll. Akinek nem sikerült a tesztje, annak kötelező járnia előadásra! C feladat: beadás jövő héten kedden órán, legkésőbb e-mailen kereken éjfélig, utána késedelmi díj ellenében fogadható csak el Mintaprogramok forrás: Kulcsár Gyula & Dr. Dudás László 2 1. C önálló feladat Kiadás: most Névsor rajta a sorszámokkal+feladatok körbeadva Feladatok letölthetőek az internetről is, a szokásos (dudas+szteaok) honlapról Beadás: 46. hét (2 hét múlva!!) Beadás: szigorúan a 46. hét kedden (max. éjfélig) Aki nem teszi meg: késedelmi díjjal hozhatja, most nincsen kivétel Beadás formája: C forrásprogram (C formátum)+exe WORD jegyzőkönyv: Első oldal: feladat címe, hallgató neve, Neptun-kód, beadás dáruma(év, hónap, nap), tantárgy neve Második oldal: feladatkiírás szövege, választott változók jegyzéke és programbeli feladatuk megadása, folyamatábra, tesztelt input változók értéke Opcionális: hardcopy a futtatási eredményekrők(print screen) 3 Borland C letöltése Előrelátóan hozzunk létre egy BC mappát az asztalon Keressük fel Kulcsár Gyula honlapját (google: kulcsar, iit) -> Oktatás->Számítástechnika gyakorlat->2. (teljes) letöltés->kitömörítés a mappába 4
C beadandó mintafeladat C beadandó mintafeladat megjegyzések Függvénytáblázat készítés Legyen adott az alábbi függvény: Írjon C programot, mely kiszámítja a függvény értékeit egy adott intervallumban egymástól egyenlő távolságokra levő x változókra! A program kérje be az intervallum kezdő és végpontját, valamint az osztásközök számát, és írja ki az osztópontokban (beleértve a kezdő és végpontot is) kiszámított függvényértékeket táblázatos formában. Azokban a pontokban, ahol f(x) nincs értelmezve, a program küldjön hibaüzenetet! 5 6 C beadandó mintafeladat elemzés Esetek, mikor a feladat nem végezhető el: X<0 -> Negatív a gyök alatt! Cos(x)<=0 -> A logaritmus nem értelmezett az 1.2-re emeléshez! Log 2 utáni kifejezés negatív v. 0 -> A 2-es alapú logaritmus nem számítható! Nevező<0 -> Nullával osztás kísérlete! 7 C beadandó mintafeladat megoldás/1 #include <stdio.h> #include <conio.h> #include <math.h> void main(void) double x, fx, xkezdo, xveg, deltax, argum, nevezo; int lepeskoz, i; clrscr(); printf(" Függvénytáblázat\n\n"); printf("a függvény: ch(abs(x)-2*gyök(x))/kettesalapúlogaritmus(x*(cos(x) emelve 1.2-re))"); printf("\n Az intervallum kezdőértéke, xkezdo= "); scanf("%lf", &xkezdo); printf("\n Az intervallum végértéke, xveg= "); scanf("%lf", &xveg); printf("\n Lépésközök száma, lepeskoz= "); scanf("%d", &lepeskoz); deltax= (xveg-xkezdo)/lepeskoz; printf("\n\n x f(x)"); printf("\n--------------------------------"); 8
C beadandó mintafeladat megoldás/2 for(i=0; i<=lepeskoz; i++) x= xkezdo+i*deltax; printf("\n%10.3lf ", x); if(x < 0.0) printf(" Negatív a gyök alatt!"); else if( cos(x) <= 0.0 ) printf(" A logaritmus nem értelmezett az 1.2-re emeléshez!"); else argum= x* pow(cos(x),1.2); if( argum <= 0.0) printf(" A 2-es alapú logaritmus nem számítható!"); else nevezo= log(argum) / log(2); if( nevezo == 0.0 ) printf(" Nullával osztás kísérlete!"); /* jobb lenne: if( fabs(nevezo) < 1e-15 )... */ else fx= cosh( fabs( x ) -2*sqrt(x) ) / nevezo; printf("%10.3lf", fx); C beadandó mintafeladat teszt -100; 100; 10 9 10 C beadandó mintafeladat - folyamatábra START Clrscr() printf(" Függvénytáblázat\n\n"); printf("a függvény: ch(abs(x)- 2*gyök(x))/kettesalapúlogaritmus(x*(cos(x) emelve 1.2-re))"); printf("\n Az intervallum kezdőértéke, xkezdo= "); Be: xkezdo C beadandó mintafeladat - folyamatábra HAMIS i=0 i<=lepeskoz IGAZ x= xkezdo+i*deltax; printf("\n%10.3lf ", x); x<0.0 HAMIS cos(x)<=0.0 HAMIS argum= x* pow(cos(x),1.2); IGAZ IGAZ i++ printf(" Negatív a gyök alatt!"); printf(" A logaritmus nem értelmezett az 1.2-re emeléshez!"); printf("\n Az intervallum végértéke, xveg= "); argum<= 0.0 HAMIS IGAZ printf(" A 2-es alapú logaritmus nem számítható!"); Be: xveg nevezo= log(argum) / log(2); printf("\n Lépésközök száma, lepeskoz= "); nevezo == 0.0 HAMIS IGAZ printf(" Nullával osztás kísérlete!"); Be: xlepeskoz fx= cosh( fabs( x ) -2*sqrt(x) ) / nevezo; printf("\n\n x f(x)"); printf("\n--------------------------------"); 11 Ki: fx STOP 12
Felhasználóbarát programok elterjedésének okai: A számítástechnika hajnalán a számítógépek több millió dollárba kerültek, míg a programozók ehhez képest elenyésző összegbe -> Nem volt szükség felhasználóbarát programokra, hiszen a képzett programozók értettek hozzá. Tendencia: Gépek ára csökken, felhasználók száma nő -> nem megfizethető megoldás mindenkit szakértővé tenni -> a programokat kell egyszerűsíteni Felhasználóbarát programok eleme Önállóan tanítható lenne Hatalmas területet foglal össze 13 14 Felhasználóbarát programok eleme Használhatósági megfontolások: Kik a felhasználók, milyen tudással rendelkeznek, mit tudnak megtanulni? Mit akarnak/szükséges a felhasználóknak megtenniük? Mi a felhasználók háttere? Mi a felhasználó munkakörnyezete? Mit kell a számítógépre bízni? Felfedezhetőség A megtanulhatóság sebessége is fontos: Kell a felhasználónak bármikor megtennie olyat, ami nem nyilvánvaló (pl. szokatlan gomb, elrejtett menüpont, stb)? Vannak tippek és megjegyzések minden egyes funkciónál? Hátrányban vannak azok a felhasználók, akik nem ismernek bizonyos billentyű-kombinációkat? Minden felhasználónak joga van ismerni a program összes funkcióját. A tanulási görbe eléggé követhető, pontról-pontra halad? Vannak rejtett/dokumentálatlan billentyűkombinációk? Ezeket sem árt feltüntetni a Help-ben. 15 16
Lund 1997, Használhatósági tételek (Honlapokra: ) Ismerd a felhasználót, nem TE vagy a felhasználó! Hasonló kinézetű dolgoknak hasonlóan kell működniük. A döntéshez szükséges információnak ott kell lennie, ahol a döntés történik. A hibaüzeneteknek jelentenie is kell valamit a felhasználó számára, és arról, hogy hogyan oldja meg a problémát. Minden akciót reakció kövessen. Mindenki hibázik, tehát minden hibának javíthatónak kell lennie. Ne halmozd el a felhasználót! Konzisztencia, konzisztencia, konzisztencia. Minimalizáld a memóriaigényt! Tartsd egyszerűnek! A felhasználónak mindig tudnia kell, mi történik. Minél többet kell tenni, annál egyszerűbbnek kell lennie. A felhasználónak kell irányítania a rendszert. Nem a rendszernek a felhasználót. A felhasználó a főnök, és a rendszernek ezt el kell ismernie. Kiiktatni a felesleges döntéseket, kiemelni a többit. A legjobb utak mindig csak pár lépésbe kerülnek. Próbáld a felhasználó és a célja közötti utat lerövidíteni. A felhasználóknak képesnek kell lennie azt csinálni, amit akarnak. Informáld a felhasználót a hibákról, mielőtt rosszabb lesz! A felhasználóknak mindig képesnek kell lenniük, hogy rájöjjenek, hogy mi a következő lépés. A felhasználód próbáld felruházni nagyobb tudással, ne a rendszert gyorsítsd fel! A különbözőképpen kinéző dolgoknak különböző dolgokat kell csinálnia. Hibaüzenetek, információk Minden ember hibázik, így előbb-utóbb a felhasználó is elfog követni hibát A programnak fel kell készülnie ezekre a hibákra A felhasználót tájékoztatni kell a hibáról, a pontos okáról, és közérthetőnek kell lennie (pl. szabad lemezterület 0K nem megfelelő, mert félreérthető!) 17 Forrás: wikipedia.org 18 GUI Graphical User Interface Grafikus felhasználói felület Célja a programmal történő interakciók egyszerűsítése Fontos: Átlátható, egyszerű legyen Könnyen kezelhető Ne vesszen el a felhasználó a részletekben Hibaüzenetek, információk Minden ember hibázik, így előbb-utóbb a felhasználó is elfog követni hibát A programnak fel kell készülnie ezekre a hibákra A felhasználót tájékoztatni kell a hibáról, a pontos okáról, és közérthetőnek kell lennie (pl. szabad lemezterület 0K nem megfelelő, mert félreérthető!) 19 20
Helpmenü A programnak célszerű teljes dokumentációval készülnie, és ezt (lehetőleg) egy elektronikus helpben összefoglalni Gyakoriak az ún. context-sensitivehelp, ahol a program pl. egy hiba esetén megnyitja a help menü releváns részét, ill. pl. egy gomb fölé helyezett egérkurzor megjeleníti a megfelelő rész (Súgó) Varázslók (wizard) Bonyolultabb, összetettebb feladatok elvégzését célszerű wizard-rabízni, ami megkönnyíti és átláthatóvá teszi a felhasználó számára a feladat elvégzését Egyszerűsített lépésekre bontja a feladatot, és végigvezeti a felhasználót a szükséges lépéseken 21 22 Accelerators Egy nagy és profi programnak elengedhetetlen része a gyorsítók. Ennek célja, hogy a gyakorlott felhasználók gyorsabban tudják használni a programot. PlAlt+G stb. Dummy proof Minden programnál el fognak követni hibákat a felhasználók. A programot úgy kell megtervezni, hogy a felhasználók esetleges hibái esetén ne omoljon össze, ne vesszenek el a felhasználó adatai, stb. Bolondbiztos Tedd bolond-biztossá, valaki fel fog találni egy nagyobb bolondot. 23 24
Követendő programozási stílus A követendő programozási stílusról mindenkinek különböző elképzelése van, nincs univerzális megoldás. Egy-egy cégnél általában megvan a belső szabályzat erre, amit követni kell. Miért fontos? Egy szoftver élettartama folyamán a munkaidő 80%a a karbantartásra megy el. Nem egy (nem az eredeti) programozó fogja karbantartani. A megfelelő stílus növeli a program olvashatóságát. Vannak közös tulajdonságok. 25 Követendő programozási stílus Formai követelmények Program megfelelő tabulálása (blokk beljebb kezdődik) Program megfelelő tagolása (pl. egy utasítás egy sor, átlátható legyen) Megfelelő kommentezés (minden felhasználóra, input adatra szerepeljen a feladata, ha nem egyértelmű az algoritmus, a megvalósítás miértje is) 26 Követendő programozási stílus Követendő programozási stílus Jelölések: Legelterjedtebb jelölésmód a magyar (Hungarian notation): Pl. chinitial karakter dbpi double isize integer Stb. Egyértelművé, átláthatóvá teszi a kódot. Első ránézésre eldönthető a változó típusa, szerepe stb. Elkerülhetőek vele gyakori hibák. Egyéb: Az átláthatósághoz emellett az is fontos, hogy a forráskód maga is tagolt legyen: Pl. egy függvény egy, nyilvánvaló feladatot végezzen, inkább több függvény legyen Teljesítményorientált programok eltérőek!!!! 27 28
Kifejezések kiértékelése Példákkal (3-2)? 1: 4 =1 25+4>5 && 56-7<8 29>5 && 49<8 1 && 0 =0 7/2 =3 6%3 =0 Kifejezések kiértékelése Példákkal (3-2)? 1: 4 =1 25+4>5 && 56-7<8 29>5 && 49<8 1 && 0 =0 7/2 =3 6%3 =0 29 30 Kifejezések kiértékelése Példákkal (ZH 2007) 21/8+14%5 =2+4=6 (a=2, a*=4) a=a*4=8 (g=3, k=11, g-=k;) g=g-k=3-11=-8 (x=8; y=2;) x>=4 &&!(y==2) 1&&!1=1&& 0=0 HAMIS c/=--i-k++; --i; c=c/(i-k); k++; i=7; k=2; c=70; Eredmény: 17 31 Kifejezések kiértékelése Példákkal (ZH 2007) 83/12%4 =6%4=2 (w=7, w+=4) W=w+4=7+4=11; (d=1, h=11, a*=0) A=a*0=0;!(x!=3 y>=-4) (x=3; y=11;)!(0 1) ->!1 -> 0 c+=++i * k--; ++i; c=c+i*k; k--; i=7; k=2; c=40; Eredmény: 56 32
Kifejezések kiértékelése Példákkal (ZH 2007) 7/2/6 3/6=0 (v1=8, v1/=6) V1=8/6=1 (g=9, k=3, g%=k) g=g%k=9%3=0!(a<=b&&!(c==d)) (A=-6; B=2; C=8; D=11)!(1&&!0) ->!(1&&1) ->!1 ->0 v5*=-j--*++k; ++k; v5=v5*(-j*k); j--; J=8; k=3; v5=7; Eredmény: -224 33 Kifejezések kiértékelése Példákkal (ZH 2007) 3-9%2-1 3-1-1=1 (5+3,7,8) 8 (g=k=1, k*=7+g) K=k*(7+g) Eredmény: 8!(A>-B (C<D)) (A=1; B=3; C=6; D=1;)!(1 0) ->!1 -> 0 v1*=i++*k--+7; V1=v1*(i*k+7); i++; k--; i=3;k=2; v1=3; Eredmény: 39 34 Mintaprogram switch alap #include<stdio.h> #include<conio.h> int main(int argc, char* argv[]) int v; clrscr(); printf("\n Kerem a kiirando szavak szamat(1-3):"); scanf("%d", &v); switch(v) case3: printf("\n harom"); case2: printf("\n ketto"); case1: printf("\n egy"); j} getch(); //karakterbeolvasas return0; 35 Mintaprogram switch alap 2 #include<stdio.h> #include<conio.h> int main(int argc, char* argv[]) int szam; clrscr(); printf("\n Kerek egy szamot(1-3):"); scanf("%d", &szam); switch(szam) case 3: printf("\n harom"); break; case 2: printf("\n ketto"); break; case 1: printf("\n egy"); break; //el is maradhat default: printf("\n nem megfelelo szam"); //helye nem kotott getch(); //karakterbeolvasas return0; 36
#include<stdio.h> #include<conio.h> Mintaprogram do while ZH minta int main(int argc, char* argv[]) int szam; int i; //ciklusvaltozo int lepesek; //ismetlesek szama clrscr(); printf("\n Kerem az ismetlesek szamat:"); scanf("%d", &lepesek); i = 1; do printf("\n Kerem a %d. egesz szamot:", i); scanf("%d", &szam); if( szam%2 == 0 ) printf("\n A %dszamparos.", szam); else printf("\n A %d szam paratlan.", szam); i++; while( i <= lepesek); getch(); return 0; 37 38 Köszönöm a figyelmet! 39