C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C#のソートについて


(過去ログ 94 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■56257 / inTopicNo.1)  C#のソートについて
  
□投稿者/ のびた (1回)-(2011/01/07(Fri) 00:19:49)

分類:[C#] 

C#、およびNUnitを使ったテストコードの勉強をしています。
C#でソートについて勉強しています。
以下のファイルの問題(問2の野球大会)を解いてみようと思っています。

http://web-ext.u-aizu.ac.jp/pc-concours/2010/03/pdf/2009yosen.pdf

自分で以下のように考えてみました。

///////program

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

namespace 野球大会
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine("野球大会\r\n★終了するには「0」を入力してください★");
            System.Console.WriteLine();

            Console.WriteLine("チーム数を入力してください");
            string チーム数 = Console.ReadLine();
            if (チーム数 == "" || int.Parse(チーム数) < 2 || int.Parse(チーム数) > 10)
            {
                中断メッセージ();
                return;
            }

            チームリスト チームList = new チームリスト();
            ArrayList 出力list = new ArrayList();

            do
            {
                for (int ii = 0; ii < int.Parse(チーム数); ii++)
                {
                    Console.WriteLine("チーム情報を入力してください");
                    Console.Write("チーム名: ");
                    string Name = Console.ReadLine();
                    int 成績合計 = 0;
                    for (int j = 0; j < int.Parse(チーム数) - 1; j++)
                    {
                        string data = Console.ReadLine();
                        if (data == "" || int.Parse(data) < 0 || int.Parse(data) > 2)
                        {
                            中断メッセージ();
                            return;
                        }
                        if (チームList.Count != int.Parse(チーム数))
                        {
                            成績合計 = 成績合計 + int.Parse(data);
                        }
                    }
                    //チーム情報をリストに追加
                    チームList.Add(new チーム情報() { 名前 = Name, 成績 = 成績合計 });
                }

                チームList.成績順Sort();

                string[] 結果 = new string[int.Parse(チーム数)];
                for (int i = 0; i < チームList.Count; i++)
                    結果[i] = チームList[i].名前;
                出力list.Add(結果);
                チームList.Clear();

                Console.WriteLine("チーム数を入力してください");
                チーム数 = Console.ReadLine();
            } while (チーム数 != "0");

            //結果を表示
            Console.WriteLine("★---結果---★");
            foreach (IList _結果 in 出力list)
            {
                foreach (string ss in _結果)
                    Console.WriteLine(ss);
                Console.WriteLine("+-☆-+");
            }
            System.Console.ReadLine();
        }

        private static void 中断メッセージ()
        {
            System.Console.WriteLine("データが不正です。終了します。");
            System.Console.ReadLine();
        }
    }
}


//////////チームりすと

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

namespace 野球大会
{
    public class チームリスト
    {
        public void Add(チーム情報 _チーム情報)
        {
            m_チームリスト.Add(_チーム情報);
        }

        public チーム情報 this[int index]
        {
            get { return m_チームリスト[index]; }
        }

        public int Count
        {
            get { return m_チームリスト.Count; }
        }

        public void Clear()
        {
            m_チームリスト.Clear();
        }

        public void 成績順Sort()
        {
            for (int i = 0; i < m_チームリスト.Count - 1; i++)
            {
                int 成績Result = m_チームリスト[i].成績.CompareTo(m_チームリスト[i + 1].成績);

                if (成績Result == 1)
                {
                    チーム情報 temp;
                    temp = m_チームリスト[i];
                    m_チームリスト[i] = m_チームリスト[i + 1];
                    m_チームリスト[i + 1] = temp;
                    成績順Sort();
                }
            }
        }

        private List<チーム情報> m_チームリスト = new List<チーム情報>();
    }

}


///////////////////ちーむ情報

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

namespace 野球大会
{
    public class チームリスト
    {
        public void Add(チーム情報 _チーム情報)
        {
            m_チームリスト.Add(_チーム情報);
        }

        public チーム情報 this[int index]
        {
            get { return m_チームリスト[index]; }
        }

        public int Count
        {
            get { return m_チームリスト.Count; }
        }

        public void Clear()
        {
            m_チームリスト.Clear();
        }

        public void 成績順Sort()
        {
            for (int i = 0; i < m_チームリスト.Count - 1; i++)
            {
                int 成績Result = m_チームリスト[i].成績.CompareTo(m_チームリスト[i + 1].成績);

                if (成績Result == 1)
                {
                    チーム情報 temp;
                    temp = m_チームリスト[i];
                    m_チームリスト[i] = m_チームリスト[i + 1];
                    m_チームリスト[i + 1] = temp;
                    成績順Sort();
                }
            }
        }

        private List<チーム情報> m_チームリスト = new List<チーム情報>();
    }

}

引用返信 編集キー/
■56258 / inTopicNo.2)  Re[1]: C#のソートについて
□投稿者/ のびた (2回)-(2011/01/07(Fri) 00:23:46)
質問の続きです。

テストコードは以下のように考えました。

/////////////てすと チームリスト
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using 野球大会;

namespace Test
{
    public class Testチームリスト
    {
        チームリスト target;

        [SetUp]
        public void SetUp()
        {
            target = new チームリスト();
        }

        [TearDown]
        public void TearDown()
        {
            target = null;
        }

