עבור לתוכן

שאלה | שפת C עזרה בכתיבת תכנית לחישוב שעות עבודה

Featured Replies

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

עכשיו מבחינה לוגית, עדיף שאת השאלה האם המשתמש עבד יותר מ-8 שעות תשאל ככה ולא האם הוא עבד פחות מ-8 שעות.

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

ימשיך כבודו...

#include <stdio.h>

#define HOURS_FOR_FULL_JOB 8

int main()
{
int shift, sum = 0, c,hours,n,extra;

printf("Enter the number of shift worked\n");
scanf("%d", &shift);

printf("Enter number of hours worked\n");

for (c = 1; c <= shift; c++)

{
scanf("%d",&hours);
if ( hours > 8 )

extra = hours - 8;

else
{
sum += hours;
}

}

printf("Sum of entered hours worked = %d\n",sum);
printf("Sum of Overtime hours worked = %d\n",extra);

return(1);
}

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

  • תגובות 63
  • צפיות 6.6k
  • נוצר
  • תגובה אחרונה
פורסם

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

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

ב. אתה "שוכח" את 8 השעות הרגילות, במקום להוסיף אותן לסכום של השעות הרגילות (sum).

פורסם

עכשיו נניח שהתנאי התקיים. כלומר, הוא עבד יותר מ-8 שעות. מה יהיה הערך של sum תמיד?

פורסם
  • מחבר

אני חושב שאני אלך על עזרה מהקהל

לא מצליח להבין איך ניסיתי כל מיני דברים אבל הם לא התקמפלו והיו קצת הזויים

פורסם

תעלה את הקוד ונחשוב ביחד מה לא בסדר.

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

פורסם

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

זה משפט נכון והוא נכון שבעתיים בתכנות.

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

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

הפסיאודו קוד של הדרך שאני הייתי בוחר זה משהו כזה:

1. אפס sum ו extra.

2. קלוט מספר משמרות ל shifts

3. עבור I מ 0 עד shifts

3.1. קלוט מספר שעות ל hours

3.2. אם hours > HOURS_FOR_FULL_JOB

3.2.1. extra = extra + hours - HOURS_FOR_FULL_JOB

3.2.2. sum = sum + HOURS_FOR_FULL_JOB

3.3. אחרת

3.3.1. sum = sum + hours

וההמשך ידוע

שים לב שבמקום המספר 8 השתמשתי ב define שלי. זה נראה יותר יפה ויותר ברור. והכי חשוב שאם צריך לשנות את התוכנה ל7 שעות אתה לא משכתב את התוכנה אלא מחליף את ההגדרה רק.

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

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

זה משפט נכון והוא נכון שבעתיים בתכנות.

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

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

הפסיאודו קוד של הדרך שאני הייתי בוחר זה משהו כזה:

1. אפס sum ו extra.

2. קלוט מספר משמרות ל shifts

3. עבור I מ 0 עד shifts

3.1. קלוט מספר שעות ל hours

3.2. אם hours > HOURS_FOR_FULL_JOB

3.2.1. extra = extra + hours - HOURS_FOR_FULL_JOB

3.2.2. sum = sum + HOURS_FOR_FULL_JOB

3.3. אחרת

3.3.1. sum = sum + hours

וההמשך ידוע

שים לב שבמקום המספר 8 השתמשתי ב define שלי. זה נראה יותר יפה ויותר ברור. והכי חשוב שאם צריך לשנות את התוכנה ל7 שעות אתה לא משכתב את התוכנה אלא מחליף את ההגדרה רק.

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

תשמע אני כל כך שמח שיש את הפורום הזה ואותכם פה כתמיכה לשאלות שלי אתם מחזקים מאוד!!

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

- - - נערך: - - -

איזה חיוך מטומטם יש לי שהצלחתי לעבור את הצעד הפשוט הזה

#include <stdio.h>

#define FULL_SHIFT 8

int main()
{
int shift, sum = 0, c,hours,extra=0;

printf("Enter the number of shift worked\n");
scanf("%d", &shift);

printf("Enter number of hours worked\n");

for (c = 1; c <= shift; c++)

{
scanf("%d",&hours);
if ( hours > FULL_SHIFT )
{
extra = extra + hours - FULL_SHIFT;
sum = sum + FULL_SHIFT;
}
else
{
sum = sum + hours;
}

}

printf("Sum of entered hours worked = %d\n",sum);
printf("Sum of Overtime hours worked = %d\n",extra);

return(1);
}

עכשיו צעד הבא

