עזרה בחישוב

liatbi30

New member
עזרה בחישוב

ערב טוב צריכה עזרה בתרגיל :


במפעל יש שני משמרות 8-14:59 בוקר ומשמרת ערב 15-22

השכר למשמרת בוקר לשעה 20 ש"ח ולמשמרת ערב לשעה גבוה ב30% משכר משמרת בוקר
צריך לחשב את השכר ליום של עובד
אין צורך לבדוק את הקלט ז"א תקינות השעות
החישוב לא יוצא לי טוב כבר התבלבלתי בבקשה עזרה

להלן התכנית:



#include<stdio.h>
int main()
{
int s_h,f_h,s_m,f_m;
float pay_h,pay_m;
printf("\nEnter start hour and minuts:\n");
scanf("%d%d",&s_h,&s_m);
printf("\nEnter finish hour and minuts:\n");
scanf("%d%d",&f_h,&f_m);
if(s_h<15)
{
if(s_m<f_m)
{
pay_h=f_h-s_h;
pay_m=(f_m-s_m)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*20);
}
else
{
pay_h=(f_h-s_h)+(((60-s_m)+f_m)/60);
pay_m=(60-s_m+f_m)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*20);
}
}
else
{
if(s_m<f_m)
{
pay_h=f_h-s_h;
pay_m=(f_m-s_m)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*26);
}
else
{
pay_h=(f_h-s_h)+(((60-s_m)+f_m)/60);
pay_m=(60-s_m+f_m)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*26);
}
}
return 0;
}
 

BravoMan

Active member
יש לך בעיה בחישוב כי החישוב בכלל לא תואם

את הלוגיקה שדרושה לפתרון התרגיל.

לדוגמה: מדוע את מחלקת את מספר הדקות ב-100?
מה המשמעות של התוצאה בכלל?

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

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

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

liatbi30

New member
כתבתי על דף

את מה שהצעת

אני מחלקת ב-100 שיצא למשל 20/100 0.20 כל שיחשב את האגורות כי הרי לא הגיוני שעובד יעבוד משעה 08:10
עד 13:30 זה יוצא 5.20 ולא 520 כך שאני מחשבת את השכר אז זה 5.20*20 = 104.00 ולא 520*20 = 10400

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

אני יודעת שהתכנית ארוכה ויכול להיות שכתבתי משתנים מיותרים אבל עכשיו בחישוב הוא פשוט מתעלם מהדקות ז"א

אם הקלט הוא שעת התחלה 08:10 והסיום 13:30 אז יוצא 100.00 ולא 104.00 ש"ח



#include<stdio.h>
int main()
{
int s_h,f_h,h1,h2,m1,m2;
float pay_h,pay_m;
printf("\nEnter start hour and finish hour:\n");
scanf("%d%d",&s_h,&f_h);
h1=s_h/100;
h2=f_h/100;
m1=s_h%100;
m2=f_h%100;
if(h1<15)
{
if(m1<m2)
{
pay_h=h2-h1;
pay_m=(m2-m1)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*20);
}
else
{
pay_h=h2-h1;
pay_m=(60-m1+m2)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*20);
}
}
else
{
if(m1<m2)
{
pay_h=h2-h1;
pay_m=(m1-m2)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*26);
}
else
{
pay_h=h2-h1;
pay_m=(60-m1+m2)/100;
printf("\nThe pay day is:%.2f\n",(pay_h+pay_m)*26);
}
}
return 0;
}
 

nocgod

New member
במקרה גם 20 דקות זה שליש שעה :)

תנסי קודם כל לכתוב על דף איך את היית מחשבת שלב שלב (כל מה החישובים שאת עושה בראש, תעשי על הדף) ותממשי במחשב, אני לדוגמא הייתי מחשב:
א. כמה שעות עבד בשכר בסיס
ב. כמה שעות עבד בשכר מוגבר
ג. מחשב משכורת עבור שעות בסיס
ד. מחשב משכורת עבור שעות בשכר מוגבר
ה. מחשב משכורת כללית.
 

liatbi30

New member
אתה מתכוון?

שיניתי לחישוב כזה וזה גם לא יוצא



#include<stdio.h>
int main()
{
int s_h,f_h,h1,h2,m1,m2;
float pay;
printf("\nEnter start hour and finish hour:\n");
scanf("%d%d",&s_h,&f_h);
h1=s_h/100;
h2=f_h/100;
m1=s_h%100;
m2=f_h%100;
if(h1<15)
{
if(m1<m2)
{
pay=((h2-h1)*60)+(m2-m1);
printf("\nThe pay day is:%.2f\n",pay/60*20);
}
else
{
pay=((h2-h1)*60)+(60-m1+m2);
printf("\nThe pay day is:%.2f\n",pay/60*20);
}
}
else
{
if(m1<m2)
{
pay=((h2-h1)*60)+(m2-m1);
printf("\nThe pay day is:%.2f\n",pay/60*26);
}
else
{
pay=((h2-h1)*60)+(60-m1+m2);
printf("\nThe pay day is:%.2f\n",pay/60*26);
}
}
return 0;
}
 

