2009-03-22 9 views
19

पाठ्यक्रम विकास अनुभव के साथ आप में से उन लोगों के लिए: सरणी के बारे में सबसे अच्छी रणनीति क्या है?सी को पढ़ाने के दौरान, क्या पॉइंटर्स के पहले या बाद में सरणी सिखाना बेहतर होता है?

मैंने कुछ स्कूलों को देखा है जो चर और नियंत्रण संरचनाओं के बाद सरणी सिखाते हैं, अक्सर शिक्षण कार्यों से पहले भी। यह कुछ प्राथमिक एल्गोरिदम, आदि के शिक्षण की इजाजत देता है। हालांकि, यह फिर कार्यों के लिए सरणी को पारित करने की समस्या को लाता है, इसलिए सरणी पॉइंटर्स पर वापस जाना आवश्यक है और चीज़ों को पैच किया जाता है।

एक और विकल्प चर और नियंत्रण संरचनाओं से कार्यों के लिए जाना है, और फिर पॉइंटर्स सिखाएं, और एक बार आपके पॉइंटर्स हों, स्क्रैच से सरणी सिखाएं, और उसके बाद गतिशील स्मृति आवंटन प्राप्त करने के लिए इसका उपयोग करें।

मेरे लिए दूसरा विकल्प अधिक समझ में आता है, क्योंकि सरल चर के विपरीत, सरणी के साथ "सीमा से बाहर जाना" आसान है, लेकिन जिन छात्रों ने अभी तक स्मृति और पॉइंटर्स के बारे में नहीं सीखा है, वे समझ नहीं सकते कि इन सीमाओं के बाहर क्या है ।

हालांकि, मुझे यह जानने में दिलचस्पी है कि दूसरों को क्या लगता है।

उत्तर

34

मुझे लगता है कि एक समय में 1 अवधारणा को पेश करना सबसे अच्छा तरीका है। आपको पहले मॉड्यूल में सरणी 100% व्याख्या करने की आवश्यकता नहीं है। आप एक समय में 1 अवधारणा पेश करके लगभग कुछ भी उलझा सकते हैं।

मैं उन्हें इस क्रम में सिखाऊंगा: Arrays, Pointers, Arrays + Pointers, OtherStuff [N]।


सरणी:

आप सरल सरणियों पहले सिखाना तो वे एक भी चर नाम से पहुँचा जा सकता से अधिक डेटा स्लॉट्स करने की क्षमता को समझ सकते हैं।

//The following doesn't need an understanding of pointers 
int x[10]; 
x[0] = 5; 

प्वाइंटर:

तो फिर तुम संकेत के बारे में सिखा सकते हैं और वे कैसे काम करते हैं, कुछ सरल उदाहरण के साथ शुरू:

int y = 5; 
int *p = &y; 
*p = 6; 
printf("%i\n", y); 

एक विशेष जोर देने देने के लिए सुनिश्चित करें कि एक सूचक सिर्फ किसी अन्य चर की तरह है। यह एक स्मृति पता स्टोर करता है।

अभी तक ढेर बनाम ढेर में जाने की आवश्यकता नहीं है।


सरणी + प्वाइंटर:

संकेत के साथ सरणियों से अधिक पुनरावृति करने के लिए:

int x[10]; 
x[0] = 5; 
x[1] = 6; 
int *y = x; 
printf("%i\n", *y);//prints the first element 
y++; 
printf("%i\n", *y);//prints the second element 

तो फिर तुम और अधिक जटिल बातें सिखा सकते हैं ...

  • पॉइंटर अंकगणित कैसे करें।
  • सरणी + मैं सरणी के लिए आशुलिपि [i]
  • Passing arrays to functions as array pointets vs pointer param + size param
  • कैसे सरणियों स्मृति के निरंतर ब्लॉक
  • के बारे में बताएं स्ट्रिंग शाब्दिक, बफ़र्स, रहे हैं ...
  • कैसे sizeof संकेत बनाम सरणी प्रकार (के साथ काम करता सूचक आकार बनाम बफर आकार)
  • के बारे में बताएं आवंटन स्मृति की तरह अधिक जटिल अवधारणाओं, the stack, and the heap
  • अविवेक
  • आर के कई स्तरों eferences
  • कैसे बहुआयामी सरणियों काम
  • ...

सभी उदाहरणों के दौरान sizeof और मुद्रण पतों की भारी उपयोग करते हैं। यह वास्तव में यह समझने में मदद करता है कि क्या हो रहा है।

+2

उन्नत विषयों के लिए, बहुआयामी सरणियों उपयोगी हो सकता है। के रूप में एक 2 डी संरचना का प्रतिनिधित्व करने के बारे में समझौतों से "int ** आगमन" स्पष्ट 2 डी अनुक्रमण या मैनुअल अनुक्रमण के साथ "int * आगमन" के साथ सहायक होता है जब छात्रों के लिए तैयार हैं हो सकता है। –

