עבור לתוכן

בעית קלט ב-c++

Featured Replies

פורסם

שלום,

כבר נשאלה שאלה דומה אך לא נענתה תשובה העונה עליה במדיוק.

יש לי בעיה בקליטת משתנים....

התוכנית שלי צריכה לקלוט בשורה עד 5 משתנים עד להופעת נקודה.

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

אין לי מושג איך לעשות זאת..

אם משהו יוכל לעזור אני ממש אשמח...

תודה רבה!!! :xyxthumbs:

פורסם

כולם מאותו טיפוס?

פורסם

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

אם כן, להפסיק לקרוא, ואם לא, אז להחזיר את אותו תו (באמצעות הפונקציה cin.putback) ולקרוא את כל הערך.

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

אז הפתרון הוא:



int inputs[5];
bool done = false;
int i=0;
char ch;

while (!done) {
  cin >> ch; // read one char
  if (ch == '.') {
    // If it is a dot, finish input.
    done = true;
  } else {
    // else, put the dot back in and read a value
    cin.putback(ch)
    cin >> inputs[i];
    ++i;
  }
  // Make sure we read 5 values at most
  if (i == 5) done = true;
}


ברור?

פורסם
  • מחבר

המון תודה על ההתיחסות.... (דרך אגב אני בת)

הבעיה שאני מעונינת לקלוט כל מיני סוגי משתנים ולא רק char ולכן זה מסבך את כל העסק...

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

תודה רבה...

פורסם
  • מחבר

קראתי שוב את ההצעה שלך ועסק קצת יותר ברור... השאלה היא.. אם התוכנה לא תחכה לקלט מסוג char? כשאני כותבת: cin>>ch

פורסם

בשביל זה יש

cin.putback(ch)

שמחזיר את התו כאילו למקלדת

פורסם

אז זהו, שכל קלט, כולל ספרות, הוא מסוג  char.

כלומר, אם הקלט הוא:

12 34.

אז קודם כל הלולאה תקרא את התו '1' לתוך ch.

התכנית תראה שזה לא נקודה, אז היא תחזיר את הערך לתוך הקלט, ותקרא אותו כמספר (כלומר 12).

אח"כ היא תקרא את התו הבא כ-'3', תבין שזה לא נקודה, תחזיר את הערך פנימה ותקרא אותו כ-34.

אח"כ התכנית תקרא את התו הבא, שהוא נקודה - ולכן היא תפסיק.

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

פורסם
  • מחבר

המון תודה אני אנסה......

מה קורה במצב שהקלט שלי הוא double ולכן יכול להופיע המספר: 6. (0.6)

פורסם

טוב, זה כבר קצת יותר מסובך.

איפה שאת מצפה ל-double, את צריכה לבדוק אם יש אחרי הנקודה ספרה או לא.

כלומר, צריך לשים (בחלק שבודק אם יש נקודה):


cin >> ch;
if (ch == '.') {
  cin.get(ch); // read the next char
  if (ch >= '0' && ch <= '9') {
    // if the next char is a digit, put it and the . back
    cin.putback(ch);
    cin.putback('.');

    // after putting the chars back, read the double
    cin >> d;

  } else {
    done = true;
  }
} else {
  cin >> d;
}

פורסם
  • מחבר

ממש תודה!!!!!!!!!!!!!!!!!!

פורסם

את גם תמיד יכולה לקלוט את כל השורה(cin.getline) ו"לשחק" איתה, אבל הדרך שהציעו כאן יותר טובה.

ארכיון

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

דיונים חדשים