שלום

eyalbd

New member
אוקיי אני צריך להסביר

בקורס ראשוני לא לומדים את הפרטים הקטנים. לומדים קונספטים. מקבלים הסבר מהו array ומהן הפעולות שעובדות עליו. עכשיו אבקשכם לנסות להסביר מה ההבדל מבחינה קונספטואלית - לא STL ולא iterators - בין שתי מקטעי הקוד הבאים.
// Segment 1 // vector<int> v(1000); for (int i = 0; i < v.size(); ++i) v = i; // Segment 2 // int array[SIZE]; for (int i = 0; i < SIZE; ++i) array = i;

מבחינה קונספטואלית - לא קיימים הבדלים. כל העניין הוא לנסות לברור מהם הכלים המובנים בספריה הסטנדרטית שיקלו על תלמיד מתחיל. וקטור הוא מועמד מתאים בהחלט. כנ"ל string. קחו למשל משימה פשוטה של מיון שורות של קובץ טקסט לא חייבים להכנס ל generic programming כדי להבין קוד כזה:
string line; vector<string> lines; while (getline(in, line)) lines.push_back(line); sort(lines.begin(), lines.end()); for (int i = 0; i < lines.size(); ++i) cout << lines << endl;

קוד כזה הרבה יותר קל להבנה מהפתרונות המוצעים ב-C למשל. אין בו קשיים קונספטואליים מיוחדים והוא גם הרבה יותר נכון. אני לא חושב שתלמידים צריכים ללמוד בסדר שאני למדתי (אחרת היו מתחילים ב FORTRAN המסכנים). כל העניין הוא בחירה נכונה של מה להציג ובאיזה סדר. בכל מקרה וקטור וסטרינג קלים יותר מ array ו-*char, נכונים יותר כמעט תמיד ואין בהם קשיים קונספטואליים גדולים יותר.
 

Zack DA

New member
אבל array הוא טיפוס בסיסי שהמימוש

שלו הוא מאוד קרוב וברור לאסמבלר. הוא דבר שמתכנת חייב להבין לפני שהוא מבין את מנגנון ה- STL. מתכנת שמבין מה הוא עושה עדיף על מתכנת שלמד פעולה ששקולה מתמטית חולא למד משהו הרבה יותר בסיסי. חוץ מזה אין שום סיבה להשתמש ב- STL כשלא צריך ואפשר לעשות את זה עם array פשוט.
 

אלדד28

New member
מסכים חלקית לגבי string,

אבל לא לגבי STL. הקוד הפשוט שכתבת אכן לא מציג הבדל בין STL לבין Pure C אבל ההמשך כבר מסתבך. מה זה lines.begin? מה זה lines.end? למה push_back? וכו'. ולגבי sort, זה משהו שצריך ללמוד - לא להשתמש בפונקציית sort אלא לעשות את זה בעצמך. זה בדיוק כמו שלא לומדים לופיטל בתחילת קורס חדוו"א. קודם עושים את הדרך הקשה והמייגעת ובסוף לומדים את הטריקים. לדעתי זה הרבה יותר נכון.
 

Zack DA

New member
גם לגבי string זה לא מומלץ

קודם שילמד מהו *char ואחר כך כשיבין איך זה עובד שיעבוד עם string.
 

annefan

New member
אם כבר ככה עדיף perl!

אני לא צוחק. לפי הגישה הזו, בא נבחר שפה שהאבסטרקציה שלה את מה שקורה במחשב עוד הרבה יותר גדולה. מה אכפת לתלמידים מה זה int? הם רוצים לעבוד עם מספרים או עם מחרוזות לפי הצורך, הם לא רוצים להתעסק עם push_back או end() (נסה לדמיין את התלמידים שואלים אותך, למה end היא פונקציה ולא משתנה) רוצה OOP? למד Python! הגישה הזו טובה דווקא לקורסים מתקדמים שלא נוגעים למחשב באופן מהותי, כמו אלגוריתמים. יש ספר "Mastering Algorithms with Perl", והרעיון בו מבריק. אתה מלמד אלגוריתמים? נהדר! אבל למה צריך להשקיע פי 5 זמן בניהול הזכרון והמצביעים ב-C או ב-++C? עוד דוגמא זה קומפיילרים. כל עוד אתה מלמד את החלק של ה-front-end מה ילמד אותך מצד אחד איך לעשות parsing ומצד שני לא תצטרך לכתוב כל פונקציה ידנית ב-++C? שוב, perl. (כמובן שבשלב ה-back-end אתה יורד לרמת המכונה ואין תחליף פשוט ל-C). דווקא בקורסים ראשוניים, יש צורך, בנוסף ללימוד השפה, לתת מבוא למדעי המחשב. כמה תלמידים יודעים על רציפות המערך בזכרון, על int כאורך המילה של המעבד, ועל מצביעים? המושגים האלה צריכים לחלחל לתלמידים. בגישה שלך, הכל נשאר קופסה שחורה והתלמידים נשארים בורים, וחבל.
 

