שפת C

pilot23

New member
שפת C

שלום,
אני קצת מתקשה לכתוב בשפת C את הדבר הבא : תבקש התכנית 2 מספרים אי זוגיים שטווחם נע בין 5 ל 21 ( כולל קצות הטווח ).
אגב, אסור לי להשתמש בפונקציות, מערכים ,פונקציות מספריות math.h או stdlib.h ופקודת return.
אשמח להכוונה,
תודה.
 

YardenBu

New member
היי את!

גם את נפלת על סיקסיק בקיץ?
אפשר לעשות לולאת while שבתוכה יש פרינט וסקן לקבלת קלט והתנאים לכניסה ללולאה יהיו גודל המספר (קטן שווה 21 וגם גדול שווה 5) וגם שהמספר מודולו 2 יהיה שונה מאפס, ככה את יודעת שהמספר הוא אי זוגי.
 

pilot23

New member
חחח גם אני, גם אני...

איזה סיוט הקורס הזה, אלוהים ישמור... אני לא מבינה איך אנשים הצליחו לעבור אותו בנוסף לעוד 6 קורסים... אני יכולה לשבת 4 שעות מול סעיף ולא להצליח. איך הולך לך?
ואיך הלך סמסטר ב' ?

תודה רבה! ידעתי בערך לכתוב את מה שאמרת.. אבל העניין הוא שאני לא בטוח איך אני רושמת את 3 התנאים ב- while? כלומר גם שיהיה קטן שווה 21 וגם גדול שווה 5 וגם שמודולו של המספר שונה מ- 0 ?
 

YardenBu

New member
חחחח, לגמרי!

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

while ((input<5)||(input>21)||(input%2==0)) {
printf ("please enter new input");
scanf ("%d", &input);
}

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

pilot23

New member
תשובה

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

דבר אחד אני לא מבינה.... עשית בין התנאים "או". או שזה בגלל שעשית על דרך השלילה... ?
 

YardenBu

New member
חופשי...

לדעתי רמת הנכשלים סבירה כי הרבה לוקחים את הקורס כקורס חוזר, או קונים עבודות מוכנות ורק לומדים למבחן.
בכל מקרה, אני לא בטוחה שהבנתי מה לא הבנת... כשנותנים כמה תנאים מספיק שאחד מהם יתקיים כדי שהמשתמש יכנס ללולאה.
#include <stdio.h>
void main () {
int num=0;
printf ("enter number\n");
scanf ("%d", &num);
while ((num<5)||(num>21)||(num%2==0)) {
printf ("wrong, again\n");
scanf ("%d", &num);
}
printf ("ok\n");
}

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


תעתיקי את זה לתוכנה ותראי מה זה נותן.
 

YardenBu

New member
*כשנותנים כמה תנאים עם "או" מספיק שאחד מהם

יתקיים. כשנותנים תנאים עם "וגם" כולם צריכים להתקיים. השעה הזאת לא באה בטוב...
 

pilot23

New member
תגובה

תכלס, צודקת.. הרוב באמת חוזר על הקורס או קונה עבודות מוכנות... הלוואי והיה לי אומץ לקנות עבודה מוכנה, אני ממש מפחדת מכל העניין של הועדות משמעת וכאלה... זה ממש לא נעים.
את הצלחת את המלבן ?? ישבתי אתמול עד 5 בבוקר!! בעיקרון נראה לי שמה שצריך לעשות פה זה 3 לולאות for מקוננות שרצות.. אחת על השכבה הפנימית , אחת אחת על השכבה האמצעית ואחת על החיצונית .. זה נכון? אני לא יודעת מה קודם למה מבחינת הסדר של הלולאות.
ואיך בכלל אפשר לכתוב בלולאה שזה יהיה שליש של אורך מסוים?
 

pilot23

New member
רציתי לשאול אם אני פשוט עושה את הלולאה

פעמיים עבור כל מספר?
 

YardenBu

New member
נראה לי שהרעיון הכללי הוא בכיוון

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

Guy Yafe

New member
ולעשות בהם מה?

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

nocgod

New member
השאלה הזאת לא קשה או מסובכת...

לא יודע על איזה קורס אתם מדברים, משום מה הסיקסיק הזה נשמע לי מוכר בכל זאת.
השאלה לא קשה ולא מצריכה פונקציות או מערכים או סיפריות אחרות חוץ מ stdio.h בשביל הscanf printf.

#include <stdio.h>

int main()
{
int numberOne, numberTwo;

do
{
printf("Enter an odd number between [5, 21]:\n");
scanf("%d", &numberOne);
if ( (numberOne % 2 == 0) || (numberOne > 21) || (numberOne < 5) )
{
printf("This number is not odd, enter again\n");
}
} while ( (numberOne % 2 == 0) || (numberOne > 21) || (numberOne < 5) );

printf("Number accepted.\n");

do
{
printf("Enter an another odd number between [5, 21]:\n");
scanf("%d", &numberTwo);
if ( (numberTwo % 2 == 0) || (numberTwo > 21) || (numberTwo < 5) )
{
printf("This number is not odd, enter again\n");
}
} while ( (numberTwo % 2 == 0) || (numberTwo > 21) || (numberTwo < 5) );

printf("Number accepted.\nThe number are %d and %d.\n", numberOne, numberTwo);

return 0;
}
 

pilot23

New member
עשיתי משהו מאוד דומה. רק בלי

return כי אסור לנו. זה בסדר?
 

nocgod

New member
עד כמה שאני זוכר לפי סטנדרט של C

הmain חייב להחזיר int ועלכן חייב להכיל return
אם אסור לכם אז תעשה את טיפוס ההחזרה של הmain ל void ואז אפשר למחוק את הreturn...
 

pilot23

New member
תגובה

היי,
קודם כל זה תעשי, ולא תעשה :)
אני לא ממש מבינה מה זה אומר "תעשי את טיפוס ההחזרה של ה- main ל- void"... אם אפשר הסבר על מה זה אומר זה יהיה מעולה.

תודה.
 

nocgod

New member
זה דיי פשוט

main היא פונקציה כמו כל פונקציה, ההבדל היחיד הוא העובדה שפונקציה הmain היא נקודת החדירה לתוכנית שלך.
כמו לכל פונקציה גם main יכולה להחזיר ערך לקורא. בקוד שאני כתבתי
int main()
{
//
// some code here
//
return 0;
}


את יכולה לכתוב גם:
void main()
{
//
// some code here
//
}


שימי לב שטיפוס ההחזר של main הוא int בקוד הראשון, ובקוד השני הוא void.
 

kerneliminal

New member
אז זה לא נכון

Main צריכה להחזיר return code למערכת הפעלה,
למעשה כל תוכנית למשל במערכת לינוקס הינה process, ברגע שהתוכנית מסתיימת היא צריכה להחזיר ערך כלשהו,
ערך אפס מסמן הצלחה, וערך שלילי מציין כישלון,
כאשר יש ערכים שלילים מוגדרים, חפשי את errno
 

pilot23

New member
יש לי בעיה עם הקוד

כשמכניסים קלט שלא עומד בתנאים שציינתי אני לא רוצה שזה יכתוב " זה לא מספר זוגי " או משהו כזה.. אלא שאני רוצה שהוא שוב ושוב ייבקש את המספר , כלומר : ("Enter an odd number between [5, 21]:\n")
ועשיתי do while, אבל אם מקישים למשל 6 זה יוצא לי מהתוכנית במקום להמשיך ולבקש את המספר.
מה אני עושה ?
 

nocgod

New member
מוזר מאוד...

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

אני הייתי ממליץ לך לפתוח ספר את הספר K&R The C Programming language בפרק של control-flow structures וללמוד אותו.
ובכללי בכל הקשור ללימודים בסיסיים של תכנות הספרים הם החברים הכי טובים שלך, אחריהם יבואו אתרי האינטרנט והדוקומנטציות שתמצאי באינטרנט.
אני לא מצפה מאף מרצה (גם לא מציון סיקסיק) להצליח ללמד כיתה של קרוב לוודאי 100 סטודנטים הכל לעומק ובצורה ברורה ובסופו של יום החומר יקלט רק אצל אחוז הסטודנטים שקולטים מהר.
 
למעלה