BravoMan

Active member
ועכשיו את סתם מנחשת...

בואי נתחיל מהחישוב:

כמה מרוויח עובד משמרת בוקר בדקה?

עם בשעה הוא מרוויח 20 ש"ח ויש 60 דקות בשעה אז כל דקה הוא מרוויח 0.33 = 60 / 20 כלומר 33 אגורות.

כפי שאת רואה, אין כאן שום חילוק, כפל או מודולו של 100.

עכשיו, יהיה נוח לחשב הפרש זמנים אם נמיר הכל לדקות.
אבל שוב - חייבים לזכור שיש 60 דקות בשעה ולא 100!

אז ניקח את השעות שנתת בדוגמה:
490 = 10 + (60 * 8)
830 = 50 + (60 * 13)

עכשיו נחסר:
340 = 490 - 830

כעת, נכפיל בשכר לדקה ונקבל:
113.3 = 0.33 * 340
כלומר, 113 ש"ח ו-33 אגורות.

ורק כדי לוודא שהחישוב שלנו נכון:
5 = 60 / 340
40 = 60 % 340

כלומר, 5 שעות ו-40 דקות ואם תספרי שוב תראי שזה אכן ההפרש ולא 5 שעות ו-20 דקות.

וכמובן בדיקת נכונות התשלום:
100 = 20 * 5

40 דקות זה שני שליש שעה, ושני שליש מ-20 זה 13.33 וכך קיבלנו 113.33 בדיוק כמו בתשובה הקודמת.

עכשיו, כל שעליך לעשות זה לתרגם את שלבי החישוב האלה לקוד.
 

liatbi30

New member
לא יוצא לי

החישוב של מודול 60 יוצא 40.00 ולא 0.40


#include<stdio.h>
int main()
{
int s_h,f_h,h1,h2;
float pay1,pay2;
printf("\nEnter start hour and finish hour:\n");
scanf("%d%d",&s_h,&f_h);
h1=s_h/100*60+s_h%100;
h2=f_h/100*60+f_h%100;
if(s_h<1500)
{
pay1=(h2-h1)/60;
pay2=(h2-h1)%60;
printf("\nThe pay is :%f shekel\n",(pay2+pay1)*20);
}
return 0;
}
 

BravoMan

Active member
בוודאי ש-40!

מודולו מחזיר את שארית החילוק.
בחילוק שלמים שארית היא תמיד מספר שלם.

לדוגמה, כשמחלקים 5 ב-2 השארית תהיה 1. (לא 0.5 ולא 0.1)
כלומר 1 = 2 % 5.

זה משום ש-2 נכנס ב-5 פעמיים.
אבל 4 = 2 * 2 אז עושים 4 - 5 ומה שנשאר זה 1.

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

למה שלא תקלטי אותם בנפרד?

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

pay1=(h2-h1)/60;
pay2=(h2-h1)%60;
printf("\nThe pay is :%f shekel\n",(pay2+pay1)*20);

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


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

אז נסי שוב, על הנייר להבין מה החישוב הדרוש.

בהצלחה!
 

liatbi30

New member
בא לי למות !!!

כבר התייאשתי עשיתי את התכנית ככה אני כבר יומיים לא ישנה ולא אוכלת בגלל התרגיל המגעיל הזה


#include<stdio.h>
int main()
{
int s_h,f_h,h1,h2;
float pay1,pay2;
printf("\nEnter start hour and finish hour:\n");
scanf("%d%d",&s_h,&f_h);
h1=s_h/100*60+s_h%100;
h2=f_h/100*60+f_h%100;
if(s_h<1500)
{
pay1=(h2-h1)/60*20;
pay2=(h2-h1)%60*0.33;
printf("\nThe pay is :%.2f shekel\n",pay2+pay1);
}
else
{
pay1=(h2-h1)/60*26;
pay2=(h2-h1)%60*0.43;
printf("\nThe pay is :%.2f shekel\n",pay2+pay1);
}
return 0;
}
 
אני מקווה שאת לא בונה על קריירה כמתכנתת אם תרגיל כזה זה מה ששובר אותך.

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

אין שום משמעות למספר 100 בכל החישובים שלך. את סתם מסבכת את עצמך שלא לצורך.
 

liatbi30

New member
אתה צודק ולא צודק!!

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

BravoMan

Active member
התוכנה הזו כמעת נכונה, אבל היא לא מתחשבת

במצב שבו העובד עבד בשתי המשמרות.

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

כלומר, את צריכה קודם כל לחשב את כל שעות העבודה לפי 20 ש"ח לשעה ולא משנה מתי העובד התחיל ומתי סיים, ואז לבדוק כמה זמן מתוך זה שייך למשמרת ערב (אם בכלל) ולהוסיף 30% על הזמן הזה.

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