Friday 13 December 2013

ASCII text file and Binary File - Part I

File handling शिकतांना तुम्हाला सुरवातीला ASCII Text file आणी Binary File असे काहीतरी शब्द कानावर पडतात. व अनेक विद्यार्थ्यांना नेमका अर्थ काय तेच कळत नाही. कारण विद्यार्थ्याला तो ASCII text file वर काम करतोय कि Binary या मध्येच गोंधळ होतो. खरं तर आपण दोनही वर काम केलेले असते. C/C++/Perl/HTML या सर्व कोड मध्ये आपण text file वरच काम करतो. 


ज्या File मध्ये ASCII characters असतात ती ASCII text file अशी simple definition देता येइल. Notepad किंवा vi editor वापरून आपण जी तयार करतो त्या ASCII text files च असतात. ASCII मधील A हा American असल्यामुळे ASCII text file american-centric च आहे आणी जगभर America देशाचाच Software मध्ये प्रभाव असल्याने अर्थातच ते international standard होउन बसले आहे...!

Computer Scientist हे सर्वात जास्त महत्व कशाला देत असतील तर ते Abstraction ला. हिच philosophy वापरून खरं तर OOP methodology तयार झाली. Text editor हे abstraction चे उत्तम उदाहरण म्हणता येइल. 

Memory मग ती free memory असो अथवा hard disk असो, त्या वरील डेटा हा 0s आणी 1s मध्येच स्टोअर होतो हेच तर खरे abstraction आहे. तर मग Text file असली काय किंवा binary file असली काय, शेवटी काय फरक पडतो असा प्रश्न तुम्हाला पडेल...!

त्या साठी प्रथम file म्हणजे काय ते सांगते. C मध्ये file म्हणजे Collection of bytes stored on secondary storage device like hard disk. त्या मध्ये characters असतील, words असतील, lines असतील, paragraphs असतील अथवा Data base मधील fields आणी records असतील. किंवा Image मधील pixels असतील. 

ASCII Text Files:
  1. हि एक प्रकारची Special Binary file च असते. ASCII हा 7 byte code असलेले character असते कारण एकूण ASCII characters 128 आहेत. त्यामुळे प्रत्येक कॅरेक्टर स्टोअर होतांना त्याचा most significant bit 0 (zero) असतो व तो वापरला जात नाही. Binary file च्या बाबतीत मात्र तशी काही गैरसोय होत नाहॊ व पुर्ण 256 bit patterns वापरले जातात. 
  2. शिवाय ASCII text file हि कायम Sequential स्वरूपात access करता येते. 
  3. या प्रकारची file forward direction नेच access करता येते. 
  4. याच कारणामुळे Text file हि read mode, write mode or append mode या पैकी एकाच mode मध्ये open करता येते. 
  5. ज्यावेळी data store (write) होतो त्यावेळी Newline character in text mode is converted into the carriage return - line feed combination व तशाच प्रकारची process उलट पद्धतीने होते ज्यावेळी file (read) hard disk वरून आणली जाते. अशाच प्रकारची इतर translation सुद्धा programmer च्या अपरोक्ष (background) होत असतात.
  6. फक्त कॅरेक्टर्स handle करण्याच्या पद्धतीमुळे एकावेळी एकच कॅरेक्टर read किंवा write करता येते.    

समजा एखाद्या नोटपॅड मध्ये तुम्ही cat असा word type केला व file save केली तर hard disk वर c, a, t या प्रत्येक alphabet हे corresponding ASCII value च्या स्वरूपात स्टोअर होइल. 




Binary files:
Binary files सुद्धा collection of bytes च असते. C language मध्ये Character आणी Byte एकच represent करत असल्यामुळे Binary files सुद्धा character streams म्हणूनच ओळखल्या जातात. थोडा-फार फरक आहे तो असा कि:

  1. Write किंवा Read operation च्या वेळी डेटाचे special processing होत नाही व गरज सुद्धा नसते. 
  2. C Programmer ला bit level ला काम करता येते. 
  3. Binary files sequentially आणी Randomly प्रोसेस करता येतात. 
  4. Read आणी Write operations हि एकाच वेळी (Simultaneously) करता येतात. 

ज्यावेळी तुम्ही एखादे कॅरेक्टर टाइप केल्यानंतर save होतांना तो entire byte rules प्रमाणे स्टोअर होइल.  
Binary files बरोबर सुद्धा आपण अनेकवेळा काम करतो...उदा. executable file, object files, sound files, image files या सर्व binary files category मध्ये मोडतात. उदा.

