עבור לתוכן

בעיה של מתחילים בשפת C

Featured Replies

פורסם

התחלתי ללמוד C לפני שבוע ומשהו ולמדתי לולאות.

הקוד הבא אמור לקבל מספר ולתת את הריבוע שלו, נגיד אם שמתי 5 אז התוצאה תהיה 25.

ואם הכנסתי כל תו אחר חוץ ממספר הוא יכתוב incorrect input

'>http://jpg.co.il/view/4fce40fa3c0c1.jpg/"]4fce40fa3c0c1.jpg

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

מישהו עזרה?

פורסם

כי את התו הראשון (הספרה הראשונה במקרה שלך) הוא קורא ב-IF הראשון שלך ואם הוא מספר אז הוא ממשיך ללולאה.

בלולאה הוא קורא את התו הבא - ז"א הוא לא מתייחס לתו הראשון

פורסם
  • מחבר

דבר ראשון תודה רבה.

דבר שני אפשר לסדר את הבעייה חוץ מלשים את ה"If" אחרי הלולאה?

פורסם

למה הדבקת את הקוד כתמונה? יכלת פשוט להדביק פה את הקוד עצמו, בתוך טג קוד (הכפתור עם ציור #).

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

פורסם
  • מחבר

שמתי כתמונה כי לא הכרתי את הכפתור הזה #, תודה.

ואני חושב שלא הבנתי אותך כ"כ אתה אולי יכול בבקשה לתקן את הקוד כדי שאני אראה למה התכוונת?

הקוד בשביל הנוחות:


#include <stdio.h>

int main()
{
int i;
if(scanf("%d", &i)<1)
{
printf("Incorrect input.\n");
return 0;
}
while(scanf("%d", &i)>0)
{
printf("%d\n", i*i);
}
return 0;
}

פורסם

כמו שאמרתי:

תעיף את ה-if (ואת הקוד שהוא מבצע) לחלוטין.

צור משתנה נוסף (נגיד נקרא לו c), ותאתחל אותו ב-0.

בתוך ה-while תבצע ++c.

אחרי ה-while תבדוק האם c==0, ואם כן אז זה אומר שלא נקרא שום קלט - ואז תדווח על שגיאה.

פורסם
  • מחבר

התכוונת לזה?

#include <stdio.h>


int main()
{
int i, c=0;


while(scanf("%d", &i)>0)
{
printf("%d\n", i*i);
c++;
}
if(c==0) printf("No input.\n");


return 0;
}

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

תודה.

פורסם

אני יכול לענות על זה אבל

זה משהו בסיסי בתיכנות וכדאי שתחשוב לבד למה התוכנית מתנהגת ככה

פורסם
  • מחבר

אחי גם אני יודע למה זה, זה בגלל שכאשר אני מכניס מספר הערך של c הוא כבר לא 0 אז מן הסתם שהוא לא יכתוב כלום אם לאחר מכן אני ישים תו שהוא לא מספר.

בכל מקרה מה שאני מחפש פה זה תוכנית כזאת:

1)בכל זמן שאני אכניס מספר התכנית תתן תשובה ולא תסגר.

2) בכל זמן שאני אכניס כל תו אחר שהוא לא מספר, התוכנית תכתוב "No input" ושהתוכנית לא תפסק, אלא אני אוכל עוד פעם להכניס תו נוסף.

פורסם

עכשיו קצת יותר ברור מה אתה מחפש.

שים לב שאתה עושה (while(scanf(...)>0, מה שאומר שברגע שה-scanf יחזיר 0 (מה שקורה כשהקלט "לא חוקי") הלולאה תסתיים, ואתה תצא מהתכנית. במקרה שלך אתה לא רוצה שהתכנית תיפסק, אלא תמשיך לנצח, ולכן משתמשים בלולאה אינסופית. בשביל זה אתה צריך להעביר ל-while תנאי שהוא תמיד אמת, לדוגמה 1==1 או אפילו רק 1, דהיינו:

while (1) {
if (scanf(...)) {
...
}
}

שחק עם זה קצת ותראה מה קורה. תנסה לבדוק מה קורה בדיוק כש-scanf נכשלת (מה קורה אם scanf נכשלת ואז אתה מנסה לבצע שוב scanf?)

פורסם
  • מחבר

תודה רבה על העזרה,

אבל ניסיתי לעשות משהו כזה, אני חושב שזה בערך מה שהתכנוות:


#include <stdio.h>


main()
{
int i;
while(1)
{
if(scanf("%d", &i)>0)
{
printf("%d\מ", i*i);
}
if(scanf("%d", &i)<1)
{
printf("Incorrect input\n");
}
}
return 0;
}

לא הבנתי, למה אם אני שם תו לא נכון התוכנה רושמת Incorrect input אינסוף פעמים?

פורסם

קודם כל, כל פעם שאתה עושה scanf אתה קורא עוד קלט. למה אתה עושה פעמיים scanf בתוך הלולאה?

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

ארכיון

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

דיונים חדשים