הגדרת זקיף בלולאה - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

הגדרת זקיף בלולאה


shaithebest

Recommended Posts

שלום לכולם

אני מנסה להריץ קטע קוד שכתבתי בשפת C כחלק משיעורי בית ולא הולך לי

השאלה:

בעל חברה מעוניין לדעת מה היו הוצאותיו החודשיות למשכורות עובדיו.

לכל עובד יש לקלוט את מספר השעות שעבד ואת התעריף לשעה.

אם העובד עבד יותר מ-150 שעות, הוא מקבל בונוס של 250 שקל.

הקלט יסתיים כאשר מספר השעות והתעריף לשעה יהיו 999-.

פתח ויישם אלגוריתם שיקלוט את נתוני העובדים ויציג כפלט:

א) מהן הוצאותיו של בעל המפעל?

ב) מהי המשכורת הממוצעת?

   #include<stdio.h>
void main()
{ float sum=0,mone=0,shaot,taarif,avg;
printf("please enter working hours of employee and taarif\n");
scanf("%f %f",&taarif,&shaot);
while (shaot!=-999)
{
sum+=taarif*shaot;
if (shaot>150)
sum+=250;
mone++;
scanf("%f %f",&shaot,&taarif);
}
avg=sum/mone;
}

אני מצליח להריץ את התוכנה אבל לא מצליח מעבר לזה לא יודע מה קרה נתקעתי

אני בטוח שהאלגוריתם שלי טוב אבל משום מה לא הבנתי את השאלה

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

תודה מראש

קישור לתוכן
שתף באתרים אחרים

הבעיה היא לענות על 2 השאלות

הוצאות המנהל והממוצע

נראה לך שהקוד בסדר?

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

-999.....

איך הוא יכול לעבוד 999- שעות ??

תודה

קישור לתוכן
שתף באתרים אחרים

זה הקטע שהקוד שלך אמור להיות בסדר

רק בWHILE צריך להוסיף תנאי AND taarif!=-999

ואז ההוצאות של בעל המפעל יהיו בSUM

והמשכורת הממוצעת תהיה בAVG

-999.....

איך הוא יכול לעבוד 999- שעות ??

תודה

אני לא חושב שהבנת מזה זקיף

זקיף משמש כדי לעצור לולאות לא קבועות (כמו WHILE) בגלל שאתה לא יודע כמה פעמים הלולאה תרוץ אתה חייב להשתמש בWHILE אבל כדי שתדע לעצור אתה מחפש את הזקיף

קישור לתוכן
שתף באתרים אחרים

כמה בעיות :

- המשתנה shaot לא מאותחל ואתה משתמש בו בloop מסוג while בו הבדיקה נעשת התחלה. או שתחליף לdo while או שתאתחל את המשתנה הזה

- יש בעיה של בדיקת עם מספר שווה למשהו מתי שהוא מסוג float בגלל שלא חובה שיהיה לו רפרזנטציה. אני לא חושב שתהיה בעיה בגלל שמדובר על מספר ללא נקודה עשרונית שיש מספיק ביטים במנטיסה ליצג אותו . אבל לרוב בודקים אם הabs של ההפרש בין המספרים קטן מאיזה delta ( משהו כמו 0.001 ). בכל מקרה כדאי לך להוסים נקודה 0 ל מיניוס 999 שלך כדי להגיד למהדר שיעשה השווה בין מספרים מסוג float ולא יעשה המרות סוג על דעת עצמו..

קישור לתוכן
שתף באתרים אחרים

אחלה הבנתי את ההערות שלכם

אלה שמתנגדים לvoid main () - אין מה לעשות זה מה שמלמדים אותנו באוניברסיטה

בכל מקרה.....הוספתי עוד תנאי והסתדר ומראה לי פלט תקין

אל תדאגו יש עוד שאלות

סמסטר הבא(אם יתחיל)......VB.NET, אסמבלי ועוד...

תודה ביי

קישור לתוכן
שתף באתרים אחרים

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

איזו אוניברסיטה זו? כדי שאני אדע להמליץ נגדה.

קישור לתוכן
שתף באתרים אחרים

למה לא מאותחל? הוא הרי קורא לתוכו ב-scanf.

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

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

קישור לתוכן
שתף באתרים אחרים

do while לא ממש יפתור פה את הבעיה.

קח לדוגמא אם הוא ירשום ככה.

do
{
sum+=taarif*shaot;
if (shaot>150)
sum+=250;
mone++;
scanf("%f %f",&shaot,&taarif);
}while (shaot!=-999);

הוא עדיין יצטרך לקלוט לפני פעם אחת את המשתנים shaot ו- taarif .

ואם הוא יקלוט בתחילת הלולאה כמו למשל ככה:

do
{
scanf("%f %f",&shaot,&taarif);
sum+=taarif*shaot;
if (shaot>150)
sum+=250;
mone++;
}while (shaot!=-999);

תהיה לו בעיה שהוא יוסיף את ה -999 לסכום(בפעם האחרונה שהוא ירצה לצאת מהלולאה) למרות שבמקרה הזה הוא צריך לצאת מהלולאה.

או שהוא יכול לטפל בזה כשהוא יוצא מהלולאה .

בכל מקרה עדיף לכתוב את זה כבר כמו שהוא כתב.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...