עבור לתוכן

טיפול במספר משתנה של ארגומנטים -- שפת C

Featured Replies

פורסם

רמז: מה צריך להיות הערך ההתחלתי של next_num כדי שגם frst ייבדק?

  • תגובות 64
  • צפיות 6k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר

ניסיתי שלילי אבל כנראה שזו לא התשובה... אז לא ממש הצלחתי... :nixweiss:

פורסם

למה שזה יעזור?

שים לב מה הבעיה - frst בכלל לא נבדק בלולאה.

פורסם
  • מחבר

ניסיתי קצת לשנות, אבל עדיין מדלג על המס' הראשון בקריאה... :nixweiss:


#include <stdarg.h>
#include <stdio.h>

int lowest_ever (int frst,...)
{
va_list mylist;
static int lowest_num;
static int next_num;

va_start (mylist, frst); /*Initialize the argument list*/


next_num= va_arg(mylist, int);

while (next_num!=-1)
{
if (frst <lowest_num)
lowest_num= frst;
next_num = va_arg(mylist, int);
}


va_end (mylist); /*Clean up */
return lowest_num;
}

int
main (void)
{
/*This call prints 5*/
printf ("%d\n", lowest_ever (5, 78, 100, 20, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (70, 40, 2, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (40, 30, -1));

return 0;
}

פורסם

אבל עכשיו בכל איטרציה אתה מתעלם מ-next_num ובודק רק את frst. מה ההגיון בזה?

פורסם
  • מחבר

אז איזו שורה אני צריך להוסיף (בלולאה נכון?) כדי לטפל ב- next_num ? :nixweiss:

פורסם

למה אתה חושב שהבעיה היא בלולאה?

הבעיה היא שיש לך ארגומנט אחד שאתה לא בודק - frst.

פורסם
  • מחבר

עכשיו הוא מדפיס לי את הספרה 5 עבור כל אחת מהקריאות. הוא כאילו מתייחס רק לקריאה הראשונה אפילו שהוא מסתכל גם על האיבר הראשון... :'(

הקוד:


#include <stdarg.h>
#include <stdio.h>

int lowest_ever (int frst,...)
{
va_list mylist;
static int lowest_num=101;
static int next_num;

va_start (mylist, frst); /*Initialize the argument list*/


next_num= va_arg(mylist, int);
if (frst <lowest_num)
lowest_num= frst;
while (next_num!=-1)
{
if (frst <lowest_num)
lowest_num= frst;
next_num = va_arg(mylist, int);
}


va_end (mylist); /*Clean up */
return lowest_num;
}

int
main (void)
{
/*This call prints 5*/
printf ("%d\n", lowest_ever (5, 78, 100, 20, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (70, 40, 2, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (40, 30, -1));

return 0;
}

פורסם

אתה בכיוון הנכון, רק שלא תיקנת את הטעות שעשית קודם.

פורסם
  • מחבר

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

הקוד:


#include <stdarg.h>
#include <stdio.h>

int lowest_ever (int frst,...)
{
va_list mylist;
static int lowest_num=101;
static int next_num;

va_start (mylist, frst); /*Initialize the argument list*/

next_num= va_arg(mylist, int);

if (frst <lowest_num)
lowest_num= frst;
if (frst = -1) /* ADDON*/
printf("ERROR"); /* ADDON*/
while (next_num!=-1)
{
if (next_num <lowest_num)
lowest_num= next_num;
next_num = va_arg(mylist, int);
}


va_end (mylist); /*Clean up */
return lowest_num;
}

int
main (void)
{
/*This call prints 5*/
printf ("%d\n", lowest_ever (5, 78, 100, 20, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (70, 40, 2, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (40, 30, -1));

/*This call prints error*/
printf ("%d\n", lowest_ever (-1)); /* ADDON*/


return 0;
}

[attachment deleted by admin]

פורסם

א. עשית = במקום ==.

ב. לא יצאת מהפונקציה במקרה הזה.

פורסם
  • מחבר

א. :kopfpatsch:

ב. מותר לי לעשות כך ? ומדוע יוצא לי ERROR5 במקום ERROR ?


#include <stdarg.h>
#include <stdio.h>

int lowest_ever (int frst,...)
{
va_list mylist;
static int lowest_num=101;
static int next_num;

va_start (mylist, frst); /*Initialize the argument list*/

next_num= va_arg(mylist, int);

if (frst <lowest_num)
lowest_num= frst;
if (frst == -1)
{
return (printf("ERROR"));
}
while (next_num!=-1)
{
if (next_num <lowest_num)
lowest_num= next_num;
next_num = va_arg(mylist, int);
}


va_end (mylist); /*Clean up */
return lowest_num;
}

int
main (void)
{
/*This call prints 5*/
printf ("%d\n", lowest_ever (5, 78, 100, 20, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (70, 40, 2, -1));

/*This call prints 2*/
printf ("%d\n", lowest_ever (40, 30, -1));

/*This call prints error*/
printf ("%d\n", lowest_ever (-1)); /* ADDON*/


return 0;
}

[attachment deleted by admin]

פורסם

^

למה אתה עושה:


return (printf("ERROR"));

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

אז זה מדפיס לך את ה ERROR שב PRINTF, ואחרי זה ה PRINTF שב MAIN מדפיס לך את מה ש PRINTF החזירה (5 תווים למילה ERROR שהודפסה)

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

פורסם
  • מחבר

תשתמש בקוד שגיאה כלשהו שלא חלק מהערכים וב MAIN

איזה קוד שגיאה כזה קיים ?

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

לא הבנתי למה הכוונה ?....
פורסם

אתה מחליט מה יהיה קוד השגיאה.

למשל, תחליט שהפונקציה תחזיר את הערך 9999 שמבחינתך זה שגיאה (במקום שהיא תחזור PRINTF).

ב MAIN, תבדוק מה היא החזירה, אם היא החזירה 9999 אז תדפיס הודעת שגיאה מתאימה.

אני לא מבין למה עשית

return printf("error");

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

לדוגמא, בתוך ה MAIN אתה יכול לעשות כזה דבר לפני שאתה מדפיס ישירות את מה שהפונקציה מחזירה:

result=lowest_ever (70, 40, 2, -1);
if (result!=9999)
printf ("%d\n", result);
else
printf ("ERROR\n");

ארכיון

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

דיונים חדשים