עבור לתוכן

בעיה בשפת C

Featured Replies

פורסם

אני אמור לבנות תוכנית שבה מקלידים מספר והיא אמורה להוציא פלט של מספר הספרות של אותה ספרה. למשל אם כותבים את הספרה 100 צריך לקבל את הפלט: 3.

הנה התוכנית. למה זה לא עובד לי?

#include <stdio.h>

int main()

{

int a,b,d,counter=0;

printf("Please enter a number: ");

scanf("%d", &a);

for(d=1 ; b<1 ; d++){

b=a/10;

}

printf("%d", d);

}

לא משנה, הצלחתי!!! תודה בכל אופן.

פורסם

אל תשכח לעשות קימפול עם אזהרות. אני מניח שהשגיאה פה היא שאתה לא מאתחל את המשתנה b לפני הבדיקה הראשונית בלולאת ה for.

פורסם

טוב אני די המום מהקוד הזה, ואני שונא להיות זה שאומר את הדברים הלא יפים, אבל אם מישהו לא יסביר לך מה לא

בסדר בקוד הזה יהיה לך הרבה בעיות עם C, אז אל תעלב או משהו, גם לי היו את אותם באגים...

דבר ראשון כמו ש Omniscience אמר, המשתנה b לא מאותחל, במילים אחרות: הרגע הקצאת (לרוב) 32 ביט

של זיכרון מבלי להגיד בדיוק מה אתה רוצה שיהיה בו ברגע זה, בגלל ש b נוצר ב stack מה שקורא זה שכרגע

מאוכסן בו "ערך זבל", כלומר מה שהיה בזיכרון באותו רגע ש b נוצר. התוכנית שלך מסתמכת על זה שהלולאת

FOR תרוץ לפחות פעם אחת, הבעיה היא שברגע שביט הכי שמאלי של b יהיה אפס ועוד ביט מה 31 האחרים

יהיה אחד הלולאה שלך לא תרוץ בכלל, והסיכוי שזה יקרה הוא די גדול.

הבעיה השניה היא זה:

b=a/10;

שים לב מה קורה פה, אתה מחלק את a ב 10 ושם את הערך ב b, חשוב שתבין שהערך של a לא משתנה.

במילים אחרות: אתה מחלק את אותו מספר ב 10 ואז בודק את בתוצאה שוב ושוב ושוב...

ולדעתי גם יש פה עוד 2 בעיות קטנות:

קודם כל אם יש רק ביטוי אחד אחרי FOR/WHILE/IF וכו' אתה לא צריך לכתוב {}.

וגם יש לך פה ביזבוז זיכרון, קודם כל counter לא שייך לשם, דבר שני אתה לא צריך את b , אתה

יכול לבדוק את התנאי הזה בתוך התנאי של הלולאה עצמה ולהחליף את האופורטור / ב =/ או להשתמש

ב a עצמו במקום b .

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

#include <stdio.h>


main()
{
unsigned long number,i;


printf("Please enter a number: ");
scanf("%u", &number);


for ( i = 1 ; number /= 10 ; i++ )
; /* Do nothing, just count... */


printf("The answer is: %u", i);



fflush (stdin);
getchar();

}

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

ארכיון

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

דיונים חדשים