குர்ஆனை பொருள் உணர்ந்து தினம் ஒரு பக்கமாவது படியுங்கள்

பதிவுகளில் தேர்வானவை

9.2.11

அல்லாஹ் நம் அனைவருக்கும் நல்லருளும் நற்கிருபையும் புரிவானாக

சி-மொழி
சி-மொழியில் ஒரு நிரலை எழுதிச் செயல்படுத்துவது எப்படி என்பதைப் பார்ப்போம். சி-மொழியில் ஜோர்டெக்-சி, போர்லாண்டு-சி, மைக்ரோசாஃப்ட்-சி, டர்போ-சி என்று எத்தனையோ வகைகளும், ஒவ்வொன்றிலும் பல்வேறு பதிப்புகளும் உள்ளன. இவை எல்லாம் பல்வேறு நிறுவனங்கள் உருவாக்கிய சி-மொழிக்கான கம்ப்பைலர்கள். இவையனைத்தும் ரிட்சி உருவாக்கிய அடிப்படையான சி-மொழியின் இலக்கணப்படி அமைந்தவை.


நாம் எழுதும் சி-மொழி நிரலை ஏதேனும் ஒரு கம்ப்பைலரில் கம்ப்பைல் செய்து பிறகுதான் இயக்கிப் பார்க்க முடியும். கம்ப்பைலர்களில் பின்பற்றப்படும் வழிமுறைகளில் மிகச்சிறு வேறுபாடுகள் இருக்க முடியும். நமது பாடங்களைப் பொறுத்தவரை டர்போ-சி (Turbo C) கம்ப்பைலரை அடிப்படையாகக் கொண்டே நிரல்கள் வடிவமைக்கப்பட்டுள்ளன. கருத்துருக்களும் விளக்கப்பட்டுள்ளன. ஒன்றில் நல்ல அனுபவம் பெற்று விட்டால், மற்றதில் பணிபுரிவது எளிதாகவே இருக்கும்.

நிரலை எழுதிச் சேமித்தல்

டர்போ சி-யின் ஃபைல்கள் TC என்னும் டைரக்டரியில் இருப்பதாக வைத்துக் கொள்வோம். அந்த டைரக்டரியில் இருந்துகொண்டு,

C : \TC>TC WELCOME

என்று கட்டளை கொடுங்கள். திரையில் டர்போ சி-யின் ஒருங்கிணைந்த புரோகிராம் உருவாக்க சூழலின் (Integrated Development Environment) மெனுவும் புரோகிராம் எடிட்டரும் தோன்றும்.

டர்போ சி-யின் எடிட்டரில் கீழ்க்காணும் புரோகிராமை தட்டச்சு செய்யுங்கள்:

/*ProgramNo.1.1*/

/*WELCOME.C*/

#include

main()

{

printf("WelcometoC!");

}