אני צריך לחשוב איך אני מוסיף את ההפרדה השלישי לשעות סופ''ש אולי ELSE IF?? אבל כבר אמרתם לי שאני לא יכול להוסיף אות אז איך המשתמש יוכל להכניס משהו שיפריד לחלוטין את הספירה מכולם

הוספתי משתנה WEEKEND..

פורסם

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

אתה מחויב על פי התרגיל לכלול אות בסוף המספר?

אגב, במקום לכתוב:

extra = extra + hours

אתה יכול לכתוב:

extra += hours

פורסם

מצוין.

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

אבל כדאי להחליף את הscanf. אני הייתי מעדיף בgets שקולט מהמשתמש מחרוזת שלמה עד אנטר.

אפשר גם להוסיף לscanf עוד פרמטר ככה:

scanf ("% d% c", &hours, &type);

type צריך להיות מסוג char.

ואז צריך לבדוק האם type הוא רווח או אינטר (תווים 30 ו13 בהתאמה). אם כן להמשיך כרגיל כמו עכשיו

אם הערך שלו הוא 's' או כל תו אחר שבחרת... אתה יודע מה לעשות נכון?

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

פורסם
  • מחבר
מצוין.

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

אבל כדאי להחליף את הscanf. אני הייתי מעדיף בgets שקולט מהמשתמש מחרוזת שלמה עד אנטר.

אפשר גם להוסיף לscanf עוד פרמטר ככה:

scanf ("% d% c", &hours, &type);

type צריך להיות מסוג char.

ואז צריך לבדוק האם type הוא רווח או אינטר (תווים 30 ו13 בהתאמה). אם כן להמשיך כרגיל כמו עכשיו

אם הערך שלו הוא 's' או כל תו אחר שבחרת... אתה יודע מה לעשות נכון?

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

לא כל כך מכיר עדיין את GETS אז מעדיף כרגע להישאר בSCANF

בכל מקרה זה מה שיצא לי אבל המשתמש כאילו מחוייב להוסיף אות כי כשאני מכניס מספר בלי אות התוכנית נעצרת

#include <stdio.h>

#define FULL_SHIFT 8

int main()
{
int shift, sum = 0, c,hours,extra=0,type=0,weekend=0;

printf("Enter the number of shift worked\n");
scanf("%d", &shift);

printf("Enter number of hours worked\n");

for (c = 1; c <= shift; c++)

{
scanf ("% d% c", &hours, &type);
if ( hours > FULL_SHIFT )
{
extra = extra + hours - FULL_SHIFT;
sum = sum + FULL_SHIFT;
}
else if (hours + type)
{
weekend = weekend + hours;
}
else
{
sum = sum + hours;
}

}

printf("Sum of entered hours worked = %d\n",sum);
printf("Sum of Overtime hours worked = %d\n",extra);

return(1);
}

לילה טוב נשב על זה לעומק מחר אחרי עבודה

פורסם

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

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

אופציה אחרת היא לשאול בנפרד האם המשמרת הנוכחית היא סופ"שית.

פורסם

לכן אמרתי שעדיף להשתמש ב-gets או ב:

scanf("%s", str);

כאשר str הוא מערך של chars

פורסם

אפשר גם להוסיף לscanf עוד פרמטר ככה:

scanf ("% d% c", &hours, &type);

ב-scanf אסור שיהיה רווח בין ה-% לאות שבאה אחריו, דהיינו צריך להיות:

scanf("%d%c",...

חוץ מזה, כמובן שפותח הת'רד התעלם מהמשפט הזה:

type צריך להיות מסוג char.

חוץ מזה, לפותח הת'רד: תסביר לי בבקשה מה המשמעות של השורה הזו:

	   else if (hours + type)

פורסם

אם יצא שם רווח זה רק בגלל ה-Firefox באנדרואיד

פורסם
  • מחבר
ב-scanf אסור שיהיה רווח בין ה-% לאות שבאה אחריו, דהיינו צריך להיות:

scanf("%d%c",...

חוץ מזה, כמובן שפותח הת'רד התעלם מהמשפט הזה:

חוץ מזה, לפותח הת'רד: תסביר לי בבקשה מה המשמעות של השורה הזו:

       else if (hours + type)

ניסיון עלוב להציג שאם השעות יהיה עם אות אז...

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

ושניצל אתה יוכל לקרוא לי בן..

חחח פותח הת'רד רשמי מידי...

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

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

תודה לכולם נראה לי שאפשר לנעול את הת'רד..

ארכיון

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

דיונים חדשים