+0

हे, इस तरह मुझे सिखाया गया था। यह ठीक काम किया। –

+0

@Mr Fooz: धन्यवाद –

2

उन्हें एक ही समय में पढ़ाया जाना चाहिए।

ऑफ़सेट (टाइपसाइज * इंडेक्स) के आधार पर पॉइंटर के रूप में उपयोग किए जाने वाले एकल आयामी सरणी का उदाहरण एक उपस्थिति बनाना चाहिए।

अर्थात

a[i] is equivalent to *(a + i) 
+0

के लिए Arrays/Pointers/malloc का उपयोग करते हैं, यह एक नोप है, जब तक कि स्मृति अस्थिर न हो या आप हो दौड़ की स्थिति की उम्मीद है। =] – strager

+0

@strager: क्या आप समझाएंगे? –

+0

@ मिच, आपने एक असाइनमेंट लिखा है। शायद आपका मतलब == है। –

9

मैं संकेत पहले सिखाना होगा। उन्हें शिक्षण सरणी के बिना समझाया जा सकता है। जबकि सरणी को पढ़ाने के दौरान मैं a[i] अभिव्यक्ति समझाते समय पॉइंटर्स को संदर्भित कर सकता हूं, और यह समझाते हुए कि कोई उन्हें कार्य करने के लिए कैसे पारित कर सकता है।

8

चीजों को ओवरथिंक न करें।

इन अवधारणाओं शिक्षण के रूप में स्पष्ट रूप से और चित्ताकर्षक ढंग से संभव के रूप में क्या आदेश आप उन्हें में क्या की तुलना में कहीं अधिक महत्वपूर्ण है।

(अधिक पूरी तरह से मैं सरणियों की मूल बातें पहली पर छू, और संकेत कर रही है और सरणियों समीक्षा सुझाव है कि इस समय के आसपास) बाद में।

0

निर्भर करता है कि वे क्या जानते हैं। क्या आप सी, या प्रोग्रामिंग-और-सी पढ़ रहे हैं?

मैंने बाद वाले के साथ बहुत कम सफलता देखी है। सी बस एक बहुत ही सहज या क्षमा करने वाली भाषा नहीं है। मैंने छात्रों को इसके साथ शुरू करने के लिए आभारी नहीं देखा है, हालांकि मैंने छात्रों को इसके लिए प्रोग्रामिंग से निराश देखा है।

जो प्रोग्रामिंग के साथ चिपकने जा रहे हैं वे बाहर निकल जाएंगे और वैसे भी सी को अपने खाली समय में सीखेंगे। पहले इसे पहले धक्का देने की जरूरत नहीं है।

यदि आप केवल सी पढ़ रहे हैं, और वे पहले से ही पॉइंटर्स और सरणी जानते हैं, तो सिखाते हैं कि सी में पॉइंटर्स और एरे कैसे काम करते हैं, एक सबक में किया जा सकता है।

8

आपको पहले सरणी सिखाना चाहिए, क्योंकि वे लगभग किसी अन्य भाषा में मौजूद हैं, और समझने में आसान हैं। पॉइंटर्स, या पॉइंटर्स के कुछ पहलुओं, सरणी के बारे में जो सीखा था, उस पर निर्माण करें। यह जैविक आदेश है, इमो, और जब मैंने इसे वापस कैसे सीखा।

2

मुझे लगता है कि आप उन छात्रों को सी पढ़ रहे हैं जो पहले ही जानते हैं कि जावा जैसी दूसरी भाषा (या मेरे दिन, पास्कल में वापस) में प्रोग्राम कैसे करें। मुझे नहीं लगता कि सी नौसिखियों को पूरा करने के लिए प्रोग्रामिंग शिक्षण के लिए उपयोग करने के लिए एक अच्छी भाषा है।

मैं पहले पॉइंटर्स सिखाऊंगा। यह उन महत्वपूर्ण नए विचारों में से एक है जो सी में सीखेंगे। वे पहले से ही अन्य भाषाओं से सरणी की अवधारणा को जान लेंगे, इसलिए इसे पहले पढ़ाने की कोई तात्कालिकता नहीं है। तो जब आप सी में कवर एरे करते हैं, तो आप इस बात के बारे में बात कर सकते हैं कि पॉइंटर अंकगणित के लिए वे अनिवार्य रूप से सिंटैक्टिक चीनी कैसे हैं, एक अवधारणा जिसे वे अब परिचित हैं।

+0