eyalbd

New member
לא בקורס ++C

לומדים פרל בקורס פרל ופיתון בקורס פיתון (שלדעתי היא שפה מעולה לקורס התחלתי) אם לומדים ++C כשפה ראשונה אז עדיף לטעמי לפי הסדר שהצעתי. לא קופסה שחורה ולא להחביא דבר. פשוט לשנות את הסדר שקודם יילמדו קונספטים וימומשו בקלות. אין סיבה להכנס לפוינטרים ו*char בהתחלה, או הבילבול שתלמידים חדשים נתקלים כאשר מלמדים אותם שarray הוא די דומה למצביע ומצביע למערך. כל זה יילמד אבל בעיתו - בזמן מאוחר יותר. יש כאן שני עקרונות פשוטים א. מה שטוב לי כמתכנת מנוסה טוב גם לתלמידים חדשים. אני משתמש רק בוקטור אלא אם יש מקרה שמחייב מערך. אני משתמש רק בstring אלא אם יש מקרה שמחייב *char. אלה הרגלים טובים ומומלצים וטוב שילמדו בהתחלה. אח"כ ילמדו את כל ה gory-details ולא חסר ב ++C. ב. תלמיד יהיה הרבה יותר מוצלח ויאהב יותר את מה שהוא לומד אם הוא יותר פרדוקטיבי מיד בהתחלה. העיסוק המוקדם מדי במצביעים וכתובות מבלבל. אם מערך רציף בזכרון או לא זה פחות חשוב בהתחלה. מה שחשוב יותר הוא התכונות של מערך כ-ADT ולא היותו בלוק בזיכרון.
 

אלדד28

New member
השאלה היא מה לומדים.

יש כמה אפשרויות: 1. קורס בסיסי בתכנות. לטעמי צריך לעבור ב-BETTER C. 2. לימוד עקרונות OO. לטעמי צריך לעבור ב-++C. 3. לימוד שפה X. צריך מן הסתם ללמד את השפה X. בין אם זה ANSI C ובין אם זה PERL, צריך ללמוד את השפה מההתחלה ועד הסוף. אם אתה רוצה להעביר את עקרונות התכנות, לדעתי כדאי לעשות את זה ב-BETTER C או כמו ש-annefan הציע ב-PERL או ב-PYTHON.
 

Zack DA

New member
סליחה על הגישה הלא נחמדה, אבל

שמעת על דיבאגר ? לא עדיף שתתמודד עם הבעיות שלך לבד ? גם תלמד יותר ככה.
 

inflatable

New member
תגובה לכולם (כמעט)

דבר ראשון אלו שעורים באוניברסיטה, ולא בתיכון. דבר שני אנחנו לא לומדים c++, אלא C (לפחות לפי מה שהבנתי עד עכשיו) או יותר נכון ANSI C. דבר שני, יש לי ידע די בסיסי בC++ (עשיתי כבר קורס תכנות בסיסי באוניברסיטה הפתוחה) אבל מאיזושהי סיבה לא ברורה לא הצלחתי למצוא שום בעייה בתוכנית, למרות שישבתי על זה שעות, ולא הדיבאגר לא מודיע על בעיות בתוכנית, וגם אחרי שהרצתי את זה לא ראיתי שום בעייה. ודבר שלישי, תודה רבה שוב לכל מי שעזר לי
 

inflatable

New member
וזה לא שאני מתכנת או משהו

כולה קורס בסיסי בתכנות למהנדסי תעשייה
 
למעלה