சிறிய எழுத்து, பெரிய எழுத்து, அடைப்புக் குறிகள், அரைப்புள்ளி ஆகியவற்றை எதையும் மாற்றாமல் மறக்காமல் அப்படியே தட்டச்சு செய்யுங்கள். ஏன் என்று பிறகு விளக்கமாகப் பார்ப்போம். நிரலைத் தட்டச்சிட்டு முடித்த பிறகு F2 விசையை அழுத்துங்கள். உங்கள் நிரல் WELCOME.C என்ற பெயரில் நிலைவட்டில் சேமிக்கப்பட்டுவிடும். C என்ற வகைப்பெயரை ((Extension) டர்போ-சி தானாகவே கோப்பின் பெயரில் ஒட்ட வைத்துக்கொள்ளும்.

நிரலைக் கம்ப்பைல் செய்து செயல்படுத்தல்

கோப்புச் சேமிக்கப்பட்ட பின்னும் டீசி எடிட்டர் திரை மறையாமல் அப்படியே இருக்கும். இப்போது F9 விசையை அழுத்துங்கள். திரைக்குள் ஒரு குட்டித்திரை தோன்றும். கம்ப்பைலிங், லிங்க்கிங் ஆகிய இரண்டு வேலைகளும் கடகடவென்று நடந்து முடியும். WELCOME.EXE என்ற கோப்பு உருவாகி விடும். Success என்ற செய்தி திரையில் தெரியும். Press any key என்ற செய்தி மின்னிக் கொண்டிருக்கும். நீங்கள் Alt+F கீகளை ஒருசேர அழுத்துங்கள். மேலே முதல் வரியிலுள்ள மெனுத் தேர்வுகளில் File என்பதில் உள்ள துணைமெனுப் பட்டியல் திரையில் தோன்றும். இப்போது O (ஓ) என்னும் எழுத்தைத் தட்டுங்கள். அது ’ஆப்பரேட்டிங் சிஸ்டம் ஷெல்லைக்’ (OS Shell) குறிக்கிறது.

அதாவது, நீங்கள் தற்காலிகமாக டீசி பணிப் பரப்பைவிட்டு நீங்கி, டாஸ் பணிப் பரப்பிற்கு வந்திருக்கிறீர்கள் என்று பொருள். திரையில் மைக்ரோசாஃப்டின் பதிப்புச் செய்தியும், C:\TC> என்ற டாஸ் சின்னமும் தோன்றும். இப்போது,

C : \ TC > WELCOME

என்று கட்டளை கொடுங்கள். சுத்தமான திரையின் மத்தியில்,

Welcome to C!

என்ற வாசகம் தோன்றும். அருகில் C : \TC> என்னும் டாஸ் சின்னம் இருக்கும். இப்போது EXIT என்ற கட்டளை கொடுங்கள். மீண்டும் டீசி எடிட்டரில் உங்கள் நிரல் தோன்றும். ஏதேனும் திருத்தங்கள் இருப்பின், செய்யலாம். முன்பு சொன்னது போலவே F2 விசையை அழுத்தி நிரலைச் சேமிக்கலாம். F9 மூலம் .EXE கோப்பினை உருவாக்கலாம். Alt+F+O மூலம் ஓஎஸ் ஷெல்லுக்கு வந்து நிரலைச் செயல்படுத்தலாம்.

மாற்று வழிமுறை

சி-மொழி நிரலை இயக்கிப் பார்க்க இன்னொரு வழிமுறையும் உள்ளது. நிரலை எழுதி முடித்தவுடன் Ctrl மற்றும் F9 கீகளை ஒருசேர அழுத்துங்கள். நிரல் கம்ப்பைல் ஆகி, லிங்க் ஆகி, .EXE கோப்பு உருவாகி முடிந்துவிடும். ஆனால் உடனே ஐடிஇ-க்கே திரும்பிவிடும். நிரலின் வெளியீட்டைப் பார்க்க வேண்டுமானால் Alt+F5 விசைகளை அழுத்த வேண்டும். டாஸ் திரையில் வெளியீடு தெரியும். என்டர் விசையைத் தட்டினால் மீண்டும் ஐடிஇ-க்கே திரும்பலாம். பலரும் இந்த முறையையே பின்பற்றுகிறார்கள். ஆனால், சில சி-மொழி நிரல்களை இந்த முறையில் இயக்கிப் பார்க்க முடியாது. எனவே, F9 அழுத்திக் கம்ப்பைல் / லிங்க் செய்தபின், Alt+F+O அழுத்தி, டாஸ் சூழலுக்கு வந்து, நிரலை இயக்கிப் பார்க்கும் முறையே சிறந்த முறையாகும்.

டீசி எடிட்டரில் இருக்கும்போது Alt+F விசைகளை ஒருசேர அழுத்தி, துணைமெனு வந்த பிறகு L என்ற எழுத்தை அழுத்தி, ஏற்கெனவே எழுதப்பட்டுள்ள ஒரு நிரலின் பெயரை உள்ளிட்டு, அதனை எடிட்டரில் வரவழைக்கலாம். L-க்குப் பதில் N கீயை அழுத்திப் புதிய நிரலை எழுதலாம். எழுதி முடித்துச் சேமிக்கும் முன்பாகப் புதிய நிரலுக்குப் பெயர் கொடுக்கலாம்.

டீசி பணிப் பரப்பை அதாவது டீசி ஐடிஇ-யை விட்டு வெளியே வருவதற்கு Alt +F விசைகளை ஒரு சேர அழுத்திப் பின் Q விசையைத் தட்டுங்கள். திரையில் C:\TC> தோன்றும். விண்டோஸிலிருந்து TC-க்குச் சென்றிருப்பின் மீண்டும் விண்டோஸ் முகப்புக்கு வந்து விடலாம். இப்போது டீசியைவிட்டு நிரந்தரமாக வெளியே வந்துவிட்டீர்கள்.

வேறு எடிட்டரைப் பயன்படுத்தல்

சி-மொழிப் நிரலை நோட்பேடு போன்ற வேறு எந்த எடிட்டரில் வேண்டுமானாலும் எழுதலாம். வேறு எடிட்டரில் எழுதும்போது .C என்ற வகைப்பெயர் கொடுத்து, WELCOME.C என்று நிரல் கோப்பினை உருவாக்குங்கள். பிறகு, கூஊ டைரக்டரிக்கு வந்து,

C:\TC>TCC WELCOME

என்று கட்டளை கொடுங்கள். ஒரே நொடியில் நிரல் கம்ப்பைல், லிங்க் செய்யப்பட்டு, WELCOME.EXE என்ற கோப்பு உருவாகிவிடும். ஆனால், டீசி ஐடிஇ-யில் நிரல் எழுதிக் கம்ப்பைல் செய்யும்போது, நிரலில் உள்ள பிழைகளைக் கண்டறிந்து திருத்துவதற்கு ஐடிஇ-யின் சில தனிச்சிறப்பான வசதிகளை பயன்படுத்திக் கொள்ள முடியும்.

[பாடம்-3 முற்றும்]

ஒரு நிரலின் கட்டமைப்பில், இருவகைக் கூறுகள் உள்ளன. ஒன்று மரபு (Convention); மற்றொன்று விதிமுறை (Rule). மரபுகளை, நீங்கள் விரும்பினால் பின்பற்றலாம். இல்லாவிட்டால் விட்டுவிடலாம். மரபுகள் பின்பற்றப்படா விட்டாலும் அந்த நிரல் சரியாகவே செயல்படும். ஆனால் விதிமுறைகளை நிரல் எழுதும்போது கட்டாயம் கடைப்பிடித்தே ஆக வேண்டும். இல்லையேல் நிரல் கம்ப்பைல் ஆகாது அல்லது சரியாகச் செயல்படாது.

ஒவ்வொரு மொழியிலும் மரபு முறைகளும், விதிமுறைகளும் வேறுபடுகின்றன. ஆனால், இந்த இரண்டு கூறுகள்தாம் ஒரு மொழியில் எழுதப்படும் நிரலின் கட்டமைப்பினை முடிவு செய்கின்றன.

ஒரு சிறு நிரலை எடுத்துக் கொள்வோம். இந்த நிரலைச் செயல்படுத்தியவுடன், ஓர் ஆண்டை உள்ளிடும்படி கேட்கும். நாம் கொடுத்த ஆண்டு லீப் ஆண்டா அல்லது சாதாரண ஆண்டா என்பதைக் கணக்கிட்டுச் சொல்லும். இந்த நிரலில் கட்டளை வாக்கியங்கள் எப்படி அமைந்துள்ளன, அவற்றின் பொருள் என்ன நிரலின் வடிவமைப்பு எப்படி உள்ளது, மரபு முறைகளும் விதிமுறைகளும் எப்படிப் பின்பற்றப்பட்டுள்ளன என்ற விவரங்களை மேலோட்டமாக இப்பாடத்தில் அறிந்துகொள்வோம். அடுத்துவரும் பாடங்களில் ஒவ்வொன்றைப் பற்றியும் ஆழமாகக் கற்போம்.

/*ProgramNo.1.2*/

/*LEAPYEAR.C*/

/*Programtofindsquareofanumber*/

/*WrittenbyM.Sivalingamon25-04-1994*/

#include

main()

{

iny;

printf("Enteryear:");

scanf("%d",&y);

if(y%4==0&&y%100!=0

y%400==0)

printf("%disaleapyear",y);

else

printf("%disnotaleapyear",y);

}

இந்த நிரலை எழுதி இயக்கிப் பார்ப்பதற்கு முன்பாக, நிரலின் கூறுகள் ஒவ்வொன்றையும் வரிவரியாக ஆய்வு செய்வோம்.

1. குறிப்புரை (Comment)

ஒரு நிரலின் தலைப்பில், நிரலின் முகப்புரை (Preamble) இடம் பெறுவது மரபாகும். நிரலின் பெயர், நிரலின் நோக்கம், நிரலை எழுதியவர் பெயர், நாள் போன்ற குறிப்புகள் கொண்ட பகுதி முகப்புரை எனப்படுகிறது. சி-மொழியில் இதனைக் குறிப்புரை (Comment) என்கிறோம். குறிப்புரை /* */ ஆகிய குறிகளுக்கு இடையில் அமையும். சி-மொழி நிரலுக்குக் குறிப்புரை கட்டாயமில்லை. மேற்கண்ட நிரலில் குறிப்புரைகள்,

/*ProgramNo.1.2*/

/*LEAPYEAR.C*/

/*Programtocheckleapyear*/

/* Written by M.Sivalingam on 25-04-1994 */

என அமைந்துள்ளன. சி-மொழியில் குறிப்புரை நிரலின் முகப்பில் மட்டுமின்றி எங்கு வேண்டுமானாலும் இடம் பெறலாம்.

குறிப்புரைக்கும், நிரல் செயல்பாட்டுக்கும் எவ்விதத் தொடர்பும் இல்லை. இந்தக் குறிப்புரைகள் இல்லாவிட்டாலும் நிரல் சரியாகவே செயல்படும் என்பதை மறக்க வேண்டாம். நிரலைக் கம்ப்பைல் செய்யும்போது /* */ ஆகியவற்றுக்கு இடையே அமையும் குறிப்புரைகளைக் கம்ப்பைலர் புறக்கணித்துவிடும். இத்தகைய விளக்கக் குறிப்புரைகள் நிரலைப் படிக்கின்ற மற்றவர்களுக்கு பெரிதும் பயன்படுகின்றன. நிரலை எழுதியவர்க்கேகூட இந்த விளக்கக் குறிப்புகள் பயனுள்ளவையாக இருக்கும்.

குறிப்புரை எத்தனை வரிகள் வேண்டுமானாலும் இருக்கலாம். குறிப்புரை முடிந்த பிறகு */ என்ற குறிகளை இடவேண்டும். ஒவ்வொரு கட்டளைக்கும் அரைப்புள்ளி இடவேண்டும் என்ற சி-மொழி விதிமுறை விளக்கவுரைக்குப் பொருந்தாது.

/* */ ஆகிய குறிகளைக் குறிப்புரையின் ஒவ்வொரு வரியிலும் பயன்படுத்தத் தேவையில்லை. விளக்கவுரை எத்தனை வரிகள் இருந்தாலும் தொடக்கத்தில் /* எனவும், இறுதியில் */ எனவும் குறிப்பிட்டால் போதும்.

/*..... /* .....*/ .....*/

என்று குறிப்புரைக்குள், இன்னொரு குறிப்புரை எழுத அனுமதி கிடையாது.

நிரலில் எங்கு வேண்டுமானாலும் குறிப்புரை இடம்பெறலாம். ஒவ்வொரு கட்டளை வரிக்கு முன்னும் பின்னும் குறிப்புரை அமைக்கலாம். கட்டளை வரியிலேயே குறிப்புரை இடம்பெறலாம்.

int i, J;/*Declaring variables*/

என்று அமைக்கலாம். ஒரு கட்டளையின் நடுவில்கூட குறிப்புரை அமைக்க முடியும் என்பது சி-மொழியின் சிறப்புக்கூறாகும். printf(), scanf() மற்றும் இனி படிக்கவிருக்கும் if(), for(), while() ஆகியவற்றில் அடைப்புக்குறிகளுக்கு உள்ளேயும் குறிப்புரை அமைக்கலாம்.

scanf("%d",&num/*Addressofthevariable*/);

printf(/* Display the result */ "%d is a leap year", y);

என்று குறிப்புரைகளை அமைக்கலாம். இவ்வாறெல்லாம் ஒவ்வொரு வரிக்கும் குறிப்புரை எழுத வேண்டியதில்லை. தேவையான இடங்களில் மட்டும் குறிப்புரை சேர்ப்பது சிறந்தது.



2. நூலகக் கோப்புகள் (Library Files)

நிரலின் மூன்றாவது வரியில்,

# include

என்று குறிப்பிடப்பட்டுள்ளது. stdio.h என்பது சி-மொழியின் உள்ளிணைந்த நூலகக் கோப்பாகும். இதனை ’ஹெடர் ஃபைல்’ என்றும் அழைப்பர். stdio என்ற சொல் (எஸ்டீடிஐஓ என உச்சரிப்பர்) standard input output என்பதையும், h என்ற எழுத்து header என்பதையும் குறித்து நிற்கிறது. stdio கோப்பில் பல்வேறு உள்ளீட்டு, வெளியீட்டுச் செயல்கூறுகள் (I/O Functions), மாறிலிகள் (constants) வரையறுக்கப்பட்டுள்ளன. அவற்றை நமது நிரலில் பயன்படுத்த வேண்டியிருப்பின் அந்தக் கோப்பினை #include என்ற கட்டளைச்சொல் மூலம் இணைத்துக் கொள்கிறோம். ஒரே நிரலில் ஒன்றுக்கு மேற்பட்ட கோப்புகளை இணைத்துக் கொள்ள முடியும். ஒவ்வொரு கோப்பினையும் தனித்தனி #include கட்டளைகளில் அடுத்தடுத்த வரிகளில் குறிப்பிட வேண்டும். #include கட்டளை நிரலின் தொடக்கத்தில் இடம்பெற வேண்டும்.

3. செயல்கூறுகள் (Functions)

நிரலின் அடுத்தவரி,

main()

என அமைந்துள்ளது. ( ) என்ற அடைப்புக் குறிகள் main என்பது ஒரு ஃபங்ஷன் என்பதை குறிக்கின்றன. அதன்கீழ் உள்ள கட்டளைகள் அனைத்தும் { } என்ற அடைப்புக் குறிகளுக்குள் கொடுக்கப்பட்டுள்ளன. ஒவ்வொரு சி-மொழி நிரலும் ஃபங்ஷன்களால் ஆனதுதான். ஒரு நிரலில் ஒரு ஃபங்ஷனோ அல்லது ஒன்றுக்கு மேற்பட்ட ஃபங்ஷன்களோ இருக்கலாம். ஒன்று மற்றதை அழைக்கலாம்.

ஒவ்வொரு நிரலிலும் குறைந்தபட்சம் main() ஃபங்ஷன் மட்டுமாவது இருக்க வேண்டும் என்பது கட்டாய விதிமுறையாகும். main ஃபங்ஷனின் கட்டளைகளை { } என்னும் அடைப்புக் குறிகளுக்குள் அமைக்க வேண்டும் என்பதும் கட்டாய விதிமுறையாகும். இந்த இரு விதிமுறைகளுக்கும் உட்பட்டு எழுதப்பட்ட,

main()

{



}

என்பதுதான் சி-மொழியில் மிகச்சிறிய நிரல். இந்த நிரல் எந்தச் செயலையும் செய்யாது என்பது ஒருபுறம் இருக்க, இது சி-மொழியின் விதிமுறைப்படி எழுதப்பட்ட நிரல் (Legal Program) என்பதைக் கருத்தில் கொள்க. இதைக் குறிப்பிடுவதன் நோக்கம், ஒவ்வொரு சி-மொழி நிரலிலும்,

Main()

{

............;

...........;

}

என்ற கட்டமைப்பு கட்டாயம் இருக்க வேண்டும் என்பதை வலியுறுத்தத்தான்.

4. மாறிகளின் அறிவிப்பு (Declaration of Variables)

main() ஃபங்ஷனுக்குள் உள்ள முதல் வரி,

int y;

என்பதுதான். இதில் int என்பது integer என்னும் தரவு இனத்தைக் (Data Type) குறிக்கிறது. சி-மொழியில் char, int, float, double என்னும் அடிப்படைத் தரவினங்கள் வரையறுக்கப்பட்டுள்ளன. y என்பது int இனத்தில் ஒரு மாறி (variable) ஆகும். ஒரு சி-மொழி நிரலில் பயன்படுத்தப்படுகிற அனைத்து மாறிகளும் நிரலின் தொடக்கத்திலேயே அறிவிக்கப்பட வேண்டும் என்பது விதிமுறையாகும்.



5. உள்ளீடு / வெளியீடு (Input / Output)

நிரலில் அடுத்து,

printf("Enteryear:");

scanf("%d",&y);

ஆகிய வரிகள் இடம்பெற்றுள்ளன. printf()-ல் ஒரு செய்தி வெளியிடப்பட்டுள்ளது. scanf()-ல் ஒரு மாறியின் மதிப்புப் பெறப்பட்டுள்ளது. printf(), scanf() ஆகியவை stdio.h என்னும் ஹெடர் ஃபைலில் வரையறுக்கப்பட்டுள்ள ஃபங்ஷன்கள் ஆகும். இத்தகைய உள்ளிணைந்த ஃபங்ஷன்களின் துணைகொண்டே சி-மொழி நிரலில் உள்ளீடும் வெளியீடும் செயல்படுத்தப்படுகின்றன. ஒற்றை எழுத்து, ஒரு சொல், ஒரு வரி எனப் பல்வேறு வகையில் உள்ளீடு / வெளியீடு செய்ய வெவ்வேறான ஃபங்ஷன்கள் உள்ளன. அவற்றைப் பற்றிப் பின்வரும் பாடங்களில் விரிவாகப் படிக்க இருக்கின்றோம்.

6. கட்டளை அமைப்புகள் (Command Syntax)

ஒவ்வொரு கட்டளைத் தொடரின் இறுதியிலும், ஓர் அரைப்புள்ளி (;) இடம் பெற்றுள்ளதை நோக்குங்கள். இது கட்டாய விதிமுறையாகும். இங்கே அரைப்புள்ளி, கட்டளையை முடித்துவைக்கும் குறியீடாகப் (Terminator) பயன்படுகிறது, பாஸ்கல் மொழியில் உள்ளதுபோல், கட்டளைகளைப் பிரித்துக்காட்டும் குறியீடாக (separator) அல்ல என்பதைப் புரிந்துகொள்ள வேண்டும். ஒன்றுக்கு மேற்பட்ட கட்டளை வாக்கியங்களை ஒரே வரியில் எழுத முடியும். எடுத்துக்காட்டாக, மேற்கண்ட நிரலின் முதல் மூன்று வரிகளை,

int y ; printf (“Enter Year:”); scanf("%d",&y);

என்று ஒரே வரியில் எழுதினாலும் நிரல் செயல்படும்.

ஒரு கட்டளை வாக்கியம் மிக நீளமாக இருந்தால், \ என்னும் பின்சாய்வுக்குறி (Back Slash) மூலம் கட்டளை வாக்கியத்தைத் துண்டாக்கி ஒன்றுக்கு மேற்பட்ட வரிகளில் எழுதலாம்.

printf("Do you want to add more records? \

Say Y/N : ");

என்று எழுதலாம். மேற்கண்ட நிரலில், அடுத்து,

if ()

........... ;

else

............. ;

என்னும் கட்டளை அமைப்பு பயன்படுத்தப்பட்டுள்ளது. இந்தக் கட்டளை, தீர்வுசெய் கட்டளை (Decision Making Command) அல்லது நிபந்தனைச் சரிபார்ப்புக் கட்டளை (Condition Checking Command) எனப்படுகிறது. மேலே உள்ள நிரலில் அந்தச் சொற்கள் இடம்பெற்ற வரிகளில் அரைப்புள்ளி கிடையாது என்பதைக் கவனியுங்கள். மேற்கண்ட நான்கு வரிகளையும்,

if () statement;

else statement ;

என இரண்டு வரிகளிலும் எழுதலாம். இதுதவிர, for(), while(), do...while() ஆகிய கட்டுப்பாட்டு மடக்கி (Control Loop) என்னும் கட்டளை அமைப்பும் சி-மொழியில் உண்டு. இவற்றைப் பற்றி இனிவரும் பாடங்களில் விரிவாகப் படிப்போம்.

7. செயற்குறிகள் (Operators)

if () நிபந்தனையில் == != % &&

ஆகிய செயற்குறிகள் (Operators) இடம்பெற்றுள்ளன. சி-மொழியில் கணக்கீடு, ஒப்பீடு, மதிப்பிருத்தல், நிபந்தனைச் சரிபார்ப்பு, ஒன்று கூட்டல், ஒன்று குறைத்தல், பிட்நிலைச் செயல்பாடு போன்ற பல்வேறு பணிகளுக்கும் பல்வேறு வகைப்பட்ட ’ஆப்பரேட்டர்கள்’ எனப்படும் செயற்குறிகள் பயன்படுத்தப்படுகின்றன. இவைபற்றித் தனியாக இனிவரும் பாடத்தில் படிப்போம்.

8. வடிவமைப்புக் குறியீடுகள் (Format Specifiers)

சி-மொழி நிரலில் உள்ளீட்டு, வெளியீட்டுக் கட்டளைகளில் பல்வேறு வகையான வடிவமைப்புக் குறியீடுகள் (Format Specifiers) பயன்படுத்தப்படுகின்றன. இந்த நிரலில் scanf(), printf() கட்டளைகளில் %d என்கிற வடிவமைப்புக் குறியீடு பயன்படுத்தப்பட்டுள்ளது. உள்ளீட்டில் பெறப்படும் மதிப்பும் வெளியீட்டில் இடம்பெறும் மதிப்பும் ஓர் இன்டிஜர் என்பதை %d உணர்த்துகிறது. இதுபோல சி-மொழியில் ஒவ்வோர் உள்ளீட்டு வெளியீட்டுக் கட்டளையிலும், கையாளப்படும் மதிப்பு எந்த இனத்தைச் சார்ந்ததாகக் கருதப்பட வேண்டும் என்பதைக் குறிப்பிடக் கட்டாயமாக வடிவமைப்புக் குறியீட்டைப் பயன்படுத்த வேண்டும்.

9. சிறிய எழுத்து / பெரிய எழுத்து (Lower Case / Upper Case)

நிரலை உற்று நோக்குங்கள். பெரும்பாலும் சிறிய எழுத்தில் எழுதப்பட்டுள்ளன. include, main, int, printf, scanf, if, else - ஆகிய சொற்களைப் பெரிய எழுத்திலோ, கலப்பு எழுத்திலோ எழுதினால் நிரல் கம்ப்பைல் ஆகாது. .EXE கோப்பு உருவாகாது. கம்ப்பைலர் பிழைசுட்டும். நாம் பயன்படுத்துகிற மாறிகள் (variables), மாறிலிகள் (constants) ஆகியவற்றின் பெயர்கள்கூட வடிவக் கட்டுப்பாடு உள்ளவை (case sensitive). SUM என்கிற ஒரு மாறியை உங்கள் நிரலில் பயன்படுத்துவதாக வைத்துக் கொள்வோம். SUM, Sum, sum என்று எழுதப்படுகிற மூன்றும் வெவ்வேறு மாறிகள் ஆகும்.

10. வெற்றுவரிகள் / இடவெளிகள் (Blank Lines / Spaces)

சி-மொழி நிரலின் கட்டளைத் தொடர்களை வரியின் எந்த இடத்தில் வேண்டுமானாலும் எழுதத் தொடங்கலாம். ஃபோர்ட்ரான், கோபால் போன்ற மொழிகளில் குறிப்பிட்ட கட்டளையை, வரியில் ஒரு குறிப்பிட்ட இடத்திலிருந்துதான் தொடங்க வேண்டும் என்ற விதிமுறை உண்டு.

ஒரு கட்டளை வாக்கியத்தில் ஒரு சொல்லுக்கும், இன்னொரு சொல்லுக்கும் இடையே ஒன்றுக்கு மேல் எத்தனை இடவெளி (space) இருந்தாலும் நிரல் செயல்படும். கட்டளை வரிகளுக்கு இடையே வெற்று வரிகள் எத்தனை வேண்டுமானாலும் இருக்கலாம். சி-மொழிக் கம்ப்பைலர் வெற்று வரிகள், தத்தல்கள் (Tabs), ஒன்றுக்கு மேற்பட்ட இடவெளிகள் (spaces) ஆகியவற்றைப் புறக்கணித்துவிடும்.

கட்டமைப்பு மிக்க சி-மொழியின் நிரல் கட்டமைப்பை நன்கு புரிந்து கொண்டுள்ளோம். இனி வரிசைப்படி ஒவ்வொரு கருத்துருவையும் (concept) விரிவாகக் கற்றுக் கொள்வோம்.

[பாடம்-4 முற்றும்]

பாடம்-5

சி-மொழித் தரவினங்கள்

(Data Types in C)

ஒரு குறிப்பிட்ட பணியைச் செய்து முடிப்பதற்குக் கம்ப்யூட்டரில் புரோகிராம் எழுதுகிறோம். புரேகிராம் என்பது கம்ப்யூட்டருக்குத் தரப்படும் கட்டளைகளின் தொகுப்பாகும். வெறும் கட்டளைகளை வைத்துக் கொண்டு கம்ப்யூட்டரால் எதுவும் செய்ய முடியாது. புரோகிராம் செயல்படுவதற்குத் தேவையான விவரங்களை உள்ளீடாகத் தரவேண்டும். இவ்விவரங்களைத்தான் டேட்டா என்கிறோம். தமிழில் ‘தரவு’ எனலாம்.

ஆக, கம்ப்யூட்டர் புரோகிராம் என்பது ஒரு பணியைச் செய்து முடிப்பதற்கான தீர்வுநெறி (Algorithm), தரவுகள் (Data) - ஆகிய இரண்டையும் உள்ளடக்கியதாகும். சென்ற அத்தியாயத்தில் குறிப்பிட்டுள்ள LEAPYEAR.C என்ற புரோகிராமை எடுத்துக் கொள்ளுங்கள். அது நாம் தரும் ஆண்டினை, லீப் ஆண்டா எனப் பரிசோதித்துச் சொல்லும். நாம் உள்ளீடாகத் தரும் ஆண்டினை டேட்டா என்கிறோம். இத்தகைய தரவுகளை அடித்தளமாகக் கொண்டு, அவற்றைக் கையாளும் கட்டளைகளின் உதவியுடன் சிக்கலான புரோகிராம் மாளிகைகளை எழுப்புகிறோம்.

புரோகிராம்களில் பயன்படுத்தப்படும் ஒவ்வொறு டேட்டாவும் குறிப்பிட்ட இனத்தைச் சேர்த்ததாகவே இருக்கும். LEAPYEAR.C புரோகிராமில்,

int y;

என்று குறிப்பிட்டுள்ளோம். y என்பது ‘இன்டிஜர்’ இனத்தைச் சேர்ந்தது என்பது இதன் பொருள். இதுபோலப், பல்வேறு இனத் தரவுகளைக் கம்ப்யூட்டரில் கையாளுகிறோம்.

ஓர் அலுவலரின் பெயர், வயது, பிறந்த நாள், சம்பளம், திருமணம் ஆனவரா இல்லையா என்ற விவரம் - இவற்றையெல்லாம் புரோகிராமில் எடுத்தாள வேண்டியுள்ளது. இவை முறையே எழுத்துச் சரம் (String), முழுஎண் (Integer), தேதி (Date), பதின்மப் புள்ளி எண் (Real), ஆமில்லை (Logical) போன்ற வெவ்வேறு இன மதிப்புகளாகும். ஒவ்வொரு கம்ப்யூட்டர் மொழியும் தமக்கே உரிய தரவினங்களைக் கொண்டுள்ளன. சி-மொழியில் கையாளப்படும் தரவின வகைகளைப் பார்ப்போம்.

சி-மொழியில் நான்கு அடிப்படைத் தரவினங்கள் (Basic Data Types) உள்ளன. .இவை மூலத் தரவினங்கள் (Primitive Data Types) என்றும் அழைக்கப்படுவதுண்டு. எளிய தரவினங்கள் (Simple Data Types) என்றும் கூறுவர். தரவினம் என்பது ஒரு குறிப்பிட்ட தரவை மட்டுமின்றி அதைப் பயன்படுத்துவது பற்றிய விதிமுறைகளையும் சேர்த்தே குறிக்கிறது. ஒரு தரவினம் குறிப்பிட்ட மதிப்புகளையே (values) ஏற்கும். குறிப்பிட்ட செயல்பாடுகளையே (operations) அதன்மீது நிகழ்த்த முடியும்.

சி-மொழியின் தரவினங்களில் சில உள்-வகைகளும் உள்ளன. மூலத் தரவினங்களின் அடிப்படையில் உருவாக்கப்படும் தருவிக்கப்பட்ட தரவினங்களும் (Derived Data Types) சி-மொழியில் கையாளப்படுகின்றன.

மூலத் தரவினங்கள் (Basic Data Types)

சி-மொழியின் அடிப்படை அல்லது மூலத் தரவினங்கள்:

1. char

2. int

3. float

4. double

char என்பது ஒற்றை எழுத்து, எண் அல்லது சிறப்புக் குறியைக் (special character) குறிக்கிறது. int என்பது முழு எண்களையும் float என்பது மெய்யெண் (Real Number) எனப்படும் புள்ளி எண்களையும் double என்பது துல்லியப் புள்ளி எண்களையும் குறிக்கின்றன. ஒன்றுக்கு மேற்பட்ட எழுத்துகள் அடங்கிய சரத்தைக் (String) குறிக்கத் தனியான தரவினம் சி-மொழியில் கிடையாது. அதே வேளையில், எண்வகை இனம் int, float, double என்ற மூன்று தனித்தனி தரவினங்களாக அமைந்துள்ளன.

இந்த நான்கு மூலத் தரவினங்களையும் அடிப்படையாகக் கொண்டு அர்ரே, ஸ்ட்ரக்சர், யூனியன், ஈநம், பாயின்டர் என்னும் தருவிக்கப்பட்ட தரவினங்களும் (Derived Data Types) கையாளப்படுகின்றன. இவற்றைப்பற்றி பின்வரும் அத்தியாயங்களில் விரிவாகப் படிப்போம். சி-மொழியில் ஸ்டிரிங் தரவினம் இல்லை. ஸ்டிரிங்குகளைக் கையாள கேரக்டர் அர்ரேக்கள் பயன்படுத்தப்படுகின்றன. சி-மொழியில் தேதிக்கென்று தனி இனம் கிடையாது. அதேபோல் சரி/தவறு (True/Flase) என்ற லாஜிக்கல் இனமும் கிடையாது. ஜீரோ என்கிற எண் மதிப்பு False என்பதற்கும், ஒன்று அல்லது ஏதேனும் ஒரு நிறை எண் (Positive number) True என்ற நிலைக்கும் பயன்படுத்தப்படுவது சி-மொழியின் சிறப்புக் கூறாகும்.

உள்-வகைகள்

நான்கு மூலத் தரவினங்களும், அவை ஏற்கும் மதிப்பெல்லைகளை அடிப்படையாகக் கொண்டு, பல்வேறு உட்பிரிவுகளாகப் பிரிக்கப்படுகின்றன: int இனம் மூன்று வகையாக எடுத்தாளப்படுகிறது.

1. short int

2. int

3. long int

மேற்கண்ட மூன்று இனங்களும் நினைவகத்தில் எடுத்துக் கொள்ளும் இடம் (பைட் எண்ணிக்கை) கம்ப்யூட்டரைப் பொறுத்து மாறுபடுகின்றது. அதாவது பீசி, மினி, மெயின் ஃபிரேம்களில் இந்த அளவுகள் மாறுபடலாம். ஆனால் short int என்பது int-ஐவிட அதிக பைட்டுகளை எடுத்துக் கொள்ள முடியாது. சில கம்ப்யூட்டர்களில் short int நினைவகத்தில் எடுத்துக் கொள்ளும் பைட்டு எண்ணிக்கை int எடுத்துக் கொள்வதில் பாதியாக இருக்கலாம். அதேபோல் long int என்பது int அளவைப்போல் இரு மடங்கு இருக்கும். எல்லா கம்ப்யூட்டரிலும் அப்படி இருக்கும் என்று சொல்ல முடியாது. ஆனால் int என்பது long int-ஐவிட அதிக அளவுடையதாக இருக்க முடியாது.

புரோகிராம்களில் தரவினங்களைக் குறிப்பிடுகையில் short int என்பதை வெறுமனே short எனவும், long int என்பதை long எனவும் குறிப்பிட்டால் போதும். டர்போ-சி கம்ப்பைலரைப் பொறுத்தவரை short int என்பதும் int என்பதும் ஒன்றுதான். long int என்பது int -ஐவிட இரு மடங்கு பைட்டு அளவுடையது.

பதின்மப் புள்ளி எண்களைப் பொறுத்தவரை double இனம் float இனத்தைவிட இரு மடங்கு பைட்டுகளை நினைவகத்தில் எடுத்துக் கொள்ளும். இதுவும் கம்ப்யூட்டர் சார்ந்த (Machine Dependent) அளவீடுதான். double இனம் long float எனவும் வரையறுக்கப்படும். அன்சி-சி, long double என்னும் ஒரு புதிய உள்-வகைக்கு வழியமைத்துக் கொடுத்துள்ளது. இது double இனத்தைவிட அதிக அளவு இடத்தை எடுத்துக் கொள்ளும்.

சி-மொழியில் char, int ஆகிய தரவு இனங்களை signed, unsigned ஆகிய பண்புகளினால் வேறுபடுத்திக் காட்ட முடியும். தரவு இனங்களை அறிவிக்கும்போது signed char, unsigned char எனவும் signed int, unsigned int எனவும் signed long, unsigned long எனவும் அறிவிக்க முடியும். signed இனம் நெகட்டிவ், பாஸிட்டிவ் ஆகிய இரு மதிப்புகளையும் ஏற்கும். unsigned இனம் பாஸிட்டிவ் மதிப்புகளை மட்டுமே ஏற்கும். இதன் காரணமாய் unsigned இனம் ஏற்கும் உச்சமதிப்பு signed இனத்தின் உச்சமதிப்பைவிட இருமடங்கு இருக்கும்.

short, long, signed, unsigned ஆகியவை தனித் தரவினங்களாகக் கருதப்படுவது இல்லை. இச்சொற்கள் பண்பேற்றிகள் (Qualifiers அல்லது Modifiers) என்று அழைக்கப்படுகின்றன. எனவேதான் இத்தகைய அடைமொழி பெற்ற தரவினங்களை ‘உள்-வகை’ எனக் குறிப்பிட்டுள்ளோம். தரவின அறிவிப்பில் வெறுமனே char, int, long எனக் குறிப்பிட்டால் signed char, signed int, signed long ஆகிய இனங்களையே குறிக்கும்.

தரவு இனம், மதிப்பெல்லை, நினைவக அளவு

இதுவரை நாம் பார்த்த தரவினங்கள் மற்றும் அவற்றின் உள்-வகைகள் ஏற்கும் மதிப்புகளின் எல்லைகளையும், இவ்வினங்கள் நினைவகத்தில் எடுத்துக் கொள்ளும் பைட் அளவுகளையும் கீழே உள்ள பட்டியலில் காண்க:

தரவு இனம் மதிப்பின் எல்லை நினைவக அளவு (பைட்டில்)

signed char -128 to +127 1

char -128 to +127 1

unsigned char 0 to 255 1

signed short int -32768 to +32767 2

short int -32768 to +32767 2

unsigned short int 0 to 65535 2

signed int -32768 to +32767 2

int -32768 to +32767 2

unsigned int 0 to 65535 2

signed long int -2147483648 to +2147483647 4

long int -2147483648 to +2147483647 4

unsigned long int 0 to 4294967295 4

float .4 x 10-38 to 3.4 x 1038 4

long float .7 x 10-308 to 1.7 x 10308 8

double .7 x 10-308 to 1.7 x 10308 8

long double .7 x 10-4932 to 1.7 x 104932 10

பட்டியலின் இறுதியில் குறிப்பிட்டுள்ள நினைவக அளவு கம்ப்யூட்டருக்குக் கம்ப்யூட்டர் வேறுபடலாம். சில கம்ப்பைலர்கள் char என அறிவிக்கப்படும் தரவினத்தை எப்போதும் unsigned char இனமாகவே கருதிக்கொள்ளும். அதாவது char என்பது 0 முதல் 255 வரையிலான மதிப்புகளையே எடுத்துக்கொள்ளும். நெகட்டிவ் மதிப்புகளை ஏற்காது. எனவே char இனத்தைக் கம்ப்பைலருக்கு ஏற்பப் பயன்படுத்த வேண்டும் என்பதை மனதில் கொள்க.

int என அறிவிக்கப்பட்ட மாறியில் 36767-ஐவிடப் பெரிய எண்ணை இருத்தி வைக்க முடியாது. எடுத்துக்காட்டாக 200 x 200 என்ற பெருக்குத் தொகையின் விடையை ஓர் int மாறியில் இருத்த முடியாது. உங்கள் புரோகிராமில்,

int n;

n = 200 * 200;

என்று, கட்டளைகள் அமைந்துள்ளதாக வைத்துக் கொள்வோம். புரோகிராமைக் கம்ப்பைல் செய்யும்போது, கம்ப்பைலர் பிழை எதுவும் சுட்டாது. புரோகிராமைச் செயல்படுத்தும்போது இயக்கநேரப் பிழை (Run Time Error) எதுவும் நிகழாது. ஆனால், புரோகிராம் தவாறான விடையைக் காட்டும். n என்னும் மாறியில் 40000 என்னும் மதிப்பு இருக்காது. இதுபோன்ற தருணங்களில் n என்னும் மாறியை long என அறிவித்துக் கொள்ள வேண்டும். உங்கள் புரோகிராம்களில் கணக்கீடுகளை மேற்கொள்ளும்போது தரவினங்களின் மதிப்பெல்லைகளை நினைவில் வைத்துக் கொள்வது முக்கியம்.

[பாடம்-5 முற்றும்]

பாடம்-6

சி-மொழியில் மாறிகள்

(Variables in C)

கம்ப்யூட்டர் மொழிகளில் டேட்டாவை இரண்டு வகையாகக் கையாள முடியும்:

1. மாறிகள் (variables)

2. மாறிலிகள் (constants)

ஒரு புரோகிராம் செயல்படுத்தப்படும்போது, மதிப்பு மாறக்கூடிய வாய்ப்பிருக்கும் டேட்டா, மாறி (variables) எனப்படுகிறது. LEAPYEAR.C புரோகிராமை எடுத்துக் கொள்வோம். அதில் y-ன் மதிப்பு ஒவ்வொரு முறை புரோகிராம் இயக்கப்படும்போதும், நமது உள்ளீட்டுக்கு ஏற்ப மாறுகின்றது. எனவே, இதனை மாறி என்கிறோம். மாறிலி (constants) என்பது மாறா மதிப்பைக் கொண்டது. மாறிலி அறிவிக்கப்படும்போது அதில் இருத்தப்படும் மதிப்புப் புரோகிராமில் பின் எப்போதும் மாற்றப்பட முடியாதது. முதலில் மாறிகள் பற்றிக் காண்போம்.

நாம் பார்த்த நான்கு தரவு இனங்களில் மட்டும் இன்றி, அவற்றின் உள்-வகைகளிலும், தருவிக்கப்பட்ட தரவு இனங்களான அர்ரே, ஸ்ட்ரக்சர், யூனியன், ஈநம், பாயின்டர் ஆகிய தரவு இனங்களிலும் மாறிகள் அறிவிக்கப்பட்டுக் கையாளப்படுகின்றன. சி-மொழியில் லாஜிக்கல் (அல்லது பூலியன்) மாறிகள், ஸ்டிரிங் மாறிகள் கிடையாது என்பதை மனதில் இருத்துங்கள்.

மாறிகளைப் புரோகிராம்களில் எடுத்தாள்வதற்குப் பல்வேறு வழிமுறைகளும் விதிமுறைகளும் வரையறுக்கப்பட்டுள்ளன. அவற்றை எடுத்துக்காட்டுகளுடன் விரிவாகக் காண்போம்.

மாறிகளின் பெயர்கள்

புரோகிராமில் பயன்படுத்தப்படும் டேட்டா கம்ப்யூட்டரின் நினைவகத்தில் பதிந்து வைக்கப்பட்டு எடுத்தாளப்படுகின்றது. தேவையானபோது எடுத்தாள அதற்கு ஒரு பெயர் இருக்க வேண்டும். எனவே, புரோகிராமில் பயன்படுத்தப்படும் டேட்டாவுக்குப் பொருத்தமான ஒரு பெயரைச் சூட்டுகிறோம். அதாவது, டேட்டாவை நினைவகத்தில் பதிந்து வைக்க ஓர் இடத்தை ஒதுக்கீடு செய்து, அந்த இடத்துக்கு ஒரு பெயர் (Label) சூட்டுகிறோம். அப்பெயரையே மாறி (variable) என்கிறோம்.

மாறிகளின் பெயர்கள் எப்படி அமைய வேண்டும் என்பதற்கான விதிமுறைகள்:

(1) மாறிகளின் பெயர்கள் அதிக அளவாக எட்டு எழுத்துகள் இருக்கலாம். ஆனால் புதிய கம்ப்பைலர்கள் 16 அல்லது அதற்கு மேற்பட்ட எழுத்துகளையும் ஒத்துக் கொள்கின்றன. அதிக அளவாக 31 எழுத்துகளை அடையளம் காண முடியும் என அன்சி-சி வரையறுத்துள்ளது.

(2) மாறிகளின் பெயர்கள் எண்ணாகவோ, எண்ணில் தொடங்குமாறோ இருக்கக் கூடாது.

(3) மாறிகளின் பெயரில் இடவெளி (space) இடம்பெறக் கூடாது.

(4) அண்டர் ஸ்கோர் தவிர பிற சிறப்புக் குறிகள் இடம்பெறக் கூடாது.

(5) மாறிகளின் பெயர்களாக சி-மொழியின் சிறப்புச் சொற்களைப் (Reserved Words) பயன்படுத்தக்கூடாது.

மாறிகளின் சரியான பெயர்களுக்கு எடுத்துக்காட்டுகள்:

1. a, b, c, ab, xyz, A, Bc,aBC

2. a1, B2, C2c, x1y2z3

3. name, age, pay, area, redius

4. SUM, Sum, sum, average, dBASE

5. a_1, file_2, basic_pay, data_of_birth

6. lotus123, art312C, sys5ver6

மாறிகளுக்கு எப்போதுமே பொருத்தமான பெயர்களைச் சூட்ட வேண்டும். வெறுமனே ஒற்றை எழுத்துகளை மட்டுமே மாறிகளின் பெயர்களாக அறிவிப்பது சிறந்த முறை ஆகாது. ஒரு பணியாளரின் பெயர், வயது, சம்பளம் போன்றவற்றைக் கையாள முறையே a, b, c எனக் குறிப்பிடக் கூடாது. பொருத்தமாக name, age, salary எனப் பெயரிடலாம். total amount, rate of interest என இரண்டு மூன்று சொற்களில் மாறிகளின் பெயர்களை அமைக்க விரும்பினால் சொற்களுக்கு இடையே அண்டர் ஸ்கோர் பயன்படுத்தி, total_amount, rate_of_interest என மாறிகளின் பெயர்களை அறிவிக்க வேண்டும். மாறிகளின் பெயர்கள் எப்போதும் சிறிய எழுத்தில் இருப்பதே மரபு.

மாறிகளின் தவறான பெயர்களுக்கு எடுத்துக்காட்டுகள்:

(1) 2, 32, 123 - எண்களாக இருக்கக் கூடாது

(2) 2A, 4BCD, 5digit - எண்ணில் தொடங்கக் கூடாது

(3) basic pay, date of birth - இடவெளி கூடாது

(4) yes/no, bill.amt, month-total - சிறப்புக் குறிகள் கூடாது

(5) int, char, float - சிறப்புச் சொற்கள் கூடாது

(6) while, do, else, return - கட்டளைச் சொற்கள் கூடாது

மாறிகளை அறிவித்தல்

புரோகிராம்களில் மாறிகளை அறிவிக்கும் முறைக்குச் சில எடுத்துக்காட்டுகளைப் பார்ப்போம்.

char ch;

int age;

long salary;

float radius;

double area;

ஒரே இனத்தில் ஒன்றுக்கு மேற்பட்ட மாறிகளையும் அறிவிக்க முடியும்.

int i, j, k;

float radius, area;

ஒரே இனமாக இருந்த போதிலும் வேறுவேறு பயன்பாடுகளுக்கான மாறிகளைத் தனித்தனி வரிகளில் அறிவிப்பது மரபாகும்.

int i, j;

int length, breadth;

அறிவிப்பும் வரையறுப்பும் (Declaration & Definition)

ஒரு மாறி, மதிப்பை ஏற்ற பிறகே ‘இனிஷியலைஸ்’ செய்யப்பட்டதாகக் கொள்ளப்படும். இனிஷியலைஸ் செய்யப்பட்ட பிறகே அந்த மாறி வரையறுக்கப்பட்டதாகக் (defined) கருதப்படும். இனிஷியலைஸ் செய்யப்படாத மாறியை எக்ஸ்பிரஷன்களில் பயன்படுத்தினால் கம்ப்பைலர் எச்சரிக்கை செய்யும்.

ஒரு மாறியை இரண்டு வழிகளில் இனிஷியலைஸ் செய்யலாம். மாறியை அறிவித்த பிறகு புரோகிராமின் வேறோர் இடத்தில் அதில் மதிப்பை இருத்துவது ஒரு முறை. அறிவிக்கும்போதே அதில் தொடக்க மதிப்பை இருத்துவது இன்னொரு முறை.

int a;

...........

a = 5;

என்று மதிப்பிருத்தலாம்.

int sum = 0;

int a = 100;

char ch = ‘A’;

என்றும் மாறிகளை வரையறுக்கலாம். ஒரே அறிவிப்பில் ஒன்றுக்கு மேற்பட்ட மாறிகளை அறிவிக்கும்போது, சிலவற்றை மட்டும் இனிஷியலைஸ் செய்யலாம்.

int m, n, sum = 0;

int start = 1, end, step = 5, sum;

என்றெல்லாம் அறிவிக்க முடியும். மிகவும் கறாராகக் கூறுவது எனில்,

int m;

என்று மாறியை மட்டும் மதிப்பிருத்தாமல் குறிப்பிடுவது ‘அறிவிப்பு’ (Declaration) எனப்படும்.

int m = 5;

என்றோ,

int m;

m = 5;

என்றோ மாறியை இனிஷியலைஸ் செய்வது ‘வரையறுப்பு’ (Definition) எனப்படும். எந்தவொரு மதிப்பையும் ஏற்காமல் அறிவிப்பு நிலையிலேயே இருக்கும் மாறி வரையறுக்கப்படாத மாறி எனப்படுகிறது.

சி-மொழிப் புரோகிராமில் பெரும்பாலும் மாறிகள் புரோகிராமின் அல்லது ஒரு ஃபங்ஷனின் தொடக்கத்திலேயே அறிவிக்கப்படுகின்றன. மிக அரிதாக ஒரு பிளாக்குக்குள் மாறிகள் அறிவிக்கப்படுவதுண்டு. { } என்னும் இரட்டை அடைப்புக் குறிகளுக்குள் அமையும் கட்டளைத் தொகுதி சி-மொழியில் பிளாக் எனப்படுகிறது இதைப்பற்றி பின்னர் விரிவாக படிப்போம்.

main() அல்லது வேறு ஃபங்ஷனில் அல்லது பிளாக்கில் மாறிகளின் அறிவிப்புக்கு முன்பாக printf(), scanf() ஃபங்ஷன்களோ அல்லது வேறெந்தக் கட்டளையுமோ இடம்பெறக் கூடாது. இன்னொரு கோணத்தில் சொல்வதெனில், சி-மொழிப் புரோகிராமில் மாறிகளை இடையிடையே நினைத்த இடத்தில் அறிவித்துக் கொள்ள முடியாது. மேலேயுள்ள புரோகிராமை நன்றாகக் கூர்ந்து கவனியுங்கள். radius, pai, area ஆகிய மாறிகள்/மாறிலிகள் தொடக்கத்திலேயே அறிவிக்கப்பட்டுள்ளன.

printf(“\nEnter redius:”);

scanf(“%d, &redius);

float area;

area = pai * redius * redius;

என்று கட்டளைகள் அமைத்தால் புரோகிராம் கம்ப்பைல் ஆகாது.

ஒரு ஃபங்ஷனுக்குள் அல்லது ஒரு பிளாக்கினுள் ஒரே பெயரில் இரண்டு மாறிகள் இருக்க முடியாது. அதாவது ஒருமுறை அறிவித்த மாறியை மீண்டும் அறிவிக்க முடியாது. அதாவது, ஏற்கெனவே அறிவிக்கப்பட்ட ஒரு மாறியின் பெயரில் வேறொரு மாறியை அறிவிக்க முடியாது. வெவ்வேறு ஃபங்ஷன்களில் அல்லது வெவ்வேறு பிளாக்குகளில் ஒரே பெயரில் வெவ்வேறு மாறிகளைப் பயன்படுத்த முடியும்.

மாறிகளை அறிவிக்கும் விதம் தொடர்பாக, மனதில் பதிய வைக்க வேண்டிய விவரங்களைத் தொகுத்துக் காண்போம்:

(1) மாறிகள் புரோகிராம், ஃபங்ஷன் அல்லது பிளாக்கின் தொடக்கத்திலேயே அறிவிக்கப்பட வேண்டும்.

(2) மாறிகளின் இனத்தை முன்கூட்டியே தெரிவித்துவிட வேண்டும். இனம் சுட்டாத மாறி இருக்க முடியாது. வேறுசில மொழிகளில் இருப்பதுபோல் முதலில் மாறியை அறிவித்துவிட்டுப் பிறகு இனத்தைத் தீர்மானிக்க சி-மொழியில் அனுமதி இல்லை.

(3) ஒரு ஃபங்ஷனுக்குள் அல்லது ஒரு பிளாக்கினுள் ஒரே பெயரில் இரண்டு மாறிகள் இருக்க முடியாது.

(4) ஓர் இன மாறியில் வேறு இன மதிப்பை இருத்த முடியாது. (int மாறி என அறிவித்து விட்டால், அதில் float மதிப்பை இருத்தி வைக்க முடியாது). இனமாற்றம் செய்து இருத்தலாம். இனமாற்றம் பற்றிப் பிறகு படிப்போம்.

(5) ஒரு மாறியை அறிவிக்கும்போதே அதில் தொடக்க மதிப்பையும் இருத்த முடியும்.

(6) ஒரே இனமுள்ள பல மாறிகளை ஒரே வரியில் முன்னறிவிக்கலாம். இரண்டு மாறிகளுக்கிடையே காற்புள்ளி இடவேண்டும்.

(7) மதிப்பு இருத்தப்பட்ட மாறி இனிஷியலைஸ் செய்யப்பட்ட மாறி எனப்படும். இனிஷியலைஸ் செய்யப்பட்ட மாறி வரையறுக்கப்பட்ட மாறி ஆகிறது.

(8) வரையறுக்கப்படாத அதாவது இனிஷியலைஸ் செய்யப்படாத (மதிப்பு இருத்தப்படாத) மாறிகளை எக்ஸ்பிரஷன்களில் பயன்படுத்தக் கூடாது.

[பாடம்-6 முற்றும்]

பாடம்-7

சி-மொழியில் மாறிலிகள்

(Constants in C)

ஒரு புரோகிராமில் எப்போதுமே மாற்றப்படும் சாத்தியக்கூறு இல்லாத ஒரு டேட்டாவை மாறிலி (Constant) என்கிறோம். சி-மொழியில் இரண்டு வகையாக மாறிலிகள் செயல்படுத்தப்படுகின்றன. (1) #define பதிலீடுகள் மூலமாக. இத்தகைய மாறிலிகள் ‘குறியீட்டு மாறிலிகள்’ (Symbolic Constants) என்று அழைக்கப்படுகின்றன. (2) const என்னும் பண்பேற்றி (Qualifier) மூலமாக. இத்தகைய மாறிலிகள் ‘பண்பேற்றிய மாறிகள்’ (Qualified Variables) எனப்படுகின்றன. இவ்விரண்டு வகைகளையும் எடுத்துக் காட்டுகளுடன் பார்ப்போம்.

நேரடி மதிப்பு

புரோகிராமில் எப்படிப்பட்ட இடங்களில் மாறிலியைப் பயன்படுத்த முடியும் என்பதற்கு ஒரு சரியான எடுத்துக்காட்டைப் பார்ப்போம். பயனாளரிடம் இருந்து ஆர அளவை (radius) பெற்று வட்டத்தின் பரப்பளவைத் திரையிடும் புரோகிராமைப் பாருங்கள்:

/* Program No. */

/* AREA1.C */

#include

main()

{

int radius;

float area;

printf(“\nEnter radius: “);

scanf(“%d”, &radius);

area = 3.14 * radius * radius;

printf(“Area of the circle is %f”, area);

}

இந்தப் புரோகிராமில் பரப்பளவைக் காணும் கட்டளையில் 3.14 என்னும் மதிப்பை நேரடியாகப் பயன்படுத்தி உள்ளோம். இந்தப் புரோகிராமை எத்தனை முறை இயக்கினாலும், ஆர அளவை எப்படிக் கொடுத்தாலும் 3.14 என்னும் மதிப்பு மாறப்போவதில்லை. ஒரே புரோகிராமில் வெவ்வேறு இடங்களில் வட்டத்தின் பரப்பளவை காணவேண்டி இருந்தாலும் இதே 3.14 மதிப்பைத்தான் பயன்படுத்த வேண்டியிருக்கும்.

3.14 என்பது இந்தப் புரோகிராமில் மட்டும் அல்ல உலகிற்கே ஒரு பொதுவான எண் அல்லவா? இப்படிப்பட்ட உலகப் பொதுவான எண்களை மட்டும் அல்ல உங்கள் புரோகிராமிற்கு மட்டும் பொதுவான (மதிப்பு மாறாத) எண்களைக்கூட இப்படி நேரடியாகக் கணக்கீடுகளில் பயன்படுத்தக் கூடாது. இந்தப் புரோகிராமைப் படிப்பவர்களுக்கு 3.14 என்ற எண்ணின் முக்கியத்துவம் புலப்படாமலே போகும். புரோகிராமை எழுதியவர்க்கே, பல நேரங்களில், எக்ஸ்பிரஷன்களில் காணப்படும் இதுபோன்ற எண்கள் புதிர் எண்களாகத் தோன்றும். மொழி வல்லுநர்கள் இத்தகைய எண்களை ‘மேஜிக் எண்கள்’ எனக் கிண்டலாகக் குறிப்பிடுவர். புரோகிராமுக்குப் பொதுவான இப்படிப்பட்ட மாறா மதிப்புகளை நேரடியாகப் பயன்படுத்தக்கூடாது என்பது அவர்களின் கருத்து. அவற்றை ஒரு மாறிலி வழியாகவே பயன்படுத்த வேண்டும். எப்படி எனப் பார்ப்போம்.

குறியீட்டு மாறிலி

சி-மொழியில் குறியீட்டு மாறிலிகளை வரையறுக்க, #define என்னும் கட்டளைச் சொல் பயன்படுத்தப்படுகிறது. புரோகிராமின் தொடக்கத்தில்,

#define PAI 3.14

என்று அறிவித்து விட்டுப் புரோகிராமின் உள்ளே,

area = PAI * radius * radius;

என்று பரப்பளவைக் கணக்கிட வேண்டும். கீழே உள்ள புரோகிராமை நோக்குங்கள்:

/* Program No. */

/* AREA2.C */

#include

#define PAI 3.14

main()

{

int radius;

float area;

printf(“\nEnter radius: “);

scanf(“%d”, &radius);

area = PAI * radius * radius;

printf(“Area of the circle is %f”, area);

}

#define என்பதைக் கம்ப்பைல் பணிக்கு முந்தைய நெறியுறுத்தம் (pre-processor directive) என்று கூறுவர். அதாவது புரோகிராமில் எங்கெல்லாம். PAI இடம்பொற்றுள்ளதோ. அங்கெல்லாம் 3.14 என்ற மதிப்பு பதிலிடப்பட்டு, அதன்பிறகே புரோகிராம் கம்ப்பைல் செய்யப்படும்.

இவ்வாறு புரோகிராமில் கையாளும் மாறா மதிப்புகளை மாறிலிகளாகக் கையாளுவதில் இரண்டு வகையான நன்மைகள் உள்ளன:

(1) PAI ஒரு மாறா மதிப்பு என்பது புரோகிராமைப் படிப்பவர்க்கு எளிதில் புலனாகும். பொருள் பொதிந்ததாகவும் உள்ளது.

(2) PAI - யின் மதிப்பை இன்னும் துள்ளியமாக 3.142 என்றோ அல்லது 3.1415 என்றோ பயன்படுத்த எண்ணினால் #define வரையறுப்பில் மாற்றினால் போதும். நேரடியாக மதிப்பை பயன்படுத்தி இருந்தால், அம்மதிப்பு இடம்பெற்ற அத்தனை கணக்கீடுகளையும் கண்டறிந்து மாற்ற வேண்டும். மிகப் பெரிய புரோகிராம்களில் இது ஒரு சிக்கலான பணியாகும்.

புரோகிராமின் தொடக்கத்தில் மாறிலியை அறிவித்தபின் புரோகிராமின் உள்ளே,

PAI = 3.142;

என்று புதிய மதிப்பைப் புகுத்த முடியாது. சரியாகச் சொல்வதெனில், ஒரு மதிப்பு இருத்தும் கட்டளையில் (assignment statement) இடப்புறத்தில் PAI -ஐப் பயன்படுத்த முடியாது.

குறியீட்டு மாறிலியின் வரையறுப்புகள்

ஒரு #define அறிவிப்பில் ஒரேயொரு மாறிலியை மட்டுமே குறிப்பிட முடியும். வெவ்வேறு மாறிலிகளுக்கு தனித்தனி #define அமைக்க வேண்டும்.

#define TRUE 1

#define FALSE 0

#define TOP 100

#define EOF -1

#define PERIOD ‘.’

#define NAME “Sivalingam”

ஒரு #define அறிவிப்பில் உள்ள மாறிலியை அடுத்துவரும் #define அறிவிப்பில் பயன்படுத்திக் கொள்ளமுடியும்.

#define START 100

#define NEXT START + 1

என்று பயன்படுத்த முடியும்.

#define கட்டளையில் int, char, string மதிப்புகளைத் தவிர unsigned, long மதிப்புகளையும், octal, hexa decimal மதிப்புகளையும் அறிவிக்க முடியும்.

#define CR 0x0D /* hexa value 13 */

#define LINE_FEED 012 /* octal value 12 */

#define PORT 25U /* unsigned value 25 */

#define LIMIT 40000L /* long value 40000 */

#define BELL ‘\007’ /* character value 7 */

#define NEW_LINE ‘\n’ /* newline character */

#define TAB ‘\t’ /* tab character */

#define கட்டளையைப் பயன்படுத்தும்போது கருத்தில் கொள்ள வேண்டிய முக்கிய விவரங்கள்:

(1) main() ஃபங்ஷனுக்கு வெளியே புரோகிராமின் தொடக்கத்தில் அமைய வேண்டும்.

(2) #define கட்டளையின் இறுதியில் அரைப்புள்ளி கிடையாது.

(3) #define வரையறுப்பில் தரவினத்தைக் குறிப்பிட வேண்டிய தில்லை. மதிப்பினைக் கொண்டே கம்ப்பைலர் அடையாளம் கண்டு கொள்ளும்.

(4) ஒரு #define-ல் ஒரு மாறிலியை மட்டுமே வரையறுக்க முடியும்.

(5) மாறிலிகளின் பெயர்கள் எப்போதும் பெரிய எழுத்துகளில் இருப்பது மரபு.

மதிப்புருக்கள் (Literals)

int n = 25;

char ch = ‘A’;

average = 12.345 / 6.0;

printf (“Welcome to C!”);

என்பது போன்ற கட்டளைகளில் இன்டிஜர், கேரக்டர், ஸ்ட்ரிங் மதிப்புகளைப் பயன்படுத்துகிறோம். இப்படிப்பட்ட மதிப்புகளை மாறா மதிப்பு (Constant Values) என்கிறோம். மாறிலி (Constant) என்று கூறினாலும் தவறில்லை. சில ஆசிரியர்கள் இவற்றை மதிப்புருக்கள் (Literals) என்று அழைக்கின்றனர். ஒவ்வொரு தரவினத்திலும் ஏற்கெனவே அட்டவணையில் கொடுக்கப்பட்ட வரம்புகளுக்குள் ஏதேனும் ஒரு மதிப்பை மாறியில் இருத்த முடியும் அல்லது கணக்கீட்டில் பயன்படுத்த முடியும். எடுத்துக்காட்டுகள்:

char - ‘a’, ‘A’, ‘5’, ‘?’, ‘=’

int - 25, 32767, 0, -8, +65, 037

long - 0L, 25L, 100000L

unsigned - 0U, 65000U, 25U

octal - 03, 012, 0345

hexa - 0x01A, 0xFFF, 0Xf0ab

float - 12.345F, 5.0F, -8.3F, +1.234F

double - 12.345, 5.0, -8.3, +1.23, 1.23E+5, 1.234e-8

string - “Kumar”, “Long Live”, “12345”

சி-மொழியில் ஒற்றையெழுத்து கேரக்டர் மதிப்பை ஒற்றை மேற்கோள் குறிகளுக்குள்ளும், ஸ்டிரிங் மதிப்புகளை இரட்டை மேற்கோள் குறிகளுக்குள்ளும் குறிப்பிட வேண்டும் என்பதை நினைவில் கொள்க. குறிப்பிடத்தக்க செய்தி என்ன வெனில், சி-மொழியில் ஸ்டிரிங் மாறிகள் கிடையாது. ஆனால், ஸ்டிரிங் மாறிலிகள் (அதாவது மதிப்புருக்கள்) உண்டு.

const என்னும் பண்பேற்றி

புரோகிராமில் மாறிலிகளை அறிவிப்பதற்கு அன்சி-சி-யில் ஒரு புதிய முறை புகுத்தப்பட்டது. const என்னும் பண்பேற்றி (Qualifier) அறிமுகப்படுத்தப்பட்டது.

const float pai = 3.142;

என்று ஒரு மாறிலியை அறிவிக்கலாம். இங்கே pai என்பது float மாறி. const என்னும் அடைமொழியால் ஒரு மாறிலியாக மாற்றப்பட்டுள்ளது. இவ்வாறு const என்று அறிவித்துவிட்டால் புரோகிராமில் பின்னோர் இடத்தில்,

pai = 3.1415;

என்று புரோகிராமரே நினைத்தாலும் மாற்ற முடியாது. const என அறிவிக்கும்போது கட்டாயமாக அதில் ஒரு தொடக்க மதிப்பு இருக்க வேண்டும். அதாவது,

const float pai;

என்று அறிவிக்க முடியாது. AREA2.C புரோகிராமை const பயன்படுத்தி எழுதிப் பார்ப்போமா?

/* Program No. */

/* AREA3.C */

#include

main()

{

int radius;

float area;

const float pai = 3.14;

printf(“\nEnter radius: “);

scanf(“%d”, &radius);

area = pai * radius * radius;

printf(“Area of the circle is %f”, area);

}

இந்தப் புரோகிராமின் வெளியீடு முந்தைய புரோகிராமின் வெளியீடு போலவே இருக்கும். const அறிவிப்பில் ஒன்றுக்கு மேற்பட்ட மாறிலிகளை வரையறுக்க முடியும்.

const int start = 100, end = 200;

const char ch = ‘A’, int limit = 1000, float pai = 3.14;

மாறிலிகளை அறிவிக்கும் விதம் தொடர்பாக, மனதில் பதிய வைக்க வேண்டிய விவரங்களைத் தொகுத்துக் காண்போம்:

(1) மாறிலிகள் புரோகிராமின் தொடக்கத்திலேயே அறிவிக்கப்பட்டுவிட வேண்டும்.

(2) மாறிலிகளை #define அல்லது const என்ற முறையில் அறிவிக்கலாம்.

(3) #define அறிவிப்பில் மாறிலியின் பெயரும் அதன் மதிப்பும் இடம்பெற வேண்டும்.

(4) #define அறிவிப்பில் தரவு இனத்தைக் குறிப்பிட வேண்டிய தேவையில்லை. மதிப்புகளைக் கொண்டே தரவு இனத்தைக் கம்ப்பைலர் புரிந்து கொள்ளும்.

(5) #define, main()-க்கு வெளியே இடம்பெற வேண்டும்.

(6) #define அறிவிப்பின் இறுதியில் அரைப்புள்ளி கிடையாது.

(7) const அறிவிப்பில் தரவு இனத்தைக் குறிப்பிட வேண்டும்.

(9) ஒரு மாறிலியை const என அறிவிக்கும்போது கட்டாயமாக அதில் ஒரு தொடக்க மதிப்பை இருத்த வேண்டும். அந்த மதிப்பை புரோகிராமில் வேறு எங்கும் மாற்ற முடியாது.

(10) ஒரே const-ல் ஒன்றுக்கு மேற்பட்ட மாறிலிகளை அறிவிக்க முடியும்.

(11) மாறிகள் அல்லது மாறிலிகளில் இருத்தப்படும் மதிப்புகளும் எக்ஸ்பிரஷன்களில் பயன்படுத்தப்படும் மதிப்புகளும் மதிப்புரு (Literal) என்றும், சில வேளைகளில் மாறிலி (Constant) என்றும் அழைக்கப்படுவதுணடு.

பாடம்-8

சி-மொழியில் இனமாற்றங்கள்

(Type Conversions in C)

ஒரு புரோகிராமில் char, int, float, double ஆகிய தரவினங்களில் அறிவிக்கப்பட்ட மாறிகளில், ஓர் இனத்தின் மதிப்பை வேறோர் இனத்தின் மதிப்பாக எடுத்தாளும் முறையே இனமாற்றம் (Type Conversion) எனப்படுகிறது. சி-மொழியைப் பொறுத்தவரைப் புரோகிராமரின் தலையீட்டிலும், புரோகிராமரின் தலையீடு இல்லாமலும் இத்தகைய இனமாற்றம் சாத்தியம். சி-மொழியில் char மதிப்பை int மதிப்பாகவும், int மதிப்பை char மதிப்பாகவும், int மதிப்பை float அல்லது double-ஆகவும், float அல்லது double மதிப்புகளை int ஆகவும் மாற்றிக் கையாளலாம். இத்தகைய இனமாற்றம் இரண்டு வழிகளில் நடைபெறுகிறது:

(1) உட்கிடை இனமாற்றம் (Implicit Type Conversion)

(2) வெளிப்படை இனமாற்றம் (Explicit Type Conversion)

இந்த இருவகையான இனமாற்றங்களும் சி-மொழியில் எவ்வாறு நடைபெறுகின்றன என்பதை எடுத்துக்காட்டுகளுடன் பார்ப்போம்.

உட்கிடை இனமாற்றம் (Implicit Type Conversion)

கம்ப்யூட்டர் புரோகிராம்களில் இனமாற்றம் என்பது அவ்வப்போது தேவைப்படும். குறிப்பாகக் கணக்கீடுகளில் இது தேவைப்படுகிறது. ஓரினத்தில் உருவாக்கப்பட்ட ஒரு மாறியின் மதிப்பை வேறோர் இன மதிப்போடு கணக்கீடுகளில் பயன்படுத்தும்போது இத்தகைய தேவை எழும். அதுபோன்ற தேவையை அறிந்து கொள்ள சில எடுத்துக்காட்டுகளைப் பார்ப்போம். கீழேயுள்ள புரோகிராமை எழுதி இயக்கிப் பாருங்கள்:

/* Program No. */

/* TYPECAS1.C */

#include

main()

{

int a=10, b=4;

float c;

c = a / b;

printf("a=%d, b=%d, a/b=%3.1f", a, b, c);

}

இந்தப் புரோகிராமை இயக்கிப் பார்த்தால்,

a = 10, b = 4, a/b = 2.0

என்றுதான் விடை கிடைக்கும். ஏனெனில், a, b இரண்டும் int-ஆக இருப்பதால் a/b என்பதும் int-ஆகத்தான் இருக்கும். எனவே 2.0 தான் விடையாக வரும். 2.5 வராது. விடையை ஒரு float மாறியில் இருத்துவதாலேயே விடை 2.5 என்று ஆகிவிடாது. int மதிப்புகளில் செய்யப்படும் கணக்கீட்டின் விடை int மதிப்பாகவே இருக்கும் என்பது அறிக. மேற்கண்ட புரோகிராமைச் சிறிதே மாற்றுங்கள்:

/* Progarm No.2.4 */

/* TYPECAS2.C */

#include

main()

{

int a = 10;

float b = 4, c;

c = a / b;

printf("a=%d, b=%1.0f, a/b=%3.1f", a, b, c);

}

இந்தப் புரோகிராம்,

a = 10, b = 4, a / b = 2.5

என்று காண்பிக்கும். float மதிப்புகளுக்கிடையே நடைபெறும் கணக்கீட்டின் விடைதானே float மதிப்பாக இருக்கும். இங்கே, b-யின் மதிப்பு float-ஆகவும், a-யின் மதிப்பு int-ஆகவும் இருந்தும் float மதிப்பு எவ்வாறு விடையாக வந்தது? மேலும் ஒரே இனத்தைச் சார்ந்த மதிப்புகளுக்கு இடையேதான் கணக்கீடு சாத்தியம். இங்கே ஓர் int மதிப்புக்கும், ஒரு float மதிப்புக்கும் இடையே வகுத்தல் எவ்வாறு சாத்தியமாயிற்று? இங்குதான் உட்கிடை இனமாற்றம் பங்கு வகிக்கிறது. c = a / b என்ற கணக்கீட்டில் c-யும், b-யும் float-ஆக இருப்பதால் a-யின் மதிப்பும் float-ஆக மாற்றப்பட்டு, விடையும் float மதிப்பாகவே கிடைத்துவிடுகிறது. ஏற்கெனவே நாம் பார்த்த AREA3.C புரோகிராமை இங்கே நினைவு கூருங்கள். அதில்

area = pai * radius * radius;

என்ற கட்டளை இடம் பெற்றுள்ளது. radius என்பது int இனமாக இருந்த போதிலும் pai என்பது float-ஆக இருப்பதால், radius என்பது float-ஆக மாற்றப்பட்டு அவற்றின் பெருக்குத் தொகையும் float இனமாகவே இருக்கும். எனவேதான் area என்பது float-ஆக அறிவிக்கப்பட்டுள்ளது. இவ்வாறு, இரண்டு தரவு இனங்களிடையே செய்யப்படும் கணக்கீட்டில், கீழ்நிலை இனம் மேல்நிலை இனமாகத் தாமாகவே மாற்றப்பட்டுவிடும். இந்த இனமாற்றத்தைக் கம்ப்பைலர் செய்கிறது. உட்கிடை இனமாற்றத்தில் இடம்பெறும் இனங்களின் தகுதி வரிசை int, long , float, double என்றவாறு அமையும். int, long-ஆக மாறி, விடை long-லேயே கிடைக்கும். அதுபோலவே int-ம் double-ம் மோதினாலும், float-ம் double-ம் மோதினாலும் விடை double-இல்தான் கிடைக்கும்.

இவ்வாறு சி-மொழிக் கணக்கீடுகளில் புரோகிராமரின் தலையீடு இல்லாமல் தாமாகவே (Implicitly) இனமாற்றம் நிகழ்கிறது. இந்த இனமாற்றம் தற்காலிகமானதே. கணக்கீட்டில் இனமாற்றம் அடையும் ஒரு மாறி தனது மூல இனத்தை இழப்பதில்லை. கணக்கீட்டிற்குப் பிறகு அது மூல இனத்திலேயேதான் நீடிக்கும்.

எண்வகை இனங்களுக்குள் நடைபெறும் உட்கிடை இனமாற்றம் போலவே சி-மொழியில் char இனத்துக்கும் int இனத்துக்கும் இடையிலும் உட்கிடை இனமாற்றம் சர்வ சாதாரணமாக நடைபெறுகிறது. எந்த அளவுக்கு என்றால் ஒரு குறிப்பிட்ட மதிப்பெல்லைக்குள் char இனத்தை int இனமாகவே கையாளும் அளவுக்கு இந்த இனமாற்றம் நடைபெறுகிறது. எப்படி எனப் பார்ப்போம்.

char, int இரண்டும் ஓரினமா?

சி-மொழியில் char இனத்தை int இனமாகவும், int மதிப்பை char ஆகவும் கையாள முடியும். உங்கள் புரோகிராமில் ஓர் எண்வகை மாறியின் மதிப்பை -128 முதல் 127 வரைதான் கையாளுகிறீர்கள் எனில் அதனை int என்பதற்குப் பதிலாக signed char என அறிவித்துக் கொள்ளலாம். 0 முதல் 255 வரைதான் கையாளுகிறீர்கள் எனில், அதனை unsigned char என அறிவித்துக் கொள்ளலாம். அதேபோல char மதிப்புகளை int மதிப்புகளாகவே எடுத்தாள முடியும். அதாவது char இனம் மூலம் செய்து முடிக்க வேண்டிய வேலைகளை int இனம் மூலமாகவே சாதித்துக் கொள்ள முடியும். அதற்கு சி-மொழியின் உட்கிடை இனமாற்றம் துணைபுரிகிறது. இதன் காரணமாக “சி-மொழியைப் பொறுத்தவரை அனைத்துத் தரவினங்களும் எண்வகையைச் சார்ந்தவையே. எழுத்துவகை (கேரக்டர், ஸ்ட்ரிங்) இனங்களே கிடையாது” என்று கூறுவாரும் உண்டு.

int என்று அறிவிக்கப்பட்ட ஒரு மாறியை அதன் மதிப்பு -128 லிருந்து +127 வரை அல்லது 0 விலிருந்து 255 வரை இருக்கும் பட்சத்தில் அதனை char இனமாகவே கையாள முடியும் என்பதற்கு ஓர் எடுத்துக்காட்டுப் பார்ப்போம். கீழே உள்ள புரோகிராமைப் பாருங்கள்:

/* Program No.2.3 */

/* CHARINT2.C */

#include

main()

{

int alpha=65;

printf("\nASCII value is %d", alpha);

printf("\nASCII character is %c", alpha);

}

இந்தப் புரோகிராமைச் செயல்படுத்தினால்,

ASCII value is 65

ASCII character is A

என்று திரையில் காட்டும். இதில் குறிப்பிடத்தக்க செய்தி என்னவெனில், alpha என்ற int இன மாறியின் மதிப்பை %d என்ற குறியீட்டில் காண்பிக்கச் சொன்னால் 65 என்றும், %c என்ற குறியீட்டில் காண்பிக்கச் சொன்னால் A என்றும் காண்பிக்கிறது. A என்னும் ஆங்கில எழுத்தின் ஆஸ்க்கி மதிப்பு 65 என்பது நீங்கள் அறிந்ததே. இங்கே %c என்னும் வடிவமைப்புக் குறியீடே (format specifier) இனமாற்றத்தை நிகழ்த்தி விடுகிறது. கீழ்க்காணும் புரோகிராமையும் இயக்கிப் பாருங்கள்:

/* Program No.7 */

/* CHARINT3.C */

#include

main()

{

char alpha='A';

printf("\nASCII character is %c", alpha);

printf("\nASCII value is %d", alpha);

}

இந்த புரோகிராமைச் செயல்படுத்தினால்,

ASCII character is A

ASCII value is 65

என்று காட்டும். alpha என்னும் char இன மாறியின் மதிப்பை %c என்ற குறியீட்டில் A எனவும், %d என்ற குறியீட்டில் 65 எனவும் காட்டுகிறது. இன்னும் ஒரு புரோகிராமைப் பாருங்கள்:

/* Program No.2.*/

/* CHARINT1.C */

#include

main()

{

char alpha = 'A';

char beta;

beta = alpha + 1;

printf("\nAlpha is %c", alpha);

printf("\nBeta is %c", beta);

}

இந்தப் புரோகிராமைச் செயல்படுத்திப் பாருங்கள்.

Alpha is A

Beta is B

என்று மிகச் சரியாகவே காண்பிக்கும். முந்தைய புரோகிராமைவிட ஒரு படி மேலே போய் alpha என்ற கேரக்டர் மாறியில் உள்ள A என்னும் மதிப்பில் 1 என்னும் எண்ணை நேரடியாகக் கூட்ட முடிகிறது. beta = alpha + 1 என்ற கணக்கீட்டில் + என்னும் கணக்கீட்டுச் செயற்குறி (arithmatic operator) alpha என்னும் char மதிப்பை int மதிப்பாக இனம் மாற்றிக் கணக்கீட்டைச் செய்ய உதவுகிறது. அதேபோல், = என்னும் மதிப்பிருத்தல் செயற்குறி (assignmaent operator) ஓர் int மதிப்பை char மதிப்பாக இனம் மாற்றி, beta என்னும் char மாறியில் இருத்த உதவுகிறது. இந்த உட்கிடை இனமாற்றங்களைப் புரோகிராமரின் தலையீடின்றிக் கம்ப்பைலரே முன்னின்று செய்து முடிக்கிறது.

மேற்கண்ட புரோகிராம்களில் char மாறிகளில் கேரக்டர் மதிப்பையும் int மாறிகளில் இன்டிஜர் மதிப்பையும் இருத்தி வைத்து, கேரக்டராகவோ இன்டிஜராகவோ நம் விருப்பப்படி எடுத்தாள முடிந்தது. அடுத்து நம்முன் உள்ள கேள்வி, char மாறியில் இன்டிஜர் மதிப்பையும், int மாறியில் கேரக்டர் மதிப்பையும் இருத்தி வைத்துக் கையாள முடியுமா என்பதுதான். அப்படியும் முடியும் என்பதை அடுத்த புரோகிராமில் காண்க:

/* Program No. */

/* ALPBETA1.C */

#include

main()

{

int alpha = ‘A’;

char beta = 66;

printf(“int alpha = %d\n”, alpha);

printf(“char alpha = %c\n”, alpha);

printf(“int beta = %d\n”, beta);

printf(“char beta = %c”, beta);

}

இந்தப் புரோகிராமின் வெளியீடு இவ்வாறு இருக்கும்:

int alpha = 65

char alpha = A

int beta = 66

char beta = B

இதிலும் உட்கிடை இனமாற்றங்களை இடம், பொருள், ஏவல் கருதிக் கம்ப்பைலர் உட்கிடை இனமாற்றங்களைச் செய்து முடிக்கிறது. char, int இனங்களுக்கு இடையே நடைபெறும் உட்கிடை இனமாற்றத்தின் உச்சத்துக்கு இன்னோர் எடுத்துக்காட்டைப் பாருங்கள்:

/* Program No */

/* ALPHBETA.C */

#include

main()

{

const char alpha = ‘A’, beta = ‘B’;

int sum = alpha + beta;

int product = alpha * beta;

printf(“alpha = %c\n”, alpha);

printf(“beta = %c\n”, beta);

printf(“alpha + beta = %d\n”, sum);

printf(“alpha * beta = %d”, product);

}

இந்தப் புரோகிராமின் வெளியீடு இவ்வாறு அமையும்:

alpha = A

beta = B

alpha + beta = 131

alpha * beta = 4290

கேரக்டர் இன மாறிகளை எண்களைப் போலக் கூட்டவும் பெருக்கவும் முடிகிறது. காரணம் உட்கிடை இனமாற்றம் என்னும் சிறப்புக் கூறே ஆகும். இங்கே உட்கிடை இனமாற்றம் நிகழ்த்தப்பட வேண்டும் என்பதைக் கணக்கீட்டுச் செயற்குறிகள் கம்ப்பைலருக்கு உணர்த்துகின்றன. எனவே மேற்கண்ட கணக்கீடுகள் சாத்தியமாகின்றன. உட்கிடை இனமாற்றத்தின் காரணமாய், எவ்வித ஃபங்ஷன்களின் துணையும் இல்லாமலேயே, ஓர் int மதிப்பை கேரக்டராகவும், ஒரு char மதிப்பை இன்டிஜராகவும் கையாள முடியும் என்பது சி-மொழியின் சிறப்புக் கூறாகும். இதன் காரணமாகவே ’சி-மொழி இன உணர்வு (type sensitive) அற்ற மொழி’ என்ற பழிச்சொல்லுக்கும் ஆளாகிறது.

இன்னொரு முக்கியமான விவரத்தை நீங்கள் மனதில் வைத்துக் கொள்ள வேண்டும். தரவினப் பாடத்தில் (பாடம்-5) கொடுக்கப்பட்டுள்ள அட்டவணையைக் கவனியுங்கள். char இனம் என்று அறிவிக்கப்படுகிற மாறி (variable) -128 லிருந்து +127 வரையுள்ள மதிப்புகளைத்தான் ஏற்றுக் கொள்ளும். நாம் மேலே பார்த்த புரோகிராம்களில் char என்று அறிவிக்கப்பட்டுள்ள மாறிகள் signed char வகையைச் சார்ந்தவைதான். டர்போ-சி-யைப் பொறுத்தவரை வெறுமனே char என்று குறிப்பிட்டால் signed char என்றே எடுத்துக் கொள்ளப்படும். ஆனால் char இன மாறியின் மதிப்பை 0 லிருந்து 255 வரை கையாள வேண்டும் என எண்ணினால் அந்த மாறியை unsigned char என்று அறிவிக்க வேண்டும்.

பொதுவாக, சி-மொழிப் புரோகிராமர்கள் தங்கள் புரோகிராம்களில் 0 முதல் 255-க்குள் பாஸிட்டிவ் இன்டிஜர் மதிப்புகளை மட்டுமே ஏற்கும் மாறிகளை unsigned char என்றே அறிவிப்பர். எடுத்துக்காட்டாக day, month போன்ற விவரங்களைக் கையாள, int இனத்தைவிட unsigned char இனமே மிகவும் பொறுத்தமானதாகும். காரணம் அவை முறையே 1 முதல் 31 வரை, 1 முதல் 12 வரை மதிப்புகளையே ஏற்கின்றன.

வெளிப்படை இனமாற்றம் (Explicit Type Conversion)

மேற்கண்ட TYPECAS2.C புரோகிராமில் b என்ற மாறியை float-ஆக மாற்றியுள்ளோம். இவ்வாறு மாற்றாமல், a, b இரண்டையும் int ஆகவே வைத்துக் கொண்டு, விடையை மட்டும் float-ல் பெறவும் வழியுண்டு.

/* Program No. */

/* TYPECAS3.C */

#include

main()

{

int a=10, b = 4;

float c;

c = (float)a / b;

printf("a = %d, b = %d, c = %3.1f", a, b, c);

}

இந்தப் புரோகிராமை இயக்கிப் பார்த்தால்,

a = 10, b = 4, c = 2.5

என்று விடையாகக் கிடைக்கும். இதில் a, b இரண்டும் int இனத்தைச் சார்ந்தவைதாம். c-யின் மதிப்பைக் கணக்கிடும்போது மட்டும் a என்ற மாறியைத் தற்காலிகமாக float என்று கருதிக் கொள்ளுமாறு வெளிப்படையாக (Explicitly) கட்டளை அமைத்துள்ளோம். a, float-ஆக இருப்பதால் b-யும் தாமாகவே float-ஆக மாற்றப்பட்டுவிடும். எனவே விடையும் float-ல் கிடைத்துவிடும். இவ்வாறு புரோகிராமர் தலையிட்டு வெளிப்படையாக இனமாற்றம் செய்யும் செயல்முறை இனமாற்றுகை (Typecasting) எனப்படுகிறது.

சில வேளைகளில் ஒரு float இன மதிப்பில் முழு எண் பகுதி (Integer portion) மட்டும் தேவைப்படுகிறது எனில், அதற்கும் வழியுள்ளது. கீழேயுள்ள புரோகிராமைக் கவனியுங்கள்:

/* Program No. */

/* TYPECAS4.C */

#include

main()

{

float x = 5.84;

printf("\nValue of x : %4.2f", x);

printf("\nInteger Portion: %d", (int)x);

}

இந்தப் புரோகிராமின் விடை 5 என்று காண்பிக்கும். இவ்வாறு ஒரு float மதிப்பில் உள்ள int மதிப்பை மட்டும் எடுத்தாள நமக்கு இனமாற்றம் (Type Casting) வழி வகுக்கிறது.

Type Conversion Vs. Type Casting

Type Conversion, Type Casting இரண்டும் ஒன்றா? வேறு வேறா? வேறுபட்டவை எனில் இரண்டையும் வேறுபடுத்திக் காட்டுக. இவ்வாறெல்லாம் நேர்முகத் தேர்வுகளில் கேள்வி கேட்கப்படுவதுண்டு. இதற்குப் பதில் என்ன?

இரண்டும் சொல்தொடர்களுக்கும் வெவ்வேறு பொருள் என்பதில் ஐயமில்லை. ஆனால் கம்ப்யூட்டர் மொழிகளில் அதனை எவ்வாறு வேறுபடுத்திக் காட்டுவது என்பதில்தான் ஐயம் எழுகிறது. சில ஆசிரியர்கள் உட்கிடை இனமாற்றத்தை Type Conversion என்றும், வெளிப்படை இனமாற்றத்தை Type Casting என்றும் மிக எளிதாக விளக்கம் அளிக்கின்றனர். வேறுசில ஆசிரியர்கள் Type Casting என்பது காரணம் (cause), Type Conversion என்பது விளைவு (effect) எனவும் விளக்கம் அளிக்கின்றனர். இந்த இரண்டு வகையான விளக்கங்கங்களுள் மிகச் சரியானது எது?

ஆங்கிலச் சொற்களுக்கான நேரடியான பொருள் எதுவாக இருந்த போதிலும், கம்ப்யூட்டர் மொழிகளில் புரோகிராமர் வெளிப்படையாக இனமாற்றம் செய்யும் செயல்பாட்டையே Typecasting என்னும் சொல்லால் குறிப்பிடுகின்றனர். அச்செயல்பாட்டின் மூலம் Type Conversion என்னும் நிகழ்வு நிகழ்த்தப்படுகிறது. உட்கிடை இனமாற்றம், வெளிப்படை இனமாற்றம் இரண்டிலுமே இனமாற்றம் (Type Conversion) நிகழ்கிறது. முதலாவதில் இனமாற்றத்தைக் கம்ப்பைலர் நிகழ்த்துகிறது. இரண்டாவதில் புரோகிராமர் நிகழ்த்துகிறார். புரோகிராமர் நிகழ்த்தும் இனமாற்றமே (Type Coversion) Typecasting எனப்படுகிறது. எனவே மேற்கண்ட இரண்டு வகையான விளக்கங்களுள் இரண்டாவது விளக்கமே சரியானவை எனலாம்.

Type Conversion, Type Casting ஆகியவற்றுக்கு இணையாக நாம் பயன்படுத்தும் இனமாற்றம், இனமாற்றுகை என்னும் இரண்டு தமிழ்ச் சொற்களும் தாமாகவே இரண்டுக்கும் இடையேயான வேறுபாட்டை விளக்கி நிற்கின்றன.

, ,