Data base files मध्ये file तयार करणे व process करणे Binary files च्या बाबतीत सोपे असते. Record update करायची असेल तर record locate करणे, मेमरी मध्ये fetch करणे, modify करून file मध्ये हव्या त्या ठिकाणी ठेवण्याची कामे सहज शक्य असतात. अशा प्रकारच्या कामाला text file शक्यतो वापरता येत नाही. 

Text आणी Binary files मध्ये broadly फरक केला जातो तो त्यांच्या 
  • new line handle करण्याच्या पद्धतीमुळे  
  • end of line represent करण्याच्या पद्धतीमुळे 
  • number store करण्याच्या पद्धतीमुळे
याच्या पुढील पोस्ट मध्ये मी एक प्रोग्रॅम घेउन सविस्तर सांगते...

Till then Happy Coding...! 

       
            

Thursday 12 December 2013

sprintf functions in C

printfscanf हि फंक्शंन्स तुम्हाला माहीतच झाली आहेत. मागील पोस्ट मध्ये त्या दोनही फंक्शंन्स विषयी मी थोडे-फार लिहीले होते. पण सर्वच काही जाणीवपुर्वक लिहीले नाही. कारण त्या फंक्शंन्स शी निगडीत अनेक concepts असे आहेत की एकाच पोस्ट मध्ये लिहीले तर वाचायचा कंटाळा करून तुमचे दुर्लक्ष होउ शकते. 

printf व scanf या दोन फंक्शंन्सशी निगडीत अजून दोन फंक्शंन्स मी आज घेते आहे ती म्हणजे sprintf आणी sscanf. अनेकवेळा ती कशी व कधी वापरायची हे न कळाल्यामुळे शिकायची सुद्धा राहून जातात. 

Buffering Video


एकदम सोप्या भाषेत सांगायचे झाले तर printf function ज्यावेळी call करतो त्यावेळी त्याचे output आपल्याला monitor वर दिसते. पण हेच जर आपल्याला monitor वर न पाठवता एकाद्या व्हेअरेबल मध्ये स्टोअर करायचे असेल तर sprintf हे फंक्शन तुम्हाला मदत करेल. आता printf function call करतांना त्याचे पहीले argument string constant असते व त्यामधील formatted contents हे monitor वर पाठवले जात असतील तर हेच contents store करायला लागणाऱ्या व्हेअरेबल चा data type अर्थातच string असायला हवा. त्यामुळे sprintf function चा प्रोटोटाइप सुद्धा 

int sprintf ( char * buffer, const char * format [ , argument , ...] );

असा आहे. या ठिकाणी पहीले argument buffer हा character pointer म्हणजेच string आहे हे लक्षात घ्या. उर्वरीत arguments हि printf function प्रमाणे same आहेत. फरक इतकाच की output हे monitor ला पाठवायच्या ऐवजी buffer point करत असलेल्या string मध्ये स्टोअर करण्याची विनंती आपण sprintf function ला करत आहोत. त्यामुळे प्रोग्रॅम मध्ये buffer साठी एक sufficient size असलेला एक character array declare करून ठेवण्याची गरज असते. जसे की 

char buffermem[100];

व हाच base address तुम्ही sprintf function ला first argument म्हणून पाठवायचा म्हणजे काम भागले...!

समजा आपण एक छोटा प्रोग्रॅम लिहायचा प्रयत्न केला तर कसा असेल...?


व output 

              
असे असेल....

File handling करतांना अशा प्रकारच्या फंक्शंन्स चा उपयोग करता येउ शकतो. किंवा एखादे output आपल्याला नंतर वापरायचे असेल तर sprintf function चा वापर केला जातो. 

printf function ज्या प्रमाणे monitor वर किती characters print केली त्याचा integer number return करते त्याच प्रमाणे sprintf function सुद्धा किती characters array मध्ये टाकली ते return करते. अर्थात त्या मध्ये string terminating character घेत नाही हे लक्षात घ्या...!

एखादा youtube वरचा व्हिडीओ आपण direct न पहाता pause करून buffer memory मध्ये साठवून ठेवतो व नंतर internet connection नसतांना सुद्धा पाहतो तसलाच काहीतरी हा प्रकार आहे असे मला अनेक वेळा वाटते...!

पुढच्या पोस्ट मध्ये मी sscanf बद्द्ल लिहीते...

Till then Happy Coding...!    

Tuesday 10 December 2013

scanf function in C language

