Programming Fundamentals : Part 1
Introduction to Programming & Variable Scope
प्रोग्रामिंग और कुछ नहीं, बल्कि कंप्यूटर को अपनी भाषा में निर्देश (Instructions) देने की एक कला है। जब बहुत सारे निर्देश आपस में मिलते हैं, तो वह एक Program बनता है, और बहुत सारे प्रोग्राम्स मिलकर एक Software का रूप लेते हैं।
1. Data Types (Built-in vs User-Defined)
कंप्यूटर की मेमोरी में जब हम कोई वैल्यू स्टोर करते हैं, तो कंप्यूटर को पहले बताना पड़ता है कि वह वैल्यू किस प्रकार की है (जैसे नंबर है, या कोई अक्षर है)। इसे ही हम Data Type कहते हैं। इन्हें दो मुख्य भागों में बांटा जाता है:
[ DATA TYPES ]
│
┌────────────────────────┴────────────────────────┐
[ Built-in / Primary ] [ User-Defined ]
(जो लैंग्वेज में पहले से बने हैं) (जिन्हें प्रोग्रामर खुद बनाता है)
- int (Integer - पूर्णांक) - Structure (स्ट्रक्चर)
- float / double (दशमलव संख्या) - Union (यूनियन)
- char (Character - अक्षर) - Class (क्लास - OOPs में)
- void (No Value/खाली) - Enumeration (enum)
A. Built-in Data Types (प्राथमिक डेटा टाइप)
- int (Integer): इसका उपयोग बिना पॉइंट वाले पूरे नंबरों को स्टोर करने के लिए होता है (जैसे
10,-254,5000)। 32-bit कंपाइलर में यह मेमोरी में 4 Bytes की जगह लेता है। - float & double: दशमलव (Point) वाले नंबरों के लिए (जैसे
3.14,-0.005)।floatमेमोरी में 4 Bytes लेता है औरdoubleज़्यादा शुद्धता (Precision) के लिए 8 Bytes लेता है। - char (Character): किसी भी सिंगल अक्षर, सिम्बल या नंबर को स्टोर करने के लिए (जैसे
'A','7','#')। यह हमेशा सिंगल कोट्स (' ') में लिखा जाता है और मेमोरी में 1 Byte लेता है।
B. User-Defined Data Types (उपयोगकर्ता द्वारा निर्धारित)
जब हमारे पास बने-बनाए डेटा टाइप्स कम पड़ जाते हैं, तो हम अपनी जरूरत के हिसाब से नया डेटा टाइप डिजाइन करते हैं।
- Structure & Union: जब हमें अलग-अलग प्रकार के डेटा टाइप्स को एक ही छत के नीचे कंबाइंड करना हो (जैसे एक स्टूडेंट का Roll No
intहोगा, Namecharहोगा, और Feesfloatहोगी)। - Enum (Enumeration): यह इंटीजर कॉन्सटेंट्स को नाम देने का एक तरीका है (जैसे
enum Week {Sun, Mon, Tue};यहाँ Sun को अपने आप 0, Mon को 1 वैल्यू मिल जाएगी)।
2. Scope of Variables (वैरिएबल का अधिकार क्षेत्र)
मेमोरी के जिस डिब्बे में डेटा स्टोर होता है, उसे Variable कहते हैं। लेकिन वह वैरिएबल पूरे प्रोग्राम में कहाँ-कहाँ दिखाई देगा या इस्तेमाल हो सकता है, उसे उसका Scope कहते हैं। यह मुख्य रूप से दो प्रकार का होता है:
A. Local Variables (स्थानीय वैरिएबल)
- यह क्या है?: जो वैरिएबल किसी फंक्शन या ब्लॉक
{ }के अंदर बनाए जाते हैं, उन्हें Local Variable कहते हैं। - अधिकार क्षेत्र: इनका जीवन और अधिकार सिर्फ उसी फंक्शन के अंदर होता है। जैसे ही वह फंक्शन खत्म होगा, यह वैरिएबल मेमोरी से नष्ट (Destroy) हो जाएगा। बाहर का कोई दूसरा फंक्शन इसे नहीं छू सकता।
B. Global Variables (वैश्विक वैरिएबल)
- यह क्या है?: जो वैरिएबल प्रोग्राम में सबसे ऊपर, सभी फंक्शन्स के बाहर बनाए जाते हैं, उन्हें Global Variable कहते हैं।
- अधिकार क्षेत्र: इन्हें प्रोग्राम का कोई भी फंक्शन कहीं से भी इस्तेमाल कर सकता है और बदल सकता है। ये तब तक मेमोरी में रहते हैं जब तक पूरा प्रोग्राम बंद नहीं हो जाता।
🎯 रट्टा मार बॉक्स
- C लैंग्वेज में अगर किसी Local Variable को कोई वैल्यू न दी जाए, तो उसमें अपने आप एक कचरा वैल्यू (Garbage Value) आ जाती है।
- लेकिन अगर Global Variable को खाली छोड़ दिया जाए, तो कंपाइलर उसमें अपने आप
0(Default Value) डाल देता है। यह एग्जाम में कई बार पूछा गया है!
3. Precedence & Associativity of Operators
जब एक ही लाइन में बहुत सारे मैथ सिम्बॉल्स (Operators) आ जाएं, तो कंप्यूटर पहले किसको सॉल्व करेगा? इसी नियम को Operator Precedence (प्राथमिकता) कहते हैं।
- Precedence: यह बताता है कि किस ऑपरेटर की पावर (Priority) ज़्यादा है। जैसे मैथ्स के BODMAS नियम में गुणा
*पहले होता है और जोड़+बाद में। - Associativity: यदि एक ही लाइन में दो ऐसे ऑपरेटर आ जाएं जिनकी पावर बिल्कुल बराबर है (जैसे
*और/), तो हम उन्हें किस तरफ से सॉल्व करना शुरू करेंगे? लेफ्ट से राइट (L to R) या राइट से लेफ्ट (R to L)? इसे Associativity कहते हैं।
📊 C/C++ ऑपरेटर प्राथमिकता टेबल (Top to Bottom – हाई से लो पावर)
एग्जाम में एक्सप्रेशन सॉल्व करने के लिए यह टेबल कंठस्थ होनी चाहिए:
| ऑपरेटर श्रेणी (Operators Category) | सिम्बल (Operators) | Associativity (दिशा) |
|---|---|---|
| 1. Postfix/Primary | (), [], ->, ., ++ (Post) | Left to Right |
| 2. Unary | +, -, !, ~, ++ (Pre), --, sizeof, &, * | Right to Left |
| 3. Multiplicative | *, /, % (Modulus/रिमाइंडर) | Left to Right |
| 4. Additive | +, - | Left to Right |
| 5. Shift | << (Left Shift), >> (Right Shift) | Left to Right |
| 6. Relational | <, <=, >, >= | Left to Right |
| 7. Equality | ==, != | Left to Right |
| 8. Logical AND | && | Left to Right |
| 9. Logical OR | ` | |
| 10. Assignment | =, +=, -=, *=, /= | Right to Left |
📝 Live Analytical Example: एक्सप्रेशन कैसे सॉल्व करें?
चलो एक गहरे सवाल को सॉल्व करके देखते हैं जैसा एग्जाम में आता है:
सवाल: यदि int a = 2, b = 3, c = 4, res; है, तो res = a + b * c / a; का परिणाम क्या होगा?
स्टेप-बाय-स्टेप सलूशन (कंप्यूटर के दिमाग से):
- एक्सप्रेशन है:
2 + 3 * 4 / 2 - टेबल के अनुसार,
*और/की प्राथमिकता+से ज़्यादा है। - अब
*और/दोनों की पावर बराबर है, तो हम इनकी Associativity Left to Right देखेंगे। यानी जो लेफ्ट में पहले है, उसे पहले सॉल्व करेंगे। - पहले गुणा होगा:
3 * 4 = 12अब एक्सप्रेशन बना:2 + 12 / 2 - अब भाग होगा:
12 / 2 = 6अब एक्सप्रेशन बना:2 + 6 - अंत में जोड़ होगा:
2 + 6 = 8
फाइनल Answer:8
⚡ क्विक रिवीजन बॉक्स
- int, float, char: Built-in (प्राथमिक) डेटा टाइप्स।
- Structure, Union: User-defined (प्रोग्रामर द्वारा बनाए गए) डेटा टाइप्स।
- Local Scope: सिर्फ फंक्शन के अंदर मान्य, डिफ़ॉल्ट वैल्यू = Garbage।
- Global Scope: पूरे प्रोग्राम में मान्य, डिफ़ॉल्ट वैल्यू = 0।
- Right to Left ऑपरेटर: Unary ऑपरेटर और Assignment (
=) ऑपरेटर हमेशा सीधे से उल्टे हाथ की तरफ (R to L) सॉल्व होते हैं।
💡 प्रो-टिप / एग्जाम हैक (The Modulus % Operator Trap)
एग्जामिनर आपको फंसाने के लिए एक सवाल हमेशा पूछता है: 5.5 % 2 का आउटपुट क्या होगा?
बच्चे सोचते हैं कि 5.5 में 2 का भाग देंगे तो शेषफल 1.5 बचेगा और वे इसपर टिक कर देते हैं। लेकिन याद रखना—Modulus (%) ऑपरेटर केवल और केवल Integer (पूर्णांक) नंबर्स पर ही काम करता है! यदि आप इसे float या double वैल्यू के साथ यूज़ करोगे, तो कंपाइलर तुरंत Compile-time Error दे देगा। इस हैक को दिमाग में लॉक कर लो!
Programming Fundamentals: Part 2
Control Flow, Functions & Arrays
प्रोग्राम में लिखे कोड ऊपर से नीचे (Top to Bottom) एक लाइन से चलते हैं। लेकिन यदि हमें कोड का रास्ता बदलना हो (कंडीशन के आधार पर) या किसी कोड को बार-बार चलाना हो, तो हम Control Flow Statements का उपयोग करते हैं।
🧠 1. Control Flow (फैसले और चक्कर)
इसे मुख्य रूप से दो भागों में बांटा जाता है: Decision Making Statements और Looping Statements।
A. Decision Making (कंडीशनल स्टेटमेंट्स)
- if-else Statement: जब हमारे पास हाँ या ना में से एक रास्ता चुनना हो।c
if (marks >= 40) { printf("Pass"); } else { printf("Fail"); } - switch-case Statement: जब हमारे पास बहुत सारे विकल्प (Options) हों, तो
if-elseकी लंबी चेन बनाने के बजायswitchका उपयोग करना ज़्यादा फास्ट और साफ़ होता है।- देसी उदाहरण: जैसे कस्टमर केयर पर फोन करने पर बोलते हैं—”हिंदी के लिए 1 दबाएं, इंग्लिश के लिए 2 दबाएं”। वह अंदर से एक switch-case ही है।
- नियम: हर
caseके बादbreak;लगाना ज़रूरी है। अगरbreakनहीं लगाया, तो कंपाइलर उसके नीचे वाले केस को भी बिना चेक किए चला देगा। इसे टेक्निकल भाषा में Fall-Through कहते हैं।
B. Loops (एक ही कोड को बार-बार चलाना)
लूप्स को दो श्रेणियों में बांटा जाता है, जहाँ से डायरेक्ट एग्जाम में सवाल आता है:
[ LOOPS ]
│
┌──────────────────────┴──────────────────────┐
[ Entry Controlled Loop ] [ Exit Controlled Loop ]
(अंदर जाने से पहले कंडीशन चेक होगी) (बाहर निकलते समय कंडीशन चेक होगी)
- for loop - do-while loop
- while loop
- while Loop: इसे तब यूज़ करते हैं जब हमें पहले से पता न हो कि लूप कुल कितनी बार चलाना है।
- for Loop: इसे तब यूज़ करते हैं जब हमें पहले से फिक्स पता हो कि लूप को 10 बार या 100 बार चलाना है।
- do-while Loop: यह सबसे अनोखा है। यह पहले कोड को एक बार चला देता है, उसके बाद कंडीशन चेक करता है। यानी कंडीशन भले ही पहली बार में ही गलत (False) क्यों न हो, do-while लूप कम से कम एक बार जरूर चलता है।
📞 2. Functions (कोड को टुकड़ों में बांटना)
जब कोई सॉफ्टवेयर बहुत बड़ा हो जाता है, तो सारा कोड एक ही जगह लिखने पर वह कचरा बन जाता है। इसलिए हम बड़े कोड को छोटे-छोटे वर्किंग ब्लॉक्स में बांट देते हैं, जिन्हें Functions कहते हैं।
- पैरेंट फंक्शन: C/C++ में मुख्य फंक्शन
main()होता है। कंपाइलर प्रोग्राम चलाना हमेशा इसीmain()से ही शुरू करता है। - फंक्शन के भाग: इसके तीन मुख्य हिस्से होते हैं—Declaration (बताना कि फंक्शन है), Definition (उसका असली कोड लिखना), और Call (उसे काम पर बुलाना)।
🔄 Parameter Passing (डेटा भेजने के दो तरीके)
एग्जामिनर का सबसे पसंदीदा टॉपिक जहाँ से थ्योरी और आउटपुट दोनों के सवाल बनते हैं:
1. Call by Value (वैल्यू भेजना)
इसमें ओरिजिनल वैरिएबल की एक फोटोकॉपी (Duplicate Copy) फंक्शन को भेजी जाती है। यदि फंक्शन के अंदर उस वैल्यू में कोई बदलाव किया जाता है, तो उसका असर main() के ओरिजिनल वैरिएबल पर नहीं पड़ता।
2. Call by Reference / Call by Address (पते भेजना)
इसमें वैरिएबल की वैल्यू नहीं, बल्कि उसका मेमोरी एड्रेस (Pointer के ज़रिए) भेजा जाता है। चूंकि फंक्शन सीधे असली एड्रेस पर जाकर बदलाव करता है, इसलिए यहाँ किया गया बदलाव main() के ओरिजिनल वैरिएबल में भी साफ़ दिखाई देता है।
🗄️ 3. Arrays (एक जैसे डेटा का ग्रुप)
यदि आपको 50 स्टूडेंट्स के मार्क्स स्टोर करने हैं, तो 50 अलग-अलग वैरिएबल्स (m1, m2, m3…) बनाना बेवकूफी होगी। इसके बजाय हम एक ही नाम का Array बना लेते हैं।
- परिभाषा: एरे एक समान डेटा टाइप्स (Homogeneous Data Elements) का एक फिक्स साइज़ का समूह होता है, जो मेमोरी में लगातार (Contiguous Memory Locations) स्टोर होता है।
- Index (इंडेक्स): एरे की गिनती हमेशा 0 से शुरू होती है। अगर एरे का साइज़ 5 है, तो उसके डिब्बों के नाम
A[0],A[1],A[2],A[3],A[4]होंगे।
एरे मेमोरी लेआउट:
Index: [0] [1] [2] [3] [4]
Data: | 45 | 82 | 91 | 36 | 70 |
Address: 2000 2004 2008 2012 2016 (int = 4 Bytes गैप)
🎯 रट्टा मार बॉक्स
switch()के अंदर आप केवलint(Integer) याchar(Character) वैल्यू ही पास कर सकते हैं। आप इसमेंfloat(जैसे 5.5) या स्ट्रिंग पास नहीं कर सकते, कंपाइलर एरर दे देगा।- Array का नाम (जैसे सिर्फ
A) अपने आप में उसके पहले एलिमेंटA[0]के मेमोरी एड्रेस को दर्शाता है। इसे Base Address कहते हैं। - यदि
int A[5]का बेस एड्रेस2000है, तोA[2]का एड्रेस क्या होगा? 2000 + (2 * 4 Byte) = 2008।
📝 Live Out-put Challenge: एग्जाम में आने वाले ट्रिकी सवाल
चलो दो ऐसे सवाल सॉल्व करते हैं जो बच्चों को एग्जाम में चक्कर दिला देते हैं:
ट्रिकी सवाल 1 (do-while मैकेनिज्म):
C
int i = 10;
do {
printf("%d ", i);
i++;
} while(i < 5);
इसका आउटपुट क्या होगा?
- सोल्यूशन: बच्चे सोचते हैं कि
10 < 5गलत है, तो कुछ भी प्रिंट नहीं होगा। लेकिन चूंकि यह do-while है, यह पहले अंदर जाएगा और10प्रिंट कर देगा। फिरiबढ़कर 11 होगा। अब कंडीशन चेक होगी11 < 5जो कि गलत है, तो लूप रुक जाएगा। - Answer:
10
ट्रिकी सवाल 2 (switch-case का Fall-Through):
C
int x = 2;
switch(x) {
case 1: printf("One ");
case 2: printf("Two ");
case 3: printf("Three ");
default: printf("End");
}
इसका आउटपुट क्या होगा?
- सोल्यूशन: यहाँ
x = 2है, तो कंपाइलर सीधेcase 2पर कूदेगा और Two प्रिंट करेगा। लेकिन ध्यान से देखो, केस 2 के बादbreak;नहीं लगा है! इसलिए कंपाइलर नीचे बहता हुआ चला जाएगा और केस 3 और डिफ़ॉल्ट को भी प्रिंट कर देगा। - Answer:
Two Three End
⚡ क्विक रिवीजन बॉक्स
- for, while: Entry controlled loops (शुरुआत में ही पहरा)।
- do-while: Exit controlled loop (कम से कम एक बार गारंटीड चलेगा)।
- Call by Value: ओरिजिनल डेटा सुरक्षित रहता है (कॉपी पर काम)।
- Call by Reference: ओरिजिनल डेटा बदल जाता है (एड्रेस पर काम)।
- Array Index: हमेशा 0 से शुरू और
Size - 1पर खत्म।
💡 प्रो-टिप / एग्जाम हैक (Array Bound Checking Trap)
C/C++ लैंग्वेज की एक बहुत बड़ी कमजोरी (या खासियत) है कि इसमें Array Bound Checking नहीं होती। इसका मतलब है कि अगर आपने int A[5]; का एरे बनाया है, और आप गलती से कोडिंग में A[10] = 50; लिख देते हैं, तो कंपाइलर कोई एरर नहीं देगा! वह चुपचाप मेमोरी में एरे की सीमा से बाहर जाकर किसी अनजान जगह पर 50 लिख देगा, जिससे आपका पूरा प्रोग्राम क्रैश हो सकता है या कचरा वैल्यू (Garbage Output) दे सकता है। इसे Buffer Overflow भी कहते हैं। एग्जाम में यह थ्योरी स्टेटमेंट में पूछा जाता है!
Programming Fundamentals: Part 3
Pointers, Structures, Unions & File Handling
अब तक हम नॉर्मल वैरिएबल्स में वैल्यू (जैसे 10, 3.14) स्टोर कर रहे थे। लेकिन अब हम सीधे कंप्यूटर की असली मेमोरी (RAM) के एड्रेस के साथ खेलना सीखेंगे।
1. Pointers (मेमोरी का असली पता)
- यह क्या है?: पॉइंटर भी एक वैरिएबल ही होता है, लेकिन यह कोई नॉर्मल वैल्यू स्टोर नहीं करता। यह किसी दूसरे वैरिएबल का मेमोरी एड्रेस (Address) अपने अंदर स्टोर करके रखता है।
- देसी उदाहरण: मान लो आपके पास एक तिजोरी की चाबी है। चाबी के ऊपर तिजोरी का नंबर (जैसे लॉकर नंबर 402) लिखा हुआ है। यहाँ वह चाबी ही Pointer है, जो असली तिजोरी के पते को पॉइंट कर रही है।
दो जादुई सिम्बल्स (Operators) जो पॉइंटर में यूज़ होते हैं:
&(Address of Operator): यह किसी भी वैरिएबल का असली मेमोरी एड्रेस निकाल कर देता है।*(Value at Address / Dereferencing Operator): यह उस एड्रेस के अंदर रखी असली वैल्यू को बाहर निकाल कर लाता है।
c
int a = 50; // मान लो इसका मेमोरी एड्रेस 2000 है
int *p; // यहाँ p एक पॉइंटर वैरिएबल है
p = &a; // p के अंदर आ गया 'a' का एड्रेस यानी 2000
मेमोरी का विज़ुअल नज़ारा:
Variable 'a': [ 50 ] (इसका खुद का एड्रेस = 2000)
▲
│ (पॉइंट कर रहा है)
Variable 'p': [ 2000 ] (इसका खुद का एड्रेस = 5000)
रट्टा मार बॉक्स
- Dangling Pointer: यदि कोई पॉइंटर किसी मेमोरी एड्रेस को पॉइंट कर रहा है और हम उस मेमोरी को डिलीट (Free) कर दें, लेकिन पॉइंटर अभी भी उसी डिलीटेड एड्रेस को पॉइंट करता रहे, तो उसे Dangling Pointer कहते हैं। यह सिक्योरिटी के लिए बहुत खतरनाक होता है।
- Null Pointer: ऐसा पॉइंटर जो किसी भी वैध एड्रेस को पॉइंट नहीं कर रहा होता। इसे
int *p = NULL;लिखकर डिक्लेयर करते हैं। इसकी डिफ़ॉल्ट वैल्यू0होती है। - Wild Pointer: ऐसा पॉइंटर जिसे डिक्लेयर तो कर दिया पर कोई वैल्यू या NULL नहीं दिया। यह मेमोरी में किसी भी कचरा (Garbage) एड्रेस को पॉइंट करने लगता है।
2. Structures vs Unions (डेटा का मेला)
एरे (Array) में हम सिर्फ एक जैसे (Homogeneous) डेटा रख सकते थे। लेकिन अगर हमें एक छात्र का पूरा डेटा रखना हो जिसमें उसका Roll No (int), Name (char), और Percentage (float) सब मिक्स हो, तो हम Structure या Union का यूज़ करते हैं।
A. Structure (स्ट्रक्चर)
- कीवर्ड: इसके लिए
structकीवर्ड का यूज़ होता है। - मेमोरी एलोकेशन: स्ट्रक्चर के अंदर जितने भी मेम्बर्स होते हैं, उन सबको अलग-अलग मेमोरी मिलती है। कुल साइज़ सभी मेम्बर्स के साइज़ का जोड़ होता है।
B. Union (यूनियन)
- कीवर्ड: इसके लिए
unionकीवर्ड का यूज़ होता है। - मेमोरी एलोकेशन: यह बहुत कंजूस होता है। इसमें सभी मेम्बर्स को अलग-अलग मेमोरी नहीं मिलती, बल्कि सभी मेम्बर्स एक ही कॉमन मेमोरी को शेयर करते हैं। यूनियन का कुल साइज़ उसके सबसे बड़े मेम्बर के साइज़ के बराबर होता है।
⚡ क्विक रिवीजन बॉक्स: Structure vs Union (मेमोरी का खेल)
मान लो हमारे पास एक स्ट्रक्चर और एक यूनियन है:
c
struct Student { int roll; char name[20]; }; // साइज़ = 4 + 20 = 24 Bytes
union Employee { int id; char name[20]; }; // साइज़ = केवल 20 Bytes (जो सबसे बड़ा है)
- अंतर: स्ट्रक्चर में आप
rollऔरnameदोनों में एक साथ डेटा स्टोर रख सकते हो। लेकिन यूनियन में एक समय पर केवल एक ही मेम्बर का डेटा सुरक्षित रहेगा। जैसे ही दूसरे में डेटा डालोगे, पहले वाले का डेटा ओवरराइट (मिट) हो जाएगा।
3. File Handling (डेटा को हमेशा के लिए सेव करना)
अभी तक हम जो भी प्रोग्राम चलाते हैं, उसका डेटा रैम (RAM) में रहता है। जैसे ही प्रोग्राम बंद होता है या कंप्यूटर ऑफ होता है, डेटा गायब हो जाता है। डेटा को हार्ड डिस्क में हमेशा के लिए टेक्स्ट फाइल (.txt) या बाइनरी फाइल में सेव करने के लिए File Handling का यूज़ होता है।
फाइल हैंडलिंग के मुख्य फंक्शन्स और मोड्स:
FILE *fp;– फाइल के साथ काम करने के लिए हमेशा एक फाइल पॉइंटर बनाया जाता है।fopen()– फाइल को ओपन करने के लिए। इसके मुख्य मोड्स एग्जाम में पूछे जाते हैं:"r"(Read Mode): फाइल को सिर्फ पढ़ने के लिए खोलना। अगर फाइल नहीं मिली, तो यहNULLरिटर्न करता है।"w"(Write Mode): फाइल में लिखने के लिए खोलना। अगर फाइल पहले से बनी है, तो यह उसका पुराना डेटा मिटा (Overwrite) देता है। अगर फाइल नहीं है, तो नई बना देता है।"a"(Append Mode): यह बहुत बढ़िया है। यह पुराने डेटा को बिना मिटाए, फाइल के सबसे अंत में नया डेटा जोड़ता है।
fclose(fp);– काम खत्म होने के बाद फाइल को बंद करना 100% ज़रूरी है ताकि मेमोरी फ्री हो सके।
Live Out-put Challenge: पॉइंटर का ट्रिकी सवाल
चलो एक ऐसा सवाल देखते हैं जो अक्सर एग्जाम में अच्छे-अच्छों का सिर घुमा देता है:
c
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30, 40};
int *p = arr; // p पॉइंट कर रहा है पहले एलिमेंट यानी 10 पर
printf("%d ", *p);
p++; // पॉइंटर को एक पोजीशन आगे बढ़ाया
printf("%d", *p);
return 0;
}
इसका आउटपुट क्या होगा?
- सोल्यूशन: एरे का नाम (
arr) अपने आप में पहले एलिमेंट का एड्रेस होता है। तो शुरुआत में*pप्रिंट करेगा10। जब हमp++करते हैं, तो पॉइंटर अगले एलिमेंट के एड्रेस पर चला जाता है (मेमोरी में सीधे 4 बाइट्स आगे कूदता है)। अब*pप्रिंट करेगा20। - Answer:
10 20
💡 प्रो-टिप / एग्जाम हैक (Command Line Arguments)
आपके सिलेबस में एक छोटा सा पॉइंट लिखा है—Command Line Arguments। इसका क्या मतलब है?
आमतौर पर हम main() फंक्शन को खाली रखते हैं। लेकिन हम चाहें तो प्रोग्राम को रन करते समय बाहर (Command Prompt/Terminal) से भी डेटा भेज सकते हैं। इसके लिए main के अंदर दो स्पेशल पैरामीटर्स पास किए जाते हैं:int main(int argc, char *argv[])
argc(Argument Count): यह एक इंटीजर है जो गिनता है कि बाहर से कुल कितने शब्द या आर्गुमेंट्स भेजे गए हैं (प्रोग्राम का नाम भी इसमें 1 नंबर पर गिना जाता है)।argv[](Argument Vector): यह एक स्ट्रिंग्स का एरे होता है, जो बाहर से टाइप किए गए सभी शब्दों को अपने अंदर स्टोर करता है। यह पॉइंट एग्जाम में सीधा पूछा जाता है किargcऔरargvका क्या काम है!
Programming Fundamentals: Part 4
Modern Languages & Emerging Technologies (AI, ML, Blockchain)
आज की दुनिया सिर्फ C या C++ पर नहीं चल रही है। आज हमारे पास ऐसी भाषाएं और तकनीकें हैं जो सिस्टम को खुद फैसले लेना सिखाती हैं और डेटा को 100% सुरक्षित बनाती हैं।
1. Core Languages: Java, DotNet & Python
A. Java (The Write Once, Run Anywhere Language)
- यह क्या है?: जावा एक पूरी तरह से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज है जिसे 1995 में James Gosling (Sun Microsystems) द्वारा बनाया गया था।
- WORA कांसेप्ट: जावा का सबसे बड़ा हिट फीचर है “Write Once, Run Anywhere”। इसका मतलब है कि आप जावा का कोड विंडोज लैपटॉप पर लिखो, वह बिना किसी बदलाव के मैक (Mac) या लिनक्स (Linux) पर भी चल जाएगा।
- यह कैसे काम करता है? (इंटरनल आर्किटेक्चर):
- जब आप जावा कोड लिखते हैं (
.javaफाइल), तो Java Compiler (javac) उसे सीधे मशीन कोड में नहीं बदलता। - कंपाइलर उसे एक इंटरमीडिएट कोड में बदलता है जिसे Bytecode कहा जाता है (यह
.classफाइल होती है)। - इस बाइटकोड को दुनिया के किसी भी कंप्यूटर पर चलाने के लिए वहाँ एक सॉफ्टवेयर होना चाहिए जिसे JVM (Java Virtual Machine) कहते हैं। JVM का Interpreter इस बाइटकोड को उस कंप्यूटर के हिसाब से 0 और 1 में बदल देता है।
- जब आप जावा कोड लिखते हैं (
B. .NET (DotNet Framework)
- यह क्या है?: यह कोई सिंगल प्रोग्रामिंग लैंग्वेज नहीं है, बल्कि माइक्रोसॉफ्ट (Microsoft) द्वारा बनाया गया एक बहुत बड़ा Software Framework है। इसके अंदर आप C#, VB.NET, F# जैसी कई भाषाओं में सॉफ्टवेयर बना सकते हैं।
- CLR (Common Language Runtime): जैसे जावा में JVM होता है, वैसे ही .NET का असली इंजन CLR होता है। यह कोड को मैनेज करने, मेमोरी साफ़ करने (Garbage Collection) और सिक्योरिटी संभालने का काम करता है।
C. Python (इंसानों जैसी सरल भाषा)
- यह क्या है?: पायथन एक बहुत ही सरल, ओपन-सोर्स और हाई-लेवल प्रोग्रामिंग लैंग्वेज है जिसे 1991 में Guido van Rossum ने बनाया था।
- विशेषता: इसमें C या जावा की तरह लंबे-चौड़े सिंटैक्स या हर लाइन के पीछे सेमीकोलन (
;) लगाने की जरूरत नहीं होती। इसमें कोड ब्लॉक को दर्शाने के लिए ब्रैकेट्स{ }की जगह Indentation (खाली स्पेस/गैप) का उपयोग किया जाता है। - यह कहाँ यूज़ होती है?: आज की तारीख में डेटा साइंस, AI और मशीन लर्निंग में पायथन नंबर-1 भाषा है क्योंकि इसके पास बहुत सारे बने-बनाए लाइब्रेरी पैकेजेस (जैसे NumPy, Pandas, Scikit-learn) मौजूद हैं।
2. Artificial Intelligence (AI) & Machine Learning (ML)
A. Artificial Intelligence (कृत्रिम बुद्धिमत्ता)
- सरल परिभाषा: जब हम कंप्यूटर या मशीनों को इस तरह प्रोग्राम करते हैं कि वे इंसानों की तरह सोच सकें, सीख सकें, फैसले ले सकें और समस्याओं को हल कर सकें, तो उसे AI कहते हैं।
- फादर ऑफ AI: John McCarthy को आर्टिफिशियल इंटेलिजेंस का जनक कहा जाता है।
B. Machine Learning (मशीन लर्निंग – AI का बच्चा)
- यह क्या है?: यह AI की ही एक सब-फील्ड (शाखा) है। पारंपरिक प्रोग्रामिंग में हम कंप्यूटर को ‘डेटा’ और ‘नियम (Rules)’ देते हैं और वह हमें आउटपुट देता है। लेकिन मशीन लर्निंग में हम कंप्यूटर को ढेर सारा डेटा और आउटपुट (अनुभव) दे देते हैं, कंप्यूटर उन सबको देखकर अपने नियम खुद बनाता है।
- देसी उदाहरण: जैसे एक छोटे बच्चे को आप बार-बार अलग-अलग बिल्लियों की फोटो दिखाते हो (यह डेटा है)। कुछ समय बाद बच्चा बिना बताए खुद ही पहचान जाता है कि “यह बिल्ली है”। मशीन भी पास्ट डेटा (Past Data) से पैटर्न सीखकर भविष्य की भविष्यवाणी करना सीख जाती है।
मशीन लर्निंग के 3 मुख्य प्रकार (Direct Exam Questions):
- Supervised Learning (निरीक्षित लर्निंग): इसमें मशीन को जो डेटा दिया जाता है, वह Labeled होता है। यानी हर डेटा के साथ उसका सही जवाब भी लिखा होता है। (जैसे—”यह फोटो सेब की है, यह फोटो केले की है”)।
- Unsupervised Learning (अनिरीक्षित लर्निंग): इसमें डेटा Unlabeled होता है। मशीन को कोई सही जवाब नहीं बताया जाता। मशीन खुद अपने दिमाग से डेटा की सिमिलैरिटी (समानता) देखकर उनके अलग-अलग ग्रुप्स (Clusters) बनाती है।
- Reinforcement Learning (पुरस्कार आधारित लर्निंग): यह ट्रायल और एरर (Trial and Error) पर काम करता है। मशीन जब कोई सही काम करती है तो उसे Reward (पुरस्कार) मिलता है, और गलत काम करने पर Penalty (दंड)। मशीन इनाम के चक्कर में धीरे-धीरे सही काम करना सीख जाती है (जैसे वीडियो गेम खेलने वाला AI या सेल्फ-ड्राइविंग कार)।
⛓️ 3. Blockchain Technology (सुरक्षा का डिजिटल बहीखाता)
- यह क्या है?: ब्लॉकचेन एक Decentralized (विकेंद्रीकृत) और Distributed Digital Ledger (डिजिटल बहीखाता) है। इसका मतलब है कि इसमें होने वाले लेन-देन का रिकॉर्ड किसी एक सरकारी बैंक या एक कंपनी के सर्वर पर स्टोर नहीं होता, बल्कि इस नेटवर्क से जुड़े दुनिया के लाखों कंप्यूटर्स पर एक साथ स्टोर होता है। इसलिए इसे हैक करना या इसमें धोखाधड़ी करना नामुमकिन है।
- इतिहास: इसका आविष्कार 2008 में Satoshi Nakamoto नाम के एक अज्ञात व्यक्ति (या ग्रुप) ने किया था, जिसका उपयोग पहली क्रिप्टोकरेंसी Bitcoin में हुआ।
🛠️ यह अंदर से कैसे काम करता है? (Technical Structure)
ब्लॉकचेन में डेटा छोटे-छोटे डिब्बों में स्टोर होता है, जिन्हें Blocks कहते हैं। जब एक ब्लॉक पूरा भर जाता है, तो वह अपने पिछले ब्लॉक से जुड़ जाता है, जिससे एक चेन बन जाती है।
हर एक सिंगल ब्लॉक के अंदर 3 मुख्य चीज़ें होती हैं:
- Data: लेन-देन की जानकारी (जैसे किसने, किसको, कितने पैसे भेजे)।
- Hash (हैश): यह उस ब्लॉक का एक यूनिक डिजिटल फिंगरप्रिंट (जैसे आधार कार्ड नंबर) होता है। यह ब्लॉक के अंदर के डेटा से मिलकर बनता है। अगर डेटा में ज़रा सा भी बदलाव हुआ, तो हैश कोड पूरी तरह बदल जाएगा।
- Previous Hash (पिछले ब्लॉक का हैश): यही वो धागा है जो इस ब्लॉक को पिछले ब्लॉक से जोड़ता है। यदि कोई हैकर बीच के किसी ब्लॉक का डेटा बदलने की कोशिश करेगा, तो उस ब्लॉक का हैश बदल जाएगा, जिससे आगे की पूरी चेन Invalid (टूट) हो जाएगी।
[Block 1] [Block 2] [Block 3]
- Data - Data - Data
- Hash: 1A2B - Hash: 3C4D - Hash: 5E6F
- Prev Hash: 0000 - Prev Hash: 1A2B - Prev Hash: 3C4D
(Genesis Block)
🎯 रट्टा मार बॉक्स
- Genesis Block: ब्लॉकचेन के सबसे पहले ब्लॉक को ‘जेनेसिस ब्लॉक’ कहा जाता है। इसके पास कोई
Previous Hashनहीं होता (यह0000होता है)। - Garbage Collector (जावा/डॉटनेट): यह बैकग्राउंड में चलने वाला एक ऑटोमैटिक प्रोग्राम है जो मेमोरी में उन ऑब्जेक्ट्स को ढूंढकर डिलीट कर देता है जिनका अब प्रोग्राम में कोई यूज़ नहीं हो रहा है, जिससे रैम (RAM) खाली रहती है।
- पायथन एक Interpreted Language है, जबकि सी/सी++ पूरी तरह Compiled Languages हैं।
⚡ क्विक रिवीजन बॉक्स
- JVM/CLR: जावा और डॉटनेट के रनटाइम इंजन जो प्लेटफॉर्म इंडिपेंडेंसी प्रदान करते हैं।
- Bytecode: जावा कंपाइलर द्वारा जनरेट किया गया इंटरमीडिएट कोड (
.classफाइल)। - Supervised ML: जब डेटा के साथ सही लेबल/आंसर पहले से मौजूद हो।
- Unsupervised ML: डेटा के पैटर्न्स और क्लस्टर्स खुद ढूंढना (नो लेबल्स)।
- Hash Function: ब्लॉकचेन में डेटा की सुरक्षा के लिए जनरेट होने वाला फिक्स लेंथ का क्रिप्टोग्राफिक कोड (जैसे SHA-256)।
💡 प्रो-टिप / एग्जाम हैक (The Blockchain Immutability Concept)
एग्जाम में एक टेक्निकल शब्द पूछा जाता है—Immutability। इसका क्या मतलब है?
ब्लॉकचेन की सबसे बड़ी ताकत इसकी Immutability है, जिसका अर्थ है “अपरिवर्तनीयता”। यानी एक बार कोई डेटा ब्लॉकचेन नेटवर्क में दर्ज (Commit) हो गया, तो उसे दुनिया की कोई भी ताकत न तो मिटा सकती है और न ही एडिट कर सकती है। अगर कोई सुधार करना भी है, तो उसके लिए एक नया लेन-देन दर्ज करना पड़ेगा, पुराना रिकॉर्ड हमेशा इतिहास की तरह वहाँ सुरक्षित रहेगा।
