Történeti áttekintés
Programozás alapjai C nyelv 1. gyakorlat
•
Blaise Pascal (1623 - 1662), •
•
Charles Babbage (1792 - 1871) •
Szeberényi Imre
•
BME IIT
<
[email protected]>
•
© BME-IIT Sz.I.
2005.09.19 .
-1-
•
•
•
Elektromos, lyukkártya alapú gép népszámlálási adatok feldolgozására (1896-ban megalapítja a Tabulating Machine Company-t, melyet 1924-től IBM-ként ismerünk)
•
• • • •
MARK I. telefonreléken alapuló gép 18m hosszú, 2.5m magas gép, kb 300 ms egész összeadási sebesség
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
-3-
1951 Mikroprogramozás elve 1971 Intel 4004 1985 Intel iAPX386 ..................
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
© BME-IIT Sz.I.
2005.09.19 .
-4-
Neumann modell
• Utasítás és adat azonos közegben és formában van tárolva (tárolt program). • Az utasításszámláló által címzett adat lesz a következő utasítás. • Adat vagy utasítás? Csak annak értelmezésétől függ. • Szekvenciális utasítás végrehajtás. • Egydimenziós, lineáris címzésű memória. © BME-IIT Sz.I.
-2-
"Előzetes gondolatok egy számító berendezés logikai tervéről" című tanulmány EDVAC (1951) ezen alapuló gyakorlati megvalósítás
Neumann modell jellemzői
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
Neumann János (1946) •
Howard Aiken (IBM 1943) • • •
© BME-IIT Sz.I.
Történeti áttekintés
Hermann Hollerith (1860 - 1929) •
Az első példaprogramok az Analitical Engine-re
Programozás alapjai I. (C nyelv, gyakorlat)
Történeti áttekintés •
Analitical Engine - a mai digitális számítógépek előfutára, Bár a tervek jók voltak, a kor technológiai színvonalán elkészítésükre nem volt esély.
Ada Byron (1815 - 1852) •
Programozás alapjai I. (C nyelv, gyakorlat)
mechanikus 6 digites összeadó/kivonó gép
Operatív tár
BE
ALU
KI
Vezérlő egység
-5-
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
-6-
1
Processzor
Mai számítógép cím
ALU
Busz interfész
adat vezérlő jelek
Belső busz Vezérlő és Regiszterek
utasítás dekódoló
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
-7-
Jellegzetes gépi utasítások
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
-8-
Gépek programozása/használata
Egyszerű műveletek, de gyors végrehajtás: • adatok mozgatása (ld, st, in, out) • aritmetikai műveletek (add, sub, mul, div) • logikai műveletek (and, or, shift) • vezérlésátadó műveletek (jp, jz, call, ret) • veremkezelő műveletek (push, pop)
• • • •
Gépi kódban mindent a legutolsó műveletig Könyvtárak a közös feladatokra Monitorok - kötegelt feldolgozás Kezdeti op. rendszerek – B/K, fájl
• Mai operációs rendszerek – több felhasználó, több taszk, védelem, hálózat, valós idő, ...
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
-9-
Szoftver komponensek 1. felhasználó
fájlkezelés file kezelés 4. felhasználó
tárgazdálkodás
© BME-IIT Sz.I.
- 10 -
felhasználói felület hálózatkezelés
ütemezés védelem
periféria kezelés perifériakezelés
alkalmazói porgramok
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
Operációs rendszer feladatai
3. felhasználó
operációs rendszer
© BME-IIT Sz.I.
Operációs rendszer feladatai
számítógép 2. felhasználó
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
- 11 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 12 -
2
Programozás ≠ kódolás Fő lépései: • specifikáció • tervezés – algoritmus választás – adatszerkezet választás – nyelv választása
• kódolás • tesztelés • dokumentálás Programozás alapjai I. (C nyelv, gyakorlat)
Programozási paradigmák • • • • • • •
Nagyon fontos a lépések folyamatos ellenőrzése, dokumentálása !
© BME-IIT Sz.I.
2005.09.19 .
- 13 -
Program, algoritmus
2005.09.19 .
© BME-IIT Sz.I.
2005.09.19 .
- 14 -
• Szóban: – Olvass be egy számot és írd ki hogy páros-e!
• Folyamatábrával • Struktogrammal • Mondatszerű leírással (pszeudokód)
– Tevékenységek és döntések egy sorozata
© BME-IIT Sz.I.
Programozás alapjai I. (C nyelv, gyakorlat)
Algoritmus megadása
• Algoritmus + Adatstruktúra = program • Algoritmus
Programozás alapjai I. (C nyelv, gyakorlat)
Imperatív Deklaratív Objektum-orientált, Aspektus-orientált Üzenet-orientált, Függvény-orientált Adatfolyam-orientált, Esemény-orientált Szimbolikus ....
- 15 -
Programozás alapjai I. (C nyelv, gyakorlat)
Folyamatábra
© BME-IIT Sz.I.
2005.09.19 .
- 16 -
2005.09.19 .
- 18 -
Stuktogram
Start A
n
A páros ?
páratlan
be: A
i
nem
A páros ?
ki: páratlan
páros
igen
ki: páros
Stop Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 17 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
3
C programozási nyelv Egy kis történelem
Pszeudokód
• B, BCPL (1970) - típus nélküli nyelvek • FORTRAN, ALGOL • UNIX (1969)
Olvassd be A-t Ha A páros akkor írd ki: „páros” különben írd ki: „páratlan” vége
– 1973-ban újraírják C nyelven (~8000 C sor + 700 sor assembly nyelven)
be: A Ha A páros akkor ki: „páros” különben ki: „páratlan”
• A C nyelvet a legkülönbözőbb gépeken implementálták (mikro -> mainframe).
vége Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 19 -
Programozás alapjai I. (C nyelv, gyakorlat)
C nyelv jellemzői
© BME-IIT Sz.I.
2005.09.19 .
- 21 -
Programozás alapjai I. (C nyelv, gyakorlat)
C forrás (.c)
„Olvasható assembly”
Előfeld. forrás
PP
Szerk. gépi kód (.obj)
Ass
Más obj.
Gépi nyelvek (assembly) © BME-IIT Sz.I.
© BME-IIT Sz.I.
2005.09.19 .
- 22 -
Hagyományos C fordító
Magas szintű nyelvek
Programozás alapjai I. (C nyelv, gyakorlat)
- 20 -
• Standard függvénykészlet, ami nem része a nyelvnek de elengedhetetlen. • Nyelvi szinten közvetlenül nem támogatja a dinamikus adatszerkezeteket. • Nyelvi szinten nem támogatja a konkurens programozást és az ahhoz tartozó szinkronizációs mechanizmusokat.
C nyelv jellemzői (3)
C nyelv
2005.09.19 .
C nyelv jellemzői (2)
• Magas szintű nyelvekre jellemző adatszerkezetek és vezérlési struktúrák. • Hatékony gépközeli megfogalmazás. • Rendszerprogramozási nyelv. • Függvényorientált, egyszintű . • Rekurzív fv. hívási lehetőség. • Kevésbé szigorú típusellenőrzés. Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
Gépi nyelv (assembly) Link
Könyvtár (.lib) 2005.09.19 .
- 23 -
Programozás alapjai I. (C nyelv, gyakorlat)
C0
© BME-IIT Sz.I.
Közb. kód C1
Futtatható kód (.exe) 2005.09.19 .
- 24 -
4
preprocesszor dolgozza fel
Hagyományos C fordító (2) • Közbülső kód minden olyan információt hordoz, ami a kódgeneráláshoz szükséges. • C1 átírása egy új architektúrához 2-3 mérnökhónapba telik. • Ezen kívül implementálni kell a könyvtári függvényeket, melyek többnyire C nyelven vannak megírva.
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
Első program
#include <stdio.h> main() azonosító { printf(”Hello Cicus!\n”); }
c:> cc elso.c c:> elso.exe c:> Hello Cicus! c:>
könvtári függvény - 25 -
Programozás alapjai I. (C nyelv, gyakorlat)
Nyelvek szabályainak megadása
© BME-IIT Sz.I.
2005.09.19 .
- 26 -
Szintaxis diagram
• Erőteljes magyarázat
irányított gráf nem terminális szimbólum
• Leíró vagy metanyelv (pl. BNF)
tovább bontható
– szabványokban, könyvekben (pl. K&R) Terminális szimbólum
• Szintaxis diagram
nem bontható tovább
– referencia kártyákon Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 27 -
Szintaxis diagram példák előjeles dec. szám:
dec. szám:
::= |
2
-
3
dec. számjegy:
- 28 -
definíció vagy kapcsolat
4
Példa: <előjeles dec. szám> ::= + <dec. szám> | <dec. szám> | - <dec. szám>
5
dec. számjegy
2005.09.19 .
tovább bontható fogalom v. szimb.
1
dec. szám
© BME-IIT Sz.I.
BNF (Backus-Naur Form) 0
+
Programozás alapjai I. (C nyelv, gyakorlat)
6 7 8 9
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 29 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 30 -
5
EBNF (Extended BNF)
EBNF példák <előjeles dec. szám> ::= [ + | - ] <dec. szám> <dec. szám> ::= <dec. számjegy> + <dec. számjegy> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
tovább bontható fogalom v. szimb. ::= | < >+ < >* { }
definíció vagy kapcsolat ismétlődés egyszer v. többször ismétlődés nullaszor v. többször u.a. mint a * (gyakran használják)
<dec. szám> ::= <dec. számjegy> [ <dec. szám> ]
[ ] ( )
ismétlődés nullaszor v. egyszer csoportosítás, de a {}-t is használják a csillag használatakor
::=
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
::= { | <számjegy> } ::= { | <számjegy> } *
- 31 -
Programozás alapjai I. (C nyelv, gyakorlat)
C nyelv szintaktikája
<számjegy> © BME-IIT Sz.I.
fordítási_egység: külső_deklaráció fordítási_egység külső_deklaráció
összetett utasítás
külső_deklaráció: függvénydefiníció deklaráció függvénydefiníció: deklaráció_sp.opc deklarátor dekl_lista.opc összetett_ut. © BME-IIT Sz.I.
2005.09.19 .
- 33 -
Két szám összege
a, b
Az adatokat változókban tároljuk
Programozás alapjai I. (C nyelv, gyakorlat)
fv. argumentum © BME-IIT Sz.I.
2005.09.19 .
- 34 -
– az értékkészletet, – a konstansokat, – a művelethalmazt, – néha belső tárolási formát is, bár ezt többnyire az implementáció határozza meg.
c Stop © BME-IIT Sz.I.
standard függvény hívása
külső deklaráció
• Változókban tároljuk az adatokat. • A változókat azonosítóval nevezzük el. • A változó típusa meghatározza:
program = algoritmus + adatstruktúra
Programozás alapjai I. (C nyelv, gyakorlat)
#include <stdio.h> main() { printf(”Hello Cicus!\n”); }
standard I/O-ra vonatkozó definiciók
Változó, azonosító, típus
Start
c:= a + b
- 32 -
Első program újból
EBNF-hez hasonló, de más jelölésekkel:
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
2005.09.19 .
- 35 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 36 -
6
C nyelv típusai
Változók deklarálása
• Egyszerű típusok – karakter, egész, valós, felsorolás
A C nyelvben minden változót deklarálni kell.
• Összetett vagy származtatott típusok
int AlMa;
– tömb, struktúra, unió, függvény, mutató, bitmező
char ch; float x;
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 37 -
Két egész szám összege #include <stdio.h> main() { int a, b, c;
2005.09.19 .
- 38 -
Egész típus (int) [ INT_MIN, INT_MAX ] -ban definiált
formátum lista (string)
}
• konstansok: decimális (12), oktális (012), hexa (0x12), előjeletlen (12u), hosszú (12L) • művelethalmaz (operátorok): értékadó aritmetikai, logikai, bitenkénti, relációs • belső ábrázolás: legtöbb implementációban kettes komplemens.
változó
formátum megadás következik © BME-IIT Sz.I.
2005.09.19 .
- 39 -
Egész típus (példák)
© BME-IIT Sz.I.
2005.09.19 .
- 40 -
• bit -> kétállapotú (igaz, hamis), (1, 0) (piros, zöld), (hideg, meleg) stb. • n db bit -> 2n különböző információ • A jelentés (értelmezés) tőlünk függ. • Előjeletlen egészekre kézenfekvő. • Hogyan érdemes előjeles számokat ábrázolni?
a = 123; ui = 123; b = 0123; hosszu = 0x23AL; rovid = 34;
© BME-IIT Sz.I.
Programozás alapjai I. (C nyelv, gyakorlat)
Adatok ábrázolása
register int a, b; long int hosszu; unsigned int ui; short int rovid;
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
• értékkészlet: egészek tárolására alkalmas
scanf(”%d %d”, &a, &b); c = a + b; printf(”c = %d\n”, c);
Programozás alapjai I. (C nyelv, gyakorlat)
Programozás alapjai I. (C nyelv, gyakorlat)
Memóriában keletkezik egy egész típusú változó tárolására alkalmas hely
2005.09.19 .
- 41 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 42 -
7
Előjeles egészek ábrázolása • • • •
Előjeles abszolútértékes előjel
előjeles abszolútértékes eltolt nullpontú (egyes) komplemens kettes komplemens
abszolút érték
A továbbiakban 4 biten vizsgáljuk meg ezen módszerek lényegét.
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 43 -
Eltolt nullpontú
Programozás alapjai I. (C nyelv, gyakorlat)
Néhány példa: 0001 = +1 0101 = +5 0000 = 0
© BME-IIT Sz.I.
2005.09.19 .
~0001 1110 = -1 - 45 -
Kettes komplemens
~0101 1010 +0001 1011 = -5
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 44 -
~0101 1010 = -5
Programozás alapjai I. (C nyelv, gyakorlat)
Összeadás egyszerű összeadóval: 1110 = -1 +0001 = +1 1111 = -0
© BME-IIT Sz.I.
2005.09.19 .
- 46 -
Kettes komplemens (2) A legmagasabb helyiértékű bit előjel bitként viselkedik. A szám abszolút értékének kiszámításához az előző szabályt kell követni (komplemens +1)
Ha X negatív, akkor abszolút értékét komplementáljuk majd hozzáadunk egyet, egyébként binárisan ábrázoljuk.
~0001 1110 +0001 1111 = -1
© BME-IIT Sz.I.
Ha X negatív, akkor abszolút értékét komplementáljuk (bitenként negáljuk), egyébként binárisan ábrázoljuk. Összeadás egyszerű összeadóval: 0111 = -1 +1001 = +1 0000 = -8
Néhány példa: 0001 = +1 0101 = +5 0000 = 0
Programozás alapjai I. (C nyelv, gyakorlat)
Összeadás egyszerű összeadóval: 0001 = +1 +1001 = -1 1010 = -2
Komplemens v. egyes kompl.
Legyen pl. a nulla az 1000 érték! Néhány példa: 0000 = -8 ... 0110 = -2 0111 = -1 1000 = 0 1001 = +1 1010 = +2 ... 1111 = +7
Néhány példa: 0001 = +1 0010 = +2 1010 = -2 1111 = -7 0111 = +7 0000 = +0 1000 = -0
Összeadás egyszerű összeadóval: 1111 = -1 +0001 = +1 0000 = 0 2005.09.19 .
- 47 -
Példa: 1110 = ? 0001 +0001 0010 = -2
Programozás alapjai I. (C nyelv, gyakorlat)
Def. szabály: X
© BME-IIT Sz.I.
X, ha X nem negatív 2n-|X|, ha X negatív
2005.09.19 .
- 48 -
8
Eredmény hihetősége 0101 = +5 +0101 = +5 1010 = ?-6 ~1010 0101 +0001 0110 = 6
Feladat: Hány bites az int ? Ötlet: • Egy int értéket állítsunk 1-re! • Szorozzuk addig kettővel, amíg az eredmény pozitív! • Számoljuk meg, hogy hányszor tudtuk szorozni!
Két pozitív szám összege negatív lett! Miért? Kiléptünk a számábrázolási tartományból! (A +10 már nem ábrázolható 4 biten!)
Szorzás kettővel: 0001 0010 0100 1000
A legtöbb magas szintű nyelv nem jelzi az egész aritmetika túlcsordulását! Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 49 -
Programozás alapjai I. (C nyelv, gyakorlat)
Valós típus (float, double)
© BME-IIT Sz.I.
2005.09.19 .
- 50 -
Valós típus (példák)
• értékkészlet: valós értékek tárolására [ FLT_MIN, FLT_MAX ], [DBL_MIN, DBL_MAX] -ban definiált
float f1, f2; double d1, d2; long double ld1, ld2;
• konstansok: 3., 3.14, 5e-2, -4.12f, 3.2L • művelethalmaz: értékadó, aritmetikai, relációs • belső ábrázolás: lebegőpontos Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
f1 = 3.; /* törtrész elmaradt */ f2 = .312; /* egészrész elmaradt */ d1 = 45.34; ld1 = 1e-23; /* tizedespont elmaradt */
- 51 -
Programozás alapjai I. (C nyelv, gyakorlat)
Valós számok ábrázolása
© BME-IIT Sz.I.
2005.09.19 .
- 52 -
Fixpontos ábrázolás Fixpontos ábrázolás (8 biten a példa kedvéért):
• Fixpontos ábrázolás • Lebegőpontos ábrázolás
előjel
.
egészrész
törtrész kettedespont
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 53 -
Néhány példa: 0001.1000 0010.0100 1001.1100 0000.0001
Programozás alapjai I. (C nyelv, gyakorlat)
= = = =
+1.5 +2.25 -1.75 +0.0625
Legkisebb absz: 0.0625 Legnagyobb absz: 7.9375 © BME-IIT Sz.I.
2005.09.19 .
- 54 -
9
Lebegőpontos ábrázolás
Lebegőpontos ábrázolás(2)
Lebegőpontos ábrázolás (8 biten a példa kedvéért): előjel (s)
s
kettedespont
. mantissza (m) karakterisztika (k) eltolt nullp. Programozás alapjai I. (C nyelv, gyakorlat)
Lebegőpontos ábrázolás (8 biten a példa kedvéért):
k
X = (-1) * 2 * m ahol: 1 <= m < 2
X = (-1)s * 2k * m ahol: 1 <= m < 2, ezért m 1.xxx alakú (+1 bit)
20 * 1.5 =+1.5 01001100 21 * 1.125=+2.25 01011001 -20* 1.75 =-1.75 11001110 2-4* 1.00 =+0.0625
© BME-IIT Sz.I.
2005.09.19 .
- 55 -
min(k) = -4, min(m) = 1+2-4 = 1.0625 min(|X|) = 2-4 * (1+2-4) ≅ 0.0664 max(k) = 3, max(m) = 1.9735 max(|X|) = 23 * 1.9735 ≅ 15.788 ε = 2-4 Programozás alapjai I. (C nyelv, gyakorlat)
Valós számok halmaza
-max
x+ε
-min 0 min
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
- 57 -
IEEE szabvány (2)
s
k
m'
m’ = m-1
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 58 -
• Elvégzi adatok konvertálását a belső és külső ábrázolásnak megfelelően. A külső ábrázolás szöveges, a belső gépi. • printf(formátum, adat1, adat2, adat3, ...) • scanf(formátum, cím1, cím2, cím3, ....)
max(k) = 127, max(m) ≅ 2 max(|X|) ≅ 2127 * 2 = 2128 = 3.4e+38 ε = 2-23 ≅ 1.2e-7
printf("a=%d b=4.2%f", a, 9.84);
Nem egyezik az FLT_MIN értékkel! (1.175e-38)
© BME-IIT Sz.I.
Egyszeres pontosság 32 biten: s = 1 bit, k = 8 bit (eltolt nullpontú +127), m’ = 23 bit
Adatok beolvasása/kiírása
min(k) = -126, min(m) = 2-23 min(|X|) = 2-126 * 2-23 = 2-149 ≅ 1.4e-45
Programozás alapjai I. (C nyelv, gyakorlat)
- 56 -
Speciális értékek: k = 255 ∧ m’ ≠ 0 --> Nem érvényes szám k = 255 ∧ m’ = 0 --> ±∞ k = 0 ∧ m’ = 0 --> 0 0 < k < 255 ∧ m’ ≠ 0 --> X = (-1)s * 2k-126 * m k = 0 ∧ m’ ≠ 0 --> X = (-1)s * 2-126 * m’
max
© BME-IIT Sz.I.
2005.09.19 .
IEEE szabvány
A ábrázolás miatt nem csak egy alsó és felső határ keletkezik, hanem a folytonos számegyenes egymástól nem megkülönböztethető számokat tartalmazó darabokra esik szét. x-ε x
© BME-IIT Sz.I.
2005.09.19 .
formátum
adat
cím
scanf("%d %f", &a &b); - 59 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 60 -
10
Print függvény (printf)
printf formátuma %[flags][size][.prec][lengt]type • type: diouxXpfeEgGcsn%
• A formátumlistából tudja, hogy milyen formában kell kiírnia a belső ábrázolású adatot. • Nem nyelvi elem! Nincs lehetőség annak ellenőrzésére, hogy a formátumlista és a paraméterek száma/típusa összhangban van-e. • Az inkonzisztencia veszélyes hibaforrás is lehet.
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
d, i, u decimális egész (u - előjeletlen) o oktális egész x, X hexadecimális egész p pointer f lebegőpontos (±dd.pp) e, E tudományos lebegőpontos (±dd.ppe±xx) g, G e vagy f, amelyik a rövidebb c karakter s string n kiírt karakterek számát az arg-ba teszi (int *)
- 61 -
printf formátuma (2)
2005.09.19 .
- 63 -
printf formátuma (4)
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 64 -
printf formátuma (5)
%[flags][size][.prec]type • size: Egész szám vagy *
%[flags][size][.prec]type • prec: Egész szám vagy *
* Esetén a méretet az argumentumlista következő eleme adja, ami int típusú kell hogy legyen. Értelmezés: minimális mezőszélesség (ha nem fér bele, akkor nem csonkol!);
© BME-IIT Sz.I.
- 62 -
- balra igazítás + előjel a pozitív értékre is szóköz: pozitiv érték előjele szóköz lesz (alap); e és f formátumoknál mindig van tizedespont # oktális számok 0-val hexa számok 0x-szel 0 bevezető nullák kiírása
Lebegőpontos formátumban a float és double értékek egyaránt kiírathatók. Integer formátumban bármely skalár típus kiíratható.
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
%[flags][size][.prec]type • flags: -+#0
h short, vagy unsigned short típushoz l long vagy unsigned long típushoz L long double típushoz
© BME-IIT Sz.I.
© BME-IIT Sz.I.
printf formátuma (3)
%[flags][size][.prec][length]type • length: hlL
Programozás alapjai I. (C nyelv, gyakorlat)
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
* Esetén a méretet az argumentumlista következő eleme adja, ami int típusú kell hogy legyen. Értelmezés formátumfüggő: – int formátum: a számjegek minimális száma – e és f formátum: a tizedesjegyek száma; – g formátum: lényeges számjegyek száma – s formátum: karakterek maximális száma - 65 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 66 -
11
printf példák
Scan függvény (scanf) • A formátumlistából tudja, hogy milyen belső formába kell konvertálnia a beolvasott adatot. • A formátumlista nem speciális karaktereit megkövetelt inputként kezeli (illeszt). • Az illeszkedést a visszatérési értékben jelzi. • Nem nyelvi elem! Nincs lehetőség annak ellenőrzésére, hogy a formátumlista és a paraméterek száma/típusa összhangban van-e. • Az inkonzisztencia nagyon veszélyes hibaforrás is lehet.
printf("a=%d b=%03X c=%3.1f", 1, 18, 9.86); a=1 b=012 c=9.9 printf("a=%d b=%03X", 1, 18, 9.84); printf("a=%d b=%03X c=3.1%f", 1, 18); int i = 2005; printf("%f", i); printf("%c", i); Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 67 -
scanf formátuma
2005.09.19 .
- 68 -
[...] Karaktersorozat illesztés. A zárójelekben levő szereplő karakterek (illesztési halmaz) sorozatát beolvassa és a char * argumentumba teszi lezáró nullával. [A-Z] Karakter sorozat illesztés az intervallumba eső karakterekre (pl. nagybetűk). [^...] Karakter sorozat illesztés. A halmazra nem illeszkedő karaktersorozatot olvas be. []...-] ] és - jelek is a halmazban vannak. A ] jel csak elöl lehet, - csak a végén. n beolvasott karakterek számát az arg-ba teszi
d, u decimális egész (u - előjeletlen) i decimális egész (oktális, hexa) o oktális x, X hexadecimális p pointer f,e,E,g,G lebegőpontos szám c karakter s string © BME-IIT Sz.I.
© BME-IIT Sz.I.
scanf formátuma (2)
%[*][size][lengt]type • type: diouxXpfeEgGcsn%
Programozás alapjai I. (C nyelv, gyakorlat)
Programozás alapjai I. (C nyelv, gyakorlat)
2005.09.19 .
- 69 -
scanf formátuma (3)
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 70 -
scanf formátuma (4)
%[*][size][length]type • length: hlL
%[*][size][lengt]type • *: A beolvasott érték nem tárolódik, azaz a címlistán nem tartozik hozzá cím. • size: egész szám, ami a mező maximális méretét adja meg.
h short, vagy unsigned short típushoz l long, unsigned long, vagy double típushoz L long double típushoz
Nagyon fontos a helyes méret megadása. Rossz megadás végzetes hibához vezethet. Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 71 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 72 -
12
scanf működése
scanf példák scanf("%d%d", &a, &b); // két decimális szám scanf("%d-%d", &a, &b); // dec.szám kötőjellel scanf("a=%d", &a); // a=decimális szám scanf("%*[A-Z]=%d", &a); // AZON=dec.szám
A scanf megpróbálja az inputot illeszteni a formátumra, mint mintára. A nem %-kal kezdődő karaktereket mintának tekinti, aminek pontosan illeszkedni kell. Kivéve a whitespace karakterek, melyek tetszőleges számú whitespace karakterből álló sorozatot jelentenek az inputon. Visszatérési értékben jelzi, hogy hány beolvasást végzett el sikeresen. Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
karakterbe olvas stringet
char c; scanf("%s", &c); double x; scanf("%f", &x);
double-be float-ot
Megjegyzés: printf-fel lehet %f-fel double-t kírni. Miért ? - 73 -
Programozás alapjai I. (C nyelv, gyakorlat)
© BME-IIT Sz.I.
2005.09.19 .
- 74 -
13