עבור לתוכן

בעייה בתוכנית בשפת C

Featured Replies

פורסם

שלום רב,

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

בקוד שכתבתי,כאשר קולטים מהמשתמש מספר וב SCANF רשום %C אז אכן מתבצע BREAK,אך הערך שנקלט ומוכנס למערך המספרים הוא הערך

הASSCI שלו וזה לא מה שצריך.

כאשר קולטים מהמשתמש מספר בSCANF ואני רושם %D אז לא מתבצע BREAK (לא מזהה את תו הENTER),אבל כן מוצב הערך המספרי במערך המספרים.

אנא עזרו לי להבין מה לא עובד בתוכנית! ולמה שאני עושה CASTING על התו כדי שיהיה UNSIGNED זה לא עוזר!

תודה רבה!

printf("Insert numbers(max 5):\n");

for(i=0;i<MPN_MAX;i++)
{
fflush(stdin);
scanf("%c",&ch);
if(ch=='\n')
break;
else
arr_num[i]=(unsigned)ch;
}
for(j=0;j<i;j++)
printf("%u ",arr_num[j]);

פורסם

תעשה -30 לערך הASCII ותקבל את הספרה.

פורסם
  • מחבר

לא הבנתי,תוכל לפרט?

פורסם

תווים נשמרים בזכרון תמיד בתור ערך ה-ascii שלהם. ההמרה מ-char ל-int למעשה לא עושה כלום (כי char הוא כבר מספר).

לכן, אתה צריך "לתרגם" מערך ה-ascii של הספרה לערך הספרתי שלה. באופן נוח, הספרות '0' עד '9' מסודרות זו אחר זו בקידוד ascii, ולכן בשביל להגיע לערך הספרתי של ספרה מסויימת צריך להחסיר ממנה את ערך ה-ascii של הספרה 0, שהוא '0'.

כלומר, בתכלס:

arr_num[j] = ch - '0';

שוב, שים לב שאין צורך בהמרה, כי כל תו הוא למעשה כבר קבוע מספרי ששווה לערך ה-ascii שלו.

פורסם
  • מחבר

שניצל,

מה שאמרת וכתבת תופס כאשר אני מעוניין להכניס ספרות בלבד למערך : מ 0 ועד 9, אבל במידה והמשתמש הכניס

מס דו ספרתי לא יהיה ניתן להציבו במערך מכיוון שלמספרים גדולים מ 9 לא קיים ערך ASCII!

אשמח לקבל תשובה!

פורסם

אתה יכול להשתמש ב- gets, ואחר כך ב- atoi כדי להעביר ממחרוזת למזפר.

פורסם
  • מחבר

שניצל,

אם נקלוט את המספר עם %d, אז כמו שציינתי בפתיח לא נזהה את התו ENTER...

פורסם
  • מחבר

UnsignedInteger אתה תותח עזרת לי מאוד,הצלחתי

תודה רבה!!

ארכיון

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

דיונים חדשים