मागील पोस्ट मध्ये मी printf function बद्दल सांगीतले होते. त्या फंक्शनची जोडीदारीण म्हणजे scanf function. अर्थातच printf function जर output साठी वापरण्यात येत असले तर scanf हे input घेण्यासाठी वापरण्यात येते. जवळपास सर्वच program मध्ये जोडीने फीरतांना तुम्हाला हे आढळतील...!

इंग्रजी मध्ये एखाद्याचे inspection किंवा screening करायचे असेल तर scanning हा शब्द वापरला जातो. मला कधी कधी वाटतं युझरने भरलेली व keyboard च्या आत दडलेली value मेमरीमध्ये चपखलपणे नेउन ठेवण्याचे काम करणारे हे फंक्शन आहे म्हणून scanf असे नाव ठेवले आहे. गंम्मत म्हणजे Java मध्ये अशा प्रकारचे फंक्शन जरी नसले तरी Java मध्ये input घेण्यासाठी object तयार करायला लागतो व त्या object च्या class चे नाव Scanner ठेवले आहे...!

printf function व इतर अनेक फंक्शन्स प्रमाणेच input घेण्याची व्यवस्था सुद्धा डेनीसनं C language मध्ये built in केली नव्हती. त्यामुळे हे फंक्शन सुद्धा compiler च्या library मध्ये उपलब्ध आहे व stdio.h या header file मध्ये त्याचा prototype आहे. तो सर्वसाधारणपणे 

int     _Cdecl scanf(const char *__format, ...);

असा आहे. आता याच फंक्शनचे scanning करायचे म्हणले तर 

scanf function integer return करते. 
printf function प्रमाणेच याचे calling convention _Cdecl आहे. 
याचे पहीले argument स्ट्रिंग असते
पुढील argument सुद्धा printf function प्रमाणे Ellipsis म्हणजेच 3 dots (...) आहे. म्हणूनच मागील पोस्ट मध्ये सांगीतल्या प्रमाणे हे फंक्शन सुद्धा variable number of arguments म्हणजेच any number of arguments घेउ शकते.              

scanf या फंक्शन मध्ये printf function प्रमाणे पहीले argument जरी string असले तरी या स्ट्रिंग मध्ये फॉर्मॅट स्पेसीफायर काही अपवाद वगळता कोणतीही इतर कॅरेक्टर्स लिहून नयेत. त्यामुळे समजा एक इंटीजर input घ्यायचा असेल व x या व्हेअरेबल मध्ये स्टोअर करायचा असेल तर स्टेटमेंट

scanf("%d",&x); 

असे असेल. स्ट्रिंग नंतर जी arguments ची लिस्ट असते त्या मध्ये व्हेअरेबल्सची मेमरी द्यावी लागते. म्हणून व्हेअरेबल च्या नावा समोर ampersand म्हणजेच address operator जोडतात. जर व्हेअरेबल स्वत:च pointer variable असेल तर ampersand जोडण्याची गरज उरत नाही. उदा. 

int x; 
int *ptr = &x;

scanf("%d",ptr); 

असे लिहीले तर keyboard कडून input केलेली value x मध्ये स्टोअर केली जाइल. समजा आपल्याला अनेक integer, real, characters input करून घ्यायच्या आहेत तर तुम्ही 

scanf("%d%f%c",&x,&y,&ch);

असे लिहू शकता. व या format specifiers व्यतीरीक्त इतर कोणतीही characters या string च्या आत लिहू नयेत. अनेक वेळा अनवधानाने escape sequence लिहीण्याची चुक विद्यार्थ्यांच्या कडुन होते व compile अथवा run time error सुद्धा मिळत नाही पण output मात्र चूकीचे मिळते. 

मी एक छोटासा प्रोग्रॅम खाली देते आहे. पहा हवं तर टाइप आणी रन करून...

#include<stdio.h>
void main( )
{
        char line[200];
        printf("Enter Sentence\n");
        scanf("%[^\n]",line);
        printf("%s",line);
}

मी अजून एक गंम्मत सांगते पोस्ट संपवायच्या पुर्वी.... कारण तसं म्हणल ना तर printf आणी scanf वर मला खुप काही सांगायचयं तुम्हाला पण मी एकाच पोस्ट मध्ये नाही लिहीत सगळं... कारण खुप काही आहे...सांगेन मी तुम्हाला

तर printf आणी scanf यांना print function आणी scan function असे म्हणतात हे ठिक आहे पण f हा function साठी राखीव नसून formatted साठी राखीव आहे...!

C is really mysterious language... Life long... 




Wednesday 4 December 2013

printf function in C

