שאלה | שפת C עזרה בכתיבת תכנית לחישוב שעות עבודה - עמוד 3 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


BenSalem2

Recommended Posts

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

עכשיו מבחינה לוגית, עדיף שאת השאלה האם המשתמש עבד יותר מ-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
  • נוצר
  • תגובה אחרונה

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

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

ב. אתה "שוכח" את 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 ואז לבדוק אם הוא מסתיים באות או לא.

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

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

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

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

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

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

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

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

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

	   else if (hours + type)

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

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

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

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

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

       else if (hours + type)

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

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

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

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

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

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

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

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

ארכיון

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


×
  • צור חדש...