ABA


"מחפש דרך לפשט את לולאות הwhile שלי, תמיד אני מעתיק/מדביק לפחות פעם אחת"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #21524 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 21524
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   14:32   17.12.15   
אל הפורום  
  מחפש דרך לפשט את לולאות הwhile שלי, תמיד אני מעתיק/מדביק לפחות פעם אחת  
 
   תמיד לפני לולאות while, אני צריך להדביק את אותו הקוד שבתוך לולאת הwhile לפניה, רק כדי שאוכל להיכנס אליה. משהו שגוי בלוגיקה שלי ואני לא מצליח להבין מה.



int total_wrappers = currentCandies;
int new_candy = candyFromDiscount(total_wrappers, m);
int new_wrappers = wrappersFromDiscount(total_wrappers, m);
total_wrappers = new_candy+new_wrappers;

while (new_candy >= 1 || new_wrappers >= m){
sum += new_candy;
new_wrappers = wrappersFromDiscount(total_wrappers, m);
new_candy = candyFromDiscount(total_wrappers, m);
total_wrappers = new_candy+new_wrappers;
}



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

  האשכול     מחבר     תאריך כתיבה     מספר  
  ניסית להגדיר ולאתחל\לאפס את אותם משתנים ברמת גלובל..? שונטל  17.12.15 15:25 1
     לא הבנתי איך namespace פותר את הבעיה TooBigToFail 17.12.15 15:27 2
         מה namespace ? אל תסתבך... שונטל  17.12.15 15:34 3
             ואז הלולאה בודקת אם 0 גדול מ1, ולא נכנסת TooBigToFail 17.12.15 15:36 4
                 אחרי שאתחלת את המשתנים, תציב את מה שאתה רוצה: שונטל  17.12.15 15:38 5
                     זה לא המשתנה שנבדק TooBigToFail 17.12.15 15:56 6
                         לדוגמה שונטל  17.12.15 16:12 7
                             שאלתי על הלולאה TooBigToFail 17.12.15 16:16 8
  באיזה שפה זה ? פרוצדורלית ? OOP ? aCoZz  17.12.15 21:18 9
     זה בJAVA אבל זה סתם קטע פרוצדורלי בסיסי TooBigToFail 17.12.15 21:32 10
         בגלל זה שלח לי את כל הקוד של המחלקה או של כל התכנית aCoZz  17.12.15 21:47 11
             הנה, וזה מבוסס על התרגיל הבא TooBigToFail 17.12.15 21:55 12
                 תהנה aCoZz  17.12.15 22:18 13
                     יש מצב שזה לא מתקמפל כי ערכתי בכתבן aCoZz  17.12.15 22:24 14
                     תוכל להסביר את הרעיון בבקשה? מה היתה הבעיה באלגוריתם שלי ששינית אותו? TooBigToFail 17.12.15 23:22 15
                         אותה שיטה פשוט הוצאתי לפונקציות aCoZz  18.12.15 01:18 16
                             אמנם להכניס לפונקציה מונע שכפול של כל הקוד TooBigToFail 18.12.15 13:44 17
                                 אין מה לעשות ברגע שתעשה אבסטרקציה זה יסתדר כי ה DATA ישב בממברים של ה CLASS aCoZz  19.12.15 01:13 22
  מכתב cfirzzz 18.12.15 18:22 18
     תודה, אבל מאחר ורקורסיה פחות יעילה מבחינת זמן ריצה TooBigToFail 18.12.15 18:25 19
         מכתב cfirzzz 18.12.15 20:52 20
             אם זה המצב, אז בעצם ההגבלה מגיעה מהאתגר ולא מדרך החשיבה שלי TooBigToFail 18.12.15 21:22 21
  תשתמש בDO WHILE ותצהיר על המשתנים מחוץ ללולאה כדי שתוכל להשתמש בהם בתנאי איציק2 19.12.15 11:47 23

       
שונטל  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 12.6.13
428 הודעות, 1 פידבק
   15:25   17.12.15   
אל הפורום  
  1. ניסית להגדיר ולאתחל\לאפס את אותם משתנים ברמת גלובל..?  
בתגובה להודעה מספר 0
 
  


הנספח לאבטחת-מידע, בלוג אישי-מקצועי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   15:27   17.12.15   
אל הפורום  
  2. לא הבנתי איך namespace פותר את הבעיה  
בתגובה להודעה מספר 1
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שונטל  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 12.6.13
428 הודעות, 1 פידבק
   15:34   17.12.15   
אל הפורום  
  3. מה namespace ? אל תסתבך...  
בתגובה להודעה מספר 2
 
   בתחילת התוכנית פשוט תגדיר

int a, b, c ... = 0


הנספח לאבטחת-מידע, בלוג אישי-מקצועי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   15:36   17.12.15   
אל הפורום  
  4. ואז הלולאה בודקת אם 0 גדול מ1, ולא נכנסת  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שונטל  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 12.6.13
428 הודעות, 1 פידבק
   15:38   17.12.15   
אל הפורום  
  5. אחרי שאתחלת את המשתנים, תציב את מה שאתה רוצה:  
בתגובה להודעה מספר 4
 
   total_wrappers = currentCandies;

בלי ה-intים


הנספח לאבטחת-מידע, בלוג אישי-מקצועי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   15:56   17.12.15   
אל הפורום  
  6. זה לא המשתנה שנבדק  
בתגובה להודעה מספר 5
 
   ועדיין לא הבנתי איך זה משנה את הערך שלו, תוכל להראות דוגמא מספרית למה שאתה אומר? תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שונטל  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 12.6.13
428 הודעות, 1 פידבק
   16:12   17.12.15   
אל הפורום  
  7. לדוגמה  
בתגובה להודעה מספר 6
 
  

public class test {
private int total_wrappers, new_candy, new_wrappers = 0;

........
........

public test() {
new_candy = candyFromDiscount(currentCandies, m);
new_wrappers = wrappersFromDiscount(currentCandies, m);
total_wrappers = new_candy+new_wrappers;
....
}

........
........
}

זה אומנם ב-java אבל המבנה אותו מבנה...
ולפי השאלות שלך, נראה לי שאולי אנחנו מדברים על דברים שונים?


הנספח לאבטחת-מידע, בלוג אישי-מקצועי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   16:16   17.12.15   
אל הפורום  
  8. שאלתי על הלולאה  
בתגובה להודעה מספר 7
 
   תודה בכל אופן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
aCoZz 
חבר מתאריך 19.7.06
17692 הודעות
   21:18   17.12.15   
אל הפורום  
  9. באיזה שפה זה ? פרוצדורלית ? OOP ?  
בתגובה להודעה מספר 0
 
   בכל מקרה תשלח לי את כל הקוד ככה אי אפשר לעזור לך בלי לראות מה קורה בכל התכנית


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   21:32   17.12.15   
אל הפורום  
  10. זה בJAVA אבל זה סתם קטע פרוצדורלי בסיסי  
בתגובה להודעה מספר 9
 
   מה שכתבתי מראה את כל הקוד הרלוונטי, הרי מדובר פה על עקרון בסיסי.

אפשר לראות שלולאת הWHILE תלויה בnew_wrappers או בnew_candy
והערך של המשתנים האלה תלוי גם במשתנה total_wrappers
אז בשביל האיטרציה הראשונה בלולאה, צריך שכל הקוד יתבצע לפחות פעם אחת, ורק אז אפשר להריץ אותו כמה פעמים בלולאה.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
aCoZz 
חבר מתאריך 19.7.06
17692 הודעות
   21:47   17.12.15   
אל הפורום  
  11. בגלל זה שלח לי את כל הקוד של המחלקה או של כל התכנית  
בתגובה להודעה מספר 10
 
   יש לך שם בעיה ביסוד


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   21:55   17.12.15   
אל הפורום  
  12. הנה, וזה מבוסס על התרגיל הבא  
בתגובה להודעה מספר 11
 
   https://www.hackerrank.com/challenges/chocolate-feast
אבל אני רק אגיד שוב, שזה קורה לי כמעט בכל תוכנית שאני כותב, וזאת תמיד אותה בעיה עקרונית. בגלל זה אני לא חושב שכל הקוד יעזור, אבל אולי כן, מי יודע

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


import java.util.Scanner;

public class Solution {

public static void main(String args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for (int a0 = 0; a0 < t; a0++) {
int n = in.nextInt();
int c = in.nextInt();
int m = in.nextInt();

solutionMethod(n,c,m);
}

}


private static int initialCandy(int n, int c){
return n/c;
}


private static int candyFromDiscount(int calcDiscount, int m){
return calcDiscount/m;
}

private static int wrappersFromDiscount(int calcDiscount, int m){
return calcDiscount%m;
}

private static int totalCandy(int currentCandies, int m){
if (currentCandies < 1) return 0;

int sum = currentCandies;
int total_wrappers = currentCandies;
int new_candy = candyFromDiscount(total_wrappers, m);
int new_wrappers = wrappersFromDiscount(total_wrappers, m);
total_wrappers = new_candy+new_wrappers;

while (new_candy >= 1 || new_wrappers >= m){
sum += new_candy;
new_wrappers = wrappersFromDiscount(total_wrappers, m);
new_candy = candyFromDiscount(total_wrappers, m);
total_wrappers = new_candy+new_wrappers;
}
return sum;
}

private static void printFinal(int total){
System.out.println(total);
}

private static void solutionMethod(int n, int c, int m){
int candy = initialCandy(n, c);
printFinal(totalCandy(candy, m));
}

}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
aCoZz 
חבר מתאריך 19.7.06
17692 הודעות
   22:18   17.12.15   
אל הפורום  
  13. תהנה  
בתגובה להודעה מספר 12
 
   ערכתי לאחרונה בתאריך 17.12.15 בשעה 22:34 בברכה, aCoZz
 

import java.util.Scanner;

public class Solution {

public static void main(String args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for (int a0 = 0; a0 < t; a0++) {
int n = in.nextInt();
int c = in.nextInt();
int m = in.nextInt();

solutionMethod(n,c,m);
}

}


private static int initialCandy(int n, int c){
return n/c;
}


private static int candyFromDiscount(int calcDiscount, int m){
return calcDiscount/m;
}

private static int wrappersFromDiscount(int calcDiscount, int m){
return calcDiscount%m;
}

private static int totalCandy(int currentCandies, int m){
if (currentCandies < 1) return 0;

int total_wrappers = getTotalWrappers(currentCandies, m);

while (canAddNewCandy(total_wrappers, m)){
currentCandies += candyFromDiscount(total_wrappers, m);
total_wrappers = getTotalWrappers(total_wrappers, m);
}

return currentCandies;
}

private static boolean canAddNewCandy(int totalWrappers, int m){
return candyFromDiscount(totalWrappers, m) >= 1 ||
wrappersFromDiscount(totalWrappers, m) >= m
}

private static int getTotalWrappers(int totalWrappers, int m){
return candyFromDiscount(totalWrappers, m) + wrappersFromDiscount(totalWrappers, m);
}

private static void printFinal(int total){
System.out.println(total);
}

private static void solutionMethod(int n, int c, int m){
int candy = initialCandy(n, c);
printFinal(totalCandy(candy, m));
}

}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
aCoZz 
חבר מתאריך 19.7.06
17692 הודעות
   22:24   17.12.15   
אל הפורום  
  14. יש מצב שזה לא מתקמפל כי ערכתי בכתבן  
בתגובה להודעה מספר 13
 
   אבל זה הרעיון הכי חשוב זה לחשוב אינקפסולוציה !


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   23:22   17.12.15   
אל הפורום  
  15. תוכל להסביר את הרעיון בבקשה? מה היתה הבעיה באלגוריתם שלי ששינית אותו?  
בתגובה להודעה מספר 13
 
   נראה שהשתמשת בשיטה אחרת לחשב את הדבר, ולא ברור לי גם איך זה אמור לפתור את האתגר...
במה האלגוריתמים שונים מבחינה עקרונית?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
aCoZz 
חבר מתאריך 19.7.06
17692 הודעות
   01:18   18.12.15   
אל הפורום  
  16. אותה שיטה פשוט הוצאתי לפונקציות  
בתגובה להודעה מספר 15
 
   אם יש לך שכפול קוד תוציא לפונקציה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   13:44   18.12.15   
אל הפורום  
  17. אמנם להכניס לפונקציה מונע שכפול של כל הקוד  
בתגובה להודעה מספר 16
 
   אבל לא לגמרי כי עדיין צריך לקרוא לפונקציה גם לפני הלולאה וגם בתוך הלולאה..

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
aCoZz 
חבר מתאריך 19.7.06
17692 הודעות
   01:13   19.12.15   
אל הפורום  
  22. אין מה לעשות ברגע שתעשה אבסטרקציה זה יסתדר כי ה DATA ישב בממברים של ה CLASS  
בתגובה להודעה מספר 17
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
cfirzzz לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
5060 הודעות, 2 פידבק
   18:22   18.12.15   
אל הפורום  
  18. מכתב  
בתגובה להודעה מספר 0
 
   תראה
מה שוקרה זה שבעצם אתה "פותר" את הבעיה פעם ראשונה, ואז אתה מריץ לולאה כדי לפתור אותה שוב שוב
אני חושב שאם תלך כאן לכיוון של רקורסיה הקוד יראה טוב הרבה יותר וכנראה זה יענה לך על השאלה של עצמך


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   18:25   18.12.15   
אל הפורום  
  19. תודה, אבל מאחר ורקורסיה פחות יעילה מבחינת זמן ריצה  
בתגובה להודעה מספר 18
 
   הייתי רוצה לדעת אם יש דרך לא רקורסיבית לסדר את כתיבת הקוד... או שאולי אני עובד על דברים שהרבה פעמים מחייבים לולאת do... while בשביל הפתרון, אבל אני בספק כי אף אחד כמעט לא משתמש בלולאה מהסוג הזה...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
cfirzzz לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
5060 הודעות, 2 פידבק
   20:52   18.12.15   
אל הפורום  
  20. מכתב  
בתגובה להודעה מספר 19
 
   אתה מנסה לאכול את כל העוגה ולהשאיר אותה שלמה
השאלה הזו רקורסיבית מטבעה, וכדי לפתור שאלה רקורסיבית בצורה איטרטיבית, אתה חייב מצב התחלתי,
אם אתה ממש מתעקש , נסה לפתור עם לולאת for כאשר אתה מאתחל מוקדם בעזרת הפונקציות המתאימות

נשלח ע"י הסלולרי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TooBigToFail
חבר מתאריך 12.5.14
1917 הודעות, 1 פידבק
   21:22   18.12.15   
אל הפורום  
  21. אם זה המצב, אז בעצם ההגבלה מגיעה מהאתגר ולא מדרך החשיבה שלי  
בתגובה להודעה מספר 20
 
   אז כשאני נתקל במקרים כאלה שלולאת do while הכי מתאימה, יש מצב טוב שדרושה רקורסיה בשביל "לייפות" את הקוד... מעניין
תודה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
איציק2
חבר מתאריך 26.4.08
2436 הודעות
   11:47   19.12.15   
אל הפורום  
  23. תשתמש בDO WHILE ותצהיר על המשתנים מחוץ ללולאה כדי שתוכל להשתמש בהם בתנאי  
בתגובה להודעה מספר 0
 
   של הלולאה זהו... זה אחד המצבים היחידים שאתה צריך להשתמש בDO WHILE.
אם לא בא לך להשתמש בDO WHILE תשתמש בWHILE TRUE ותשים בפנים תנאי (IF) שבודק את התנאי של הלולאה זה גם יחסוך לך את הקוד המיותר וגם את הצהרת המשתנים מחוץ ללולאה...


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

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

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



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