C language मध्ये printf म्हणजेच print function ची ओळख पहील्याच दिवशी होते. डेनीस रिची ला C language हि compact form मध्येच हवी होती. म्हणून जाणीवपुर्वक त्याने input/output ची सोय language च्या definition मध्ये केलेली नाही. अर्थात printf हे फंक्शन C language चा inherent part आहे अशी अनेक जणांची सुरवातीला समजूत होते हा भाग वेगळा. 




printf function हे formatted console I/O functions या category मध्ये येते. प्रथम मी या category चा अर्थ काय आहे ते सांगते. 


  1. Console : या शब्दाचे अनेक अर्थ आहेत. English मध्ये त्याचा अर्थ सांत्वंन करणे असा आहे. तर Computer मध्ये keyboard व monitor चे combination, display monitor, command line interface, computer terminal असे अनेक आहेत. C language च्या मर्यादीत अर्थ पहायचा असेल तर शक्यतो असे application ज्या वर फक्त text based output अशी स्क्रिन. यालाच console असे शक्यतो ओळखले जाते. व printf function कॉल करून प्रिंट केलेले output console ला म्हणजेच monitor ला पाठवले जाते
  2. Formatted: Console Screen वर output नेमक्या ठिकाणी हवे असेल, दोन शब्दांमध्ये अथवा दोन वाक्यांमध्ये ठरावीक अतंर ठेवायचे असेल, किंवा real number print करतांना decimal point नंतर ठरावीक digits हवे असतील अशा प्रकारचे किंवा तत्सम प्रकारचे formatted output हवे असेल तर ते printf function च्या सहाय्याने करता येते. 
  3. I/O : Input व Output या जोडगोळीचे ते संक्षीप्त स्वरूप आहे. 


हे फंक्शन Compiler च्या library मध्ये उपलब्ध असते व त्याचा प्रोटोटाइप stdio.h या header file मध्ये असतो. तो साधारणपणे 


int     _Cdecl printf(const char *__format, ...);


असा आहे. या prototype वरून कोणती माहीती मिळते...? तर


  • printf function चा return type integer आहे
  • _Cdecl ला printf function चे calling convention म्हणतात. 
  • printf function पहीले argument string घेते
  • printf function चे दुसऱ्या argument मध्ये तीन dots दाखवले आहेत ज्याला ellipsis असे म्हणतात ज्याचा अर्थ variable number of arguments असा आहे. म्हणजेच printf function एक पेक्षा जास्त कितीही arguments घेते.

हे फंक्शन 


  • series of arguments घेते
  • जर पहील्या स्ट्रिंग मध्ये काही format specifiers असतील तर त्या प्रमाणे apply करते
  • आणी formatted data console वर print करते

printf function ची वैशिष्ठे


  • By default printf function print करतांना right hand side ला word wrap facility वापरते
  • \n हे special implementation control character आहे ज्या मध्ये control next line ला नेण्याचे काम करते
  • Screen scroll down करण्याची सुविधा सुद्धा printf function मध्ये built in आहे
  • character print केल्या नंतर cursor next position ला नेण्याचे काम सुद्धा automatically नेण्याची provision आहे
  • पहील्या format specifier ला format नंतरचे पहीले argument connect करण्याचे, दुसऱ्या format specifier ला format नंतरचे दुसरे argument connect करण्याचे व त्याच पद्धतीने पुढील format specifier apply करण्याची built in सुविधा printf function मध्ये आहे


format specifier चा typical form 

% [flags] [width] [.prec] [{h|l}] type

असा आहे. 

या मध्ये अनेक प्रकारचे flags व type आहेत. पण महत्वाचे व नेहमी लागणारे मी येथे घेते. बाकीचे स्पेशल पुढील पोस्ट मध्ये. 

int x = 55;
printf("x = %o",x); 

असे असेल तर o हा एखादा integer number जर octal format मध्ये print करायचा असेल तर वापरतात. या ठिकाणी तुम्हाला output मात्र 

x = 67 

असे येइल. पण तुम्हाला true octal representation हवे असेल तर मात्र printf function 

printf("x = %#o",x);

असे लिहावे लागेल, या ठिकाणी # हा flag आहे . 

समजा तुम्हाला x = 55 या स्टेटमेंट नंतर value print करतांना मात्र +55 अशी हवी असेल तर + flag वापरावा लागेल जसे की 

printf("x = %+d",x); 

समजा आपल्याला 55 च्या अलीकडे 4 zero हवे आहेत. तर 0 असा flag टाकावा लागेल. जसे की

printf("x = %06d",x); 

असे स्टेटमेंट लिहीले तर output 000055 असे मिळेल. 

