ABA


"מה השיטה לגשת לתרגיל מסויים בתיכנות? דוגמא,"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10051 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10051
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   23:56   31.08.10   
אל הפורום  
  מה השיטה לגשת לתרגיל מסויים בתיכנות? דוגמא,  
 
   ערכתי לאחרונה בתאריך 01.09.10 בשעה 00:10 בברכה, dvir8
 
יש לי קובץ עם הרבה תרגילים לשפת C,
חלקם אני מצליח אך יש כאלה שהפתרון הוא ממש על קצה הלשון אך הסדר שלי לא נכון.

יש איזושהיא גישה מסויימת שאני צריך לראות את הדברים או משהו שאפשר לפתח? תרגילים מסויימים וכאלה?

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

דוגמא לתרגיל שאני אקח עכשיו באקראי,
כתוב פונקציה המדפיסה את לוח הכפל על המסך.

אז אני אומר לעצמי ככה:
אם המטרה היא לעשות זאת בכמה שפחות שורות, אם אני עושה זאת בהרבה שורות זה בסדר?
לפי דעתי צריך פה שתי לולאות אבל כאילו אחת בתוך השניה השאלה היא איך אני מביא את זה לידי ביטוי?

נגיד חשבתי על משהו בסגנון הזה:


int x,y;
for(x=1;x<=10;x++)
for(y=1;y<=10;y++)
printf("%d\t", x*y);
printf("%d\t", x);

הצחיק אותי שזה עבד שהפעלתי את זה, כי הגעתי אל זה ולא בדיוק ידעתי למה.
זאת אומרת ידעתי שזה הכיוון ושיחקתי קצת עם ההיגיון אבל אני רוצה שזה יבוא לי בשליפה מהמוח להבין דבר כזה בשניה, זה תרגיל ברמה קלה.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  לכל דבר יש מלא שיטות לחישוב. אם אתה מכיר ldan192  31.08.10 23:59 1
     איך בדיוק אתה נעזר ב-GCD לבדיקת ראשוניות? Deuce  01.09.10 00:12 2
         אתה לא מכיר? יש אלגוריתם מאוד מוכר שמתמשת בהאש ldan192  01.09.10 23:01 6
     כשאתה ניגש לתרגיל כזה אתה רואה תפתרון בראש? dvir8 01.09.10 00:26 4
         לי דווקא דברים כאלה תמיד הלכו מאוד קל. אני מאמין ldan192  01.09.10 23:03 7
             מה זאת אומרת, אני לומד כרגע C. dvir8 01.09.10 23:15 8
                 אז פשוט תטחן ספרות. אין מה לעשות ldan192  01.09.10 23:15 9
  מכתב Deuce  01.09.10 00:26 3
     תודה רבה רבה על התשובה האדירה הזאת. dvir8 01.09.10 00:31 5

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:59   31.08.10   
אל הפורום  
  1. לכל דבר יש מלא שיטות לחישוב. אם אתה מכיר  
בתגובה להודעה מספר 0
 
