Monday, November 4, 2013

10. óra

Parancssori argumentumok

A main() függvény "teljes" alakja:
int main(int argc, char* argv[])
ahol:
  • argc - az argumentumok számát tartalmazza
  • argv - két dimenziós karaktertömb, mely argc darab sztringet tartalmaz. A sztringek a parancssori argumentumok, az argv[0] maga a program neve (pontosabban amilyen néven meghívtuk - linkek esetén nem mindig a programnév (pl. busybox))

Feladatmegoldás, konzultáció

  • haladó feladatok: prog-halado.txt
  • előző órai házik
  • korábbi feladatok
  • parancssori argumentumos feladatok: 1

Monday, October 28, 2013

9. óra

Jövő héten 2. kis ZH

  • A szabályok ugyanazok, mint az előző kis ZH-n
  • Tematika:
    • vezérlési szerkezetek (szekvenciális, feltételes, ismétléses). Lásd: /pub/progalap-ban a vezerles.txt-t
    • típusok, típusdefiniciók, értékkészlet, túlcsordulás
    • printf/scanf különböző kiiratási módjai
    • pointerek, deklarációk, malloc, free, sizeof
    • pointer és tömb viszonya, referencia/dereferencia, érték/referencia paraméter
    • kis program írása (ciklus, dinamikus memóriafoglalás, tömbműveletek)
    • hibajavítás forráskódban (szintaktikai és szemantikai)

Új anyag


Feladatmegoldás, gyakorlás

  • korábbi órák feladatai (tömbök, dinamikus foglalás)
  • házi feladatok: 1, 2 (progalap.pgm)

Monday, October 21, 2013

8. óra

Pointerek

  • Pointer = mutató --> egy változó memóriacímét tárolja, a változóra mutat
  • van típusa: milyen típusú változóra mutat
  • dereferencia operátor: *
    • int *p;  //egy integer típusú változóra mutató pointer
    • p = 3;  //a változó címe 3
    • *p = 3;  //a változó értéke 3
    • int s; s = *p;   //s értéke 3
    • pointerek.c
  • referencia operátor: &
    • a változó memóriacímére mutat
    • int a, *pa; a = 3; pa = &a;  //*pa = 3 lesz
      • egy memóriacímen helyezkednek el: ha a változik, akkor *pa értéke is változik
    • függvények: paraméterek átadása érték és referencia szerint
      • printf vs scanf
  • tömbök: pointerek sorozata, melyek a tömb elemeire mutatnak
    • függvényekben a tömbelemek referencia szerint lesznek átadva, ez a referencia maga a tömb (így nem kell az & operátor)
  • malloc függvény - dinamikus helyfoglalás
    • int *t; t = (int*)malloc(N*sizeof(int));
      • típuskényszerítés
      • stdlib.h
      • sizeof függvény
  • calloc: mint a malloc, de nullára inicializálja az elemeket
  • két (vagy N) dimenziós tömbök

Struct és Union

Struktúra:

Union:
  • hasonló a struct-hoz, de csak egy elemet tárol
  • melyiket tárolja? amelyiknek utoljára adtunk értéket
  • példa: union.c

Haladó függvénykezelés, tárolási osztályok


Feladatok

Struktúrák: fgv-struct.c
Órai: 1, 2, 3
Házi: 1, 2

7. óra

Nagy ZH

Tuesday, October 8, 2013

6. óra

