שאלה על משפטי switch - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


eliorws

Recommended Posts

שלום רב,

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

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

 
#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;
}

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

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

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

מסתיימת. אני מבין שהמשפט השני לא עובד כי הוא לא נותן לי אפשרות להקליד שוב פעם תו, כמו בפעם הראשונה. הוא מדפיס לי את המשפט שלפני ה-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;
}

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

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

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

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

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

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

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

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

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

scanf(" %c", &G);

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

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

ארכיון

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

×
  • צור חדש...