עבור לתוכן

שאלה על משפטי switch

Featured Replies

פורסם

שלום רב,

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

פורסם

על איזה שפה מדובר?

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

פורסם
  • מחבר

שפת C. פקודת ה-switch הראשונה עבדה בלי בעיות. אני פשוט רוצה את אותה אחת ישר אחרי.

פורסם

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

amitbl, על איזה שפות אתה מדבר?

נב. הועבר לפורום שפות עילית.

פורסם
  • מחבר
 
#include <stdio.h>
int main(void)
{
int F, X, Y, Z, G;
printf("The First Format Is ");
F=getchar();
switch (F)
{
case 'E':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &X, &Y,&Z);
break;
case 'A':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &Y, &X,&Z);
break;
case 'J':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &Z, &Y,&X);
break;
case 'M':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &X, &Z,&Y);
break;
default:
printf("Error, unknown operator.");
break;
}
G=getchar();
switch (G)
{
case 'A':
printf("hellow");
break;
}
return 0;
}

פורסם

מי אמר שהוא דילג על ה switch השני? תזכורת ש getchar קוראת את התו הבא בלי לדלג על רווחים וירידות שורה.

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

פורסם
  • מחבר

לא הבנתי...נאמר כשאני מכניס printf כלשהו לפני ה-switch השני - המשפט מודפס (לאחר שבוצע ה-switch הראשון) ואז התוכנית פשוט מפסיקה. לא נותנת לי את הקלט כמו של ה-switch הראשון.

פורסם

התכנית מפסיקה או מסתיימת? שוב, לפי מה החלטת שהתכנית לא נכנסה ל switch השני?

אני מציע לך להוסיף ל switch השני default ותראה מה קורה.

פורסם
  • מחבר

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

 
#include <stdio.h>
int main(void)
{
int X, Y, Z;
char G, F;
printf("The First Format Is ");
scanf("%c", &F);
switch (F)
{
case 'E':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &X, &Y,&Z);
break;
case 'A':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &Y, &X,&Z);
break;
case 'J':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &Z, &Y,&X);
break;
case 'M':
printf("The First Birthday Is ");
scanf("%d.%d.%d", &X, &Z,&Y);
break;
default:
printf("Error, unknown operator.");
break;
}
printf("The Second Format Is ");
scanf("%c", &G);
switch (G)
{
case 'A':
printf("hellow");
break;
}
return 0;
}

פורסם

שפות סקריפטים רבות. כדוגמת perl.

פורסם
  • מחבר

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

פורסם

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

לאחר מכן התו השני יהיה תו מפסיק(לחצת אנטר על מנת שהוא יקלוט את התו הראשון) ולכן הוא יודפס רק עם יש default(הוא נכנס לswitch אבל מכיוון שהוא לא a לא תראה כלום).

פורסם

בגלל האופן שבו פועלות scanf ו-getchar.

אני מניח שאחרי שאתה מכניס את התאריך, אתה לוחץ על אנטר, כן? אז האנטר הזה הוא תו מיוחד בשם line feed, ומסומן כ-'n\' (ב-windows זה למעשה שני תווים - 'r\' ואחריו 'n\' - אבל נניח לשם הנוחות שזה רק תו אחד).

כשאתה עושה (scanf("%d", &x אז הפונקציה קוראת מהקלט מספר עד שהיא מגיעה לתו שאינו ספרה. אם לדוגמה רשמת 12 ואחר כך אנטר, אז הקלט יכיל את התווים 1, 2 ואחר כך 'n\'. לכן הפונקציה תקרא 12 ולאחר מכן תראה את התו 'n\' שאינו ספרה, ולא תקרא אותו.

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

הפתרון הוא לעשות כזה דבר:

scanf(" %c", &G);

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

פורסם
  • מחבר

תותחים!!!!!! העלתם לי חיוך אחרי חצי יום שאני אובד עצות.

ארכיון

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

דיונים חדשים