עבור לתוכן

שאלה ב C#

Featured Replies

פורסם

יש לי שאלה שאני מנסה לפתור ואני לא בטוח בדרך פעולה שלי

השאלה : 71781973.jpg

וזה מה שאני עשיתי:

static void Main()
{

}

static void Sum2Biggest(int n)
{

int Fmax = 0;
int Smax = 0;
int sum;
Console.WriteLine("Enter Val numbers:");
n = int.Parse(Console.ReadLine());
for (int i = 0; i <= n; i++)
{
Console.WriteLine("Enter Number:");
int val = int.Parse(Console.ReadLine());
if (Math.Max(Fmax, val))
Fmax = val;
else
if (Math.Max(Smax, val))
Smax = val;

}
sum = Fmax + Smax;
}

פורסם
  • מחבר

טוב מחקתי את ה Math.Max ובמקום פשוט רשמתי

if (val >Fmax)

Fmax=val;

פורסם

אכן זה מה שאתה אמור לעשות. Math.Max זו פונקציה שמחזירה מספר, ולא ערך אמת/שקר.

שים לב לכמה טעויות קטנות:

א. אתה קורא n+1 מספרים, לא n.

ב. אתה לא מתייחס למקרה שבו הקלט מכיל מספרים שליליים (בזה שהגדרת Fmax=0 ו-Smax=0 הנחת שכל המספרים לא קטנים מ-0).

ג. הבדיקה שלך לא מדוייקת. תחשוב מה קורה כשאתה קורא את המספרים 2,3,7 (בסדר הזה, משמאל לימין). מה יהיה Fmax ומה יהיה Smax?

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

ה. טיפ קטן: אחרי if/else/for/while תמיד תמיד תמיד תשתמש בסוגריים מסולסלים, גם כשזה לא חובה. דהיינו, במקום ככה:

if (val > Fmax)
Fmax = val;

תכתוב ככה:


if (val > Fmax)
{
Fmax = val;
}

זה הופך את הקוד ליותר קריא ומונע טעויות בעתיד.

פורסם
  • מחבר

לגבי מספרים שליליים, אם יכניסו לדוגמא -8 אז הוא לא יכנס ל=FMAX וגם לא ל-SMAX ואז הוא פשוט ימשיך להריץ את הלולאה עד סופה לא ?

לגבי אם המספרים יוכנסו ככה: 2,3,7 באמת כולם יכנסו רק ל-FMAX וכלום לא יגיע ל-SMAX....יש לך הצעות איך לסדר את זה ?

פורסם

לגבי מספרים שליליים, אם יכניסו לדוגמא -8 אז הוא לא יכנס ל=FMAX וגם לא ל-SMAX ואז הוא פשוט ימשיך להריץ את הלולאה עד סופה לא ?

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

לגבי אם המספרים יוכנסו ככה: 2,3,7 באמת כולם יכנסו רק ל-FMAX וכלום לא יגיע ל-SMAX....יש לך הצעות איך לסדר את זה ?

תחשוב על זה בעצמך :) זה הקטע בתרגיל. אתה פשוט צריך לשים קצת יותר ifים.

פורסם
  • מחבר

בעצם עכשיו שאני חושב על זה במקרה של 2,3,7 Math.MAX אמור לפתור לי את הבעיה הזאת לא ??

פורסם

איך בדיוק? אל תנחש, תנסה לפתור בעצמך. תחשוב מה קורה אחרי שקראת את 2 ו-3, ואתה עכשיו קורא את 7. מה מכילים Fmax ו-Smax? מה הם צריכים להכיל אחרי שקראת את 7? איזה ifים אתה יכול לעשות כדי לדאוג לזה?

פורסם
  • מחבר

אז זהו זאת בידיוק הבעיה...השתמשתי כבר בעבר ב- MATH.MAX וזה נתן לי את המספר הגדול יותר, ועכשיו כשאני מציב

if (Math.Max(val,Fmax))

זה נותן לי שגיאה על BOOL שלא יכול להמיר INT ל-BOOL...אני לא זוכר שהייתי צריך להתנות את MATH.MAX ב-BOOL...

פורסם
  • מחבר

לא לא טעות שלי MATH.MAX לא אמור לפתור את זה

פורסם

כבר אמרתי לך קודם כל שימוש בהשוואה במקום ב-Max:

אכן זה מה שאתה אמור לעשות. Math.Max זו פונקציה שמחזירה מספר, ולא ערך אמת/שקר.

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

נ.ב. כשאתה רוצה להוסיף משהו להודעה אתה יכול פשוט לערוך אותה. לא צריך תגובה נוספת.

פורסם
  • מחבר

טוב זה מה שעשיתי, פשוט הוספתי חלק קטן בלי IF בלי כלום:

if (val > Fmax)
{
Smax = Fmax; - זה מה שהוספתי
Fmax = val;
}
else
if (val > Smax)
Smax = val;

עשיתי לזה סימולציות נראה לי שזה מסדר את העיניין אלא אם פספסתי פה משהו...?

ככה אם לדוגמא יש את הרצף 2,5,3...זה עובד חלק

פורסם

יותר טוב :)

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

נ.ב. כדאי לך לתקן את ההזחה שלך, לפי הכללים הבאים:

א. הסוגריים המסולסלים צריכים להיות באותה רמת הזחה כמו ה-if שלהם.

ב. ה-else גם צריך להיות באותה רמת הזחה.

ג. כשיש else if שמים אותם באותה שורה.

ד. כמו שאמרתי קודם - אחרי כל if שמים סוגריים מסולסלים, גם אם הוא מכיל רק פקודה אחת.

פורסם
  • מחבר

יש לי עוד שאלה קטנה

http://www.fastup.co.il/images/64584325.jpg

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

 static int[] OddsDividedByNum(int[] arr, int num)
{
int count = 0;
for (int i = 0; i < arr.Length; i++)
{
if (IsNotZogi(arr[i]) && (DividedByNum(arr[i],num)))
{
count++;
}
}
int[] arr2 = new int[count];
for (int i = 0,j=0; i < arr.Length; i++)
{
if (IsNotZogi(arr[i]) && (DividedByNum(arr[i], num)))
{
arr2[j] = arr[i];
j++;
}
}





static bool IsNotZogi(int num)
{
if (num % 2 != 0)
return true;
else
return false;
}
static bool DividedByNum(int num1, int num2)
{
if ((num1 % num2) == 0)
return true;
else
return false;
}

פורסם

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

ארכיון

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

דיונים חדשים