        [Test]
        public void Testチームリスト_Count()
        {
            チーム情報 A = new チーム情報();
            A.チーム("A", 0);
            target.Add(A);
            チーム情報 B = new チーム情報();
            B.チーム("B", 1);
            target.Add(B);
            チーム情報 C = new チーム情報();
            C.チーム("C", 2);
            target.Add(C);

            Assert.AreEqual(3, target.Count);
        }

        [Test]
        public void Testチームリスト_index()
        {
            チーム情報 A = new チーム情報();
            A.チーム("A", 0);
            target.Add(A);
            チーム情報 B = new チーム情報();
            B.チーム("B", 1);
            target.Add(B);
            チーム情報 C = new チーム情報();
            C.チーム("C", 2);
            target.Add(C);

            Assert.AreEqual(A, target[0]);
            Assert.AreEqual(B, target[1]);
            Assert.AreEqual(C, target[2]);
        }

        [Test]
        public void Testチームリスト_Clear()
        {
            チーム情報 A = new チーム情報();
            A.チーム("A", 0);
            target.Add(A);
            チーム情報 B = new チーム情報();
            B.チーム("B", 1);
            target.Add(B);
            チーム情報 C = new チーム情報();
            C.チーム("C", 2);
            target.Add(C);
            Assert.AreEqual(3, target.Count);
            
            target.Clear();
            Assert.AreEqual(0, target.Count);
        }

        [Test]
        public void Testチームリスト_成績順Sort_最小のチーム数()
        {
            チーム情報 A = new チーム情報();
            A.チーム("A", 1);
            target.Add(A);
            チーム情報 B = new チーム情報();
            B.チーム("B", 0);
            target.Add(B);

            target.成績順Sort();
            Assert.AreEqual(B, target[0]);
            Assert.AreEqual(A, target[1]);
        }

        [Test]
        public void Testチームリスト_成績順Sort_最大のチーム数()
        {
            チーム情報 F = new チーム情報();
            F.チーム("F", 6);
            target.Add(F);
            チーム情報 I = new チーム情報();
            I.チーム("I", 7);
            target.Add(I);
            チーム情報 H = new チーム情報();
            H.チーム("H", 6);
            target.Add(H);
            チーム情報 E = new チーム情報();
            E.チーム("E", 8);
            target.Add(E);
            チーム情報 D = new チーム情報();
            D.チーム("D", 6);
            target.Add(D);
            チーム情報 C = new チーム情報();
            C.チーム("C", 10);
            target.Add(C);
            チーム情報 A = new チーム情報();
            A.チーム("A", 4);
            target.Add(A);
            チーム情報 B = new チーム情報();
            B.チーム("B", 7);
            target.Add(B);
            チーム情報 J = new チーム情報();
            J.チーム("J", 9);
            target.Add(J);
            チーム情報 G = new チーム情報();
            G.チーム("G", 7);
            target.Add(G);

            target.成績順Sort();
            Assert.AreEqual(A, target[0]);
            Assert.AreEqual(F, target[1]);
            Assert.AreEqual(H, target[2]);
            Assert.AreEqual(D, target[3]);
            Assert.AreEqual(I, target[4]);
            Assert.AreEqual(B, target[5]);
            Assert.AreEqual(G, target[6]);
            Assert.AreEqual(E, target[7]);
            Assert.AreEqual(J, target[8]);
            Assert.AreEqual(C, target[9]);
        }

        [Test]
        public void Testチームリスト_成績順Sort_任意()
        {
            チーム情報 A = new チーム情報();
            A.チーム("A", 0);
            target.Add(A);
            チーム情報 B = new チーム情報();
            B.チーム("B", 2);
            target.Add(B);
            チーム情報 E = new チーム情報();
            E.チーム("E", 3);
            target.Add(E);
            チーム情報 D = new チーム情報();
            D.チーム("D", 3);
            target.Add(D);
            チーム情報 C = new チーム情報();
            C.チーム("C", 2);
            target.Add(C);

            target.成績順Sort();
            Assert.AreEqual(A, target[0]);
            Assert.AreEqual(B, target[1]);
            Assert.AreEqual(C, target[2]);
            Assert.AreEqual(E, target[3]);
            Assert.AreEqual(D, target[4]);
        }
    }
}


//////////////////////てすと チーム情報

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using 野球大会;

namespace Test
{
    public class Testチーム情報
    {
        チーム情報 target;

        [SetUp]
        public void SetUp()
        {
            target = new チーム情報();
        }

        [TearDown]
        public void TearDown()
        {
            target = null;
        }

        [Test]
        public void Testチームのデータ()
        {
            target.チーム("A", 0);
            Assert.AreEqual("A", target.名前);
            Assert.AreEqual(0, target.成績);
        }
    }
}

という感じです。
もっとシンプルなプログラム、およびテストケースになりそうな気がするのですが。。。
サンプル的なものと解説をしていただけたら非常に助かります。
ご教授宜しくお願いします。

引用返信 編集キー/
■56314 / inTopicNo.3)  Re[2]: C#のソートについて
□投稿者/ επιστημη (2592回)-(2011/01/09(Sun) 12:11:43)
επιστημη さんの Web サイト
2011/01/10(Mon) 09:41:39 編集(投稿者)

僕なら二つのチーム情報を比較し大小関係を教えてくれるメソッドを作る。
さらにそれを使ってチーム情報がソートされているかを判断するメソッドを作る。
こんだけ作っておけばテストが簡単になるんちゃう?

ところで成績順ソートが自分自身を呼んでいるが、大丈夫か?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -