שארית המס בין דרגה אחת לשניה

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

אם אתה מרוויח 10,000 ש"ח אתה נמצא במדרגה השניה:
בדרגה הראשונה צריך לשלם מס מלא בשיעור 10% (6310 * 10%)
במדרגה השניה משלמים על ההפרש שבין המשכורת שלך לבין גובה המדרגה הראשונה (10000-6310) * 14%.
סה"כ המס הוא חיבור של שתי הדרגות…
אם אתה מרוויח משכורת שנמצאת במדרגה השלישית, גם על ההפרש שבין המדרגה השלישית והשניה צריך לשלם 14% ואז להוסיף את המשכורת פחות גובה הדרגה השניה כפול 20%… וכן הלאה…

כן אבל אם אחרי כל תנאי תחסיר את הדרגה מהמשכורת, לא תמשיך הלאה אף פעם לדרגה הבאה

תחשב כל מדרגה בנפרד… לדוגמא מישהו שמרוויח שכר שנמצא במדרגה השלישית ככה זה יחושב לו (כל מדרגה מחושבת בסוגריים):
(6310 * 10%) + ((6310 - 9050) * 14%) + ((9050 - סה"כ משכורת) * 20%) = תשלום המס

תודה רבה,
כתבתי את זה , אתה אבל יכול להסביר את זה שאבין בדיוק מה בסיס החישוב ואיך זה עובד?
תודה

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

לייק 1

אמת,
עשיתי בהתחלה טווחים (אני מצרף פה את הסוף)
elif (sallary < 42030 and sallary > 20200):
print('your VAT is: ', sallary * 35 // 100)
elif (sallary < 54130 and sallary > 42030):
print('your VAT is: ', sallary * 47 // 100)

אבל…המס לא הסתדר לי בין אחד לשני וזה ההסבר שאני רוצה

האמת שאני לא ממש מבין מה כתבת. במקום חלוקת שלמים אני מציע שתשתמש בשבר עשרוני (20% = 0.2)…
לגבי הפקודות בתוך ה elif: תגדיר את vat שיהיה שווה לתשלום המס לאותה מדרגה (טיפ: תתחיל מחישוב המדרגה הגבוהה ביותר, שהיא הכי ארוכה, ואח"כ יהיה לך פשוט לעשות קופי-פייסט לשאר ההתניות (אם ההתאמות הנדרשות לאותה מדרגה)… בסוף תיתן פקודת הדפסה אחת ל- vat.

לייק 1

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

אני הגדרתי כל מדרגת מס ואת אחוזי המס לפי המדרגות כמשתנים.

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

וכן הלאה עד הסוף

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

זה המון חזרת קוד…ברעיון, המון

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

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

  1. הגדרת כלל המשתנים (מדרגות מס ושיעור המס לכל מדרגה), כך שהלקוח יוכל לערוך את הקוד בקלות לפי צרכיו.
  2. בכל פעם נבדוק האם השכר תואם למדרגת המס, בסדר עולה.
  3. כאשר התנאי לא מתקיים, משתנה “מס” צובר את סכום המס המקסימלי עבור מדרגה זו.
  4. כאשר התנאי מתקיים, מחברים את המס שנצבר עד כה להפרש שכר-מדרגת שכר * שיעור המס (מספר עשרוני) ומדפיסים.

היי,

אני כתבתי את הקוד עם אותה הלוגיקה…ועדיין כותב לי invalid syntax. חשבתי שהבעיה היא ערבוב בין str ל int אבל הגדרתי את המדרגות כ int אז לא אמורה ליהיות בעיה.
אשמח ממש לתובנות של מי שמבין מה הבעיה כאן בקוד שכתבתי, קמתי בחמש לפנות בוקר לנסות לפתור את זה שוב (כשמגדלים ילדים בני 2 ו 5 מנסים ללמוד קוד בקצוות היום :sleeping:)

עריכה - בבקשה להתייחס רק להתניית IF הראשונה, כי שם הקוד נתקע לי. אז עובדת בינתיים רק עליה (אני ידעת שבשורות למטה של ELIF אין את החישוב () בין האחוזים)

ואם חשבתי שהבעיה היא בסימן %…
אז המרתי הכל ל #.0 ועדיין אותו syntax error

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

הבעיה היא בהגדרת המשתנה stage 7.
אי אפשר להגדיר משתנה עם גדול שווה, רק עם שווה.

לייק 1

היי תודה על התגובה, לצערי תיקנתי את הסוגריים והאחוזים ועדיין לא רץ :frowning:

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

Sorry to hear it didn’t help :frowning:
Is it reporting another error?