print होतांना तुम्हाला width specify करायची असेल तर ती सुद्धा देउ शकता. जसे की 

printf("x = %d",x); असे लिहीले तर output 

x = 55 

असे मिळेल. पण समजा

printf("x = 10d",x);

असे लिहीले तर 10 columns जागा राखीव ठेवून मग त्या ठिकाणापासून डाव्या बाजूला printing होइल जसे कि

x =           55

असे होइल. 

समजा 

float y = 6.7;

असे स्टेटमेंट असेल तर 

printf("y = %f",y); 

हे स्टेट्मेंट printing करतांना 

y = 6.700000 

असे करेल. पण जर 

printf("%0.2f",y);

असे लिहीले तर मात्र output

y = 6.70 

असे मिळेल.   
  
C language मध्ये असलेल्या वेगवेगळ्या format specifiers ची माहीती मी या पुर्वीच Blog वर टाकली आहेत


  
   

   

Sunday 24 November 2013

Precedence and Associativity of operators in C

C language मध्ये काही concepts असे आहेत कि ज्याचा स्वतंत्रपणे अभ्यास केला जात नाही. "प्रोग्रॅम सोडवतांना अडचण येइल त्यावेळी बघून घेउ काय करायचे ते" अशी सर्व साधारण मनोवृत्ती असते. 

Operator associativity हा अशाच काही टॉपीक पैकी एक टॉपीक. आज मी या पोस्ट मध्ये Operator precedence and associativity या बद्दल सांगते.    

C language is very rich in number of operators. आणी हे सर्व operators वेगवेगळ्या categories मध्ये विभागून ठेवले आहेत. म्हणजे त्याच्या broad categories 


  1. Unary operators (Single operand)
  2. Binary operators (Two operands on both side of operator)
  3. Ternary operators (three operands) 


अशा आहेत. 

शिवाय हे सर्व 

General operators
e.g. function operator ( ), Array expression [ ], Structure operator ->, Structure operator
Unary operators
e.g. unary minus - , increment ++, decrement --, one's complement ~, Negation !, Address of &, value at address *, type cast (type), size in bytes (sizeof)   
Mathematical operators
e.g. Multiplication *, Division /, Modulus %, Addition +, Subtraction -, 
Shift operators
e.g. Left shift <<, Right shift >>
Relational operators
e.g. Less than <, Less than or equal to <= , Greater than >, Greater than or equal to >=, equal to ==, Not equal to != 
Bitwise operators
e.g. BIT wise AND &, BIT wise exclusive OR ^, BIT wise inclusive OR |
Logical operators
e.g. Logical AND &&, Logical OR ||
Ternary operators
e.g. Conditional operator ? : 
Assignment operators
e.g. =, *=, /=, %=, +=, -=, &=, ^=, |=, <<=, >>= 
Comma operator 
e.g. ,

अशा categories मध्ये विभागले गेले आहेत. 


वरील सर्व operators हे Highest precedence पासून Lowest precedence पर्यंत लिहीले आहेत. म्हणजेच Function operator ला highest precedence आहे तर comma operator ला lowest precedence आहे. 

आता precedence म्हणजे एखादे एक्सप्रेशन सोडवतांना कोणते operation प्रथम करायचे, त्या नंतर कोणते करायचे याचा जो sequence follow करायचा असतो तो... उदा. 

x = 8 / 4 + 4 % 2 

या expression मध्ये वरील चार्ट प्रमाणे / आणी % ला + operator पेक्षा higher precedence आहे तर = ला मात्र + पेक्षा सुद्धा कमी precedence आहे. म्हणजेच त्याच क्रमाने operations होतात. म्हणजेच
8/4 will be evaluated to 24%2 will be evaluated to 02 + 0 will be evaluated to 2 and will be assigned to x 
आता समजा expression 
x = 8 / 4 * 2  
असे मात्र असेल तर अनेक वेळा 4 * 2 हे प्रथम सोडवून नंतर मग 8/8 हे ऑपरेशन विद्यार्थ्यांच्याकडून केले जाते. या ठिकाणी associativity consider केली जाते. म्हणजेच एकच precedence असलेले operators जर sequentially आले तर कोणत्या मार्गाने operations करायची त्याच्या संबधीत language चे rules म्हणजे associativity...!

Associativity of operators in C हि दोन प्रकारची असते 
Left to Right (याला काहीवेळा Left associativity असे सुद्धा म्हणतात)Right to Left (याला काहीवेळा Right associativity असे सुद्धा म्हणतात)
हि associativity operators च्या संबधीत असते. म्हणजे C च्या operator precedence table मध्ये Dennis Ritchie ने precedence बरोबर associativity सुद्धा दिली आहे. उदा. mathematical operators ला Left to Right associativity आहे तर assignment operators, unary operators आणी comma operators ला Right to Left associativity आहे. 

म्हणजेच वरील expression आता associativity च्या नियमानुसार 8/4 हे प्रथम सोडवून मिळालेल्या result ला 2 ने multiply केले जाते व x मध्ये 4 store होतो. 

हे सगळं वाचल की समजल असं वाटत पण ज्या वेळी precedence chart मधील अनेक operators मात्र एखाद्या expression मध्ये उलट-सुलट येतात त्यावेळी भंबेरी उडते. अनेक छोटे-छोटे प्रोग्रॅम्स डोळ्याखालून घालणे व त्याचे execution समजावून घेणे हाच एकमेव उपाय आहे. आमच्या टिम मधील काही engineers नी अशा प्रकारच्या अनेक प्रश्नांची व त्याच्या explanation ची व्यवस्था C Marathi framework मध्ये प्रत्येक चॅप्टरच्या खाली केली आहे.  

Friday 22 November 2013

if Decision Control Structure in C

Decision Control Structures मध्ये एकुण ४ प्रकारची control structures आहेत. अर्थात control म्हणजे काय हे माहीत हवे. Program execute होतांना प्रत्येक स्टेटमेंट हे compiler कडुन compile केले जाते. मात्र execute करण्यासाठी OS कडुन व CPU कडुन मदत घ्यावी लागते. पण हि सर्व स्टेटमेंट कोणत्या order ने execute होतात हे महत्वाचे. 

जर program मध्ये लिहीलेली सर्व च्या सर्व स्टेटमेंट विनासायास एका मागोमाग execute होत असतील तर त्याला Sequential Control Structure म्हणतात. 

पण जर एखादे स्टेटमेंट किंवा काही स्टेटमेंट्स execute करायची कि नाही हे जर काही conditions satisfy झाल्या तरच ठरवायचे असेल तर लिहीलेल्या स्टेटमेंट्स ना अथवा ब्लॉक ला Decision Control Structure म्हणतात. 

C language मध्ये decision घेण्यासाठी ३ पद्धती आहेत. 


  • पहीली म्हणजे if control structure
  • दुसरी म्हणजे if else control structure
  • तिसरी म्हणजे case control structure


if control structure

syntax:

if(condition)
{
do this;
do this; 
}

या control structure मध्ये if हा keyword आहे. या keyword नंतर लगेच pair of round brackets मध्ये condition लिहीली जाते. 


condition लिहीण्यासाठी मात्र C language मधील 6 relational operators वापरता येतात ते म्हणजे 

  1. less than (<) 
  2. Less than or equal to (<=)
  3. Greater than (>)
  4. Greater than or equal to (>=)
  5. Equal to (==)  आणी 
  6. Not equal to (!=)


वरुन operators वरून हे कळतेच की हे सर्व relational operators Binary Operators आहेत. प्रोग्रॅम लिहीतांना assignment operator (=) आणी equal to operator (==) मध्ये गोंधळ होण्याचीई शक्यता असते. या ठिकाणी equal to operator हा relational operator आहे हे लक्षात घेतले पाहीजे. 

वरील syntax मध्ये हे लक्षात घेतले पाहीजे की condition हि दोन operands मध्ये टेस्ट केली जाते. व या expression चा result एकतर True (non-zero म्हणजेच 1) किंवा False (Zero म्हणजेच 0) असतो. 

ज्यावेळी result True असेल त्याच वेळी if condition शी associated statements execute केली जातात. 
जर result False असेल तर if block किंवा if condition शी associated statements execute केली जाणार नाहीत. 

interview किंवा viva मध्ये तुम्हाला 

if(x)

असे स्टेटमेंट दिसून येइल. या ठिकाणी relational operator वापरलेला नाही. पण वर सांगीतल्या प्रमाणे round brackets च्या आत असलेला x हे expression म्हणून सोडवले जाते. आता x मध्ये non-zero value असली तर ते true असेल व x मध्ये 0 असेल तर expression false होइल. 

Click here if (condition) च्या व्हिडीओ साठी...! 


Tuesday 29 October 2013

Variable in C