आपको लगता है कि पास्कल में पॉइंटर्स नहीं हैं। मैंने पास्कल के साथ कई सालों में काम नहीं किया है, लेकिन मेरे दिन पास्कल में पॉइंटर्स थे। मैंने वहां उनके बारे में पहले सीखा, क्योंकि मैं कुछ और वर्षों तक सी नहीं मिला था। – GreenMatt

2

मैं एरे के बारे में चिंता करने से पहले पॉइंटर्स सिखाता हूं। हालांकि, आम तौर पर, जिन छात्रों को मैं देखता हूं, वे पहले से ही किसी अन्य भाषा में अपनी पहली सीएस कक्षा में सरणी के संपर्क में आ चुके हैं। हालांकि, यहां तक ​​कि मैं पहली सीएस कक्षा में सी पढ़ रहा था, मैं एरे से पहले पॉइंटर्स करता हूं और पॉइंटर्स के संदर्भ में सरणी का वर्णन करता हूं। सिर्फ इसलिए कि ये सोचने के लिए फैशनेबल है कि "किसी को कभी भी यह जानने की आवश्यकता नहीं होगी कि कंप्यूटर वास्तव में कैसे काम करता है" इसका मतलब यह नहीं है कि यह सच है।

1

जैसा कि ऊपर बताया गया है, मुझे नहीं लगता कि आदेश महत्वपूर्ण है, लेकिन यह वह आदेश है जिसकी इच्छा है कि किसी ने मुझे सामान दिखाया होगा।

  1. सरणी
  2. प्वाइंटर
  3. कैसे Arrays और संकेत दिए गए हैं एक ही
  4. क्यों Arrays और प्वाइंटर नहीं हैं एक ही

बिंदु 4 अधिक जानकारी के लिए मैं वास्तव में अध्याय 4 की सिफारिश "चौंकाने वाली सच्चाई: सी सरणी और पॉइंटर्स वही नहीं हैं!" "विशेषज्ञ सी, गहरे सी रहस्य" में।

/जोहान


अद्यतन:

किताब के लिए कुछ लिंक, और वहाँ भी पुस्तक के एक पूर्वावलोकन है। http://books.google.se - Expert C, deep C secrets

और इस पुस्तक के बारे में उपयोगकर्ता टिप्पणियां सत्य है: http://www.amazon.co.uk/Expert-Programming-Peter-van-Linden/dp/0131774298

+0

मैं उस पुस्तक से परिचित नहीं हूं। मुख्य मतभेद क्या हैं जो इसे हाइलाइट करते हैं? (मेरे पास निवेश करने के लिए बहुत सीमित समय है, लेकिन मैं एक दृढ़ तर्क प्रदर्शित करना चाहता हूं) – Uri

+0

इस पुस्तक में कोई जादू नहीं है, लेकिन यह एक पुस्तक थी जिसने मुझे उन "आंखों के सलामी बल्लेबाज" क्षणों में से एक दिया। किताब एक और तरीके से सरणी और पॉइंटर्स के माध्यम से जाती है। – Johan

0

आप तार से पहले संकेत सिखाना चाहेंगे?

शायद नहीं। और अधिकांश तर्क लागू होते हैं।

(लेकिन आम तौर पर मैं @legion — से सहमत यह overthink नहीं है।)

1

वे पहले से कोडांतरक के लिए, पहले संकेत सिखाने उजागर किया गया है।

यदि वे उच्च स्तर की भाषाओं (यानी बस कुछ भी) के संपर्क में आ चुके हैं तो पहले सरणी सिखाएं।

मेरे अनुभव में लोग असेंबली स्तर प्रोग्रामिंग (रजिस्टर्स, पते, "कंप्यूटर मूलभूत") के संपर्क में आने के बिना सी में आ रहे हैं, दर्द की दुनिया में प्रवेश करने वाले हैं। आईएमएचओ आप पहले असेंबली स्तर कोडिंग को पढ़ाने से बेहतर हैं, फिर सी को एक बेहतर असेंबलर के रूप में पेश करना।

+0

हां, यह और अधिक संक्षेप में कह रहा है कि मैं क्या सोच रहा था। –

0

मुझे लगता है कि यह सरणी के साथ बेहतर शुरुआत होगी, क्योंकि सरणी की अवधारणा सरल और सहज है, लेकिन सी में यह पहले से सुझाए गए 'लीजन' के रूप में पोंटर सिखाने के बाद महत्वपूर्ण पुनरीक्षण सरणी होगी।

0

इस प्रश्न को किसी वस्तु-उन्मुख भाषा के लिए वास्तव में पूछा जा सकता है।

जब मैं सिखाया गया था जावा, मैं पहली बार दिखाया गया था सरणियों और सरणियों के अंतिम भाग के रूप में संकेत दिए गए, एक गहरी कॉपी और एक उथले नकल के बीच अंतर को प्रदर्शित करने के।

1

