עבור לתוכן

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

Featured Replies

פורסם

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

בעיקרון אתה צריך לולאת WHILE אחת שתסתיים כשהקלט הוא -1,

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

ובסוף כמובן לפלוט אותו...

מקווה שהבנת את הרעיון.. אם אתה צריך עזרה בביצוע דבר איתי!

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

תיאורטית כן, אבל אז צריך להתעסק עם מבני נתונים, וסיבוכיות הזכרון עולה מ-(O(1 ל-(O(n.

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

פורסם
  • מחבר

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

בעיקרון אתה צריך לולאת WHILE אחת שתסתיים כשהקלט הוא -1,

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

ובסוף כמובן לפלוט אותו...

מקווה שהבנת את הרעיון.. אם אתה צריך עזרה בביצוע דבר איתי!

מכיוון שאני לקראת פתרון, אני חושב שאני אדבוק בשיטה הנוכחית מלבד זה שלא ממש שואלים על מבני נתונים בד"כ בבחינה...:)

כשאתה עושה lowest_num=frst' date=' אתה מאבד את הערך שלו מההפעלות הקודמות של הפונקציה. למעשה, זה כאילו לא הגדרת אותו להיות סטטי בכלל.

[/quote'] באיזו פקודה אני אמור להחליף את זה ע"מ שהתוכנית תעבוד ? (היא כבר גמורה אני רק צריך את התוספת הקטנה הזו... ::))

פורסם

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

פורסם
  • מחבר

הוא לא נותן לי, הוא רושם: initializer is not a constant :nixweiss:


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

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

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


next_num= va_arg(mylist, int);

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 (90, 78, 5, 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;
}

פורסם
  • מחבר

גם לא עובד... נותן לי הכל אפסים... :'(


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

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

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


next_num= va_arg(mylist, int);

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 (90, 78, 5, 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;
}

פורסם

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

פורסם
  • מחבר

כן אבל לכל ערך שאני מאתחל אותו אני מקבל פשוט אותו בפלט.

אם אני ארשום 1- באתחול אני אקבל בתדפיס 3 פעמים 1- ואם אני ארשום 1 אני אקבל 3 פעמים 1...

פורסם

זה כי 1- ו-1 קטנים יותר מכל המספרים שאתה מזין לפונקציה.

קרא שוב את התרגיל ותחשוב איך אפשר לאתחל אותו.

פורסם
  • מחבר

כמו הסרט (101 כלבים וגנבים ;))

תודה יואב !!

פורסם

בבקשה.

אגב, שים לב שעדיין יש לך שני באגים קטנים:

מה קורה אם האיבר הקטן ביותר הוא הארגומנט הראשון? לדוגמה, (lowest_ever(3,5,6,-1?

מה קורה אם לא מועבר שום מספר לרשימה, פרט ל-1-? כלומר, (lowest_ever(-1?

פורסם
  • מחבר

את התנאים האלה אני יכול להוסיף פשוט בתוך ה- while נכון ? אין לי מה לשנות מחוץ ל- while במקרי הקצה האלה נכון ? :silly:

פורסם
  • מחבר

חשבתי להכניס for-ים נוספים לתוך ה- while אבל זאת כנראה לא הדרך... :-[

יש מצב לרמז ?

ארכיון

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

דיונים חדשים