In C "Memory is Syntactic Sugar" असे म्हणतात. Programming World मध्ये language चा syntax प्रोग्रॅमर ला लिहायला व समजायला सोपा असला तर त्याला "Syntactic Sugar" असे गोड नाव आहे. त्याचे कारण म्हणजे डेटा-टाइप व व्हेअरेबल चे नाव वापरुन मेमरी बरोबर आपण direct खेळ करू शकतो. Assembly level language मध्ये अशी कोणतीही सुविधा नसते कारण त्या मध्ये डेटा टाइपच नसतात. गंम्मत आहे ना...! आज मी या पोस्ट मध्ये दिसायला व समजायला एकदम सोप्पा असणारा पण मशीनच्या आत जावून बघितले तर interesting असा variable in C हा विषय निवडला आहे. 

 
Syntactic Sugar










int x;
float y;

char ch;


या वरील तीन स्टेटमेंट्स (ज्याला आपण Type declaration statements म्हणतो) मध्ये int, float, आणी char याला आपण डेटा टाइप म्हणतो. तर x, y, ch ला आपण variables म्हणतो. काय करतात ही स्टेटमेंट्स नक्की...?

ही स्टेटमेंट्स compiler ला मेमरी राखीव ठेवण्यासाठी व्यवस्था करण्याची विनंती करतात! या मध्ये एकंदरीत ३ महत्वाच्या information दडलेल्या आहेत. 

  • प्रत्येक व्हेअरेबल हे मेमरीचा starting address denote करते. 
  • प्रत्येक व्हेअरेबल ला डेटा टाइप आवश्यकच असतो
  • डेटा टाइप म्हणजे compiler ला किती bytes राखीव ठेवायच्या इतक्याच कारणासाठी आवश्यक असतो. 

त्यामुळेच ज्यावेळी आपण int x असे लिहीतो त्यावेळी आपण कंपायलरला सांगत आहोत की तु जी मेमरी राखीव ठेवली आहेस त्याला मी नाव x असे दिले आहे. अर्थात compiler ला मात्र x च्या address शी देणे-घेणे असते व त्या starting address पासून तो integer ला 4 bytes लागत असतील तर पुढील 32 bits access करण्याचे काम करतो. (सांग काम्या हो नाम्या हि मराठी म्हण कशी कंपायलरा तंतोतंत लागू होते...!)

मग प्रश्न असा उरतो की compiler ला कसे कळते की किती bytes द्यायचे ते...? तर integer data types ची definition limits.h या header file मध्ये ठेवलेली असते आणी float data type ची definition मात्र macro चा आधार घेउन floats.h या header file मध्ये ठेवलेली असते. 

त्यामुळे variable म्हणजे मेमरी हे प्रोग्रॅमरने कायम लक्षात ठेवणे जरूरी आहे. म्हणूनच variable is named memory location अशी त्याची व्याख्या करता येइल. शिवाय हे सुद्धा लक्षात घेतले पाहीजे कि ज्या प्रकारचे व्हेअरेबल आहे त्याच प्रकारचा constant त्या मध्ये (memory मध्ये) ठेवता येतो. 

