GCC Windows-ra: Code::Blocks , Cygwin
Gyakorlaton bemutatott könyv itt és egy újabb kiadás itt
Kommentek:
// Ez egy egysoros komment, ami itt van az nem fog látszani a programban /* Ez egy többsoros komment, ez sem fog látszani a programban */
Main - fő függvény
/* MAIN függvény, ez a függvény fog lefutni először */ int main(){ return 0; // a main függvény visszatérési értéke: Op. rendszer felé: Nincs hiba /* return 1; // a main függvény visszatérési értéke: Op. rendszer felé: Valami hiba történt */ }
Input - Output használata
/* A ki- és bevitel használatához szükségünk van az alábbi sorra. */ #include <stdio.h> /* Ezek után használhatjuk a scanf és printf I/O függvényeket Az input-output használatához meg kell mondani a fordítónak, hogy szeretnénk használni az ezzel kapcsolatos függvényeket. */
Matematikai könyvtár
/* Matematikai könvvtár: ha szeretnénk a beépített matematikai függvényeket, konstansokat használni. pl.: négyzetre emelés, négyzetgyök, pí,... */ #include <math.h>
Fordítás és futtatás
Fordítás és futtatás Linux alatt (terminalban): $ gcc -o prog progalap.c // fordítás $ ./prog // futtatás Object fájl készítése: $ gcc -c -o progalap.o progalap.c $ gcc -o progalap progalap.o Warning-ok kiíratása fordítás után: $ gcc -Wall -o hello helloworld.c
Minden utasítást pontosvessző (";") zár.
Ha nem teszünk pontos vesszőt, akkor kifejezésről beszélünk.
Kifejezés - egy (önmagában még nem végrehajtható) elemi művelet. pl.: 3 + 5
Utasítások sorozatát szekvenciának nevezzük.
Példa:
main() { 3 + 5 // kifejezés 3 + 5; // utasítás }
Feladat: Csinálj utasítást a következő értékekből/értékeketet kiszámító kifejezésekből:
- Egy év napjainak száma. - Mikor született az, aki most 18 éves? - Átlagban hány órát kell hetente otthon a progalap gyakorlásával tölteni a szorgalmi időszakban, ha egy kredit (a teljes félév során elvégzett) 30 munkaórát jelent, a félév 20 hétből áll, és ebbe a kreditszámba az órai munka is beleszámít?
Változók deklarációja - Deklaráció: elemek létrehozása
void main(){ // void - Ez egy adatot tárolni képtelen típus, többek között eljárásokhoz használatos int egesz; // Egy egyszavas (esetünkben 32 bites - 4 bájtos) előjeles egész szám // Műveletek: +, -, *, /, %, ahol a / az egészosztás egészrésze, a % az egészosztás maradéka char karakter; // Egy egybájtos, előjeles, vagy előjeltelen egész szám. Jól használható szöveges karakterek tárolására is, ascii-kód segítségével. float valos1; // Egy egyszavas lebegőpontos szám // Műveletek: +, -, *, / double valos2; // Annyiban különbözik a float-tól, hogy 8 bájtos // Logikai és szöveges típus külön nincs, azokat máshogy kell megvalósítani. (Későbbi gyakorlaton) }
Változók definiálása - Definíció: a tényleges értékadás
void main(){ int egesz = 2014; char karakter = 'A'; // Karakterek megadásakor (és mint később látjuk, szövegekben is) használhatunk escape-szekvenciákat, pl.: \" - idézőjel, \' - aposztróf, \t - tabulátor, \n - soremelés (új sor), \r - kocsi-vissza float valos1 = 3.14; double valos2 = 3.1415916; }
Feladat: fordítsuk le az alábbit -Wall kapcsolóval! Milyen hibákat kapunk? Javítsuk őket!
#include <stdio.h> main() { printf("Hello Világ!\n"); }
Feladat: Futtassuk le az alábbi parancsokat a fenti, javított "Hello World" programon! Mi lett az eredmény és miért? Hogyan tudnánk felcserélni a 2. és 3. parancs eredményét?
$ ./hello ; ./hello $ ./hello && ./hello $ ./hello || ./hello
Blokknak nevezünk két kapcsos zárójel - { } - közé zárt programrészt.
Egy blokkon belül minden változónév csak egyszer használható, egy blokkon belül létrehozott változók csak az adott blokkban használhatók.
void main(){ int szam1; { int szam2 = 2; } { int szam3 = 3; //int szam4 = szam1 + szam2 + szam3; // itt hiba lesz mivel a szam2 nincs deklarálva ebben a blokkban } }
Globális változó: blokkon kívül deklarált, mindenhol látszik.
Lokális változó: valamilyen blokkon (függvényen) belül deklarált, csak az adott blokkon belül látszik.
#include <stdio.h> int global = 0; int LG(int alpha) { int local = 0; local += alpha; // local = local + alpha; rövidítése global += alpha; return local; } void main() { printf("Lokalis valtozo: %d, Globális változó: %d\n", LG(2), global); printf("Lokalis valtozo: %d, Globális változó: %d\n", LG(2), global); printf("Lokalis valtozo: %d, Globális változó: %d\n", LG(2), global); }
Feladat: Próbáljuk ki, fordul-e a fenti program, ha a main függvényben megpróbáljuk felhasználni a local változót!
Feladat: Mi történik, ha a global-t csak a fuggveny után deklaráljuk?
Függvényekben és beágyazott blokkokban létrehozhatunk ugyanolyan nevű változót, mint amilyen valamilyen felsőbb szinten már deklarálva van. Ez el fogja rejteni a felsőbb szintű példányt:
#include <stdio.h> int a = -1; void fgv() { printf("%d\n", a); } void main() { int a = 0; // ez elrejti a globális a változót { int a = 1; // ez elrejti az eggyel feljebb lévő a változót { int a = 2; // ez elrejti az eggyel feljebb lévő a változót printf("%d\n", a); // 2 } printf("%d\n", a); // 1 } printf("%d\n", a); // 0 fgv(); // -1 }
Feladat: Próbáld meg futtatás nélkül megtalálni a hibá(ka)t, majd javítsd (őket)!
int main() { int elso; elso = 3; { int masodik; elso = 6 masodik = 5; } { int harmadik; elso = 9 masodik = 10; harmadik = 8; } masodik = 15; harmadik = 16; return 0; }
Kiíratás képernyőre:
#include <stdio.h> void main(){ /* Változók deklarálása és definiálása */ int egesz = 2014; char karakter = 'A'; float valos1 = 3.14; double valos2 = 3.1415916; /* Kiíratás képernyõre */ printf("Egyszerű szöveg\n"); printf("Integer érték: %d\n", egesz); printf("Karakter: %c\n", karakter); printf("Float érték: %f\n", valos1); printf("Double érték: %lf\n", valos2); printf("%s\n", "Szöveg, mint \"string\"\n"); }
Adatok bekérése:
#include <stdio.h> void main(){ int egesz; float valos1; double valos2; /* Adatok bekérése */ printf("Adj meg egy egész számot:\n"); scanf("%d", &egesz); printf("Adj meg két valós számot (Üss Enter-t a két szám bevitele között):\n"); scanf("%f", &valos1); scanf("%lf", &valos2); printf("\n\n"); }
Egy kis érdekesség:
#include <stdio.h> void main(){ // Egész egészként és karakterként printf("%d\n",65); printf("%c\n\n",65); // Valós valósként és egészként printf("%f\n",65.5555); printf("%d\n\n",65.5555); // Karakter karakterként és egészként printf("%c\n",'A'); printf("%d\n",'A'); }
Több adat beolvasása egyszerre:
#include <stdio.h> void main(){ int st, rd; char nd, th; printf("Beolvasás (egész karakter egész karakter): "); scanf("%d%c%d%c", &st, &nd, &rd, &th); printf("first = %d; second = '%c'; third = %d; fourth = '%c';\n", st, nd, rd, th); }
Feladat: Írj egy programot amely bekéri a neved, majd a bekérés után kiírja azt a képernyőre! Ezután bekéri a születési dátumod és kiszámítja a korodat, és ezt is kiírja a képernyőre!
Feladat: Alakítsd át a fenti programot úgy, hogy bekérje a vezetékneved, majd a születési dátumod, majd a keresztneved és végül a korodat! A bekért adatokat "logikus sorrendben" írasd ki a képernyőre!
Deklaráció:
típus név( formális_paraméterek );
Definíció:
típus név( formális_paraméterek ) { törzs }
Példa függvények használatára:
#include <stdio.h> #include <math.h> void main(){ // A main függvény allján lévő függvények hívása nullParamVoid(); nullParamInt(); printf("%d\n\n", negyzetKerulet(5)); printf("%d\n\n", teglalapTerulet(3,4)); } void nullParamVoid(){ printf("Ez egy paraméter nélküli függvény, amelynek nincs visszatérési értéke.\n\n"); } int nullParamInt(){ printf("Ez egy paraméter nélküli függvény, amelynek 1 a visszatérési értéke.\n\n"); return 1; } // Egy egyparaméteres fgv, ami kiszámítja egy négyzet kerületét az oldalhosszból int negyzetKerulet(int a){ int kerulet; kerulet = 4*a; return kerulet; } // Egy többparaméteres fgv, ami kiszámítja egy téglalap területét a két oldalhosszból int teglalapTerulet(int a, int b){ float terulet; terulet = sqrt((a*a)+(b*b)); return terulet; }
Feladat: Írj egy függvényt, ami összead két egész értéket, és visszatér az eredménnyel! Írj egy programot is, ami felhasználja ezt!
A házi feladatot megoldani nem kötelező és bemutatni sem kell, viszont a következő gyakorlaton visszakérhető (kikérdezés, táblához hívás, stb. formájában)! Ha a hallgató megoldása ötletes, szép kivitelezésű, plusz pont adható. Amennyiben viszont nem tudja megoldani gyakorlaton a házi feladatban szereplő példákat vagy nem tud válaszolni az azzal kapcsolatban feltett kérdésekre, mínusz pont adható. Plusz és mínusz pontból is egyaránt maximum 10 pontot gyűjthet össze egy-egy hallgató.
Házi feladat letöltése .
További gyakorló feladatok letöltése . Programok a gyakorló példákhoz: kifejezes.c .
Még több gyakorló feladat letöltése . Programok a gyakorló példákhoz: globals.c , muvint.c , muvreal.c .
Elgondolkodtató feladatok letöltése .
Még több feladat található a PUB-ban ( /n/pub/ProgramozasAlapjai/Gyakorlat/gyak03 ).
Téma:
Linux alapok: 1. és 2. gyakorlat anyaga.
Gyakorlásra:
A honlapomon az 1. és 2. gyakorlathoz tartozó anyag, magyarázatokkal, példákkal.
A gyakorlatok végén lévő házi feladat és gyakorló feladatok megoldása.
A honlapom mellet további feladatok találhatóak a PUB-ban. (/n/pub/ProgramozasAlapjai/Gyakorlat/ - erős átfedés van az "itt" és "ott" található feladatok között).
Egyéb infó:
A gyakorlat 8:10-kor kezdődik és a ZH-t 8:15-kor kezdhetitek írni. Előreláthatóan 30 percetek lesz a feladatok megoldására és beadására (tehát 8:45-ig). A feladatokat a bíró rendszeren keresztül fogjátok megkapni és beadni is, de értékelni (javítani) én fogom. Aki késik, az is csak a fenti időintervallum alatt írhatja a ZH-t (a bíró rendszer nyit, majd automatikusan zár is). Hiányozni csak igazolással lehet, de a ZH akkor sem pótolható!
Vissza a lap tetejére.