2017-11-11 11 views
0

への入力を複製するので、私たちのC#クラスのために、我々は5つのオブジェクトの配列を作成する必要があり、仕事の説明のための文字列
仕事の予想時間の2倍。
ループ配列

ユーザーが重複したジョブ番号を入力しないようにするには、私のループに必要です。これまでのコードはここまでです。このコードは機能しますが、重複するジョブ番号を許可します。

namespace JobDemo2 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Job[] jobbies = new Job[5]; 
     int x; 
     int jobNum; 
     string customerName; 
     string description; 
     double hours; 
     const double RATE = 45.00; 

     for (x = 0; x < jobbies.Length; ++x)// creates array 
     { 
      GetJobData(out jobNum, out customerName, out description, out hours, jobbies); 
      jobbies[x] = new Job(jobNum, customerName, description, hours);    
     } 

     //Array.Sort(jobbies); 
     Console.WriteLine("The jobs, sorted, are: "); 
     for (x = 0; x < jobbies.Length; ++x) // prints the array values 
     { 
      DisplayJobs(jobbies[x]); 
     } 

     double totalRevenue = (jobbies[0].Hours + jobbies[1].Hours + 
       jobbies[2].Hours + jobbies[3].Hours + jobbies[4].Hours) * RATE; 
     Console.WriteLine(); 
     Console.WriteLine("The total revenue projected is {0}", totalRevenue); 

     Console.ReadKey(); 
    } 

    static void GetJobData(out int jobNum, 
     out string customerName, out string description, out double hours, 
     Job[] jobbies) 
    {     
     string inString; 

     Console.Write("Please enter a job number >> "); 
     inString = Console.ReadLine(); 
     int.TryParse(inString, out jobNum); 

     Console.Write("Please enter the customer's name for this job >> "); 
     customerName = Console.ReadLine(); 

     Console.Write("Please enter the job's description >> "); 
     description = Console.ReadLine(); 

     Console.Write("Please enter the projected hours for the job >> "); 
     inString = Console.ReadLine(); 
     double.TryParse(inString, out hours); 
     Console.WriteLine(); 
    } 

    static void DisplayJobs(Job jobbies) 
    { 
     Console.WriteLine("{0, 5} {1, -10} {2, 6} {3, 8}", 
      jobbies.JobNumber, jobbies.Customer, jobbies.Description, jobbies.Hours); 
    } 
} 

class Job //object 
{ 
    private double hours; 
    private double price; 
    public const double RATE = 45.00; 
    public Job(int num, string cust, string desc, double hrs) 
    { 
     JobNumber = num; 
     Customer = cust; 
     Description = desc; 
     Hours = hrs; 
    } 
    public int JobNumber { get; set; } 
    public string Customer { get; set; } 
    public string Description { get; set; } 
    public double Hours 
    { 
     get 
     { 
      return hours; 
     } 
     set 
     { 
      hours = value; 
      price = hours * RATE; 
     } 
    } 
    public double Price 
    { 
     get 
     { 
      return price; 
     } 
    } 
    public override string ToString() 
    { 
     return (GetType() + " " + JobNumber + " " + Customer + " " + 
      Description + " " + Hours + " hours @" + RATE.ToString("C") + 
      " per hour. Total price is " + Price.ToString("C")); 
    } 
    public override bool Equals(Object e) 
    { 
     bool equal; 
     Job temp = (Job)e; 
     if (JobNumber == temp.JobNumber) 
      equal = true; 
     else 
      equal = false; 
     return equal; 
    } 
    public override int GetHashCode() 
    { 
     return JobNumber; 
    } 
} 
} 

教師は、オブジェクトを比較する別のループの広告をクラスに提案しています。どのようなループのように見えるだろうか?ここで

は彼女のメールです:ループはブール変数を作成するための

ヘルプ。
あなたの配列をループして、情報を入力してbool変数をtrueに設定するようにユーザーに依頼します。

もう1つのforループは、クラス内のequalsメソッドを呼び出して、配列内の各オブジェクトに入力したばかりのジョブを比較します。これは、オブジェクトとオブジェクトを比較する必要があるため、ほとんどの場合、オブジェクト全体に対してジョブ番号のインタジェクタを比較する必要があるためです。オブジェクトが等しい場合、boolはfalseに設定されます。

boolが間違っている間に、間違った番号を入力して再度入力するように伝えたいとします。ここでブール値をtrueに設定し、同じ値をループに戻して再度比較します。数字が偽のままである限り、ユーザーはこのwhileループで立ち往生します。彼らが正しい番号を入力すると、それは打ち切られます。

+0

これまでに何を試しましたか? 'Equals'を呼び出すときにどんなエラーがありますか? – casiosmu

+0

したがって、iveは次のようなforループを作成しようとしました。
for(x = 0; x <2; ++ x) { Equals(); } x <2の代わりにこれが間違っていることは分かっていますが、何が重複していないかをループする必要があり、Equalsメソッドに渡す必要がある内容がわかりません。私はここで構文がわからない。 – James

+0

辞書を使ってみませんか?必要な場合は配列に変換できます。 –

答えて

1

これは宿題ですので、私はあなたにいくつかのポインタをあげる:

  1. GetJobDataにジョブを保存する配列(jobbies)には手をしないでください。この方法には、ジョブデータの取得という1つの懸念だけが必要です。データに重複がある場合はIdですが、それは問題ではありません。

  2. 重複を確認するヘルパーメソッドを作成します。何が必要ですか?以前のすべてのジョブ、存在するジョブの数、および検証に必要な新しいジョブが必要です。次の署名は正しく表示されます:

    private static bool CheckIfNewJobIsValid(Job newJob, 
                 Job[] jobs, 
                 int jobsValidatedCount) 
    

    このメソッドは何をする必要がありますか?最初のjobsValidatedCountジョブをループしてjobsに入れるだけで、newJobがそれらのどれかと一致するかどうか確認する必要があります。そうなった場合は、返品を取り消し返すfalse。ループが終了するとtrueを返すことができますが、一致するものは見つかりませんでした。

  3. jobsValidatedCountは、新しいカウンタである必要はありません。コード内の既存の変数が既にその情報を提供している可能性があります。

幸運を祈る!

P.D.

public override bool Equals(Object e) 
{ 
    bool equal = false; 
    Job temp = e as Job; 

    if (Job != null && JobNumber == temp.JobNumber) 
    { 
     equal = true; 
    } 

    return equal; 
} 

P.D.:これは、すでにあなたの教師によって受け継がれたので、私はほんの少しEquals方法を修正しますAlexei Levenkovがコメントで指摘しているように、JobNumberについてはEquals onyを使用しています。 JobNumberの2つのジョブは、他のすべてのプロパティの値に関係なく実際に等しいですか?それは一番言っても紛らわしいかもしれません。より良い方法はCheckIfNewJobIsValidの中でJobNumberを直接チェックし、Equalsを使用しないことですが、その使用は学術的な理由によるものと思います。

+0

サイドノート:プロパティの半分だけを比較する 'Equals'は、将来の混乱の恐ろしいソースです。どの教師が学生を育成しているのかわからない - 「私の仕事の話」のようなものが必要だ。 –

+0

@AlexeiLevenkov非常に真実だが、私はそれを指摘するだろう。私は、この例は多くの面でベストプラクティスを正確に教えるものではありませんが、「優先」と「同等」の使用を理解していると思います。 – InBetween