את אלגוריתם ה-gdc אז הרווחת.
אם לא, אז תבצע אלגוריתמים פחות יעילים (כמו איטרציה וחלוקה של כל מספר אפשר (קטן ממנו, או קטן משורש הוא) באותו המספר.

בקיצור, אם אתה נתקע על דברים כאלה זה או בגלל דברים ממש בסיסיים או בגלל חוסר תרגול...


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:12   01.09.10   
אל הפורום  
  2. איך בדיוק אתה נעזר ב-GCD לבדיקת ראשוניות?  
בתגובה להודעה מספר 1
 






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:01   01.09.10   
אל הפורום  
  6. אתה לא מכיר? יש אלגוריתם מאוד מוכר שמתמשת בהאש  
בתגובה להודעה מספר 2
 
ו-gcd בשביל להסיק אם מספר ראשוני בסיבוכיות זמן ממש טובה (אבל זכרון פחות).
ברח לי השם שלו. אם אזכר ארשום לך


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   00:26   01.09.10   
אל הפורום  
  4. כשאתה ניגש לתרגיל כזה אתה רואה תפתרון בראש?  
בתגובה להודעה מספר 1
 
   או שאתה צריך לרשום על נייר קודם כל?

נניח ואתה לא מתכנת מנוסה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:03   01.09.10   
אל הפורום  
  7. לי דווקא דברים כאלה תמיד הלכו מאוד קל. אני מאמין  
בתגובה להודעה מספר 4
 
שזה גם קשור בכך שאתה הבסיס למדתי כמו שצריך ולא קפצתי ישר הלאה (לצורך העניין להתחיל מ-C וברגע שמתמקצעים טוב טוב רק אז להסתבך עם דברים מתקדמים).

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


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   23:15   01.09.10   
אל הפורום  
  8. מה זאת אומרת, אני לומד כרגע C.  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:15   01.09.10   
אל הפורום  
  9. אז פשוט תטחן ספרות. אין מה לעשות  
בתגובה להודעה מספר 8
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   00:26   01.09.10   
אל הפורום  
  3. מכתב  
בתגובה להודעה מספר 0
 
כתיבת אלגוריתם זה חשיבה שמתפתחת עם הזמן, זה בטוח. לפעמים כדי לפתור יעיל יותר צריך גם ידע מסויים בתחום מסויים, או חשיבה מחוץ למסגרת כדי לפתח משהו חדש.

אני אנסה להסביר לך מאד בכללי את הגישה שלי לתחום הזה:
ראשית בעת פתרון תרגיל אין שום צורך לחשוב עליו במובן של האם הוא 10 שורות בשפת C, כי יכול להיות שהוא 8 שורות ב-JAVA ויכול להיות שסתם אתה לא כותב בצורה אלגנטית. באופן כללי, שופטים אלגוריתם בהסתכלות יותר מתנשאת שאומרת כמה מהיר האלגוריתם ביחס לקלט. אם למשל כדי לבדוק מספר ראשוני n אני בודק (במקרה הגרוע ביותר) האם הוא מתחלק במספרים 2 עד (n-1) אז אני רץ סדר גודל של n איטרציות וזאת היעילות שלי. כמובן שבאופן כללי כשמתכנתים מומלץ שהקוד יהיה כמה שיותר אסתטי, כמה שיותר נעים לעין ולפעמים רצוי שגם הביצועים הקטנים ביותר יהיו אופטימלים (אם למשל אתה בונה תוכנה לאיזון טיל אז אתה רוצה להתחשב בפרטים הקטנים ביותר עד כדי במאית המילי שנייה).

אבל כל זה מגיע עם הזמן, אי אפשר ישר להנות מכל העולמות. בוא נתחיל בזה שתכתוב תכנית עובדת שכתובה במספר שורות סביר. אני אקח את 2 הבעיות שהעלת ואנסה לתת לך מענה כיצד לפתור אותן (באופן מילולי, לא אכתוב לך את הקוד מפורשות):
א. קלוט מספר ובדוק האם הוא ראשוני.
לקלוט מספר אנחנו יודעים, אז למעשה החלק שנותר לנו הוא לבדוק ראשוניות. אוקיי, אז נבנה פונקציה שכקלט מקבלת מספר טבעי (חיובי ושלם) ומחזירה האם הוא מספר ראשוני.
אז איך בודקים ראשוניות?
מספר ראשוני - מספר הגדול מ-1 ומתחלק אך ורק בעצמו וב-1. כלומר - אם נלך באופן יבש לפי ההגדרה, מספיק שעבור כל מספר נרוץ על כל המספרים בין 2 ל-(n-1) ונבדוק האם n מתחלק בהם; במידה והוא מתחלק באחד מהם נחזיר 'שקר' ואם הצלחנו לבצע את הכל, נחזיר לבסוף 'אמת'. איך בודקים האם מספר מתחלק? לשם כך בודקים האם שארית החלוקה היא 0. את זה רושמים למשל ב-C ע"י:

mod_n_m = n % m;
if (mod_n_m == 0)
n is divided by m

זה פתרון אחד. אם חושבים קצת, אפשר להבין שמספיק לעבור על כל המספרים מ-2 עד שורש המספר (נסה לחשוב למה!). אם לומדים קצת מתמטיקה, לומדים על מבחנים יותר יעילים לראשוניות (אולי) לרבות מילר-רבין, מבחן סולוביי, מבחן פרמה (שמפשל לפעמים) - במבחנים אלו תיגע אולי עוד כמה חודשים אם תתעניין.
ב. כתוב פונקציה המדפיסה את לוח הכפל על המסך.
אכן צדקת, אבל למה זה עובד אתה שואל?
אתה אומר לעצמך ראשית - לוח הכפל הוא מטריצה ריבועית (ואם טרם שמעת את המושג, אז מטריצה ריבועית = טבלה עם מספר שווה של שורות ועמודות). כלומר אני צריך לרוץ על שורות ועל עמודות. באופן ספציפי יותר, עבור כל שורה אני רץ על כל העמודות ובתא עצמו אני שם את תוצאת המכפלה.
למעשה אם תא i,j יסמן את התא שמתקבל בעת הצלבת השורה ה-iית עם העמודה ה-jית, אז מתקיים שהערך של התא הוא i * j.
אז מה רשמת בעצם דביר?
עבור כל שורה (לכל x מ-1 עד 10 - עשר השורות שלנו)
רוץ על כל העמודות (לכל y מ-1 עד 10 - עשר העמודות שלנו)
הדפס את הערך המתאים מהצלבת השורה בעמודה - הלא זה x * y.
בשביל הסדר היה מומלץ אולי להוסיף הורדת שורה לאחר כל הדפסת שורה.


בהצלחה!






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   00:31   01.09.10   
אל הפורום  
  5. תודה רבה רבה על התשובה האדירה הזאת.  
בתגובה להודעה מספר 3
 
   עזרת לי מאוד, אפילו ספר לא יכול להסביר את זה יותר טוב


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net