दिलचस्प सवाल - मुझे आशा है कि यह जवाब देने के लिए देर नहीं हुई है।

जब मैं जल्दी 80 के दशक में बोस्टन कॉलेज में प्रोग्रामिंग सिखाया, अपने सहयोगियों और मैं हर साल इन मुद्दों के साथ लड़ा, और हम अपने दृष्टिकोण में सुधार करने रखा। सी तब एक नई भाषा थी, इसलिए हमारी प्रगति बेसिक टू पास्कल के माध्यम से हुई। मैं समय पर सोच याद है यह सी को पढ़ाने के लिए कितना मुश्किल सिर्फ इसलिए कि इसे और अधिक loosey-बेवक़ूफ़ था हो सकता है, वहाँ गंदगी करने के लिए छात्रों के लिए और अधिक तरीके थे, और है कि आप को पढ़ाने के लिए किया था सरणियों और संकेत के बीच के अंतर की तरह अधिक वास्तव में भ्रामक बातें ।

क्या मैं सबसे अधिक उपयोगी पाया, ठोस सार नहीं बनने की कोशिश करने के लिए किया गया था। उदाहरण के लिए, परिचय प्रोग्रामिंग कोर्स में मैं एक साधारण दशमलव आप जिस कंप्यूटर का कार्यक्रम होगा में यह दशमलव "मशीन भाषा" है के लिए एक अनुवादक का इस्तेमाल किया। यह 1234 की तरह 0 से 999 के लिए जा रहा पते, और opcodes था "1" के साथ, जिसका अर्थ है 'संचायक में जोड़ने के लिए ", और" 234 "जहां जोड़ने के लिए पता लगाना का पता किया जा रहा है। छात्र वास्तव में सरल कार्यक्रमों लिखते थे, नंबरों की सूची को जोड़ने के लिए पसंद है, और वे उन्हें एकल पद छोड़ देंगे, को देख क्या हर कदम पर होता है।

मैं उनके बारे में 3 सप्ताह के लिए इस के साथ खेलते हैं, और फ़िर BASIC में शुरू होगा। दूसरे कोर्स में, वे पास्कल में जाएंगे।

  • क्या स्मृति है, और क्या पते दिए गए हैं, और क्या है कि छोटी दशमलव "कंप्यूटर" पूरा किया जैसे कुछ ठोस अवधारणाओं है कि "कपोल-कल्पना" "असली" भाषाओं में समझने के लिए बहुत आसान बनाने के लिए, संप्रेषित करने के लिए था मेमोरी में पते पर डेटा और प्रोग्राम दोनों ही संख्याएं हैं। इससे बाद में व्याख्या करने के लिए "परिवर्तनीय" और "सरणी" और "सूचक" की अवधारणा बहुत आसान हो जाती है।
  • कैसे गणना के बुनियादी मॉडल है कि बहुत सरल कदम क्रम में किया जाता है, और इससे पहले हर कदम शुरू कर सकते हैं, पिछले एक खत्म करने के लिए है। मुझे पता है कि लोग इस बात पर ऑब्जेक्ट करेंगे कि कंप्यूटर आजकल समानांतर और पाइपलाइन हैं, लेकिन मुझे यह बताने की ज़रूरत है कि आपको वास्तव में सरल शुरुआत करने की आवश्यकता है, क्योंकि जब नए लोग प्रोग्राम चलाते हैं, तो ऐसा लगता है कि यह दुनिया पूरी तरह से सब कुछ करता है, और पढ़ता है प्रक्रिया में आपका दिमाग।
  • कैसे, कूद और सशर्त कूद सहित निर्देशों की एक बहुत छोटी शब्दावली के संयोजन से, आप कंप्यूटर को लगभग कुछ भी करने के लिए प्राप्त कर सकते हैं जो आप चाहते हैं।

अब, सी के संबंध में, मैंने इसे असेंबली भाषा के ऊपर सिर्फ एक कट के रूप में अपमानित सुना है, लेकिन मुझे लगता है कि यह एक अच्छी बात है। यह हमेशा विशेषज्ञों के विशेषज्ञों द्वारा एक भाषा के रूप में मुझे मारा। मुझे लगता है कि अगर आप केवल अंतर्निहित मशीन पर वापस जा सकते हैं तो सरणी और पॉइंटर्स और संरचनाओं के विचारों को समझाना बहुत आसान है। इसी प्रकार सी ++ और ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए।

तो, संक्षेप में, यदि छात्र अंतर्निहित अवधारणा को समझते हैं कि कंप्यूटर कैसे काम करते हैं, भले ही यह वास्तव में कृत्रिम कंप्यूटर है, तो उच्च-स्तरीय डेटा संरचना अवधारणाओं को समझा जाना बहुत आसान है।

संबंधित मुद्दे