זקוק לעזרה בסוויצ' שנמצא בתוך while. שפת C. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

זקוק לעזרה בסוויצ' שנמצא בתוך while. שפת C.


pain_killer12

Recommended Posts

שלום. הקוד:

	scanf("%c",&c);
scanf("%c",&d);
while ((c != 'e') && (c != 'E'))
{
switch (c)
{
case 'P':
Palindrom();
break;
case 'p':
Palindrom();
break;
case 'F':
Devidors();
break;
case 'f':
Devidors();
break;
case 'M':
great_Average();
break;
case 'm':
great_Average();
break;
case 'B':
Base();
break;
case 'b':
Base();
break;
case 'C':
Contain();
break;
case 'c':
Contain();
break;
default:
printf("error\n");
break;
}
scanf("%c",&c);
scanf("%c",&d);
}
return 0;
}

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

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

איך אני פותר את הבעיה הזאת?

תודה מראש לכל העוזרים.

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

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

נתקלתי בעוד בעיה באחת הפונקציות:

void great_Average()
{
int x,sum,counter,temp;
double avg;
counter = 0;
sum = 0;
scanf("%d",&x);
scanf("%d",&temp);
while (temp != 999)
{
if (temp>x)
{
sum = sum+temp;
counter = counter+1;
}
scanf("%d",temp);
}
if(counter == 0)
{
printf("0\n");
}
else
{
avg = sum/counter;
printf("%lf\n",avg);
}
}

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

משום מה אחרי 3 קלטים (כולל המספר הראשון) התכנית עפה לי.

יש רעיונות למה זה קורה?

ד"א הקוד של הswitch נראה כעת כך:

scanf(" %c",&c);
while ((c != 'e') && (c != 'E'))
{
switch (c)
{
case 'P':
Palindrom();
break;
case 'p':
Palindrom();
break;
case 'F':
Devidors();
break;
case 'f':
Devidors();
break;
case 'M':
great_Average();
break;
case 'm':
great_Average();
break;
case 'B':
Base();
break;
case 'b':
Base();
break;
case 'C':
Contain();
break;
case 'c':
Contain();
break;
default:
printf("error\n");
break;
}
scanf(" %c",&c);
}

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

וואי, טעות של חובבן, וישבתי על זה שעה ושברתי את הראש.

ד"א אם לא נותנים לו משתנה לפי כתובת בscanf, איפה הוא שומר את הערך שאני מכניס?

הוא לא אמור לתת לי שגיאת קומפילציה?

ועוד שאלה לצוות המומחים (אני יודע שחפרתי, פשוט אני לא מצליח להסתדר):

יש לי פוקציה שחלק ממנה אמור להמיר ממספר מבסיס כלשהו (שקטן מ10) לבסיס 10 הדצימלי.

זה הקוד:

				if(tBase == 10) //convert to decimal
{
b10 = 0;
i = 0;
while (temp != 0)
{
power = pow(oBase,i);
b10 = b10 + ((temp%10)*power);
temp = temp/10;
i++;
}
printf("%ld\n",b10);
}

temp זה המספר. oBase זה הבסיס המקורי, b10 אמור להכיל את המספר בבסיס 10, power שומר את החזקה של הבסיס המקורי בi, i הוא כמו מונה של הלולאה והוא בעצם מעריך החזקה המשתנה.

לא משנה מה אני מכניס (כל עוד הבסיס שאליו ממירים הוא 10) אני מקבל 0. מישהו יודע היכן טעות החישוב?

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

ד"א אם לא נותנים לו משתנה לפי כתובת בscanf, איפה הוא שומר את הערך שאני מכניס?

הוא לא אמור לתת לי שגיאת קומפילציה?

הוא לא נותן שגיאת קומפילציה, כי scanf לא יודעת מראש את הטיפוסים שהיא מקבלת (היא יכולה לקבל כל טיפוס אפשרי, והיא "מסיקה" את הטיפוסים לפי מה שיש בתוך המחרוזת). ב-++C, כמובן, אין את הבעיה הזו (כשמשתמשים ב-cin).

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

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

תודה רבה על התשובה העניינית שניצל. החכמתי.

בנוגע לפונקציה שלי להעברת מספר מבסיס כלשהו לבסיס עשרוני, יש רעיון למה יכולה להיות הבעיה?

b10 ,i , power מוגדרים כדאבל וכל השאר מוגדרים כint.

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

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

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

זה בערך סך כל הפונקציה:

	int num, oBase, tBase,temp,temp1,counter, counter2;
double b10, i, power;
scanf("%d\n%d\n%d",&num,&oBase,&tBase);//gets the number and bases
temp = num;
counter = 0;
counter2 = 0;
if ((oBase == tBase) || (tBase>10)) //if the bases are even or 16 = error!
{
printf("error\n");
}
else
{
while (temp!=0) //counts the number's digits and the numbers that are less or equal the second base
{
temp1 = temp%10;
if (temp1<oBase)
{
counter++;
}
counter2++;
temp = temp/10;
}
temp = num;
temp1 = 0;
if((counter == counter2) && (counter>0))//all the digits are in the base
{
if (oBase == 10) //we need to convert from decimal
{
while (temp != 0)
{
temp1 = (temp1*10) + (temp%tBase);
temp = temp/tBase;
}
printf("%d\n",temp1);
}
else //we need to convert from another base
{
if(tBase == 10) //convert to decimal
{
b10 = 0;
i = 0;
temp = num;
while (num != 0)
{
power = pow(oBase,i);
printf("power = %lf, b10 = %ld, i = %d, num = %d",power,b10,i, num);
b10 = b10 + ((num%10)*power);
num = num/10;
i = i + 1;
}
printf("%ld\n",b10);
}

מטרת הפונקציה היא להחליף בסיסים, מקבלים מספר, אחריו הבסיס שבו המספר ואחריו הבסיס שאליו רוצים להעביר את המספר.

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

הif של להעביר מספר מבסיס 10 לבסיס כלשהו, עובד מעולה.

הפלט שלי בלולאה הוא:

power = 1.000000, b10 = 0, i = 0, num = 0, power = 2.000000, b10 = 0, i = 1072693248, num = 10

וזהו. עבור הקלט -

11

2

10.

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

אני מניח שהבעיה היא בקטע האחרון (איפה ש-tBase == 10), נכון?

מה הערך של num כשאתה מדפיס אותו בלולאה?

דרך אגב, אין שום צורך להשתמש ב-pow. במקום לאתחל את i ב-0, וכל פעם להגדיל אותו ב-1 ואז להעלות בחזקה שלו, פשוט תאתחל את power ב-1, ואז כל פעם תכפיל אותו ב-oBase.

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

שמעתי לעצתך, וכעת כך נראה הif האחרון:

         if (tBase == 10) 
{
b10 = 0;
i = 1;
while (temp != 0)
{
printf("temp = %d",temp);
b10 = b10 + ((temp%10)*i);
temp = temp/10;
i = i*oBase;
}
printf("%ld\n",b10);
}

עבור אותו קלט, הוא מדפיס לי temp = 11 ואז temp = 10 אבל לא מדפיס את b10.

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

ארכיון

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

×
  • צור חדש...