עבור לתוכן

איך בודקים האם משתנה הוא FLOAT - שפת C

Featured Replies

פורסם

שלום,

אני בונה תוכנה של מחשבון ורציתי לבדוק האם הקלט שלי הוא קלט של FLOAT חיפשתי במלא מדריכים באינטרנט ולא עבד לי אף אחד מהם יש לי כרגע את התוכנה VISUAL STDIO 2008

ניסיתי המון דברים ואף אחד מהם לא עבד לי, ד"א כרגע התוכנה שלי פועלת לפי התנאי:

if ( f/f == (int)1)

{

.....

}

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

נ.ב

אני מקבל מספר לדוגמא : 123.6

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

בתודה מראש,

יוגב

פורסם

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

ויותר ספציפי לשאלתך: ניסית להשתמש בפונקציה floor ולהשוות את התוצאה?

כלומר:

if (f == floor(f))

?

נ.ב. מומלץ שתציין בכותרת באיזו שפה אתה כותב.

פורסם
  • מחבר

לגבי הכותרת סבבה צודק לפעם הבאה אדע..

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

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

בכל מקרה תודה רבה על התגובה!

פורסם
  • מחבר

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

לגבי הפונקציה שאמרת ניסית אותה עכשיו והיא לא עבדה..זה התקמפל אבל עדיין כשהכנסתי @ זה קיבל את זה והתנאי לא נשבר..

אין לי מושג למה זה קורה הדבר הזה..הוא כאילו מקבל את זה אבל בתוכנית עצמה אם אני כותב למשל @ + @ זה כותב לי בסוף " the sum of 0.00 and 0.00 is 0.00"

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

אתה יכול לפרט לי בקטנה מה היא עושה? בקצרה כזה..

תודה מראש!

פורסם

אני מניח שאתה קורא את המספר באמצעות scanf. הפונקציה הזו קוראת את הקלט עד שהיא מגיעה לתו שאותו היא לא יכולה לקרוא. לדוגמה, אם הכנסת את המחרוזת 123@432 אז היא תעצר אחרי ה-432, כי ב-@ היא כבר לא יכולה לטפל. אתה לא מצפה שהמספר יכיל את התו @ איכשהו, נכון?

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

פורסם
  • מחבר

כן אני משתמש בSCANF אני יכול להשתמש בתכונה הזאת שלה? ולהשתמש בRETURN? ולהכניס את זה למשתנה ולבדוק האם הוא שונה מ-0

פורסם

אה..... מה?

הדבר הנכון הוא לקרוא את הקלט כמחרוזת (s%) ולא כמספר (f%). אחר כך תוכל לבדוק שהמחרוזת תקינה, ולהמיר את תוכנה למספר באמצעות atof.

פורסם
  • מחבר

איך אני בודק אם המחרוזת תקינה?

פורסם

למה שתבדוק אם מספר שאתה מקבל הוא שלם או לא?

תשתמש ב float, או שתשתמש ב int בלבד (תחליט קודם אם אתה עושה מחשבון למספרים שלמים, או מספרים רציונאליים).

אם החלטת לעשות מחשבון רציונאלי, תקבל את הקלט לתוך float, תעשה את העיבודים באמצעות float, ותציג את התוצאה באמצעות float.

ז"א:

// code...

float input_number;

//...

scanf("%f", &input_number);

// more code...
float result;
result = input_number * input_number + 5;

printf("%f", result);

פורסם

strtod

פורסם
  • מחבר

מה אני עושה עם זה?..

זה יהיה נחמד אם מישהו ייתן לי פתרון מלא ולא ייזרוק תשובות אפשריות לאוויר..

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

פורסם

אפשר גם להשתמש ב- sscanf אחרי הקליטה והוידואים במקום strtod.

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

פורסם
  • מחבר

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

תודה מראש

פורסם

א. מחרוזת היא מערך של תווים, ולכן לכל תו במחרוזת ניתן לגשת כמו לתא רגיל במערך של תווים (או בעזרת מצביע אם תרצה).

ב. קרא את המספר שלך לתוך מערך תווים, ולא לתוך משתנה מספרי.

ג. עבור תו תו במערך התווים ובדוק מה יש שם:

1. אם מספר (למעשה סיפרה בין 0 ל-9), אז זה בסדר.

2. אם נקודה ראשונה, אז זה בסדר, אבל רק בתנאי שאחריה יש עוד סיפרה.

3. אם מדובר בנקודה שניה ומעלה - אז זה כבר לא מספר.

4. אם מדובר בכל תו אחר - זה לא מספר.

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

הרעיון הוא שמספר הוא מהצורה XXXXX.XXXXX, כאשר הנקודה היא אופציונלית, והמספר יכול להיות גם מהצורה XXXXX (למשל "12345" - רק ספרות), או מהצורה XXXXX. (מתחיל בנקודה ואחריו ספרות "1234." ), אבל לא משהו כמו ".1234" (מתחיל בספרות ומסתיים בנקודה).

הנה קוד ממש ממש בסיסי, שאפשר לשפר אותו כדי לבצע את הנ"ל:


#include <stdio.h>

void main()
{
char str[50];
int i;

printf("Enter String: ");
scanf("%s", &str);

i=0;
while (str[i]!= '\0')
{
printf("char %d: %c\n", i, str[i]);
i++;
} // end while

printf("The string you entered: %s", str);
} // end main

ארכיון

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

דיונים חדשים