יום רביעי, 30 באפריל 2014

שאלה עם פתרון (צריך לשפץ אותו) מדעי המחשב ב' רשימה list sort

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

המערכת הממוחשבת נעזרת בשתי מחלקות לביצוע המשימה:
1. המחלקה SiteRating המגדירה זוג ערכים: כתובת האתר ומספר הנקודות המצטבר שקיבל. להלן ממשק המחלקה:
הפעולה בונה זוג ערכים: כתובת אתר האינטרנט והניקוד ההתחלתי שקיבל
SiteRating (String url, int points)
הפעולה מחזירה את כתובת האתר הנוכחי
String getURL()
הפעולה מחזירה את מספר הנקודות המצטבר של האתר הנוכחי
int getPoints()
הפעולה מוסיפה ניקוד למספר הנקודות המצטבר
void addPoints (int points)
הפעולה מתארת כתובת האתר ומספר הנקודות המצטבר שקיבל
String toString()

2. המחלקה RatingList המנהלת את "רשימת הרייטינג":
public class RatingList
{
      private List<SiteRating> ratingList; //רשימת הרייטינג
     
//פעולה הבונה רשימת רייטינג ריקה
      public RatingList()
      {
            this.ratingList = new List<SiteRating>();
       }
      
הפעולה מדרגת אתר שכתובתו url ע"י מתן ניקוד ומעדכנת את רשימת הרייטינג על פי הניקוד המצטבר//  
      public void rate(String url, int points)
       {
            // השלימו . . .
       }
     
// הפעולה מתארת את רשימת הרייטינג בצורה ממוינת, בסדר יורד,  על  פי הניקוד המצטבר
      public String toString()
       {
            return this.ratingList.toString();
       }
}
ממש את הפעולה rate(…) החסרה במחלקה RatingList, ע"פ הקריטריונים הבאים:
·         אם האתר דורג בעבר, הפעולה תוסיף לניקוד המצטבר שלו points נקודות.
·         אם זו הפעם הראשונה שהאתר מדורג, הפעולה תוסיף את האתר החדש והניקוד שקיבל לרשימת הרייטינג.
·         בשני המצבים, הפעולה תעדכן את רשימת הרייטינג כך שתישאר ממוינת בסדר יורד על פי הניקוד המצטבר של האתרים.  

לצורך הבהרת המשימה, ניתן להוסיף לצד השאלה את הדוגמה הבאה:
RatingList rl = new RatingList();
           
rl.rate("www.google.com", 9);
rl.rate("www.ynet.co.il", 2);
rl.rate("www.ynet.co.il", 8);
rl.rate("www.google.com", 4);
rl.rate("www.walla.co.il", 7);
rl.rate("www.ynet.co.il", 1);
rl.rate("www.google.com", 10);
rl.rate("www.ynet.co.il", 9);
           
System.out.println(rl);
הפלט שיתקבל:

[www.google.com=23, www.ynet.co.il=20, www.walla.co.il=7]



יש להוסיף unit4.dll (ב add reference)

תכנית ראשית:
using System;
//using System.Collections.Generic;
using Unit4.CollectionsLib;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
   class Program
   {
      
       static void Main(string[] args)
       {
           RatingList rating = new RatingList();
           rating.rate("a", 3);
           rating.rate("aa", 3);
           rating.rate("aaa", 3);
           rating.rate("aaa", 5);
           rating.rate("aa", 3);
         
          //Node <SiteRating> p = rating.get
           Node<SiteRating> p = rating.getlist().GetFirst();
           p = p.GetNext();
         Console.WriteLine( p.GetInfo().getPoints() );
           Console.ReadKey();
       }
   }
}



ratingList מחלקת

using System;
//using System.Collections.Generic;
using Unit4.CollectionsLib;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class RatingList
   {
       private List<SiteRating> ratingList;

       public RatingList()
       {
           this.ratingList = new List<SiteRating>();
       }

       public void rate(string url, int points)
       {
           if (Exist(this.ratingList, url) != null)
                Exist(this.ratingList, url).GetInfo().addPoints(points);
           else
           {

               SiteRating a = new SiteRating(url, points);
               this.ratingList.Insert(null, a);
           }

           sort_list(this.ratingList);
       }

       public string tostring()
       {
           return this.ratingList.ToString();
       }

       public static Node <SiteRating> Exist (List <SiteRating> L, string a)
   {
       Node<SiteRating> p = L.GetFirst();
           
       while (p != null)
       {
       if(p.GetInfo().getURL() == a)
               return p;

           p = p.GetNext();
       }
       return p;
   }

       public static List<SiteRating> sort_list(List<SiteRating> L)
       {
           Node<SiteRating> p = L.GetFirst();
           int mone = 0;
           while (p != null)
           {
               Console.WriteLine("I am here");
               mone++;
               p = p.GetNext();
           }

           SiteRating[] arr = new SiteRating[mone];
           p = L.GetFirst();
           for (int i = 0; i < mone; i++)
           {
               arr[i] = p.GetInfo();
               p = L.Remove(p);
           }
          SiteRating a, b;
           int min = arr[0].getPoints();
           for (int i = 0; i < mone; i++)
           {
               for (int j = 0; j < mone; j++)
               {
                   if (arr[i].getPoints() > arr[j].getPoints())
                   {
                       b = arr[i];
                       a = arr[j];

                       arr[i] = a;
                       arr[j] = b;
                   }

               }
           }

           for (int i = 0; i < mone; i++)
           {
               L.Insert(null, arr[i]);
           }
          
           return L;
       }

       public List<SiteRating> getlist()
       {
           return this.ratingList;
       }

   }
}


מחלקת SiteRating

using System;
//using System.Collections.Generic;
using Unit4.CollectionsLib;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class SiteRating
   {

      private string url;
      private int sum_point;

      public SiteRating(string a, int b)
      {
          this.url = a;
          this.sum_point = b;
      }

      public string getURL()
      {
          return this.url;
      }

      public int getPoints()
      {
          return this.sum_point;
      }

      public void addPoints(int a)
      {
          this.sum_point += a;
      }
   }
}



אין תגובות:

הוסף רשומת תגובה