Kurs C++ - Michał Widle.pdf

(208 KB) Pobierz
1214196 UNPDF
J¦zykC++,studiaj¦zykowe
MichałWilde
1Strukturaprogramu
Poni»szyprzykładpokazujenajprostszyprogramwj¦zykuC.Efektemdziałaniaprogra-
mub¦dzienapis”Witaj±wiecie!”wysłanydostandardowegourz¡dzeniawyj±ciowego.
//programdrukuj¡cynapis"Witaj±wiecie!"
#include<stdio.h>
intmain(intargc,char**argv)
{
printf("Witaj±wiecie!\n");
return0;
}
Pierwszaliniaprogramutokomentarz.Dwauko±nikioznaczaj¡,»etekstnast¦puj¡cy
ponicha»doko«caliniijestignorowany.Je±lijestpotrzebnykomentarzw±rodkulinii
tomo»nagozacz¡¢uko±nikiemzgwiazdk¡( /* )izako«czy¢gwiazdk¡zuko±nikiem( */ ).
Wtrzeciejlinii(uwzgl¦dniaj¡cliniepuste)mamydyrektyw¦kompilatora,którana-
kazujekompilatorowiwczytaniestandardowegoplikunagłówkowegozestandardowymi
operacjiwej±cia/wyj±cia.Plikinagłówkowes¡plikamitekstowymi.Bardzowieletakich
plikówjestdostarczanychzkompilatorem.Oprócztegou»ytkownikmo»etworzy¢wła-
sneplikinagłówkowe.Plikinagłówkowes¡potrzebnekompilatorowiabywiedziałjakie
funkcjes¡dost¦pneijakiemaj¡parametry.Senspisaniawłasnychplikównagłówkowych
jestdopierowtedygdynaszprogrampodzielimynamoduły.
Wła±ciwewykonanieprogramurozpoczynasi¦odwywołaniafunkcjimain.Ka»da
funkcjawj¦zykuCskładasi¦zdwóchcz¦±ci:nagłówkafunkcjiiciałafunkcji.Nagłó-
wekfunkcjiskładasi¦zdeklaracjitypuwyniku(tu: int czyliliczbacałkowita),nazwy
funkcji(tu: main )ilistyparametrówformalnych(tudwaparametry: argc typucałkowi-
tegoi argv ,któryjesttablic¡wska¹nikównała«cuchy).Nagłówektejwyj¡tkowejfunkcji
mainjestnarzucony.Wyniktokodbł¦du.Je±lifunkcjamainzwróci0toznaczy,»epro-
gramwykonałsi¦poprawnie.Je±liwarto±¢wi¦ksz¡odzeratoznaczy,»enast¡piłbł¡d
otymwła±nienumerze.Pierwszyparametrfunkcji main ,mówiileparametrówpodał
u»ytkownikponazwiefunkcji.Parametr argc jestrówny1je±liu»ytkownikniepodał
»adnegoparametru,2,je±lipodałjedenparametritp.Parametrargcjestwi¦kszyo1
odliczbyparametrówprogramugdy»przystarcieautomatyczniejestdodawanapełna
nazwauruchamianegoprogramu( argv[0] ).Drugiparametr( argv )jesttablic¡wska¹ni-
kówwskazuj¡cychnakolejneparametryprogramu.Zerowyelementtejtablicy( argv[0] )
wskazujenapełn¡nazw¦programu,pierwszyelement( argv[1] )pokazujenapierwszy
parametrprogramuitd.
Pierwsz¡instrukcj¡funkcjimainjestwywołaniefunkcji printf .Tafunkcjasłu»ydo
wysyłaniasformatowanychwydrukówdostandardowegourz¡dzeniawyj±ciowego.Format
wydrukuokre±lapierwszyparametrfunkcjiprintf.Jesttoła«cuch.Jegoznakis¡wysyłane
dostandardowegourz¡dzeniawyj±ciowegoa»donapotkaniaznaku % .Znak % oznacza,
1
»ewtymmiejscunale»ypodstawi¢parametrwyst¦puj¡cyzaformatem(drugiparametr
funkcji printf ).Napotkaniedrugieznaku % oznacza,»ewtymmiejscunale»ypodstawi¢
drugiparametrpoformacie(trzeciparametrfunkcji printf ).Poznaku % musinast¡pi¢
dodatkoweokre±lenietypuparametru(np. s –ła«cuchznaków, d –liczbacałkowita,
u –liczbacałkowitabezznaku, x –liczbacałkowitazapisanaszesnastkowo, f –liczba
zmiennoprzecinkowa, c –znakitp.).Wnaszymprogramie,wformacieniewyst¦puj¡
znaki % dlategopoformacieniema»adnychparametrów.
Drug¡instrukcj¡funkcjimainjestwykonaniepowrotuizadeklarowaniakodubł¦du
zwracanegoprzezt¡funkcj¦(tu0,czyliprogramwykonałsi¦poprawnie).
Wj¦zykuCposzczególneinstrukcjeko«czymyznakiem ; (±rednik).
Zadanie1.Cowydrukujeponi»szyprogram?
#include<stdio.h>
intmain(intargc,char**argv)
{
printf("Witaj/*±wiecie*/!\n");
return0;
}
2Kompilacjaikonsolidacja
Abymo»nabyłoskompilowa¢program,nale»ynajpierwgonapisa¢przyu»yciudowol-
negoedytoratekstowegoizapisa¢wplikunp.podnazw¡ hello.cpp .Dokompilacji
ikonsolidacjiprogramuzostanieu»ytydarmowykompilatorfirmyBorlandwwersji5.5,
którymo»napobra¢zserwerafirmyInprise(dawniejBorland)podadresem:
ftp://ftpd.inprise.com/download/bcppbuilder/freecommandLinetools.exe.
Natymsamymserwerzeznajdujesi¦równie»darmowydebuggerpracuj¡cywtrybie
tekstowym:
ftp://ftpd.inprise.com/download/bcppbuilder/TurboDebugger.exe.
Kompilacj¦ikonsolidacj¦mo»nawykona¢wjednymwywołaniuprogramu bcc32 .
Poniewa»±cie»kado bcc32 (domy±lnie c:\borland\bcc55\bin )musiby¢zadeklarowana
w PATH ,dlategowystarczynapisa¢:
bcc32-tWC-Lc:\borland\bcc55\lib-Ic:\borland\bcc55\includehello.cpp
Opcja -tWC informujekompilator,»ejesttoaplikacjakonsolowa,opcja -L informuje
kompilatorgdzieznajduj¡si¦bibliotekipotrzebnedokonsolidacji,opcja -I informuje
kompilatorgdzieznajduj¡si¦plikinagłówkowe.
Tenprocesmo»nawykona¢wdwóchkrokach.Kompilacjewykonujemypoleceniem:
bcc32-c-tWC-Ic:\borland\bcc55\includehello.cpp
Parametr -c oznacza,»eby bcc32 tylkoskompilowałpodanyprogram.Natomiast
konsolidacj¦wykonujemypoleceniem:
2
ilink32-c-Lc:\borland\bcc55\libc0x32.objhello.obj,hello.exe,
hello.map,cw32.libimport32.lib
Parametr -c oznaczacasesensive(wra»liwo±¢nawielko±¢liter), c0x32.obj jestko-
demstartowymdlaaplikacjikonsolowych, hello.obj jestplikiempo±rednimotrzyma-
nympokompilacji, hello.exe jestnazw¡plikuwynikowego, hello.map ,nazw¡pliku
zsymbolami,a cw32.lib i import32.lib dwiemaobowi¡zkowymibibliotekamidlaapli-
kacjijednow¡tkowych.
Mo»nastworzy¢du»okrótsz¡aplikacj¦.Je±lizamiastbiblioteki cw32.lib u»yjemy
cw32i.lib toprogramb¦dziewymagałobecno±cibibliotekidynamicznej cc3250.dll .Ta
bibliotekamusiby¢dost¦pnaw PATH (najlepiejj¡umie±ci¢wkatalogu c:\windows\system )
ilink32-c-Lc:\borland\bcc55\libc0x32.objhello.obj,hello.exe,
hello.map,cw32i.libimport32.lib
Gotow¡aplikacj¦uruchamianyprzeznapisanienazwy(tu: hello.exe albotylko
hello )plikuwykonywalnego.
3Automatyzacjakompilacjiikonsolidacji
Proceskompilacjiikonsolidacjimo»nazautomatyzowa¢.Jesttoszczególniewa»neprzy
wi¦kszychprojektach.Dozautomatyzowaniaprocesukompilacjiikonsolidacjimo»na
wykorzysta¢standardowenarz¦dziewchodz¡cewskładpakietuFreeCommanLineTools,
czyli make .Najprostszyplikdlaprogramumakemo»emie¢posta¢:
hello.exe:hello.cpp
bcc32-tWC-Lc:\borland\bcc55\lib-Ic:\borland\bcc55\includehello.cpp
Wpierwszejliniaprogramistaokre±liłjakijestcelkompilacji(tu: hello.exe )apo
dwukropkuokre±liłjakieplikiwchodz¡wskładprojektu.Wdrugiejliniiprogramista
okre±liłconale»yzrobi¢abytencelosi¡gn¡¢.Reguła(pierwszalinia)musiby¢napisana
bezodst¦puzlewejstrony,akomendatejregułymysiby¢napisanazconajmniejjedn¡
spacj¡odst¦pu.
Je±lipiszemydu»ojednomodułowychprogramówtomo»napisa¢jedenuniwersalny
makefile.mak (tojestdomy±lnanazwaprojektugdyuruchomimyprogram make bez
parametrów).Abyrozró»ni¢projektymo»naprzywywołaniuprogramu make definiowa¢
stał¡(np.onazwie SRC )owarto±cirównejnazwiekompilowanegoprogramu.Wpliku
makefile.mak mo»naodwoływa¢si¦dostałychprzeznapisanie $(xxx) gdzie xxx jest
identyfikatoremstałej.
CC=c:\borland\bcc55\bin\bcc32
LIB=c:\borland\bcc55\lib
INC=c:\borland\bcc55\include
OPT=-5-tWC
$(SRC).exe:$(SRC).cpp
$(CC)$(OPT)-L$(LIB)-I$(INC)$(SRC).cpp
Opcjakompilatora -5 oznacza,»eprogramwynikowyb¦dzieoptymalizowanydla
procesoraPentium(inieb¦dziedziałałnawcze±niejszychprocesorach).Podobnyplik
dlaprogramumakemo»nanapisa¢gdyzale»ynamnarozdzieleniuprocesukompilacji
iprocesukonsolidacji.Przykładowyplik hello.mak mo»ewygl¡da¢nast¦puj¡co.
3
CC=c:\borland\bcc55\bin\bcc32
LINK=c:\borland\bcc55\bin\ilink32
LIB=c:\borland\bcc55\lib
INC=c:\borland\bcc55\include
STDLIB=cw32.libimport32.lib
CCOPT=-5-v-tWC
LINKOPT=-v
.cpp.obj:
$(CC)-c$(CCOPT)-I$(INC)$<
hello.exe:hello.obj
$(LINK)-c$(LINKOPT)-L$(LIB)c0x32.objhello.obj,hello.exe,hello.map,$(STDLIB)
hello.obj:hello.cpp
Opcje -v dlakompilatoraidlakonsolidatoraoznaczaj¡,»epowstanieaplikacjazpełn¡
informacj¡dladebugera.Wtymprzykładziezastosowanodefinicj¦regułyogólnej,mó-
wi¡cejconale»yzrobi¢gdywprogramiezaistniejepotrzebaprzekształceniuplikuzroz-
szerzeniem cpp naplikzrozszerzeniem obj .Wkomendzierealizuj¡cejtoprzekształcenie
zostałou»ytemakro $< ,którejestzast¦powaneprzezpełn¡nazw¦przekształcanegopli-
ku.Wostatniejliniimówi¡cejokonieczno±cizamiany hello.cpp na hello.obj niema
potrzebypisaniakomendyprzekształcaj¡cejgdy»jestonanapisanawregule .cpp.obj .
4Preprocesor
Preprocesordziałanazasadziewst¦pnejobróbkitekstubezwnikaniawzasadyj¦zykaC.
Dwiepodstawowedyrektywypreprocesorato:
Dyrektywa Opis
#include<nazwapliku> inkluzjazkatalogukompilatora
#include"nazwapliku" inkluzjazkataloguprojektu
#definesymbolci¡g definicjabezparametrów
#definesymbol(parametry)ci¡g definicjazparametrami
Rzadziejstosowanedyrektywyto:
4
1214196.007.png 1214196.008.png 1214196.009.png 1214196.010.png 1214196.001.png
Dyrektywa Opis
#undefsymbol odwołaniedefinicji
#ifwyra»enie
instrukcje
#else
instrukcje
#endif
kompilacjawarunkowa
#ifdefsymbol
instrukcje
#else
instrukcje
#endif
kompilacjawarunkowa
#ifndefsymbol
instrukcje
#else
instrukcje
#endif
kompilacjawarunkowa
Widentycznysposóbdefiniujesi¦deklaracjekompilatora.Tedyrektywyniemaj¡
wpływunapreprocesor,s¡przekazywanedokompilatoraidopieroonnaniereaguje.
Dwiewa»niejszedyrektywykompilatorato:
Dyrektywa Opis
#errorkomunikat przerwaniekompilacjizkomunikatembł¦du
#pragmaparametry zmianaopcjikompilacji
4.1Inkluzje
Pierwszaposta¢inkluzji( #include<...> )poszukujewskazanegoplikuw±cie»cestan-
dardowej(podanejwparametrachkompilatora)adruga( #include"..." )poszukuje
wplikuzprojektem.Preprocesorwstawitre±¢wskazanegoplikuwmiejscuwyst¡pienia
inkluzji.
4.2Definicje
Definicjapoleganatym,»ewtrakcieczytaniaplikuzkodem¹ródłowymprogramu
wszystkiewyst¡pienia symbolu s¡zast¦powaneprzez ci¡g .Symbolzostanierozpozna-
nyizast¡pionyje±lib¦dzieodr¦bnymsłowem(aniecz¦±ci¡innegosłowa)orazniemo»e
by¢cz¦±ci¡ła«cucha.Wtrakciezast¦powaniasymboluci¡giempreprocesordodaspacje
(przedizaci¡giem).Niewszystkiesymbolemo»nazdefiniowa¢.Mi¦dzyinnymizastrze-
»onesymboleto: DATE , TIME , FILE , LINE .Dwapierwszesymbole
przechowuj¡dat¦iczaskompilacji,trzeciprzechowujenazw¦kompilowanegoprogramu,
czwartynumerwła±niekompilowanejlinii.Dzi¦kidwómostatnimsymbolommo»napre-
cyzyjniepoinformowa¢u»ytkownikawjakimmoduleiwktórejjegoliniinast¡piłbł¡d.
Zadanie2.Cowydrukujeponi»szyprogram?
#include<stdio.h>
#definea10
5
1214196.002.png 1214196.003.png 1214196.004.png 1214196.005.png 1214196.006.png
Zgłoś jeśli naruszono regulamin