お土産を人に分配するプログラム内で、お土産の数を計算するクラスを作りました。お土産を人数で割ったときの余剰分を、リストの上にいる人から一つずつわけていくことを意図しています。(あるいは、トランプを一枚ずつ配るときのように、全員にお土産を1つずつ順番に配っていき、お土産がなくなるまで続ける方法も可です。)
しかし、せっかく分配のためのコードを書いたものの、return値があるため、最後のdivision + 1が適応されて、すべての人に同じ数でtotalSouvenirsの数を超えたかたちになってしまいます。なにかよい方法はないものでしょうか。もしくは、intでなくて、voidにしたらうまく行くでしょうか。解決法を探しています。
C#
1class SouvenirDistribution 2 { 3 4 public int Distribute(int totalSouvenirs, List<Person> p) 5 { 6 7 int numberOfPpl = p.Count; 8 int division = totalSouvenirs / numberOfPpl; 9 int remainder = totalSouvenirs % numberOfPpl; 10 int result = 0; 11 int i = 0; 12 13 14 if (remainder == 0) 15 { 16 for (i = 0; i < p.Count; i++) 17 { 18 result = division; 19 20 } 21 22 } 23 24 25 else if(i<remainder) 26 { 27 for (i = remainder; i < p.Count; i++) 28 { 29 result = division; 30 31 } 32 for (i = 0; i < remainder; i++) 33 { 34 result = division + 1; 35 } 36 37 } 38 39 return result; 40 41 } 42 } 43} 44
メインウィンドウ内のDistributeメソッド適用箇所です↓BtnDivide_Clickは、ボタンにより分配が実行されます。
C#
1//nameとageプロパティが入っています↓ 2List<Person> names = new List<Person>(); 3 4 private void BtnDivide_Click(object sender, RoutedEventArgs e) 5 { 6 SouvenirDistribution sd = new SouvenirDistribution(); 7 int totalSouvenirs = int.Parse(TxtTotalSouvenirs.Text); 8 9 int i = 0; 10 int numberOfSouvenirs = sd.Distribute(totalSouvenirs,names); 11 for(i = 0; i < names.Count; i++) 12 { 13 //Personクラス内のToString()メソッド内の内容で構成された人名リストに、お土産の分配数が追加される形です。 14 NameList.Items[i] += $" {numberOfSouvenirs} 個"; 15 16 } 17
こちらが、Personクラスです。
C#
1 public class Person 2 { 3 4 //プロパティ 5 public int Age { get; set; } 6 public string FirstName { get; set; } 7 public string LastName { get; set; } 8 public string Name { get; set; } 9 10 //コンストラクタ 11 public Person(string name, int age) 12 { 13 Age = age; 14 Name = name; 15 } 16 17 // 名前リストに表示される内容 「名前,年齢才」 18 public override string ToString() 19 { 20 return Name + ", " + Age + "才"; 21 22 } 23 24 }
回答3件
あなたの回答
tips
プレビュー