צריך עזרה קטנה במתודה ב-C#

פורום רשתות, IT ומחשוב כללי - רשתות, ראוטרים, מחשבים ניידים, אביזרים וכו'.
שלח תגובה
gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #1 

יש לי מתודת BOOL שמקבלת בחתימה שלה 2 פרמטרים: ID של קבוצה ומחזירה ערך ב-OUT.

אני עושה לולאה של המערך של הקבוצות שיש לי ( המערך נקרא AllTeamsArray) ובודק עם ה-ID שהמתודה מקבלת שווה ל-ID של אחת הקבוצות במערך.
אני עושה if ואם זה שווה היא מחזירה true ואת הערך ב-out ואם לא אז ב-else היא מחזירה false.
הבעיה שלי שאם אני מחזיר true או false ב-if וב-else הקומפיילר מצפה לעוד החזרת ערך מחוץ ל-for ואין לי מושג איך להתגבר על זה:

קוד: בחירת הכל

        public bool GetTeam(int teamID, out Team team)
        {
            team = null;

            for &#40;int i = 0; i < AllTeamsArray.Length; i++&#41;
            &#123;
                if &#40;AllTeamsArray&#91;i&#93;.Team_ID == teamID&#41;
                &#123;
                    team = AllTeamsArray&#91;i&#93;;
                    return true;
                &#125;

                else
                &#123;
                    return false;
                &#125;                
            &#125;            
        &#125;
[/code]

בדוגמא פה יש לי שגיאת קומפילציה כי הקומפיילר מצפה מחוץ ללולאת for לעוד ערך מוחזר (true או false)

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #2 

שים לב לקוד שלך. IF\ELSE זה בלוק אחד, מה שאומר שאם הIF לא מבוצע, מתבצע הELSE.
לכן, בבדיקה הראשונה שלך (עבור i בערך 0) הוא ילך לELSE, ויחזיר FALSE. מה שאומר, שאתה בודק תמיד רק את מיקום 0 במערך שלך.
בשביל לבדוק את כל המערך, תוציא את בלוק הELSE מחוץ ללולאת הFOR.
ככה מה שיקרה, זה אם במערך יש קבוצה עם ID מתאים הוא יחזיר TRUE ואת הקבוצה.
אבל, אם הוא עבר על כל המערך, הוא יחזיר FALSE. שזה מה שאתה מחפש.

DeaglinG
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 537
הצטרף: ינואר 2009
נתן תודות: 4 פעמים
קיבל תודות: 141 פעמים

שליחה #3 

אתה צריך למחוק את ה-ELSE לגמרי, ולהשאיר רק את הבדיקה של ה-ID.
מחוץ ל-FOR תכתוב Return false.

אם המתודה סיימה את הריצה בלי להתאים שום ID אז אין קבוצה מתאימה וצריך להחזיר false.

במקרה שסימנת עכשיו אתה לא בודק את כל האפשרויות כי נגיד ואתה מעביר ID=5 אז בבדיקה של ID=0 אתה תגיע ל-Else ותצא מהמתודה

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #4 

עדיין לא טוב.

קוד: בחירת הכל

        public bool GetTeam&#40;int teamID, out Team team&#41;
        &#123;
            team = null;

            for &#40;int i = 0; i < AllTeamsArray.Length; i++&#41;
            &#123;
                if &#40;AllTeamsArray&#91;i&#93;.Team_ID == teamID&#41;
                &#123;
                    team = AllTeamsArray&#91;i&#93;;
                    return true;
                &#125;
            &#125;

            return false;
        &#125;
אין שגיאת קומפילציה אבל ל-false הוא יגיע בכל מקרה.

hrox
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 816
הצטרף: נובמבר 2005
נתן תודות: 33 פעמים
קיבל תודות: 14 פעמים

שליחה #5 

יש לך שגיאה תכנותית. איך שזה כתוב כרגע באיטרציה הראשונה של הלולאה, אם הוא לא מוצא את הקבוצה, הוא ייצא ב false. אתה צריך לבטל את ה else ולעשות return false מחוץ ללולאה. זה גם ייפתור לך את שגיאת הקומפילציה שנובעת מאפשרות שהמערך ריק. במקרה כזה התכנית לא תכנס ללואה בכלל, מה שיביא למצב שלא מוגדר לפונקציה ערך מוחזר.

עריכה:
הקדימו אותי... :lol: אני לא מחדש כאן מעבר למה שנאמר כבר.

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #6 

gshhar כתב:עדיין לא טוב.

קוד: בחירת הכל

        public bool GetTeam&#40;int teamID, out Team team&#41;
        &#123;
            team = null;

            for &#40;int i = 0; i < AllTeamsArray.Length; i++&#41;
            &#123;
                if &#40;AllTeamsArray&#91;i&#93;.Team_ID == teamID&#41;
                &#123;
                    team = AllTeamsArray&#91;i&#93;;
                    return true;
                &#125;
            &#125;

            return false;
        &#125;
אין שגיאת קומפילציה אבל ל-false הוא יגיע בכל מקרה.
...
למה לא טוב?

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #7 

כי בוא נניח שהוא כן מוצא את הקב' ומחזיר TRUE ואת הערך ב-OUT, עכשיו הוא יוצא מהלולאת FOR ומחזיר FALSE.

DeaglinG
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 537
הצטרף: ינואר 2009
נתן תודות: 4 פעמים
קיבל תודות: 141 פעמים

שליחה #8 

אם הוא מחזיר true הוא לא ממשיך את המתודה הוא יוצא ממנה באמצע..

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #9 

ואגב אחרי שאני יוצר קבוצה מסויימת אני לא מצליח להגיע ל-AddTeam ואין לי מושג למה.

אני שפוט יוצר אובייקט של קבוצה:

קוד: בחירת הכל

FootballTeam ft1 = new FootballTeam&#40;10, "Maccabi Tel Aviv"&#41;;
אחכ אני רושם ft1. ואין לי את AddTeam

זה הקוד שלי: (ה-AddTeam נמצא ב-Class TeamList)

קוד: בחירת הכל

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;

namespace test
&#123;
    public class IncorrectTeamID &#58; ApplicationException
    &#123;
        public IncorrectTeamID&#40;string message&#41;
            &#58; base&#40;message&#41;
        &#123;
        &#125;
    &#125;

    public class Game
    &#123;
        int HostTeamID;
        int GuestTeamID;
        int HostGoals;
        int GuestGoals;

        public Game&#40;int hostTeamId, int guestTeamID, int hostGoals, int guestGoals&#41;
        &#123;
            this.HostTeamID = hostTeamId;
            this.GuestTeamID = guestTeamID;
            this.HostGoals = hostGoals;
            this.GuestGoals = guestGoals;
        &#125;

        public int Host_Team_ID
        &#123;
            get &#123; return this.HostTeamID; &#125;
        &#125;

        public int Guest_Team_ID
        &#123;
            get &#123; return this.GuestTeamID; &#125;
        &#125;

        public int Host_Goals
        &#123;
            get &#123; return this.HostGoals; &#125;
        &#125;

        public int Guest_Goals
        &#123;
            get &#123; return this.GuestGoals; &#125;
        &#125;

        public override string ToString&#40;&#41;
        &#123;
            return "Host Team ID &#58;" + HostTeamID + "Host Team Goals&#58; " + HostGoals + "Guest Team ID&#58; " + GuestTeamID + "Guest Team Goals&#58; " + GuestGoals;
        &#125;
    &#125;

    public abstract class Team &#58; IComparable
    &#123;
        int TeamID;
        string TeamName;
        int gameCount = 0;
        Game&#91;&#93; GamesArray = new Game&#91;50&#93;;

        public Team&#40;int teamID, string teamName&#41;
        &#123;
            if &#40;teamID < 1 || teamID > 24&#41;
            &#123;
                throw new IncorrectTeamID&#40;"Team ID Should Be between 1 and 24&#58; " + teamID&#41;;
            &#125;

            this.TeamID = teamID;
            this.TeamName = teamName;
        &#125;

        public void AddGame&#40;Game game&#41;
        &#123;
            GamesArray&#91;gameCount&#93; = game;
            gameCount++;
            
        &#125;

        public int Team_ID
        &#123;
            get &#123; return this.TeamID; &#125;
        &#125;

        public string Team_Name
        &#123;
            get &#123; return this.TeamName; &#125;
        &#125;

        public override string ToString&#40;&#41;
        &#123;
            return TeamID + "\t" + TeamName + "\t";
        &#125;

        public int Score
        &#123;
            get &#123; return Score; &#125;
        &#125;

        public int GameCount&#40;&#41;
        &#123;
            return this.gameCount;
        &#125;

        public int GameCount&#40;Team t2&#41;
        &#123;
            int count = 0;

            for &#40;int i = 0; i < GamesArray.Length; i++&#41;
            &#123;
                if &#40;t2.TeamID == GamesArray&#91;i&#93;.Host_Team_ID || t2.TeamID == GamesArray&#91;i&#93;.Guest_Team_ID&#41;
                &#123;
                    count++;
                &#125;
            &#125;

            return count;
        &#125;

        public int CompareTo&#40;object obj&#41;
        &#123;
            throw new NotImplementedException&#40;&#41;;
        &#125;
    &#125;

    public class FootballTeam &#58; Team
    &#123;
        public FootballTeam&#40;int teamID, string teamName&#41;
            &#58; base&#40;teamID, teamName&#41;
        &#123;
        &#125;

        //public int Score
        //&#123;
        //    get
        //    &#123;
                 
        //    &#125;
        //&#125;
    &#125;

    public class BasketballTeam &#58; Team
    &#123;
        public BasketballTeam&#40;int TeamID, string TeamName&#41;
            &#58; base&#40;TeamID, TeamName&#41;
        &#123;
        &#125;

        public int Score
        &#123;
            get
            &#123;
                return 0;
            &#125;
        &#125;
    &#125;

    public class TeamList
    &#123;
        Team&#91;&#93; AllTeamsArray = new Team&#91;24&#93;;
        int TeamCount = 0;

        public void AddTeam&#40;Team t&#41;
        &#123;
            AllTeamsArray&#91;TeamCount&#93; = t;
            TeamCount++;
        &#125;

        public bool GetTeam&#40;int teamID, out Team team&#41;
        &#123;
            team = null;

            for &#40;int i = 0; i < AllTeamsArray.Length; i++&#41;
            &#123;
                if &#40;AllTeamsArray&#91;i&#93;.Team_ID == teamID&#41;
                &#123;
                    team = AllTeamsArray&#91;i&#93;;
                    return true;
                &#125;
            &#125;

            return false;
        &#125;
    &#125;

    class Program
    &#123;
        static void Main&#40;string&#91;&#93; args&#41;
        &#123;
            //games
            #region
            Game g1 = new Game&#40;1, 2, 3, 1&#41;;
            Game g2 = new Game&#40;2, 1, 6, 4&#41;;
            Game g3 = new Game&#40;1, 3, 0, 4&#41;;
            Game g4 = new Game&#40;1, 3, 2, 2&#41;;
            Game g5 = new Game&#40;1, 2, 3, 6&#41;;
            Game g6 = new Game&#40;2, 1, 0, 0&#41;;
            Game g7 = new Game&#40;2, 3, 4, 0&#41;;
            Game g8 = new Game&#40;3, 2, 0, 1&#41;;
            Game g9 = new Game&#40;2, 3, 0, 0&#41;;
            Game g10 = new Game&#40;2, 1, 0, 0&#41;;
            Game g11 = new Game&#40;3, 1, 4, 3&#41;;
            Game g12 = new Game&#40;2, 3, 3, 1&#41;;
            Game g13 = new Game&#40;3, 2, 1, 0&#41;;
            Game g14 = new Game&#40;3, 2, 5, 0&#41;;
            Game g15 = new Game&#40;2, 3, 2, 3&#41;;
            #endregion


            //teams
            #region
            FootballTeam ft1 = new FootballTeam&#40;10, "Maccabi Tel Aviv"&#41;;
            FootballTeam ft2 = new FootballTeam&#40;11, "Hapoel Tel Aviv"&#41;;
            FootballTeam ft3 = new FootballTeam&#40;12, "Beitar Jerusalem"&#41;;
            #endregion

            //add games
            #region
            ft1.AddGame&#40;g1&#41;;
            ft1.AddGame&#40;g2&#41;;
            ft1.AddGame&#40;g3&#41;;
            ft1.AddGame&#40;g4&#41;;
            ft1.AddGame&#40;g5&#41;;
            ft1.AddGame&#40;g6&#41;;
            ft1.AddGame&#40;g10&#41;;
            ft1.AddGame&#40;g11&#41;;
            ft1.AddGame&#40;g12&#41;;
            ft1.AddGame&#40;g14&#41;;
            ft2.AddGame&#40;g1&#41;;
            ft2.AddGame&#40;g2&#41;;
            ft2.AddGame&#40;g5&#41;;
            ft2.AddGame&#40;g6&#41;;
            ft2.AddGame&#40;g7&#41;;
            ft2.AddGame&#40;g8&#41;;
            ft2.AddGame&#40;g9&#41;;
            ft2.AddGame&#40;g10&#41;;
            ft2.AddGame&#40;g13&#41;;
            ft2.AddGame&#40;g14&#41;;
            ft2.AddGame&#40;g15&#41;;
            ft3.AddGame&#40;g3&#41;;
            ft3.AddGame&#40;g4&#41;;
            ft3.AddGame&#40;g7&#41;;
            ft3.AddGame&#40;g8&#41;;
            ft3.AddGame&#40;g9&#41;;
            ft3.AddGame&#40;g11&#41;;
            ft3.AddGame&#40;g13&#41;;
            ft3.AddGame&#40;g15&#41;;
            #endregion

            Console.WriteLine&#40;"Team ID\t" + "Team Name" + "\n------------------------"&#41;;

            Console.WriteLine&#40;ft1.ToString&#40;&#41;&#41;;
            Console.WriteLine&#40;ft2.ToString&#40;&#41;&#41;;
            Console.WriteLine&#40;ft3.ToString&#40;&#41;&#41;;

            int a = ft1.GameCount&#40;&#41;;
            int b = ft2.GameCount&#40;&#41;;
            int c = ft3.GameCount&#40;&#41;;

            Console.WriteLine&#40;a&#41;;
            Console.WriteLine&#40;b&#41;;
            Console.WriteLine&#40;c&#41;;            

            //int d = ft1.GameCount&#40;ft3&#41;;
            //Console.WriteLine&#40;d&#41;;

            int e = ft1.Score;
            Console.WriteLine&#40;e&#41;;


            Console.ReadLine&#40;&#41;;
        &#125;
    &#125;
&#125;

DeaglinG
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 537
הצטרף: ינואר 2009
נתן תודות: 4 פעמים
קיבל תודות: 141 פעמים

שליחה #10 

בגלל שה-AddTeam נמצא ב-Class של ה-Teamlist אז הוא לא יופיע לך תחת ft1 בגלל שזה מסוג Class בשם FootballTeam.
אתה צריך ליצור אובייקט TeamList ואז דרכו להוסיף את ft1.
משהו כזה:

קוד: בחירת הכל

TeamList ListOfTeams = new TeamList
ListOfTeams.AddTeam&#40;ft1&#41;
ועוד משהו ששמתי לב אליו בלי קשר,
במתודה שדרסת בשם ToString, כדאי לך מאוד להשתמש ב-String.Format
בצורה שעשית את זה עכשיו זה מאוד לא טוב מבחינת ביצועים + אני כבר רואה שיש לך שם בעיה ברווחים בין המילים

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #11 

אוקיי תודה אני יבדוק.

אגב עוד משהו שלא ממש הולך לי ואשמח לעזרה זה ה-int Score
אני מתכוון שצריך לממש את ה-int Score ב-class FootballTeam וב-class BasketballTeam אבל לפני זה לכתוב את הפרופרטי הזה ב-Class Team (רשום abstract property that gives the score of the team) ואת זה עשיתי אבל ב-class FootballTeam וב-class BasketballTeam אני צריך לממש אותו (2 נק' לניצחון בכדורסל 1 להפסד ובכדורגל 3 לניצחון 1 לתיקו) ואת זה אני לא מצליח.

עריכה:

בעניין המתודה שבעינינה פתחתי את הפוסט אז צדקתם וזה עובד.

שלח תגובה

חזור אל “רשתות, אינטרנט ו- Fiber”