Jövő héten ZH

  • Számítógép előtt, 4 db programozási feladat megoldása
  • Tematika:
    • szelekció és ciklus
    • tömbök használata (egész tömbök, hosszal és végjellel vagy sztringek)
    • egyszerűbben kódolható feladat ami a problémamegoldásra vagy kihegyezve
    • házi feladatokhoz hasonló feladat (kiiratás nélkül)
  • Feltöltés biro-ra (https://biro.inf.u-szeged.hu/), bejelentkezés h-s azonosítóval: akinek nem sikerül, ellenőrizze a jelszavát, szükség esetén resetelje a help desk-en (Irinyi épület, 3. lph., 220-as szoba)
  • Minden feladatot 5 különböző bemenetre tesztel a biro, pontszám -> helyes kimenetek száma (max. 4x5)
  • Az asztalon csak toll, fényképes igazolvány lehet, mobilokat kötelező kikapcsolni. Minden más segédeszköz 0 pontot eredményez.
  • Időtartam: 135 perc. (150 perc után a biro zár)
  • A ZH-ról idő előtt csak az távozhat, aki maximális pontszámot kapott vagy az összes próbálkozását (20) elhasználta.

Próba ZH feladatainak megoldása

Próba ZH elérhető biro-ról vagy a pub-ból (/pub/ProgramozasAlapjai/Gyakorlat/gyak06/2-orai-feladatok/feladat.c)


Tipusok bővebben, typedef

Char

  • előjeles (signed) és előjel nélküli (unsigned)
  • méret: sizeof(char)
  • char[] -> sztring
    • inicializálás: char str[] = "Hello World"; //implicit 0 jel a végén, a méret kiszámítása automatikus
  • ciklusban, szelekcióban használható a számbeli értéke:
    • if (c >= 65) { ...
  • vagy maga a karakter is:
    • for (c = 'a'; c <='z'; c++) { ...

Int

  • signed és unsigned
  • rövid (short), normál (int), hosszú (long), hosszabb (long long)
  • méret: sizeof(int), sizeof(short int), ...
  • túlcsordulás: short int i = 127; i++; printf("%d", i);

Float

  • float és double (dupla pontosság)
  • sizeof(float), sizeof(double)

Typedef

  • saját típusok definiálása (már létező típusokból)
    • typedef double vector[3];  //vector nevű háromdimenziós tömb típus
    • typedef unsigned short int u16;  //16 bites nemnegatív egész szám
    • typedef char string[N+1];  //N hosszúságú sztringeket tároló karakteres tömb
  • enumnál már láttunk hasonlót, itt is alkalmazható typedef:
    • typedef enum { Hetfo, Kedd, ..., Vasarnap } het;
      het nap;
      for (nap = Hetfo; nap <= Vasarnap; nap++) { ...

I/O műveletek bővebben

A printf és scanf függvények formázása: %[flags][width][.precision][length]type
  • flags:
    • + - számoknál mindig kiírja az előjelet
    • szóköz - a nemnegatív számoknál az előjel helyett szóközt ír ki
    • - - a kimenet balra igazítása
    • 0 - szóközök helyett nullákkal tölt ki, ha van width definiálva
  • width:
    • a kiírandó karakterek minimális száma - ha a kiírandó érték hossza kisebb mint a width, akkor a maradék helyet szóközökkel tölti fel (vagy nullákkal)
  • .precision:
    • maximális precizitás, tizedesek száma float típusnál, kiírható karakterek száma string-nél
  • length:
    • hh - char hossz
    • h - short hossz
    • l - long hossz
    • ll - long long hossz
  • type:
    • d/i - decimális kiiratás; beolvasásnál a %i hexadecimálisként vagy oktálisként értelmezi a számot (ha 0x-el vagy 0-val kezdődik)
    • u - unsigned int
    • f/F - fixpontos ábrázolás; kisbetű/nagybetű csak a végtelen ábrázolását befolyásolja (inf vagy INF, nan vagy NaN)
    • e/E - lebegőpontos ábrázolás
    • g/G - fix vagy lebegőpontos ábrázolás a szám nagyságától függően
    • x/X - hexadecimális ábrázolás
    • o - oktális ábrázolás
    • s - 0-val terminált sztring
    • c - karakter
    • p - pointer
    • % - '%' jel, pl: printf("szazalek: %d%%\n", szazalek);
Egy-egy karakter kiiratása és beolvasása: getchar, putchar
Egy-egy sor kiiratása és beolvasása: gets, puts

Fájlműveletek

  • FILE*: mutató a használni kívánt fájlra
  • fopen(útvonal, módok): fájl megnyitása
    • mód: r (read), w (írás), + (append), b (bináris), t (szöveges)
  • fflush: a puffer kiiratása a fájlba
  • fclose: fájl bezárása
  • fprintf, fscanf: mint a printf/scanf, de van egy új első paraméter
    • egy FILE* típusú változó, ami a fájlt jelöli
    • stdin/stdout/stderr

Feladatok


Monday, September 30, 2013

5. óra

Mini ZH

  • toll
  • fényképes igazolvány
  • saját tudás
Minden mást 0 ponttal jutalmazok.

Gyakorlás

Felezős számkitaláló játék, ezt a forrásfájlt kell befejezni. (Megoldás itt - az óra után elérhető)

Konstansok

#define ...

gcc -E forras.c > forras.i
gcc forras.i -o forras

Enum

enum nev { elem0, elem1, ... };
enum nev { elemA = 1, elemB = 4, elemC = 12, ... };

Tömbök

tipus nev[meret];
tipus nev[dim1][dim2];
tipus nev[meret] = {elem0, elem1, elem2, ..., elem(meret-1)};

Sztringek

  • Karakter tömbök: char str[20];
  • a tömb utolsó eleme: 0
  • inicializálás: char hw[13] = "Hello world!"
  • másolásra strcpy(cél, forrás), include-olni kell a string.h-t

Feladatok

Órai: 1, 2
Házi: 1, 2, 3

Monday, September 23, 2013

4. óra

Fontos tudnivalók...

Jövő héten kis ZH! Papíron, 15 perc áll rendelkezésre. Kell: toll (2 db, mert egy mindig elromlik), fényképes igazolvány (személyi, diák, útlevél, jogosítvány), saját tudás. Nem kell: telefon, számítógép, tablet, számológép, egyéb elektronika, más tudása, papíralapú segédanyag.
Mit kell tudni? Mindent amit eddig a Linux-ról tanultunk: könyvtárműveletek, abszolút és relatív útvonalak, fájlműveletek, jogosultságok, többfelhasználós parancsok, multitask (előtérben és háttérben futtatás), szövegfájlok kezelése, átirányítás, shell és környezeti változók, távoli erőforrások elérése.
Mit nézünk még át a mai órán (mert esetleg kimaradt) és nem árt tudni a ZH-ra? cat < forrás és cat forrás>> átirányítás, tail parancs -n kapcsolójának +-os paraméterezése.

Feltételes vezérlési szerkezetek

if (feltétel) utasítás; //ha a logikai feltétel teljesül, akkor végrehajtásra kerül az utasítás

if (feltétel) {
    utasítás1;
    utasítás2;
}  //ugyanaz mint az előző, csak több utasítást hajtunk végre egy blokkban

if (feltétel) {
    utasítás1;
else {
    utasítás2;
}  //ha teljesül a feltétel, akkor az első utasítást hatjuk végre, ha nem akkor a másodikat

if (feltétel1) {
    utasítás1;
} else if (feltétel2)
    utasítás2;
else {
    utasítás3;
}  //ha az első feltétel teljesül, akkor az első utasítást hajtjuk végre, ha a második teljesül, akkor a másodikat, minden más esetben pedig a harmadikat

változó = (feltétel ? érték1 : érték2)  //ha a feltétel teljesül, akkor a változó értéke az első érték lesz, ha nem akkor pedig a második

switch (diszkrét változó) {  //diszkrét: int, char
    case érték1:
        utasítás1;
        break;
    case érték2:
        utasítás2
        break;
    default:
        utasítás3;
        break;
}  //a változó értéke szerint az első vagy a második vagy valamelyik további ágat hajtjuk végre. Ha egyik sem, akkor a default ág kerül végrehajtásra. Break utasítás szerepe...

Ciklikus vezérlési szerkezetek

while (feltétel) {
    utasítás1;
    utasítás2;
}  //amíg a feltétel igaz, addig futtatja az utasításokat - elöltesztelős: ellenőriz, majd futtat

do {
    utasítás1;
    utasítás2;
} while (feltétel);  //amíg a feltétel igaz, addig futtatja az utasításokat - hátultesztelős: futtat, majd ellenőriz

for (kezdeti utasítás1, utasítás2; feltétel; utasítás3, utasítás4) {
    utasítások;
}  //végrehajtja a kezdeti utasítás(oka)t, majd ellenőrzi a feltételt: ha igaz, akkor futtatja a blokkban található utasításokat, majd a 3.-4. utasítást és újból ellenőrzi a feltételt...

break és continue utasítások

Feladatok

Órái: 123
Házi: 12345