variables declare करतांना C मध्ये काही नियम पाळणे मात्र जरूरी आहे जसे की...

  1. variable चे नाव ठरवतांना त्या मध्ये digits आणी alphabets असू शकतात. 
  2. variable च्या नावाची सुरवात digit ने होउ शकत नाही. variable name मधील पहीले character alphabet च असले पाहीजे. (अर्थात underscore चालतो पण शक्यतो प्रोग्रॅमर ने तो वापरू नये कारण compiler लिहीणाऱ्या प्रोग्रॅमर त्याचा वापर करतात असे convention आहे. 
  3. variable name मध्ये underscore व्यतीरीक्त कोणतेही special character वापरायला allowed नाही 
  4. variable name मध्ये blank space किंवा dot किंवा comma टाकण्याची शक्यता असते पण ही सर्व special characters असल्यामुळे वापरता येत नाहीत
  5. variable चे name हे शक्यतो meaningful, short व sweet असावे. 
  6. C language मध्ये सर्व व्हेअरेबल्स हि block (scope) च्या सुरवातीला करायला लागतात.      
Animated contents of Variables in C


 

  

Saturday 26 October 2013

Character Constant in C


आपण इंटीजर कसा स्टोअर करायचा ते पाहीले. फ्लोट कॉंन्संटंट कसा स्टोअर करायचा ते पाहीले. पहील्या मध्ये डेसीमल पॉइंट नसतो तर दुसऱ्या मध्ये डेसीमल पॉइंट असतो. C language मध्ये असलेल्या Primary Data type पैकी आता गरज आहे ती character कसे स्टोअर करायचे हे माहीत करून घ्यायची. 

प्रथम आपण कॅरेक्टर म्हणजे काय हे पाहीले पाहुया. 

किबोर्ड वरील सर्व Alphabets म्हणजे 

  • lower-case  :  a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z (Small case letters)
  • upper-case :  A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z  (Capital Letters)
  • numeric       :  0|1|2|3|4|5|6|7|8|9
  • special         :  !|%|^|&|*|(|)|-|+|=|{|}|||~|[|]|\|;|'|:|"|<|>|?|,|.|/|#|@|`|_

या सर्वांचा सेट म्हणजे हि सर्व कॅरेक्टर कॉंन्संटंट म्हणता येतील. अर्थात C language मध्ये हि सर्व characters वापरून सुद्धा ४ वर्गात विभागणी करता येइल. जसे की

वरील सर्व कॅरेक्टर्स आहे तशी वापरायची म्हणजेच फक्त एक कॅरेक्टर single quote मध्ये वापरायचे. 
Individual home for every alphabet





















या मध्ये कॅरेक्टर कॉंन्स्टंट ला एक बाइट म्हणजेच 8 bits दिलेले असतात. त्यामुळे त्याची range -128 to +127 इतकी असते. वर दिलेली सर्व कॅरेक्टर्स या format मध्ये represent करता येतात. Computer मध्ये डेटा binary format मध्ये स्टोअर केला जात असल्या मुळे American Standard Code for Information Interchange (ASCII) ने एक standard केले. ज्यामध्ये प्रत्येक कॅरेक्टर ला एक unique value दिली व त्या value ला ASCII value म्हणतात. 
उदा.
  • A ची ASCII value 65, B ची 66, C ची 67....व Z ची ASCII value 90 
  • a  ची ASCII value 97, b ची 98, c ची 99.....व z ची ASCII value 122
  • 0 ची ASCII value 48, 1 ची 49, 2 ची 50......व 9 ची ASCII value 57
 आहेत. शिवाय वर जो special character चा सेट दाखवला आहे त्यांना वरील ASCII values मधील उर्वरीत values म्हणजेच 0 to 47, 58 to 64, 91 to 96 व 123 to 127 दिल्या आहेत. 8 bits मधील sign bit न वापरता अनेक special characters सुद्धा स्टोअर करण्याची व्यवस्था ASCII ने करून दिली व त्याला extended ASCII character set म्हणतात व त्यांच्या साठी 128 to 255 मधील values दिल्या आहेत.        

याचा अर्थच असा की ज्यावेळी तुम्ही 

char ch = 'A'; 

असे स्टेटमेंट लिहाल त्यावेळी memory मध्ये A ची corresponding ASCII value म्हणजेच 65 चा bit pattern store केला जातो. 

या कॅरेक्टर कॉंस्टंटचे नियम म्हणजे:

  1. कॅरेक्टर कॉंस्टंट pair of single quote मध्ये लिहावा लागतो. एका पेक्षा जास्त कॅरेक्टर्स लिहीली तर compile time error मिळते. 
  2.  char हा किवर्ड राखीव ठेवला आहे. 
  3. त्याची range -128 to +127 आहे
 नंतर फार उशीरा म्हणजे १९९० नंतर जगामधील कोणत्याही भाषेमधील कोणतेही कॅरेक्टर स्टोअर करण्याची सुविधा देण्यासाठी Unicode format design केला गेला ज्यासाठी 2 bytes ची व्यवस्था करण्यात आली. त्यामुळे 65535 इतक्या विविध प्रकारची कॅरेक्टर्स स्टोअर करता येतात. अर्थात त्यासाठी प्रोग्रॅम लिहीतांना काही Locale changes करावे लागतात व C language ने wchar_t असा नवीन कॅरेक्टर कॉंस्टंट दिला. हा कॉंस्टंट wide character प्रकारात मोडतो  पण त्याचा फार वापर केला गेला नाही. 

या मध्ये तिसरा प्रकार म्हणजे escape sequence लिहीण्याचा कारण त्यासाठी \ आणी n किंवा n ऐवजी t, a, r, v, \ अशी काही कॅरेक्टर्स वापरली जातात पण हे एकच कॅरेक्टर असते. 

शेवटचा प्रकार म्हणजे स्ट्रींग मध्ये स्ट्रिंग टर्मिनेटींग कॅरेक्टर म्हणून \0 सुद्धा Single character ओळखले जाते.   

इतके वाचून सुद्धा कळाले नसेल तर मग या ठिकाणी व्हिडीओ पहा...!

Do you like the C Marathi e-learning concept?