Professional Documents
Culture Documents
karsresrkmμviFI C
C Programming
(practice)
-I-
vCBk
matikar
CMBUkTI 1 : karENnaM ................................................................................................8
1.1 Rbvtiþrbs;Pasa C ...............................................................................................................9
1.2 critlkçN³rbs;Pasa C .....................................................................................................9
lMhat; .......................................................................................................................... 16
CMBUkTI 2 : RbePT Types, RbmaNviFI Operations nigkenSam Expressions 18
2.1 eQμaHGBaaØt .......................................................................................................................19
2.2 RbePTTinñn½ynigTMhM ...........................................................................................................19
lMhat;......................................................................................................................................30
CMBUkTI 3: l½kçx½NÐ ...................................................................................................33
3.1 Xøanigbøúk............................................................................................................................34
3.2 Xøa if .................................................................................................................................34
lMhat;......................................................................................................................................38
-II-
vCBk
CMBUkTI 4: CMu Looping nigkareFIVeLIgvij Iteration.....................................40
4.1 kenSamBakübgÁab; .............................................................................................................41
4.2 kenSamBakübgÁab; while .................................................................................................43
lMhat; .....................................................................................................................................45
CMBUkTI 5: Arrays nig Strings .................................................................................48
5.1 Array mYyvimaRtnigeRcInvimaRt ..........................................................................................49
5.2 Strings ..............................................................................................................................50
lMhat; .....................................................................................................................................50
CMBUkTI 6 : GnuKmn_ Functions ..............................................................................52
6.1 mUldæanRKwHrbs;GnuKmn_ .....................................................................................................53
6.2 Arguments - Call by Value ..............................................................................................57
6.3 GnuKmn_nig Arrays ............................................................................................................58
6.4 KMrUedImGnuKmn_ ...................................................................................................................58
lMhat; .....................................................................................................................................59
CMBUkTI 7 : RbePTTinñn½yBisþabEnßm ..............................................................63
7.1 GBaaØtsV½yRbvtþi nig GBaaØtxageRkA ...................................................................................64
7.2 GBaaØt Static .....................................................................................................................69
-II-
vCBk
8.3 Pointers nig Arrays ..........................................................................................................87
8.4 Arrays én Pointers ...........................................................................................................89
lMhat; .....................................................................................................................................96
CMBUkTI 9: Memory EdlTukeGacERbRbYlnig Structures EdlERbRbYl ..............97
9.1 Malloc, Sizeof, nig Free....................................................................................................92
lMhat; .....................................................................................................................................117
-IV-
vCBk
CMBUkTI 13: bBa©ÚlninbeBa©jTinñn½y (I/O):<stdio.h> ............................118
13.1 r)aykarN_kMhus .............................................................................................................. 119
13.2 Streams ............................................................................................................................ 120
13.3 mUldæanRKwH I/O ................................................................................................................. 121
13.4 kMnt;RTg;RTay I/O ............................................................................................................ 122
13.5 Files ................................................................................................................................. 126
13.6 I/O kMritTab ...................................................................................................................... 128
lMhat; ..........................................................................................................................129
CMBUkTI 14: GnuKmn_epSg² .................................................................................131
14.1 kareRbI String:<string.h> ......................................................................................132
14.2 karpøas;bþÚrtYrGkSrnigkarsakl,g:<ctype.h> ............................................................135
lMhat; ..........................................................................................................................139
CMBUkTI 15 : viFIRtYtBinitü : <stdlib.h>,<unistd.h> ..................................140
lMhat; ..........................................................................................................................146
-V-
vCBk
CMBUkTI 1 esckþIepþIm
Introduction
-1-
vCBk
muneBleyIgcab;epþImemIledaysegçbelIvaküsm<½n§mUldæanrbs; C nigrcnasm<½n§eyIgpþl;Rbvtþisegçb
én C nigBinitücritlkçN³rbs;Pasa C. enAkñúgkarrMlwkénemeronenHeyIgnwgBinitüelITsSn³vis½y
mUldæanénkmμviFI C dUcCarcnasm<½n§kmμviFI C karRbkasrbs;GBaaØt RbePTTinñn½y nigRbmaNviFI.
vaCaeKalbMNgrbs;eyIgedIm,Ipþl;nUvkarENnaMy:agrh½stameKalkarN_ C EdlRsedogeTAPasakMrit
x<s;bMput. enHKWCavaküsm<½n§ (syntax) GacxusKñabnþicbnþÜcb:uEnþKMnitdUcKñaebH bit.
C BitCamannUvkareFIVeGayPJak;ep¥IltictYc :
PasakMritx<s; (High level) CaeRcIndUcCa PASCAL KWmanvin½yy:agx<s;nigrcnasm<½n§.
EteTaHCay:agNak¾edayRbytñ½ -- C KWbt;EbneRcInEmnETnehIygaysikSa. esrIPaBenHpþl;eGay
C nUvGnuPaBCaxøaMgEdlGñkeRbIR)as;EdlmanbTBiesaFn_GacmankargareFIV.
1.1 Rbvtþirbs;Pasa C
RBwtþikarN_sMxan;enAkñúgkarGPivDÆn_CaPasarbs; C KWRtUv)ankt;RtaxageRkam :
UNIX )anGPivDÆn_enAkñúgqñaM 1969 -- DEC PDP-7 PasaAssembly
BCPL – gayRsYleRbIR)as OS pþl;RbeyaCn_GPivDÆn_]bkrN_GPivDÆnmkBI BCPL . Pasa
Assembler Bi)aksresrnigBi)akrkkMhusCaxøaMg.
1.2 critlkçN³rbs;Pasa C
eyIgkt;Rtay:agsegçbmYycMnYnBIcritlkçN³rbs; C EdlkMnt;Gtßn½yPasaenHnigk¾)annaMRbCa
RbiyPaBrbs;vaCaPasasresrkmμviFI. CaFmμtaeyIgnwgsikSaCaeRcInBIRTg;RTayTMagenHtamry³kmμviFI
sikSaenH.
-2-
vCBk
TMhMtUc
kareRbIR)as;d¾FMTUlayénkarehAGnuKmn_
karvayminBi)ak -- mindUcPasa PASCAL
PasaEdlmanrcnasm<½n§
GacsresrkmμviFIkMritTab (BitWise)y:aggayRsYl
karRbtibtþi Pointer - kareRbIR)as;d¾FMTUlayrbs; pointer kñúg memory array structures
nigGnuKmn_.
\LÚv C )anRtUveRbIR)as;y:agTUlayCaPasaCMnajsMrab;;ehtuplepSg².
vamankMritx<s;kñúgkarksag
vaGacedaHRsayskmμPaBkMritTab
vabegáItkmμviFIEdlmansmtßPaB
vaGacRtUv)an compile elIkarpøas;bþÚrerOy²énkMuBüÚT½r
TMnas;FMrbs;vaKWfava)anrkeXIjkMhuslM)akEdlGaceFIVeGayvaeTArkkEnøgcab;epþImvij. EteTaHCa
y:agNak¾edaykarBüayamkñúglkçN³enHGaceGayplCaTIeBjcitþcab;taMgBI)aneronc,ab;én C
C Statements
/* Sample program */
main()
{
printf( “I Like C \n” );
exit ( 0 );
}
cMNaM:
C RtUvkar semicolon mYyenAxagcugRKb;Xøa
-4-
vCBk
cUrRkeLkemIlXøae)aHecjmYyepSgeTot :
printf(``.\n.1\n..2\n...3\n'');
kare)aHecjrbs;vanwgGacCa :
.
.1
..2
...3
1.4 karbkRsaykmμviFI
enAkñúgemeronenHeyIgcab;epþImedayKUrCaRTgRTayRbtibtþikarmUldæanRKwHGñkcMa)ac;RtUveFIVTal;Etcb;
edIm,I compile kmμviFI C (b¤ C++). bnÞab;mkeyIgRbtibtþielIkarBiBN’naCak;lak;KMrURbtibtþikar C
ehIynigrebob C KaMRTbNÑal½ybEnßm :
- Source file: ASCII file sresredayPasa C ( *.c)
man C compiler CaeRcIn. cc Ca Sun compiler BIedIm. GNU C compiler gcc KWmanRbCaRbiynig
GaceRbI)ansMrab;; platform CaeRcIn. GñkeRbIR)as; PC k¾GacecHeRbI Borland bcc compiler Edr.
vak¾man compiler C++ EdlesμI EdlEtgEtbgðajR)ab;eday CC (cMNaM GkSrFM CC. ]TahrN_ Sun
pþl;eGay CC nig GNU GCC). GNU compiler k¾)anbgðajR)ab;eday g++ .
enAkñúgesovePAenH eyIgeRbI Visual C++ 6.0 compiler EdlRtUv)anbegáItedayRkumh‘un Microsoft
nigGaceRbI)ankñúg PC. Visual C++ 6.0 pþl;eGaynUvbrikçasresrkmμviFIgayRsYl gayRsYlGPivDÆn¾
user Interface MFC(Microsoft Foundation Class) nigCaKeRmagsresrkmμviFI window
-5-
vCBk
enHCarUbragrbs;Visual C++ 6.0.
Source Editing
Window
- Class View
- Resource
View
- File View
Output Display
Window
-6-
vCBk
bnÞab;mkeRCIserIsykRbePTénkarGnuvtþ console (console application) dUcKMrUGnuvtþenH
GñkGacEkERb file enAkñúg Source Editing Window bnÞab;mk compile nig link vaCamYyXøabBa¢a
Compile nig Build enAkúñg Build menu edayerog²xøÜn. dMNak;kalbnÞab;KWedIm,IdMeNIrkarRbtibtþi
-7-
vCBk
1.5KMrUkarbkRsay C
eyIgnwgsegçblkçN³KnøwHEdlsMxan;rbs;KMrU compile Pasa C
enATIenH.
rUb 1-1 KMrUkar compile Pasa C
9 The Preprocessor
enAkñúgEpñkenHeyIgcab;epþImedayKeRmagRbtibtþikarRKwHGñkcMa)ac;RtUvEtdMeNIrkaredIm,IeTAdl;kar
compile eyIgnwgsikSaEpñkenHénRbtibtþikar compile kñúglkçN³lMGitCagenHenAelIkeRkay.EteTaH
Cay:agNak¾edayeyIgRtUvkarcMeNaHdwgRKwHmYycMnYnsMrab;;kmμviFI C mYycMnYn.
Preprocessor RBmTTYlyk source code Cakare)aHcUlehIyCakarTTYlxusRtUvsMrab;;
bM)at;karBnül;
bkERb preprocessor directives Biesscg¥úlbgðajeday #
]TahrN_
#include – rab;bBa©ÚlKMniténeQμaH file. File TMagenaHEtgEtRtUv)anehAfa header files.
e.g
-8-
vCBk
#define – kMnt;Gtßn½yeQμaHnimitþsBaØab¤tMélefr. karykmkCMnYl Macro.
o #define MAX_ARRAY_SIZE 100
9 C Compiler
C compiler bkERbr source eTACa assembly code. Source code RtUv)anTTYlBI preprocessor.
9 The Assembler
Assembler begáIt object code. enAelIRbB½n§ window GñkGaceXIj file eday file_name.OBJ
bc©y½ (suffix) (file_name.o enAelIRbB½n§ UNIX ) edIMm,Ibgðaj file object code.
9 The Link Editor
RbsinebI source file mYysMGagGnuKmn_ library GnuKmn_EdlbegáItkñúg source file epSg² link
editor erobcMGnuKmn_TaMgenH (CamYy main()) edIm,IbegáIt fileRbtibtþi. k¾dUcCadMeNaHRsayenATI
{ int i;
}
Exercise 1-2
main()
{ int i;
WWWW±XXXX
-10-
vCBk
CMBYkTI 2
RbePT (Types), RbmaNviFI (Operations) nigkenSam (Expressions)
-11-
vCBk
manRbePTTinñn½ymUldæanRKwHbnþicnþÜcenAkñúgPasa C:
char Ca byte EtmYyGacpÞúk)anmYytYGkSrenAkñúgkarkMnt;kEnøgtYGkSr
-12-
vCBk
int CacMnYnKt; integer CaTUeTAbgðajTMhMFmμtaéncMnYnKt;FmμCatienAelIm:asIunpÞal; (host machine)
float single-precision cMnYnek,ós
kmμviFIbnÞab;RbkasGBaaØtnigkMnt;tMélefreTAeGayGBaaØtnige)aHBum<tMélrbs;GBaaØtTaMgenaH :
#include <stdio.h>
#include <conio.h>
void main()
{
int a;
float pt;
char ch;
a=3;
pt=10.5;
ch='A';
printf("integer number=%d\n", a);
printf("real number =%f\n", pt);
printf("character=%c\n", ch);
getch();
}
-13-
vCBk
scanf() CaGnuKmn_sMrab;;kare)aHcUltMéleTArcnasm<½n§Tinñn½y : TRmg;rbs;vaKWRsedogKñaeTAnwg
printf:
-14-
vCBk
(hexadecimal) k¾GacRtUv)andak;BIeRkayeday L edIm,IbegáItBYkvaCa long nig U edIm,IbegáItBYkva
unsigned : 0XFUL CatMél unsigned long CamYytMél 15 kñúgeKaldb; .
-15-
vCBk
"I am a string"
b¤
"" /* the empty string */
Quotes minEmnCaEpñkrbs; string eTb:uEnþbMerIedIm,IkMNt;RBMEdnvaEtb:ueNÑaH. dUcKñanig escape
enAxagcugdUcenHrUbrag rkSaTukRtUvkarmYyeRcInCagcMnYnrbs;tYGkSrEdlRtUv)ansresrenAcenøaH
eFμjkNþúrBIr (quotes).
2.4 karRbkas (Declarations)
RKb;GBaaØtRtUvEt)anRbkasmunnwgeRbIR)as; dUcenHkarRbkasCak;lak;GacRtUveFIVedaymincat;Ecg
eGayc,as;edayeBjcitþ. karRbkasRbePTCak;lak;mYynigpÞúkbBa¢Irbs;GBaaØtmYyb¤eRcInrbs;RbePT
énRbePTenaHdUcCa
int lower, upper, step;
char c;
GBaaØtGacRtUv)anEbgEckkñúgcMeNamkarRbkaskñúgrebobNamYy bBa¢IxagelIGacRtUv)ansresrdUc
xageRkam
int lower;
int upper;
int step;
char c;
TRmg;GkSrykTITMenreRcInb:uEnþvagayRsYlsMrab;;karbEnßmkarBnül;eTAkarRbkasnimYy²sMrab;;lMdab;
EkERbbnþbnÞab;Kña.
GBaaØteRcInk¾GacRtUv)ankMnt;tMélefrkñúgkarRbkasrbs;va. RbsinebIeQμaHKWRtUv)andak;BIeRkayeday
sBaØaesμInig expression mYy eKfa expression enaHCaGñkkMnt;tMélcab;epþImeGayGBaaØtenaH
dUckñúg]TahrN_xageRkam :
char esc = '\\';
int i = 0;
float eps = 1.0e-5;
char esc;
int i;
float eps;
esc = '\\';
i = 0;
eps = 1.0e-5;
RbsinebIGBaaØtenAkñúgsMnYrminsV½yRbvtþi karkMnt;tMélcab;epþImKWRtUv)aneFIVEtmþgb:ueNÑaH
CaKMnitmunkmμviFIcab;epþImRbtibtþinigGñkkMnt;tMélcab;epþImRtUvEtCa expression efr (constant
expression).
-17-
vCBk
2.6 RbmaNviFIeRbobeFob
edIm,Isakl,gsMrab;;smPaBKW “= =”
Baküdas;etOn : cUrRbugRby½tñkareRbIR)as; “=” CMnYseGay “= =” dUcCakarsresredayKμanRbugTuk
if ( i = j ) .....
-18-
vCBk
Gñksresr !X edIm,Isakl,gfaetI X KWesμIsUnü. RbsinebI X KWesμisUnütMélrbs; expression KWesμI 1
ebImindUcenHeTtMélKWesμIsUnü.
2.8 RbmaNviFI Bitwise (Bitwise Operations)
xusKñanig sUnüEdlkEnøgBYkvaKWdUcKña.
karIbgçit (shift) << nig >> bgçit bit eTAenAxageqVgnigeTAxagsþaMedaycMnYnTItMag bit
RtUv)anpþl;eday right operand EdlRtUvEtminEmnCacMnYnGviC¢man. dUcenH x << 2 bgçit (shift)
tMélrbs; x edaykEnøgBIrbMeBjkEnøgEdleFIVeGayTMenreday bit sUnü enHKWesμIeTAnigkarKuNeday
4. karbgçit (shift) eTAxagsþaMcMnYn unsigned EtgEteFIVkarbMeBj bit edaysUnü. kar shift
XOR
-19-
vCBk
One's Compliment
kMuRcLM & nig && : & KWCa bitwise AND && logical AND . RsedogKñaenHEdlsMrab;; | nig ||.
KWCakarI unary (unary operator) vaCakarIEtmYyKt;elI argument mYyBIxagsþaMkarI.
karIbgçit (shift) cat;Ecg shift RtwmRtUvedaykarIenAxagsþaMeTAkarIenAxageqVg. karIenAxagsþaM
RtUvEtCacMnYn viC¢man. bit EdlRtUv)anvaytMélKWRtUvbMeBjedaysUnü (i.e. vamin)anbiTCMuvijeT).
]TahrN_ : x << 2 rMkil (shift) bits enAkñúg x eday 2 kEnøgeTAxageqVg.
dUecñH :
if x = 00000010 (binary) or 2 (decimal)
then:
x>>2=>00000000 or 0 (decimal)
-20-
vCBk
x & 01 masks of 1st bit of x if this is 1 then count++
2.9RbmaNviFIkMenIn
C pþl;eGaynUvkarI2minFmμtasMrab;;karbEnßmnigbnßyGBaaØt.karIbEnßm ++ bEnßm 1 eTA operand
EdlvaesμIKñaeTAnwg (b:uEnþmanRbsiT§iPaBCag):
-21-
vCBk
expr1 = (expr1) op (expr2)
dUcenHeyIgGacsresr i=i+3 Ca i += 3
nig x = x*(y + 2) as x *= y + 2.
k¾kenSamb¤
a + (b * c)
RKb;karImanGaTiPaBehIykarImanGaTiPaBx<s;KWRtUv)anvaytMélmunkarImanGTiPaBTab.karImanGaTiPa
B esμIKñaKWRtUv)anvaytMélBIeqVgeTAsþaM dUcenH
a - b - c
RtUv)anvaytMélCa
( a - b ) - c
dUcEdlGñkcg;)an
BIGaTiPaBx<s;eTAGaTiPaBTablMdab;sMrab;;RKb;karI C (eyIgmin)anCYbBYkvaTaMgGs;enAeLIyeT) KW :
() [] -> . (left ->right)
! ~ ++ -- + - * (type) sizeof (right -> left)
* / % (left ->right)
+ - (left ->right)
<< >> (left ->right)
< <= > >= (left ->right)
== != (left ->right)
& (left ->right)
^ (left ->right)
| (left ->right)
&& (left ->right)
|| (left ->right)
?: (right -> left)
-22-
vCBk
= += -= *= /= %= &= ^= |= <<= >>= (right -> left)
, (left ->right)
dUcenH
a < 10 && 2 * b < c
RtUv)anbkERbCa
( a < 10 ) && ( ( 2 * b ) < c )
nig
a =
b =
spokes / spokes_per_wheel
+ spares;
Ca
a =
( b =
( spokes / spokes_per_wheel )
+ spares
);
lMhat;
sresrkmμviFI C edIm,IbegáItRbtibtþikarxageRkam.
Exercise 2-1
karbBa©ÚlnigbeBa©jeQμaHrbs;Gñk Gas½ydæannigGayueTAnwgrcnasm<½n§smrmü.
Exercise 2-3
karsresrkmμviFIEdledaHRsaytMélFMbMputnigtUcbMputBIsMnuM 10 cMnYnEdl)anbBa©Úl.
Exercise 2-4
-23-
vCBk
sresrkmμviFIedIm,IGan "float" bgðajcMnYnénGgSa Celsius nige)aHBum<Ca "float" nUvsItuNðPaBesμIKña
enAkñúgGgSa Fahrenheit. e)aHecjlT§plkñúgTRmg;dUcCa 100.0 GgSa Celsius pøas;bþÚreTACa 212.0
GgSa Fahrenheit.
Exercise 2-5
sresrkmμviFIedIm,IGancMnYnKt;FmμCatiya:gticesμI 3 ehIye)aHecjRKb;karpøas;bþÚrEdlGacénbIcMnYnKt;
FmμCativiC¢manticCagb¤esμItMélenH.
Exercise 2-7
-24-
vCBk
cUrsresrkmμviFIedIm,IGanBIrcMnYnKt;FmμCatiedayCak;lak;dUcxageRkam.
tMélcMnYnKt;TImYybgðajem:agrbs;éf¶kñúgnaLika 24 em:agdUcenH 1245 bgðajxVH !% naTIem:ag !
éf¶Rtg; ]TahrN_ .
WWWW±XXXX
-25-
vCBk
CMBUkTI 3 l½kçx½NÐ
Conditionals
-26-
vCBk
emeronenHedaHRsayCamYyviFIepSg²Edl C GacRtYtBinitülMhUréntkáviC¢aenAkñúgkmμviFI. karpøas;bþÚr
EbøkBIKñabnþicbnþÜcBYkvaKWRsedogKñaeTAnigPasad¾éTeTot.
dUceyIg)aneXIjkarItkáviC¢axageRkammanenAkñúg C:
= =, !=, ||, &&.
manenAkñúg]TahrN_xageRkam
#include <stdio.h>
void main()
{
-27-
vCBk
int num1, num2, sub, add;
printf(“Input two numbers");
scanf("%d %d", &num1, &num2);
if(num1>num2)
{
sub=num1 - num2;
printf(“addition = %d\n", sub);
}
else
{
add= num1 + num2;
printf(“subtraction = %d\n", add);
}
}
karbegáIt
if (expression)
statement
else if (expression)
statement
else if (expression)
statement
else if (expression)
statement
-28-
vCBk
else
statement
ekIteLIgCajwkjab;EdlvamantMélbMEbkkarBiPakSa.enaHCalMdab;bnþbnÞab;énXøa if KWCaviFITUeTA
bMputénkarsresrdMeNaHRsaysMerccitþeRcIn. Expressions KWRtUv)anvaytMéltamlMdab; RbsinebI
expression BitXøaP¢ab;CamYyvaRtUv)anRbtibtþiehIyvabBa©b;nUvkarRbtibtþiTaMgmUlenH. Canic©Cakal
vamansPaBFmμta :
if expression1 then expression2 else expression3
-29-
vCBk
EdldUcCa :
if (a>b)
z = a;
else
z=b;
3.4Xøa switch
C switch KWRsedogKñaeTAnigXøa case rbs;Pasa Pascal nigvaGnuBaØatnUvkareRCIserIleRcInénEpñk
rbs;vtßúenAkMritmYyénl½kçx½NÐEdlvaCaviFIRbesIrCagkarsresrXøa if eRcIndg :
switch (expression) {
case item1:
statement1;
break;
case item2:
statement2;
break;
case itemn:
statementn;
break;
default:
statement;
break;
}
krNInimYy²KWRtUv)aneFVICapøak (label) eday 1b¤eRcIntMélcMnYnKt;b¤tMél expression.
RbsinebIkrNImYyCaKUnigtMél expression karRbtibtþicab;epþImenAkrNIenaH. RKb;krNITaMgGs;
expression RtUvEtxusKña. krNIpøak (label) default RtUv)anRbtibtþiRbsinebIminmankrNIepSg
dUcEdlnwgelIkykmkBiPakSaelIkeRkay
]TahrN_ :
switch (letter)
{
case `A':
case `E':
case `I':
case `O':
case `U':
numberofvowels++;
break;
case ` ':
numberofspaces++;
break;
default:
numberofconstants++;
break;
}
cUrsresrkmμviFIedIm,IGantYGkSr2nige)aHecjtMélrbs;vaenAeBlbkERbCacMnYneKal16 2cMnYn.
TTYlykGkSrFMsMrab;;tMélBI 10 dl; 15.
Exercise 3-2
-31-
vCBk
pþl;eGaynUvkarbBa©ÚlbIcMnYnKt;bgðajkalbriecäTCaéf¶ Ex qñaM e)aHecjcMnYnéf¶ Ex nigqñaMsMrab;;
karbriecäTrbs;éf¶xageRkam.
CaFmμtakare)aHcUl : 28 2 1992 karbBa©ÚlCaFmμta : karbriecäTxageRkam 28:02:1992 KW 29:02:1992
Exercise 3-4
WWWW±XXXX
-32-
vCBk
CMBUkTI 4
CMu nig kareFIVeLIgvij
Looping and Iteration
-33-
vCBk
enAkñúgemeronenHnwgRkeLkemIlviFIedaHRsayrbs; C sMrab;;karRtYBinitü loop nigkareFIVeLIgvij
(iteration). ebImindUcenHeTmYycMnYnénviFIedaHRsayTaMgenHGacemIleTARsedognigtamkarBitnwgRbti
KWBaküEkERb (EdlGaceRcInCagkMenInFmμta);
EpñkdMbUg Cakarcab;epþIm expression RtUv)aneFIVmþg munnwg loop RtwmRtUv)aneFIVGIVmYy. EpñkTI2
1
l½kçx½NÐ)ankøayCaminBit.
tamk,ÜnevyükrN_ smasPaBbIrbs; for loop KWCa expression. samBaØaCagenHeTAeTot
expression nig expression KWkMnt;kargarb¤ ehAGnuKmn_nig expression KW expression
1 3 2
dUcenH
for (;;) {
...
}
eKGacsμanTukCamun)anfaCa loop minkMnt; (infinite loop) GaccakecjBICMu break b¤ return.
cMNaM: CamUldæan C cat;TukXøa for dUcRbePT while loop
]TahrN_ :
-34-
vCBk
main()
{
int x;
for (x=3;x>0;x-)
{
printf("x=%d\n",x);
}
}
...outputs:
x=3
x=2
x=1
...to the screen
main()
-35-
vCBk
{
int x=3;
while (x>0)
{ printf("x=%d\n",x);
x--;
}
}
...outputs:
x=3
x=2
x=1
...to the screen.
nigminRtwmEtCamYykarGantYGkSreT !!.
4.3 kenSamBakübgÁab; do-while
Rbtibtþiy:agticmþg.
Xøa do-while rbs; C manTRmg; :
do
statement;
while (expression);
-36-
vCBk
XøaRtUv)anRbtibtþi bnÞab;mk expression RtUv)anvaytMél. RbsinebIvaBitXøaRtUv)anvaytMélmþg
eTotehIybnþeTAeTot. enAeBl expression køayeTACaminBit loop enaHRtUv)anbBa©b;.
vaRsedogeTAnwg repeat ... until rbs;Pasa PASCAL b:Enþ do while expression KWBit.
]TahrN_ :
main()
{
int x=3;
do {
printf("x=%d\n",x--);
}
while (x>0);
}
..outputs:-
x=3
x=2
x=1
cMNaM : bc©y½xageRkay x—RbmaNviFIEdleRbItMélkMBugEtmanrbs; x xN³EdlkMBuge)aHecj
nigbnÞab;mkbnßytMél x.
4.4 break nig continue
C pþl;XøabBa¢a2edIm,IRtYtBinitürebobEdleyIgeFIV loop:
-37-
vCBk
}
....;
} /* end while value != 0 */
lMhat;
Exercise 4-1
mUldæannwgticCagb¤esμIeTAnwg 10.
Exercise 4-4
GankñúgbItMélbgðajEterog²xøÜn
plbUkedImTun (cMnYnKt; integer rbs; pence),
GaRtakarR)ak;CaPaKry (float),
nigcMnYnqñaM (integer).
-38-
vCBk
KNnatMélrbs;plbUkedImTunCamYynwgGRtakarR)akpSMbUkbEnßmelIkMLúgqñaM.
GRtakarR)akrbs;qñaMnimYy²RtUv)anKNnaCa
interest = capital * interest_rate / 100;
ehIyRtUv)anbUkbEnßmeTAplbUkedImTuneday
capital += interest;
-39-
vCBk
Next value is 10
Next value is 5
Next value is 16
Next value is 8
Next value is 4
Next value is 2
Final value 1, number of steps 19
RbsinebIkare)aHecjtMélticCag 1 e)aHBum<sarpÞúkBakü
Error
nigcat;Ecg
exit( 0 );
Exercise 4-6
cUrsresrkmμviFIedIm,Irab;RsHnigGkSrenAkñúgGtßbTmineRKagTukRtUv)anpþl;eGayCasþg;dabBa©Úl.
GanGtßbTmYytYGkSmYymþgrhUtdl;GñkCYbRbTHcugbBa©b;rbs;Tinñn½y.
bnÞab;mke)aHecjcMnYnénkarCYbRbTHnigRsHnimYy² a, e, i, o nig u enAkñúgGtßbT cMnYnsrubrbs;GkSr
nigRsHnimYy²CaPaKrycMnYnKt;FmμCatirbs;GkSrsrub.
esñITRmg;e)aHecjCa :
Numbers of characters:
a 3 ; e 2 ; i 0 ; o 1 ; u 0 ; rest 17
Percentages of total:
a 13%; e 8%; i 0%; o 4%; u 0%; rest 73%
GantYGkSrdl;cugbBa©b;rbs;Tinñn½ykareRbIR)as;karbegáItdUcCa
char ch;
while(
( ch = getchar() ) >= 0
) {
/* ch is the next character */ ....
}
WWWW±XXXX
-40-
vCBk
CMBUkTI 5
Arrays nig Strings
Arrays and Strings
-41-
vCBk
CaeKalkarN_ array enAkñúgPasa C KWRsedogeTAnwgGIVEdlrkeXIjenAkñúgPasaepSg²eTot.
dUceyIgnwgeXIjenAeBlbnþiceTot array KWRtUv)ankMnt;xusKñabnþicbnþÚcehIyvamankareRbIR)as;CaeRcIn
xusKñaedayehtuTMnak;TMngsñiT§rvag array nig pointer. eyIgnwgemIleGaykan;Etl¥itl¥n;elITMnak;TMng
rvag pointer nig array enAelIkeRkay.
5.1 Array mYyvimaRtnigeRcInvimaRt
-42-
vCBk
5.2 Strings
char name[50];
C minmankarsg;bEnßmPaBgayRsYlsMrab;;edaHRsay string
eTehIydUcenHkUdxageRkamKWminRtwmRtUv :
char firstname[50],lastname[50],fullname[100];
lMhat;
Exercise 5-1
GanGtßbTFmμtamYytYGkSrmYymþgBIsþg;dae)aHbBa©Úlrbs;kmμviFIehIye)aHvaCamYybnÞat;bRBa©as;
nimYy²BIeqVgeTAsþaM. GanrhUtTal;EtGñkCYbcMnuncugbBa©b;rbs;Tinñn½y (emIlxageRkam).
GñkGaccg;sakl,gkmμviFIedayvay
-43-
vCBk
prog5rev | prog5rev
edIm,IemIlRbsinebIkarcmøgRtwmRtUvénkarbBa©ÚledImKWRtUv)anbegáItmþgeTot.
edIMm,IGantYGkSrenAcugbBa©b;rbs;Tinñn½y kareRbIR)as; loop dUcCaTaMg
char ch;
while( ch = getchar(), ch >= 0 ) /* ch < 0 indicates end-of-data */
b¤k¾
char ch;
while( scanf( "%c", &ch ) == 1 ) /* one character read */
Exercise 5-3
edIm,IbgðajcugbBa©b;rbs;Tinñn½yenAcugbBa©b; emIlxageRkamsMrab;;kareFIVeGaydwgva)nige)aHecjcMnYn
énRbEvgBakü i.e. cMnYnsrubrbs;Bakürbs; length 1 Edl)anCYbRbTH cMnYnrbs; length 2 ehIy
bnþbnÞab;eTot.
kMnt;BaküedIm,I)anCaGkSrtamlMdab;GkçRkm. GñkKYrGnuBaØatsMrab;;RbEvgBakürhUtdl; 25 GkSr.
kare)aHecjCaTUeTAKYrCaEbbenH :
length 1 : 10 occurrences
length 2 : 19 occurrences
length 3 : 127 occurrences
length 4 : 0 occurrences
length 5 : 18 occurrences
....
edIMm,IGanGkSrdl;cugbBa©b;énTinñn½yemIlsMnYrxagelI.
WWWW±XXXX
-44-
vCBk
CMBUkTI 6
GnuKmn_ Functions
-45-
vCBk
enAkñúgPasa C GnuKmn_KWesμIeTAnig subroutine b¤ function enAkñúgPasa Fortran b¤ procedure b¤
function enAkñúgPasa Pascal. Function pþl;eGayviFIEdlsmrmüedImI,eFIV encapsulate
karKNnamYycMnYnEdl GacRtUv)aneRbIenAeBleRkayedayKμankarRBYy)armÖGMBIkarGnuvtþn_rbs;va.
CamYynigkarerobcMGnuKmn_d¾RtwmRtUvvaGaceFIVCamindwgBIrebobkargarEdleFIVnigcMeNHdwgGIVEdleFIVEdl
RKb;RKan;.
6.1 mUldæanRKwHrbs;GnuKmn_
GnuKmn_xøInig)anehAmþg BIeRBaHvaeFIVeGayc,as;EpñkmYycMnYnrbs;kUd.dUcenHeyIg)aneRbIGnuKmn_
dUcCa printf, getchar nig putchar Etb:ueNÑaHEdl)anpþl;sMrab;;eyIg \LÚvvadl;eBledIm,I
sresrGnuKmn_mYycMnYnpÞal;xøÜnrbs;eyIg. edaysar C minmanniTsSnþkmμdUcCa ** rbs; Fortran
GnuBaØateGayeyIgBnül;viFIedaHRsayénniymn½yGnuKmn_edaysresr function power(m,n)
edIm,IelIkcMnYnKt; integer m eTAcMnYnviC¢man integer sV½yKuN n. enaHCatMélrbs; power(2,5)
esμI32. GnuKmn_enHminGnuvtþtamTmøab;niTsSnþkmμedaysarvaedaHRsayRtwmEtsV½yKuNcMnYnviC¢man
rbs;cMnYnKt;tUc b:uEnþvaBi)aklμmsMrab;;Bnül;. (sþg;da librarypÞúkGnuKmn_ pow(x,y)EdlKNna xy)
enHCaGnuKmn_ power ehIynigkmμviFI main edIm,IeRbIR)as;vadUcenHGñkGacemIlkmμviFITaMgmUl
Etmþg.
#include <stdio.h>
int power(int m, int n);
/* test power function */
main()
{
int i;
for (i = 0; i < 10; ++i)
printf("%d %d %d\n", i, power(2,i), power(-3,i));
return 0;
}
Rkas;RbePT)a:ra:EmRtnigeQμaHehIynigRbePTénlT§plEdlGnuKmn_epÞr.
eQμaHEdleRbIeday power sMrab;;)a:ra:EmRtrbs;vaKWCa local )a:ra:ERmtrbs;GnuKmn_ power
nigminGaceRbI)anedayGnuKmn_d¾éTeTot : GnuKmn_epSgeTotGaceRbIeQμaHdUcKñaedayKμanRcLMKña.
vak¾BitdUcCakareRbIR)as;GBaaØt i nig p Edl : GBaaØt i enAkñúgGunKmn_ power
KWminmanTMnak;TMngnigGBaaØt i enAkñúg main eT.
eyIgnwgeRbI)a:ra:ERmtTUeTAsMrab;;eQμaHGBaaØtenAkñúgkarkt;RtaTukkñúgrgVg;Rkckrbs;GnuKmn_.Bakü
formal argument nig actual argument KWeBlxøH)aneRbIsMrab;;eKaedAdUcKña. tMélEdlGnuKmn_
bNþaleGaymankarRtYtBinitüb:uEnþminman tMélsMxan;EdlRtUvepÞreTAeGayGñkehA
-47-
vCBk
EdleFIVenAcugbBa©b;rbs;GnuKmn_eday)anCYbnwg brace cugxagsþaM. ehIykarehAGnuKmn_GacRtUv
)anTat;ecaltMélepÞredayGnuKmn_.
GñkGacmankMnt;cMnaMEdlmanXøa return mYyenAxagcugrbs; main. edaysar main
CaGnuKmn_dUceTAnwgGnuKmn_epSgeTot vaGacepÞrtMéleTAGñkehArbs;vaEdlvamanRbsiT§iPaB
enAkñúgmCÄdæanEdlkmμviFIRtUv)anRbtibtþi. CaTUeTAkarepÞrtMélsUnükMnt;fakarbBa©b;edayFmμta
tMélminsUnükMnt;faminFmμtab¤karbBa©b;kñúgl½kçx½NÐmankMhus.enAkñúgGRtakarR)ak;énPaBgayeyIg
)anlubXøa return BIGnuKmn_ main rbs;eyIgrhUtmkdl;eBlenHb:uEnþeyIgnwgrYmbBa©Úl
vaBIeBlenHeTAdUcCakarcMnaMfakmμviFIKYrepÞr status eTAeGaymCÄdæanrbs;va.
karRbkas
int power(int base, int n);
muneBlGnuKmn_ main faGnuKmn_ power CaGnuKmn_Edlnwgman argument BIrCaRbePT int
nigepÞrtMélCaRbePT int. karRbkasenHEdlRtUv)anehACa function prototype RtUvEtRtUvKañnwg
niymn½ynigkareRbIR)as;rbs;GnuKmn_ power. vaKWmankMhusRbsinebInimyn½yrbs;GnuKmn_b¤
kareRbIR)as;NamYyrbs;vaminRtwmRtUvCamYyKMrUrbs;va.
eQμaH)a:ra:ERmtmincMa)ac;RtUvKñaeT. tamBiteQμaH)a:ra:ERmtKWdak;k¾)anmindak;k¾)anenAkñúgGnuKmn_KMrU
(function prototype) dUcenHKMrU (prototype) eyIgGacsresr
eTaHCay:agNak¾edayeQμaHEdleRCIserIs)anläKWCaÉksal¥dUcenHeyIgjwkjab;nwgeRbIva
kMnt;cMaNaMrbs;RbvtþisaRsþpøas;bþÚrrvag ANSI C nigkMENfμIelIkmun (earlier versions) KWCarebob
GnuKmn_EdlRtUv)anRbkasnigeGayGtßn½y. enAkñúgkareGayGtßn½yedImrbs; C GnuKmn_ power
nwgRtUv)ansresrdUcenH :
/* power: raise base to n-th power; n >= 0 */
/* (old-style version) */
power(base, n)
int base, n;
{
int i, p;
p = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}
-48-
vCBk
)a:ra:EmRtRtUv)aneGayeQμaHcenøaHrgVg;RkckehIyRbePTrbs;vaKWRtUv)anRbkasmun karebIk brace
xageqVg )a:ra:EmRtEdlminRbkasKWRtUv)anykCaRbePT int. (xøÜnrbs;GnuKmn_maneQμaHdUcBImun)
karRbkasrbs;GnuKmn_ power enAeBlcab;epþImrbs;kmμviFInwgmanlkçN³dUcenH :
int power();
eyIgnwgehAGnuKmn_dUcxageRkam :
main()
{ float a=5,b=15,result;
result=findaverage(a,b);
printf("average=%f\n",result);
}
-49-
vCBk
}
main()
{ squares();
}
-50-
vCBk
vaminmankarcmøgénFatu array . edaysnÞsSn_tMélenHGnuKmn_GaceRbInigpøas;bþÚr argument
Array eRcInvimaRtGacRtUv)anbBa¢ÚneTAGnuKmn_dUcxageRkam :
TI1eT.
6.4 KMrUedImGnuKmn_
muneBleyIgeRbIGnuKmn_ C RtUvmancMeNHdwgGMBIrRbePTEdlvaepÞrnigRbePT)a:ra:EmRtEdlGnuKmn_nwg
eRbI.
sþg;da ANSI rbs; C ENnaMrebobfμI (RbesIrCag) énkareFIVenHCakMEN (versions) munrbs; C. (cMNaM:
RKb;kMENfμITaMgGs;rbs; C \LÚvRtUvKñanwgsþg;da ANSI )
sar³sMxan;énKMrUKWBIry:ag :
-51-
vCBk
vabegáIteGaymanrcnasm<½n§eRcInnigdUcenHvagayRsYlCagedIm,IGankUd.
vaGnuBaØateGay C compiler RtYtBinitüvaküs½BÞ (syntax )rbs;GnuKmn_EdlehA.
etIvaeFIVy:agdUcemþckñúgTMhMkargarrbs;GnuKmn_.
CamUldæanebIsinCaGnuKmn_RtUv)ankMnt;muneBlvaRtUv )aneRbI ( )anehA)
enaHGñkRKan;Etyl;RBmeRbIGnuKmn_.
RbsinebIminmanenaHGñkRtUvEtRbkasGnuKmn_. karRbkasGnuKmn_CaFmμtaKWRbkasRbePTtMélEdl
GnuKmn_epÞrnigRbePTrbs;)a:ra:EmRtEdleRbIedayGnuKmn_.
vaCaTUeTA (ehIynigdUcenHlä) GnuvtþKMrURKb;GnuKmn_enAeBlcab;epþImrbs;kmμviFI eTaHbIy:agNak¾
edayvaenHminCaRtUvkarxøaMeBkeT.
edIm,IRbkasKMrUGnuKmn_ (function prototype) CaFmμtaRbkasRbePTtMélEdlGnuKmn_epÞreQμaH
GnuKmn_nigenAkñúgvg;Rkck (bracket) RbePTrbs;)a:ra:EmRtEdlmankñúgkarkMnt;Gtßn½yGnuKmn_
(function definition)
e.g.
int strlen(char []);
enHedaydkEtmYyehIyykcMnYnrbs;dkXøaCMnYsva.
-52-
vCBk
dUcenH
char *cat = "The cat sat";
n = replace( cat );
nwgkMnt;
cat to "The-cat-sat"
ehIy
n to 2.
Exercise 6-2
sresrkmμviFIEdlnwgGankñúgkmμviFIedImrbs; C BIsþg;dabBa©Úlnige)aHecjsBaØapáayRKb;BaküxageRkam
EdleFIVsßitixageRkamsMrab;;kmμviFI (TaMgGs;CacMnYnKt; integer). (cMnaMkarBnül;elIGkSr tab
xagcugénkarbBa¢ak;eGayc,as;enH)
e)aHecjtMéldUcxageRkam :
Lines:
* The total number of lines
* The total number of blank lines
(Any lines consisting entirely of white space should be
considered as blank lines.)
The percentage of blank lines (100 * blank_lines / lines)
Characters:
* The total number of characters after tab expansion
* The total number of spaces after tab expansion
* The total number of leading spaces after tab expansion
(These are the spaces at the start of a line, before any visible
character; ignore them if there are no visible characters.)
The average number of
characters per line
characters per line ignoring leading spaces
leading spaces per line
spaces per line ignoring leading spaces
Comments:
* The total number of comments in the program
* The total number of characters in the comments in the program
excluding the "/*" and "*/" thenselves
The percentage of number of comments to total lines
The percentage of characters in comments to characters
Identifiers:
We are concerned with all the occurrences of "identifiers" in the
program where each part of the text starting with a letter,
and continuing with letter, digits and underscores is considered
to be an identifier, provided that it is not
in a comment,
or in a string,
or within primes.
Note that
"abc\"def"
the internal escaped quote does not close the string.
Also, the representation of the escape character is
'\\'
and of prime is
-53-
vCBk
'\''
Do not attempt to exclude the fixed words of the language,
treat them as identifiers. Print
* The total number of identifier occurrences.
* The total number of characters in them.
The average identifier length.
Indenting:
* The total number of times either of the following occurs:
a line containing a "}" is more indented than the preceding line
a line is preceded by a line containing a "{" and is less
indented than it.
The "{" and "}" must be ignored if in a comment or string or
primes, or if the other line involved is entirely comment.
A single count of the sum of both types of error is required.
edIm,IGankare)aHcUlGkSrenAeBlmYyTRmg;mankUdcUlrYmedIm,IGanmYybnÞat;kñúg1elIksMrab;;GñkeRbI
R)as;
char ch;
ch = getchar();
ebIcugbBa©b;rbs;Tinñn½yRtUv)anrab;bBa©Úl.
GñkGacrkemIlGkSredayRKan;EtGanCamYy (]TahrN_)
switch( linec[0] ) {
case ' ': /* space ..... */
break;
case '\t': /* tab character .... */
break;
case '\n': /* newline ... */
break;
....
} /* end switch */
kare)aHecjrbs;GñkGacnwgRtUv)ane)aHecjkñúgrebobxageRkam :
Total lines 126
Total blank lines 3
Total characters 3897
-54-
vCBk
Total spaces 1844
Total leading spaces 1180
Total comments 7
Total chars in comments 234
Total number of identifiers 132
Total length of identifiers 606
Total indenting errors 2
GñkGacRbmUlfakmμviFIxagelI (rYmbBa©ÚlKñaCamYyBaküminEmnCapáay)
dMbUgeGayRsYlnigTukeGayvaenATIenaHRbsinebITRmg;mYycMnYneFIVeGay GñkBi)ak.
RtLb;mkrk´RbsinebIGñkKitfadMeNaHRsayrbs;´ (b¤karCak;lak;enH) xus! enHKWGaceRcIn!
Exercise 6-3
vaCaGRtakarR)ak;énkarbg;mþg²!
Loop eFVIRbtibtþikarxageRkamkñúgkmμviFIrbs;Gñk :
GantMél integer BIr bgðajGRtakarR)ak;Edlbg; (pence kñúg1em:ag) ehIycMnYnénem:ag. e)aHecjTwk
R)ak;bg;srubeday40em:agRtUvbg;nUvGRtaFmμta BI40-eTA60em:agbg;nUvGaRta1knøHénGaRtaFmμta
ehIyelIsBI60em:agbg;BIrdgGRtaFmμta. e)aHecjkarbg;R)ak;Ca pound edaymaneRkayek,ósBIr
xÞúg.
bBa©b; loop enAeBlGaRtaR)ak;esμIsUnü)anCYb. enAcugbBa©b;rbs; loop e)aHecjkarbg;srub.
kUcsMrab;;karKNnakarbg;R)ak;BIGaRtakarR)ak;nigem:agKWRtUv)ansresrCaGnuKmn_.
kare)aHecjKYrmanTRmg;dUcGIVxageRkamenH:
Pay at 200 pence/hr for 38 hours is 76.00 pounds
Pay at 220 pence/hr for 48 hours is 114.40 pounds
Pay at 240 pence/hr for 68 hours is 206.40 pounds
Pay at 260 pence/hr for 48 hours is 135.20 pounds
Pay at 280 pence/hr for 68 hours is 240.80 pounds
Pay at 300 pence/hr for 48 hours is 156.00 pounds
Total pay is 928.80 pounds
-55-
vCBk
CMBUkTI 7
RbePTTinñn½yBisþabEnßm
Further Data Types
-56-
vCBk
emeronenHBiPakSalMGitCagmunBIRbePTTinñn½ynigrcnasm<½n§GacRtUv)anbegáItehIyeRbIenAkúñgkmμviFI
C.
GnuKmn_mankmμsiTi§EdlsMGagelIvaTaMgGs;edayeQμaHdUcKañeTaHbIBIGnuKmn_EdlRtUv)an compile
enAdac;²BIKñak¾edayKWsMGageTAvtßúEtmYydUcKña. (sþg;daehAkmμsiTi§enH external linkage.)
enAkñúgn½yenHGBaaØtxageRkAKWRsedogeTAnwg Fortran COMMON bøúkb¤GefrenAkñúgbøúkeRkA
eKbMputkñúg Pascal. eyIgnwgeXIjenAelIkeRkaynUvrebobkMnt;GBaaØtxageRkAnigGnuKmn_EdleRbI
)anEtenAkñúg file edImEtmYy.
BIeRBaHGBaaØtxageRkAKWGaceRbICaTUeTABYkvapþl;eGaykarpøas;bþÚreTACa argument rbs;GnuKmn_nigepÞr
tMélsMrab;;karTMnak;TMng;Tinñn½yrvagGnuKmn_. GnuKmn_NamYyGaceRbIGBaaØtxageRkAedaykarsMGag
eTAvaedayeQμaHRbsinebIeQμaHRtUv)anRbkas. mindwgy:agem:cRbsinebIcMnYnFMrbs;GBaaØtRtUvEt)an
EckcaykñúgcMeNamGnuKmn_GBaaØtxageRkAKWsmrmüCagnigmanRbsiT§iPaBCagbBa¢I argument Edl
Evg. EteTaHCay:agNak¾edayehtuplenHnwgRtUv)anGnuvtþCamYykardas;etOnsMrab;;vaGacmanpl
b:HBal;GaRkk;enAkñúgrcnasm<½n§kmμviFIehIynaMdl;karsresrkmμviFICamYykarP¢ab;Tinñn½yCaeRcInrvag
GnuKmn_.
GBaØaixageRkAk¾manRbeyaCn_EdreRBaHTMhMkargarrbs;vaFMCagnigry³eBlRbtibtþirbs;va.
edaysV½yRbvtþiGBaaØtKWenAxagkñúgGnuKmn_vamkCamanenAeBlGnuKmn_RtUv)anbBa©ÚlnigminmanenA
eBlva)ancakecj . GBaaØtxageRkAmüa:gvijeTotCaGBaaØtGciéRnþdUcenHvaGacTuk
tMélBIGnuKmn_mYyEdlcg;)aneTAGnuKmn_bnÞab;. dUcenHRbsinebIGnuKmn_BIrRtUvEtEckrMELkTinñn½y
mYycMnYn eTaHCa)anehAb¤k¾minTan;)anehAenAeLIyvaCajwkjab;KWRtwmRtUvRbsinebITinñn½yEdl)anEck
rMElkRtUv)anrMlgenAkñúgGBaaØtxageRkACaCagbBa¢ÚnvaeTAkñúgnigeTAeRkAtamry³ arguments.
cUrBinitüdMeNaHRsayenHCamYy]TahrN_FMmYy.bBaðaKWedIm,IsresrkmμviFIKNnaEdlpþl;karI +, -, *
nig /. BIeRBaHvakan;EtgayRsYlkñúgkarGnuvtþ GñkKNnanwgeRbIkMnt;cMnaMbRBa©as Polish (reverse
-57-
vCBk
Polish notation) CMnYskarbNþúHKMnit. (Reverse Polish notation RtUv)aneRbIedayGñkKNnakrNI
mYycMnYnnigenAkñúgPasadUcCa Forth nig Postscript.)
enAkñúgkMnt;cMnaMbRBa©as Polish RbmaNviFIxageRkay operand rbs;vabNþúHKMnit expression dUc
(1 - 2) * (4 + 5)
RtUv)anbBa©ÚlCa
1 2 - 4 5 + *
-58-
vCBk
Edl stack enA EdlvaCaGunKmn_eRbIvaedaypÞal; **. lT§PaBKWedIm,IrkSavaenAkñúg main ehIybBa¢Ún
stack nigTItMagEdlkMBugsßitenArbs; stack eTAGnuKmn_Edlruj (push) nigTajyk (pop) va. b:uEnþ
#includes
#defines
function declarations for main
main() { ... }
external variables for push and pop
void push( double f) { ... }
double pop(void) { ... }
int getop(char s[]) { ... }
routines called by getop
#include <stdio.h>
#include <stdlib.h> /* for atof() */
#define MAXOP 100 /* max size of operand or operator */
#define NUMBER '0' /* signal that a number was found */
int getop(char []);
void push(double);
double pop(void);
/* reverse Polish calculator */
main()
{
int type;
double op2;
char s[MAXOP];
while ((type = getop(s)) != EOF) {
switch (type) {
case NUMBER:
push(atof(s));
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if (op2 != 0.0)
push(pop() / op2);
else
-59-
vCBk
printf("error: zero divisor\n");
break;
case '\n':
printf("\t%.8g\n", pop());
break;
default:
printf("error: unknown command %s\n", s);
break;
}
}
return 0;
}
GBaaØt sp nwg val enAkñúg stack.c, nwg buf nwg bufp enA getch.c
KWsMrab;;kareRbIR)as;pÞal;rbs;GnuKmn_enAkñúg file edImerogxøÜnrbs;vanwgminmann½yCakareRbIR)as;
edayGVIepSgeToteT.karRbkasCa static GnuvtþnelIGBaaØtxageRkA (external variable)
b¤GnuKmn_kMnt;RBMEdnTMhMkargarrbs; object enHeTAEpñkenAsl;rbs; file edImEdlRtUv)an compile.
External static dUcenHviFIlakeQμaHdUcCa buf nwg bufp enAkñúg getch-ungetch
rYmbBa©ÚlKñaEdlRtUv)aneRbIxageRkAdUcenHBYkvaGacRtUv)anEbgEck EdlkarEbgEcknwgGñkeRbIminGac
eRbIGnuKmn_ getch nig ungetch.
karrkSaTuk static KWRtUv)ankMnt;edaykardak;buBVbTkarRbkasFmμtaCamYyBakü static. RbsinebI
GnuKmn_BIrnwgGBaaØtBIrRtUv)an compile kñúg file mYy dUckñúg
static char buf[BUFSIZE]; /* buffer for ungetch */
static int bufp = 0; /* next free position in buf */
int getch(void) { ... }
void ungetch(int c) { ... }
-62-
vCBk
GnuKmn_RtUv)anRbkas. RbsinebIGnuKmn_RtUv)anRbkasCa static EteTaHCay:ageQμaHrbs;vaKW
minGaceRbI)anenAxageRkA file EdlvaRtUv)anRbkasenaHeT.
karRbkas static k¾GacRtUUv)anGnuvtþn_CaGBaaØtxagkñúg (internal variable). GBaaØt static
xagkñúgCa local eTAnigGnuKmn_Cak;lak;dUcnigGBaaØtsV½yRbvtþiEdl b:uEnþmindUcGBaaØtsV½yRbvtþiBYk
vaenArkSakñúgGtßiPaBCaCagtMélcUlnigecjRKb;elIkGnuKmn_RtUv)aneFIVskmμPaB. vamann½yfaGBaaØt
static xagkñúgpþl;eGayCaÉkCnkarrkSaTukCaGciéRnþyxagkñúgGnuKmn_EtmYy.
main()
{ int i;
for (i=0;i<5;++i)
stat();
}
stat()
{ int auto_var = 0;
static int static_var = 0;
e)aHecjKW :
auto_var = 0, static_var = 0
auto_var = 0, static_var = 1
auto_var = 0, static_var = 2
auto_var = 0, static_var = 3
-63-
vCBk
auto_var = 0, static_var = 4
etIkarRbkasRtUv)ansresrdUcemþcdUcenHGBaaØtRtUv)anRbkasCaFmμtakñúgkMLúgeBl compile?
etIkarcat;EcgRbkasy:agdUcemþcdUcenHRKb;EpñkTaMgGs;nwgRtUv)anP¢ab;edayRtWmRtUvenAeBlkmμviFI
RtUv)anykmkeRbI?
-64-
vCBk
etIrebobcat;EcgkarRbkasy:agdUcemþcdUcenHvamanRtwmEtkarcmøgEtmYyb:ueNÑaH?
etIrebobGBaaØtxageRkARtUv)ankMnt;tMély:agdUcemþc?
cUreyIgBiPakSaRbFanbTTaMgGs;enHedaycat;EcgkarKNnakmμviFIeLIgvijenAkñúg file eRcIn. dUcbBaða
EdlGnuvtþkarKNnaKWvatUceBkedIm,IbMEbkb:uEnþvaCakarBnül;Edll¥rbs;dMeNaHRsayEdlelIkeLIg
kñúgkmμviFIFM.
TMhMkargarrbs;eQμaHKWCaEpñkmYyrbs;kmμviFIxagkñúgEdleQμaHGacRtUv)aneRbI.sMrab;;GBaaØtsV½yRbvtþi
karRbkasenAeBlcab;epþImrbs;GnuKmn_ TMhMkargarKWCaGnuKmn_EdleQμaHRtUv)anRbkaskñúgGnuKmn_.
GBaaØt local éneQμaHdUcKñakñúgGnuKmn_xusKñaKWminmanTMnak;TMng. kardUcKñaKWBitR)akdrbs;)a:ra:EmRt
énGnuKmn_EdlmanenAkñúgRbsiT§iPaBGBaaØt local . TMhMkargarrbs;GBaaØtxageRkAb¤GnuKmn_eRkay
bMputBIcMnucEdlvaRtUv)anRbkaseTAdl;cugbBa©b;rbs; file RtUv)ancab;epþIm compile. ]TahrN_
RbsinebI main, sp, val, push, nwg pop RtUv)ankMnt;enAelI file kñúgeKalbMNgbgðajxagelI
EdlenaHCa
main() { ... }
int sp = 0;
double val[MAXVAL];
void push(double f) { ... }
double pop(void) { ... }
-65-
vCBk
elceLIgenAxageRkArbs;GnuKmn_NamYyBYkvaeGayniymn½yGBaaØtxageRkA sp nwg val
bNþaleGaykarrkSaTukkMnt;enAEpñkmçageTotehIyk¾eGayCakarRbkassMrab;;Epñksl;rbs; file
edImenH. müa:gvijeTotXøaTaMgenaH
extern int sp;
extern double val[];
arrays sV½yRbvtþik¾GacRtUv)ankMnt;tMélcab;epþIm.
struct point {
int x;
int y;
};
-67-
vCBk
CakarerobcMRsedogKña
int x, y, z;
Structure sVV½yRbvtþik¾GacRtUv)ankMnt;tMélcab;epþImedaykarepÞrtMélb¤edaykarehAGnuKmn_EdlepÞr
structure énRbePTxagsþaM. smaCikén structure Cak;lak;KWsMGagelI expression edaykarsagsg;
énTRmg;.
structure-name.member
Structures GacRtUv)anbnþKña)ankarbgðajmYyrbs;ctuekaNKWCacMnucBIrEdlkMnt;tamviCÄekaNRCug
pÞúyKña :
struct rect {
struct point pt1;
struct point pt2;
};
rect structure pÞúk structure point cMnYnBIr. RbsinebIeyIgRbkas screen Ca
struct rect screen; enaH
screen.pt1.x
-68-
vCBk
CMhanbnÞab;KWkarkMnt;rbs;GnuKmn_edIm,IeFIVRbmaNviFIKNitelIcMnuc ]TahrN_
/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
p1.x += p2.x;
p1.y += p2.y;
return p1;
}
-69-
vCBk
agun arnies={"Uzi",30,7};
agun arniesguns[1000];
-71-
vCBk
7.7 Unions
union CaGBaaØtEdlGacpÞúk (enAeBlxus²Kña) objects énTMhMxus²nigRbePT. C eRbIXøa union
edIm,IbegáIt unions ]TahrN_ :
union number
{
short shortnumber;
long longnumber;
double floatnumber;
} anumber
typedef struct
{ int liftcapacity;
} helicopter;
typedef struct
{ int maxpayload;
} cargoplane;
typedef union
{ jet jetu;
helicopter helicopteru;
cargoplane cargoplaneu;
} aircraft;
typedef struct
{ aircrafttype kind;
int speed;
aircraft description;
} an_aircraft;
-72-
vCBk
]TahrN_enHkMnt;Gtßn½yRKwH union ynþehaHEdlGacCaynþehaHRbtikmμ ]T§mÖacRk
b¤uynþehaHdWkTMnij. enAkñúg an_aircraft structure manRbePTsmaCikEdlbgðaj structure
Edl cab;epþImeFIVenAeBlEtmYy.
7.8 Coercion b¤ Type-Casting
integernumber=(int)floatnumber;
nig:
int integernumber=10;
float floatnumber;
floatnumber=(float)integernumber;
integernumber=(int)letter;
-73-
vCBk
(float) internumber / (float) anotherint;
cMNaM : CamYy array eQμaH enumerated snÞsSn_dMbUgmantMél 0. dUcenH mon mantMél 0, tues
mantMél 1, nwgbnþbnÞab;. week1 nig week2 KWCaGBaaØt.
eyIgGackMnt;tMélepSg² :
enum escapes { bell = `\a',
backspace = `\b', tab = `\t',
newline = `\n', vtab = `\v',
return = `\r'};
eyIgk¾GacTat;ecaltMélcab;epþIm 0:
enum months {jan = 1, feb, mar, ......, dec};
address .l..
WWWW±XXXX
-74-
vCBk
CMBUkTI 8
Pointers
-75-
vCBk
Pointer KWCaEpñkRKwHrbs;Pasa C .RbsinebIGñkminGaceRbIR)as; pointers )anRtWmRtUvenaHGñkCa
mUldæan)at;bg;TaMgGs;nUvPaBxøaMgnigbt;EbnEdlPasa C GnuBaØat. PaBGaf’kM)aMgrbs; C KWsßitenA
elIkareRbIR)as; pointers.
C eRbIR)as; pointers CaeRcIn : ehtuGIV?
vaKWCaviFIEtmYyedIm,IbgðajkarKNnamYycMnYn.
vaeFIVeGaykUdtUcnigmanRbsiT§iPaB.
vapþl;eGaynUv]bkrN_EdlmanRbsiT§iPaBxøaMg.
C eRbIR)as; pointer edayCak;c,as;CamYy :
Arrays,
Structures,
GunKmn_ (Functions)
cMnaM : Pointer RbEhlCaEpñkEdlBi)akyl;xaø Mg. karGnuvtþrbs;Pasa C KWxusKñabnþicbnþÜcxusBIPasa
d¾éTeTot.
8.1 GIVeTACa Pointer?
cMeBaHRbePTGBaaØtNamYy.
karI unary b¤ monadic & pþl;nUv “Gas½ydæanrbs;GBaaØt ”.
karI indirection b¤ dereference pþl;eGay “nUvGIVEdlmanenAkñúg object )ancg¥úleTAeday pointer”.
edIm,IRbkas pointer mYyCaGBaaØtRtUveFIV :
int *pointer;
BinitüelIRbsiT§iPaBkUdxageRkam :
int x = 1, y = 2;
-76-
vCBk
int *ip;
ip = &x;
y = *ip;
x = ip;
*ip = 3;
*ip = 100;
ip = &x;
*ip = 100;
eyIGaceFIVRbmaNviFIKNitviTüaelI pointer:
float *flp, *flq;
++*flp;
(*flp)++;
flq = flp;
duUc)anbgðajkñúgrUb 8.2
-78-
vCBk
rUb 8.2 Pointer Arithmetic snμt;fa flp cg¥úleTA fl enaHRbsinebIGñkbegáIn pointer ( ++flp)
vapøas;bþÚrTItaMgbgðajeTAelI 4 bytes. RbsinebImüa:gvijeToteyIgbUkbénßm 2 eTA pointer
enaHvapøas;bþÚreTATItMag float 2 (float positions) i.e 8 bytes dUcbgðajkñúgrUb.
8.2 Pointer nig GnuKmn_ Functions
rbs;GnuKmn_.
dUcenHkarehA function kñúgkmμviFIrbs;eyIgnwgmanlkçN³EbbenH :
swap(&a, &b)
kUdkñúgkarpøas;bþÚrKWgayyl;Etmþg
-79-
vCBk
void swap(int *px, int *py)
{ int temp;
temp = *px;
/* contents of pointer */
*px = *py;
*py = temp;
}
main()
....
p1 = *coord_fn(...);
/* assign contents of address returned */
....
}
COORD *coord_fn(...)
{ COORD p;
.....
p = ....;
/* assign structure values */
return &p;
/* return address of p */
}
-80-
vCBk
karENnaM: KitelIFatu array Edl)ankMnt;lMdab;kñúgTItMag memory bnþbnÞab;Kña.
BinitüxageRkamenH:
int a[10], x;
int *pa;
CMnYs
pa = &a[0]
-81-
vCBk
EteTaHCay:agNak¾eday pointers nwg arrays KWxusKña :
pointer CaGBaaØt. eyIgGacsresr pa = a nig pa++.
enHKWehtuplEdleyIgRbkasGnuKmn_:
int strlen(char s[]);
karRbkasesμIKñaKW : int strlen(char *s); edaysar char s[] char *s.
nigedaysmrmüCamYYyRbEvg XøaGkSrrbs;GBaaØt.
etIeyIgeFIVvaedayrebobNa?:
rkSaGkSrFMcugbnÞat;eTAcugbnÞat; (end_to_end) kúñg char array FMmYy (rUb. 8.4). \n
nwgcuHbnÞat;.
rkSa pointer kñúg array epSgKñaEdl pointer nimYy²cg¥úleTAGkSrTImYyénbnÞat;fμInimYy².
eRbobeFobbnÞat;BIredayeRbIGnuKmn_ strcmp() én standard library function.
RbsinebIbnÞat;BIrxuslMdab;cUrbþÚr (swap) pointer eTACa pointer array (minEmnCaGtßbT).
or even:
f(int (*a)[35]) {.....}
KWCakarGnuvtþn_samBaØrbs;vaenH.
Binitü: char *name[10];
char Aname[10][20];
-84-
vCBk
Aname KWBitCa 200 Fatu 2D char array.
kareRbIR)as;FatueTAtam 20*row + col + base_address kñúg memory.
name man 10 Fatu pointer.
cMnaM: RbsinebI pointer nimYy²kñúg name RtUv)ankMnt;eGaycg¥úleTA array 20 FatuenaHnwg 200 chars
RtUv)ankMnt;Ek,r (+ 10 Fatu).
plRbeyaCn_énGkSrKWfa pointernimYy²cg¥úleTA array EdlmanRbEvgxus²Kña.
Binitü:
char *name[] = { “no month”, “jan”,”feb”, ... };
char Aname[][15] = { “no month”, “jan”,”feb”, ... };
-85-
vCBk
8.7 Pointersnig Structures
TaMgenHKWgayyl;niggaykMnt;Gtßn½y. BinitüxageRkam:
struct COORD {float x,y,z;} pt;
struct COORD *pt_ptr;
n1.next = &n2;
rUb. 8.6 TMnak;TMng Node BIr cMnaM: eyIgGacRbkas next Ca pointer eTAFatu.
eyIgminGacmanFatuénRbePTGBaaØtdUcEdlnwgkMnt;niymn½y recursive EdlminRtUv)anGnuBaØat.
eyIgRtUv)anGnuBaØateGaykMnt; pointer sMGageday 4 bytes KWtMnt;Ek,rsMrab;; pointer
NamYy.
kUdxagelIP¢ab; node n1 eTA n2 (rUb. 8.6) eyIgnwglMGitenAbBaðaenHenAkñúgemeroneRkay.
BinitükarsresrkmμviFIedIm,Irab;karCYbRbTHén C keyword nimYy². eyIgRtUvkar array én character
strings edIm,IpÞúkeQμaH nig array én integers sMrab;;karrab;. lT§PaBEdlGacmYyKWedIm,IeRbI array
enHeyIgnwgelIkykmknUvkMhusFmμtaBIrEdlbegáIteday pointer.
cMNaMkarepÞrtMél pointer eTA memory address munkareRbIR)as;va.
int *x;
*x = 100;
GacmanGas½ydæanécdnüenAeBlkMnt;tMéldMbUg.
9 TisedAminRtwmRtUv (Illegal direction)
snμt;faeyIgmanGnuKmn_ malloc() EdlBüayamedIm,IkMnt;karbt;Ebn memory
(enAeBldMeNIrkar) nigepÞr pointer eTAbøúkrbs; memory Edl)anRtUvkarRbsinebIC½yCMnHb¤ NULL
pointer ebImindUcenHeT.
Binitü:
*p = (char *) malloc(100); /* request 100 bytes of memory */
*p = `y';
kMhusxagelIenH. etICaGIV?
minman * kñúg
-88-
vCBk
*p = (char *) malloc(100);
lMhat;
Exercise 8-1
-89-
vCBk
Exercise 8-3
-90-
vCBk
CMBYkTI 9
Dynamic Memory Allocation and Dynamic
Structures
-91-
vCBk
karkMnt;kEnøgedaybt;EbnKWCalkçN³EdlläEtmYyKt;rbs;Pasa C (kñúgcMenamPasa high level ).
vaCYyeyIgedIm,IbegáItRbePTTinñ½ynigrcnasm<½n§énTMhMnigRbEvgNamYyedIm,IsmnigkmμviFIrbs;eyIgRtUv
karkñúgkarsresrkmμviFI.
eyIgnwgkarGnuvtþEdlsamBaØBIrenH:
dynamic arrays
dynamic data structure e.g. linked lists
-92-
vCBk
vaCakarGnuvtþRbesIrmYyedIm,IeRbI sizeof() eTaHCaGñkdwgBITMhMBitEdlGñkcg;)an— vabegáIteLIg
sMrab;;kUd (code) ÉkraCü. sizeof GacRtUv)aneRbIedIm,IkMnt;TMhMrbs;RbePTTinñn½yNamYyb¤
structure. karpþl;CaFmμtamYyénRbePTTinñn½yTaMgBIrenHCa argument rbs;GnuKmn_.
dUcenH:
int i;
struct COORD {float x,y,z};
typedef struct COORD PT;
sizeof(int), sizeof(i),
sizeof(struct COORD) and
sizeof(PT) are all ACCEPTABLE
GnuKmn_ free() TTYlyk pointer Ca argument ehIyTMenr memory Edl pointer cg¥úleTAelI.
9.2 Calloc and Realloc
enAcugxageqVgehIycakecjkñúglMdab;KMrUenAcugmçagepSgeTot.
kMnt;RtaeBjeljsMrab;; queue.c KWdUcxageRkamenH:
/* */
/* queue.c */
/* Demo of dynamic data structures in C */
#include <stdio.h>
-94-
vCBk
#define FALSE 0
#define NULL 0
typedef struct {
int dataitem;
struct listelement *link;
} listelement;
void Menu (int *choice);
listelement * AddItem (listelement * listpointer, int data);
listelement * RemoveItem (listelement * listpointer);
void PrintQueue (listelement * listpointer);
void ClearQueue (listelement * listpointer);
main () {
listelement listmember, *listpointer;
int data,choice;
listpointer = NULL;
do {
Menu (&choice);
switch (choice) {
case 1:
printf (“Enter data item value to add “);
scanf (“%d”, &data);
listpointer = AddItem (listpointer, data);
break;
case 2:
if (listpointer == NULL)
printf (“Queue empty!\n”);
else
listpointer = RemoveItem (listpointer);
break;
case 3:
PrintQueue (listpointer);
break;
case 4:
break;
default:
printf (“Invalid menu choice - try again\n”);
break;
}
} while (choice != 4);
ClearQueue (listpointer);
} /* main */
void Menu (int *choice) {
char local;
printf (“\nEnter\t1 to add item,\n\t2 to remove item\n\
\t3 to print queue\n\t4 to quit\n”);
do {
local = getchar ();
if ((isdigit (local) == FALSE) && (local != ‘\n’)) {
printf (“\nyou must enter an integer.\n”);
printf (“Enter 1 to add, 2 to remove, 3 to print, 4 to quit\n”);
}
} while (isdigit ((unsigned char) local) == FALSE);
*choice = (int) local - ‘0’;
}
-95-
vCBk
listelement * lp = listpointer;
if (listpointer != NULL) {
while (listpointer -> link != NULL)
listpointer = listpointer -> link;
listpointer -> link = (struct listelement *) malloc (sizeof
(listelement));
listpointer = listpointer -> link;
listpointer -> link = NULL;
listpointer -> dataitem = data;
return lp;
}
else {
listpointer = (struct listelement *) malloc (sizeof (listelement));
listpointer -> link = NULL;
listpointer -> dataitem = data;
return listpointer;
}
}
Exercises
Exercise 9-1
edIm,ItMrimTMhMBitR)akdrbs;Tinñn½yehIybnÞab;mkGancMnYnTaMgenHeTAkñúg array.
-96-
vCBk
Exercise 9-2
WWWW±XXXX
-97-
vCBk
CMBYkTI 10
The C Preprocessor
-98-
vCBk
karehAeLIgvijénRbtibtþikarCaCMhanTImYyenAkñúgdMNak;kar compile kmμviFI C – lkçN³enHKWmanEt
mYyKt;edIm,I C compilers.
Preprocessor eRcInb¤ticpþl;eGayPasarbs;vapÞal;EdlGacCa]bkrN_EdlmanGnuPaBxøaMgeTAGñk
sresrkmμviFI. karehAmþgeTotEdlRKb; preprocessor directives b¤ commands TaMgGs;cab;
epþImeday #.
kareRbIR)as; preprocessor manGtßRbeyaCn_edayvaeFIVeGay:
kmμviFIgayRsYlCagedIm,IGPivDÆn_
gayRsYlCagedIm,IGan
gayRsYledIm,IEkERb
C kUdGacykeTAeRbIkñúgm:asIunepSg²Kña.
dUcKñaEdr preprocessor k¾GnuBaØateGayeyIg customise Pasa. ]TahrN_edIm,ICMnYs { ... }
10.1 #define
]TahrN_
#define FALSE 0
#define TRUE !FALSE
b¤
#include “file”
#include <stdio.h>
#include <math.h>
#define MIN -100000
void main()
{
int a1, a2, a3 ;
printf("Input number:"); scanf("%d", &a1);
a2= a1+MIN;
a3=abs(a2);
printf("a1=%d, a2=%d, a3=%d \n", a1, a2, a3);
}
edIm,IbBa©b;cugrbs;Xøa.
-100-
vCBk
eyIgGacman else.l. k¾dUcCakareRbIR)as; #else nig #elif , else if.
XøabBa¢armYyepSgeToteRbI #if KWCamYy:
#ifdef
-- if defined and
#ifndef
-- if not defined
# line
)aneRbIR)as;Cajwkjab;CamYykmμviFIEdlbkERbPasaepSg²eToteTAPasa C. ]TahrN_sarkMhus
begáIteday C compiler GacsMGagelIeQμaH file nigcMnYnbnÞat;rbs; source file
edImCMnYseGay intermediate C (RtUv)anbkERb) source file .
Exercises
Exercise 10-1
rbs;RbePTEdl)aneGay t.
Exercise 10-1
WWWW±XXXX
-102-
vCBk
CMBUkTI 11
C, UNIX and Standard Libraries
-103-
vCBk
manTMnak;TMngsñiT§sñalCaxøaMgrvag C nig operating system CaeRcInEdldMeNIrkarkmμviFI C rbs;eyIg.
esÞIrEt UNIX operating system TaMgmYlRtUv)ansresredayPasa C. emeronenHnwgBinitüelIrebob
C nig UNIX RbTak;RbTgKña.
eyIgRtUvEteRbI UNIX edIm,IrkSaTMhM file rbs;eyIg BinitüepÞogpÞat;, compile nig run programs .l..
EteTaHCay:agNak¾eday UNIX KWmansar³sMxan;eRcInCagenH:
11.1 Advantages of using UNIX with C
-104-
vCBk
11.2 Using UNIX System Calls and Library Functions
Edlsmrmü.
]TahrN_ standard library functions eyIg)anRbTHkarbBa©ÚlGnuKmn_ I/O kMritx<s;Cag fprintf(),
malloc() ...
GnuKmn_ehIyepSgeTotyktamKMrURsedogenH.
sMrab;;karehARbB½n§CaeRcInnigGnuKmn_ library eyIgRtUvEtrab;bBa©Úl header file RtwmRtUv. e.g. stdio.h,
math.h
WWWW±XXXX
-105-
vCBk
CMBUkTI 12
Integer Functions, Random Number, String
Conversion, Searching and Sorting:
<stdlib.h>
-106-
vCBk
edIm,IeRbIR)as;GuKmn_TaMgGs;enAkúñg library GñkRtUv:
#include <stdlib.h>
manEpñkmUldæanbIrbs;GnuKmn_:
elxKNit (Arithmetic)
cMnYnécdnü (Random Numbers)
karbMElg String (String Conversion)
kareRbIR)as;rbs;GnuKmn_TaMgenHKWmanTMnak;TMngedaypÞal;.eyIgRtwmEtRtYtBinitüBYkvaedaysegçb
CatYnaTIkñúgemeronenH.
12.1 Arithmetic Functions
manGnuKmn_cMnYnKt;RKwH4:
int abs(int number);
long int labs(long int number);
dUcenH:
#include <stdlib.h>
....
-107-
vCBk
ans = div(num,den);
begáItkare)aHecjxageRkam:
Answer:
Quotient = 2
Remainder = 2
-108-
vCBk
** number generator.
*/
#include <stdlib.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
/*
** Seed the random number generator with the current time
** of day if we haven't done so yet.
*/
if( first_time ){
first_time = FALSE;
srand( (unsigned int)time( NULL ) );
}
/*
** "Shuffle" by interchanging random pairs of cards.
*/
for( i = n_cards - 1; i > 0; i -= 1 ){
int where;
int temp;
where = rand() % i;
temp = deck[ where ];
deck[ where ] = deck[ i ];
deck[ i ] = temp;
}
}
int i;
float f;
i = atoi(str1); /* i = 100 */
f = atof(str2); /* f = 55.44 */
i = atoi(str3); /* i = 1234 */
i = atoi(str4); /* i = 123 */
i = atoi(str5); /* i = 0 */
cMNaM:
naMdl;GkSrTeTrKWrMlg.
knÞúyGkSrminRtwmRtUvKWminRtUv)andwglW.
RbsinebIkarpøas;bþÚrminGacRtUv)aneFIV sUnüRtUv)anepÞrnig errno RtUv)ankMnt;CamYytMél
ERANGE.
GnuKmn_ bsearch() epÞr pointer eTA field EdlCarbs; key filed RtUv)anbMeBjCamYytMélEdl
RtUvKñaén NULL RbsinebIminKY)anrkeXIj.
cMnaMfaRbePTén key argument RtUvEtdUcKañCaFatu array (Record xagelI) ebIeTaHbICamanEtFatu
key.key mYyb:ueNÑaHRtUv)anRtUvkaredIm,IkMnt;.
Exercises
Exercise 12-1
sresrkmμviFIEdleFIVeGaydUckare)aHRKab;LúkLak;
Exercise 12-2
WWWW±XXXX
-111-
vCBk
CMBUkTI 13
Input and Output (I/O):stdio.h
-112-
vCBk
emeronenHnwgbeRgonTRmg;rbs; I/O.
eyIg)anENnaMedaysegçbTRmg;mYycMnYnmunsikSaTRmg;TaMgenHenA kñúglkçN³lMGitenATIenH.
kmμviFIrbs;GñknwgRtUvkarrYmbBa©Úlsþg;da I/O header file dUcenH:
#include <stdio.h>
errno
vaGacRtUv)ankMnt;eLIgvijedayédenAkñúgkmμviFI C
(EteTaHCay:agNak¾edayvaminEmnCakarGnuvtþFmμtaeT)
ebImindUcenHeTvaCaFmμtarkSaTuktMélEdl)anepÞrcugeRkayedaykarehARbB½n§b¤GnuKmn_ library.
-113-
vCBk
exit()
KWCaviFIEdlGaceRbIkarGannigkarsresrTinñn½y. BYkvapþl;eGaynUvPaBbt;EbnnigmeFüa)ay
Streams
EdlmansmßPaBrbs; I/O.
Stream KWCa file b¤rUbrag]bkrN_ (e.g. printer b¤ monitor) EdlRtUv)ancat;EcgCamYy pointer eTA
stream.
CamYy streams.
eyIgRKan;EtRtUvkarRbkasGBaaØt pointer rbs;RbePTenHkñúgkmμviFIrbs;eyIg.
eyIgmincaM)ac;RtUvkardwgGMBIrkarkMnt;Cak;lak;NamYyeT
eyIgRtUvEtebIk stream muneFIV I/OGIVmYy enaHeRkaymkeRbIvaehIybiTvavij.
Stream I/O KWCa BUFFERED: EdlRtUv)ankMnt;faminERbRbYl ”chunk” KWGanBIb¤RtUv)ansresreTA
file tamtMbn;rkSaTukGciéRnþmYycMnYn (buffer). enHRtUv)anBnül;enAkñúgrUb 12.1. cMNaM file pointer
-114-
vCBk
eFIVbBaðaenH). karcakecjxusBIFmμtaNamYyrbs;kUdGacbNþaleGayekItbBaða.
9 Predefined Streams
Console KWCa default sMrab;; stdout nig stderr. keyboard KWCa default sMrab;; stdin.
stream EdlkMnt;Tukmun (predefined stream) KWRtUv)anebIkedaysV½yRbvtþi.
13.3 Basic I/O
-115-
vCBk
int ch;
ch = getchar();
(void) putchar((char) ch);
kar ehARtUv)anCYbRbTH.
GnuKmn_EdlCab;Tak;Tg:
int getc(FILE *stream) : fgetc epÞrGkSrbnÞab;rbs; stream Ca unsigned char
ehIy :
char *gets(char *s) : gets Gankare)aHbBa©ÚlbnÞab;eTAkñúg array s vaCMnYskarbBa©b;
int puts(const char *s) : puts sresr string s nig newline eTA stdout.
-116-
vCBk
9 Printf
GnuKmn_RtUv)ankMnt;dUcxageRkam:
int printf(char *format, arg list ...) – e)aHecjeTA stdout taragrbs;
arguments GaRs½yeTAtamTRmg; string EdlRtUv)ankMnt;Cak;lak;.
epÞrcMnYnrbs;GkSrEdlRtUv )ane)aHecj.
karkMnt;TRmg; string (format string) manBIrRbePTén object:
ordinary characters – TaMgenHRtUv)ancmøgedIm,Ie)aHecj.
conversion specifications – RtUv)ancg¥úlR)ab;eday % ehIyRtUv)ankt;Tukkñúg tarag 13.1.
-117-
vCBk
-- m = TTwg field, d = PaBc,as;las;rbs;cMnYnéntYelxxageRkay decimal point b¤cMnYnrbs; chars
BI string.
dUcenH:
#include <stdio.h>
void main()
{
int num1=123; float num2=4.567; long num3=1234567;
printf("num1=%d| |num2=%f\n",num1, num2);
printf("num1=%10d| |num2=%10.5f\n",num1, num2);
printf("num1=%-10d| |num2=%10.1f\n",num1, num2);
printf("num1=%10.3f| |num2=%d\n",num1, num2);
}
kare)aHecjenAelIeGRkg;KW:
num1=123| |num2=4.567
num1= 123| |num2= 4.56700
num1=123 | |num2= 4.7
num1= -0.000| |num2=1074939035
nig:
printf("VAT=17.5%%\n");
... e)aHecj:
VAT=17.5%
TTwgb¤PaBCak;lak;GacRtUv)ankMnt;Ca * EdlkñúgenHkrNItMélRtUv)anKNnaedaykarpøas;bþÚr
argument bnÞab; (EdlRtUvEtCa int). ]TahrN_edIm,Ie)aHecjGkSr max eRcInbMputBI string s,
karpøas;bþÚrTRmg;eRcInbMputRtUv)anBnül;enAkñúgemerondMbUg.
karelIkElgmYyCaCak;lak;xN³EdlvaCab;Tak;Tg;eTAnig string . taragxageRkambgðajRbsiT§iPaB
éndMeNIrpøas;bþÚrjy²énkarCak;lak;enAkñúgkare)aHecj ``hello, world''(12 tYrGkSr). eyIg)andak;
sBaØa colon (:) xagmux field mYydUcenHGñkGaceXIjva xan;dac;BIKña.
:%s: :hello, world:
:%10s: :hello, world:
:%.10s: :hello, wor:
-118-
vCBk
:%-10s: :hello, world:
:%.15s: :hello, world:
:%-15s: :hello, world :
:%15.10s: : hello, wor:
:%-15.10s: :hello, wor :
9 scanf
GnuKmn_RtUv)ankMnt;dUcxageRkam:
int scanf(char *format, args....) – GanBI stdin
nigdak;bBa©ÚlkñúgGas½ydæanrbs;GBaaØtCak;lak;kñúgbBa¢I args . epÞrcMnYnrbs; chars EdlGan.
Format control string RsedogeTAnwg printf
cMNaM: Gas½ydæanrbs;GBaaØtb¤cg¥úleTAGBaaØtEdlRtUvkareday scanf.
scanf(``%d'',&i);
cUlemIl]TahrN_sMrab;;Xøa scanf :
#include <stdio.h>
-119-
vCBk
void main()
{
char ch;
int num;
float f;
printf("Enter a character:"); scanf("%c", &ch);
printf("Enter an intger:");scanf("%d", &num);
printf("Enter a floating point number:"); scanf("%f", &f);
printf("%c\n", ch);
printf("%d\n", num);
printf("%f\n", f);
}
13.5 Files
fopen epÞr pointer eTA FILE. eQμaH string CaeQμaHrbs; file enAelI disc EdleyIgcg;eRbI.
string mode RtYtBinitüRbePTénkareRbIR)as;rbs;eyIg.RbsinebI file minGacRtUv)aneRbIcMeBaHehtu
stream = fopen(“myfile.dat”,”r”);
-120-
vCBk
GnuKmn_epSgeTotsMrab; files:
int getc(FILE *stream), int fgetc(FILE *stream)
int putc(char ch, FILE *s), int fputc(char ch, FILE *s)
manGnuKmn_Edlmansar³RbeyaCn_BIrbI EdlmanKMrUdUcxageRkam:
int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
int fileno(FILE *stream);
-121-
vCBk
kareRbIR)as;rbs;BYkvaKWsamBaØedayGacERbRbYl:
feof()
-- epÞrBitRbsinebI stream KWkMBugsßitenAcug file . dUcenHedIm,IGan stream,fp,
mYybnÞat;mþg²GñkGaceFIV:
while ( !feof(fp) )
fscanf(fp,"%s",line);
ferror()
-- r)aykarN_enAkñúgdMNak;kalkMhusrbs; stream nigepÞrBitRbsinebIkMhusRtUv)anekIteLIg.
clearerr()
-- karkMnt;eLIgvijkarbgðajkMhussMrab;; stream Edlpþl;eGay.
fileno()
-- epÞr file descriptor cMnYnKt;FmμCatiEdlP¢ab;CamYyeQμaH stream.
13.6 Low Level I/O
k¾GacRtUv)aneRbIR)as;edIm,IbegáIt file.
int close(int handle) -- close a file
#include<stdio.h>
#include<fcntl.h>
float bigbuff[1000];
{ int fd;
int bytes_read;
int file_length;
-123-
vCBk
Exercises
Exercise 13-1
WWWW±XXXX
-124-
vCBk
CMBUkTI 14
Miscellaneous Functions
-125-
vCBk
Standard library pþl;eGaykarpøas;bþÚry:agTUlayénGnuKmn_enAEpñkenHKWCakarsegçberOgEdlman
GtßRbeyaCn_CaeRcIn.
14.1 String Handling: <string.h>
karehAmþgeTotBIkarBiPakSarbs;eyIgenAelI array Edl strings RtUv)ankMnt;Ca array énGkSrb¤
pointer eTAnwgEpñkrbs; memory pÞúkGkS ASCII . String enAkñúg C KWCalMdab;bnþbnÞab;rbs;sUnü
int strcmp(const char *string1,const char *string2) : eRbobeFob string1 nig string2
edIm,IkMnt;lMdab;tamlMdab;GkSr.
char *strcpy(const char *string1,const char *string2) : cmøg string2 eTA stringl.
char *strncat(const char *string1, char *string2, size_t n) : bEnßm n tYGkSrBI string2 eTA
stringl.
int strncmp(const char *string1, char *string2, size_t n) : eRbobeFob n tYGkSrdMbUgrbs; string
BIr.
-126-
vCBk
char *strncpy(const char *string1,const char *string2, size_t n) : cmøg n tYGkSrdMbUgén string2
eTA stringl .
int strcasecmp(const char *s1, const char *s2) : krNIminRbkan;tYGkSr (case insensitive version)
én strcmp().
int strncasecmp(const char *s1, const char *s2, int n) : krNIyminRbkan;tYGkSr (case
sUnü
-- RbsinebI string1 nig string2 manRbEvgesμIKña
FMCagsUnü
-- RbsinebI string1 manRbEvgFMCag string2
enHk¾GaceFIVeGayGñkeTIbEtcab;epþImsresrkmμviFInigGñkmanbTBiesaFn_sresrkmμviFIePøcvaEdr.
GnuKmn_cMlg strncat(), strncmp,() nig strncpy() KWCa string Edlkat;bnßyCMnan; (restricted version
)énvtßúEdlCaKUrKñaTUeTACaeRcInrbs;BYkva. BYkvaGnuvtþkargarRsedogKñab:uEnþRtwmEteTAdl; n
tYGkSrdMbUg. cMnaM NULL EdlbBa©b;tMrUvkarGacTTYlkarbMBanenAeBlkareRbIGnuKmn_TaMgenH
]TahrN_:
char *str1 = "HELLO";
char *str2;
int length = 2;
-127-
vCBk
str2 is NOT NULL TERMINATED.
9 String Searching
library k¾pþl;eGaynUvGnuKmn_ string searching mYycMnYnEdr:
char *strchr(const char *string, int c) : rkkarCYbRbTHdMbUgrbs;GkSr c enAkñúg string.
char *strstr(const char *s1, const char *s2) : kMnt;TItaMgkarCYbRbTHdMbUgrbs; string s2 enAkñúg
string s1.
char *strpbrk(const char *s1, const char *s2) : epÞr pointer eTAkarCYbRbTHdMbUgenAkñúg s1
EdlKUnig s2.
size_t strcspn(const char *s1, const char *s2) : epÞrcMnYnrbs;GkSrenAxagedImrbs; s1
EdlminEmnCaKUnig s2.
char *strtok(char *s1, const char *s2) : bMEbk string Edlcg¥úleday s1
ans = strchr(str1,'l');
eRkayBIkarRbtibtþienH ans cg¥úleTATItaMg str1 + 2
strpbrk() CaGnuKmn_TUeTACageKEdlEsVgrkkarCYbRbTHelIkdMbUgrbs;RkuménGkSrNamYYy ]TahrN_:
char *str1 = "Hello";
char *ans;
ans = strpbrk(str1,'aeiou');
enATIenH ans cg¥úleTATItaMg str1 + 1 TItaMgrbs; e dMbUg.
strstr() epÞr pointer eTA string EdlEsVgrkCak;lak;b¤ null pointer RbsinebI string
-128-
vCBk
ans = strstr(str1,'lo');
nwgnaMmk ans = str + 3.
strtok() KWmankarBi)akeRcInCagbnþickñúgkarRbtibtþi. RbsinebI argument dMbUgminEmnCa NULL
printf("%s\n",t1);
enATIenHeyIgeRbI for loop enAkúñgKMrUrab;minsþg;damYy:
karcabepþIm (initialisation) ehA strtok() load function Edlman string str1
eyIgbBa©b;enAeBl t1 esμI NULL
eyIgrkSakarkMnt;ykrbs; str1 esμI t1 rhUtdl;karbBa©b;edaykarehA strtok() eday NULL
argument dMbUg.
EdlpÞúkGnuKmn_manRbeyaCn_CaeRcInedIm,Ipøas;bþÚrnigsakl,gGkSrEtmYy. GnuKmn_CaFmμtamanKMrU
(prototype) dUcxageRkam:
Character testing:
int isalnum(int c) : BitRbsinebI c CaGkSrRkmelx.
int isalpha(int c) : BitRbsinebI c CaGkSrmYy.
-129-
vCBk
int isgraph(int c) : BitRbsinebI c CaGkSr graphic (graphical character).
int islower(int c) : BitRbsinebI c CatYGkSrtUc
kareRbIR)as;GnuKmn_TaMgenHKWRtg;²ehIyeyIgmineGay]TahrN_enATIenHeT.
14.3 Memory Operations: <memory.h>
eyIgsegçbTsSn³RbtibtþikarRKwHmYycMnYn. eTaHbICaminmanGnuKmn_ string twgrwgk_edayk_
GnuKmn_KWKMrUmanenAkñúg #include <string.h>:
void *memchr (void *s, int c, size_t n) : EsVgrktYGkSrenAkñúg buffer.
int memcmp (void *s1, void *s2, size_t n) : eRbobeFob buffer BIr.
void *memcpy (void *dest, void *src, size_t n) : cmøg buffer mYyeTAmYYyepSgeTot.
void *memmove (void *dest, void *src, size_t n) : pøas;cMnYnrbs; byte BI buffer
eTAmYyepSgeTot.
void *memset (void *s, int c, size_t n) : kMnt;RKb; byte rbs; buffer eTAeGayGkSr.
-130-
vCBk
memcpy(idest,isrc, SIZE*sizeof(int)); /* Copy arrays of ints */
memmove() eFVIenAkñúgviFICak;lak;dUc memcpy() elIkELgkEnøgRbPB (source) nigTisedA
(destination) GacRtYtelIKña.
-131-
vCBk
labs(long n) : rktMéldac;xat;rbs; long integer n.
double ldexp(double x, int exp) : eFIVeLIgvij x xageRkAénplbUknigniTsSnþén2.
Exercises
Exercise 14-1
cUrsresrGnuKmn_RsedogeTAnwg strlen EdlGacedaHRsay string EdlminkMnt;.
ENnaMGñknwgcaM)ac;RtUvecHbBa¢ÚnRbEvgrbs; string.
Exercise 14-2
sresrGnuKmn_EdlepÞrtMélBitRbsinebIkarbBa¢Úl string CaBaküEdlGacGanRtLb;cuHeLIg)an
(palindrome)rvagKñanigKña. Baküb¤XøaEdlGacGanRtLb;cuHeLIg)an (palindrome) KWCaBaküEdl
WWWW±XXXX
-133-
vCBk
CMBUkTI 15
Process Control:
<stdlib.h>,<unistd.h>
-134-
vCBk
Rbtibtþikar (process) KWedaymUldæanCakmμviFIkMBugdMeNIrkarmYy. vaGacCa “RbB½n§ (system)” kmμviFI
(e.g login, update, csh) b¤kmμviFIEdlcab;epþImedayGñkeRbIR)as; (textedit, dbxtool
b¤sresredayGñkeRbIR)as;).
enAeBl UNIX dMeNIrkarRbtibtþi (runs a process) vapþl;eGayRbtibtþikarnimYy²nUvcMnYnEdl
manEtmYy – Rbtibtþikar ID (process ID), pid.
XøabBa¢a UNIX ps nwgeGaytaragRKb;RbtibtþikarkMBugdMeNIrkarenAelIma:sIunrbs;GñkehIynwgbBa¢I
pid.
9 execl()
-135-
vCBk
execl sþg;dasMrab;; execute nig leave Edlmann½yfaRbtibtþikar (process) nwgTTYlkarRbtibtþi
ehIybBa©b;eday execl.
vakMnt;eday:
execl(char *path, char *arg0,...,char *argn, 0);
dUcenH]TahrN_xagelIrbs;eyIgmanragya:genH:
main()
{ printf(``Files in Directory are:\n'');
execl(`/bin/ls'',``ls'', ``-l'',0);
}
9 fork()
-136-
vCBk
printf(``Forking process\n'');
fork();
printf(``The process id is %d and return value is %d\n", getpid(),
return_value);
execl(``/bin/ls/'',``ls'',``-l'',0);
printf(``This line is not printed\n'');
}
kare)aHecjTaMgenHGacCa:
Forking process
The process id is 6753 and return value is 0
The process id is 6754 and return value is 0
two lists of files in current directory
dUcenHdMeNIrkarmYYyGacxusKñaBIdMeNIrkarbnþbnÞab;eTot. enAeBleyIgbegáItRbtibtþikar 2
eyIgGacgay RsYlrkeXIj (enAkñúgRbtibtþikarmYy) minfavaCa child b¤ parent eRBaH fork epÞrtMél 0
eTA child. eyIgGaccab;kMhusNamYyRbsinebIvaepÞrtMél -1. i.e.:
int pid; /* process identifier */
pid = fork();
if ( pid < 0 )
9 wait()
/* cc -o fork fork.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
main()
{
char buf[1024];
char *args[64];
for (;;) {
/*
* Prompt for and read a command.
*/
printf("Command: ");
if (gets(buf) == NULL) {
printf("\n");
exit(0);
}
/*
* Split the string into arguments.
*/
parse(buf, args);
/*
* Execute the command.
*/
execute(args);
}
}
/*
* parse--split the command in buf into
* individual arguments.
*/
-138-
vCBk
parse(buf, args)
char *buf;
char **args;
{
while (*buf != NULL) {
/*
* Strip whitespace. Use nulls, so
* that the previous argument is terminated
* automatically.
*/
while ((*buf == ' ') || (*buf == '\t'))
*buf++ = NULL;
/*
* Save the argument.
*/
*args++ = buf;
/*
* Skip over the argument.
*/
while ((*buf != NULL) && (*buf != ' ') && (*buf != '\t'))
buf++;
}
*args = NULL;
}
/*
* execute--spawn a child process and execute
* the program.
*/
execute(args)
char **args;
{
int pid, status;
/*
* Get a child process.
*/
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
/*
* The child executes the code inside the if.
*/
if (pid == 0) {
execvp(*args, args);
perror(*args);
exit(1);
-139-
vCBk
/* NOTE: The execv() vnd execvp versions of execl() are useful when
the number of arguments is unknown in advance; The arguments to
execv() and execvp() are the name of the file to be executed and a
vector of strings containing the arguments. The last argument
string must be followed by a 0 pointer. execlp() and execvp() are
called with the same arguments as execl() and execv(), but
duplicate the shell's actions in searching for an executable file in
a list of directories. The directory list is obtained from the
environment. */
}
/*
* The parent executes the wait.
*/
while (wait(&status) != pid)
/* empty */ ;
}
Exerises
Exercise 15-1
eRbI popen() bBa¢ÚneTA rwho (UNIX command) e)aHecjeTAkñúg more (UNIX command)
kμñúgkmμviFI C.
WWWW±XXXX
-140-