none
输入5个学生的信息,按成绩排序,程序虽然做出来了,但不完美!求改进!另外求n个学生排序该怎么写 RRS feed

  • 问题

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    //
    //以下程序是将5个学生信息以成绩排序,我想将这个程序改成输入n个学生信息后按成绩排序
    //请问该怎么改?
    //
    namespace ConsoleApplication9
    {
      class StuInfo  //学生信息类
      {
        public string no, name; //声明学号no,姓名name,本来访问修饰符是private,
                    //但这样就不能在class program里直接声明了,所以用public
        public int score;
        public void StuInfo1(string no,string name,int score)//输入学生信息的方法:StuInfo1
        {
          this.no = no;
          this.name = name;
          this.score = score;
        }
        public void putout()//输出学生信息
        {
          Console.WriteLine("学号:{0}  姓名:{1}  成绩:{2}",no,name,score );
        }
        public string sTostring()//把用方法StuInfo1(string no,string name,int score)
                     //得到的数据转换成string
        {
          return no + " " + name + " " + Convert.ToString(score);
     
        }
      }
      class Program
      {
        static void Main(string[] args)
        {
          StuInfo[] stu = new StuInfo[5];//实例化一个StuInfo 数组
          /*  我想这样写,出错了!请问该怎么写?
          str[0].StuInfo1("aa", "ea", 90);
          str[1].StuInfo1("bb", "afb", 50);
          str[2].StuInfo1("cc", "fb", 80);
          str[3].StuInfo1("dd", "fb", 60);
          str[4].StuInfo1("ee", "fb", 99);//*/
    
          StuInfo stu11 = new StuInfo();//以下11行能否合并起来写?怎么写?
          StuInfo stu12 = new StuInfo();
          StuInfo stu13 = new StuInfo();
          StuInfo stu14 = new StuInfo();
          StuInfo stu15 = new StuInfo();
          stu[0]=stu11;stu[1]=stu12;stu[2]=stu13;stu[3]=stu14;stu[4]=stu15;
          stu11.StuInfo1("aa", "ea", 90);//输入学生信息的具体内容
          stu12.StuInfo1("bb", "afb", 50);
          stu13.StuInfo1("cc", "fb", 80);
          stu14.StuInfo1("dd", "fb", 60);
          stu15.StuInfo1("ee", "fb", 99);
          
          for (int j = 0; j < 5; j++)//冒泡法,不是很懂,碰运气做出来的!能否做下解释?
          {
            for (int k = 0; k < 5; k++)
            {
              if (stu[j].score < stu[k].score)
              {
                StuInfo t = stu[j];
                stu[j]=stu[k];
                stu[k] = t;
              }
            }
          }
          int i=0;
          while (i < 5)
          {
            stu[i].sTostring();
            stu[i].putout();
            i++;
          }
          Console.ReadKey();
    
        }
      }
    }
    

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年5月6日 4:11

答案

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    //
    //以下程序是将5个学生信息以成绩排序,我想将这个程序改成输入n个学生信息后按成绩排序
    //请问该怎么改?
    //
    //namespace ConsoleApplication9 将项目名字换成一个有意义的名字,这样以后你查找起来会很方便。
    namespace ScoreManage
    {
      //class StuInfo //学生信息类 不是太长的名字,最好用全称。
      class StudentInfo
      {
        //public string no, name; //声明学号no,姓名name,本来访问修饰符是private, 
        //但这样就不能在class program里直接声明了,所以用public
        //public int score; 将字段,修改为属性。
    
        //属性的好处是,你可以控制他的操作方式。如:No学号,在实例中只可以读取,不可以修改。
        public string No { private set; get; } //在这里把set;前面加上一个private,就可以控制,在类内是可以修改他的值,但是,在类外面(实例中)是只能读取,不能修改的。
        public string Name { set; get; }
        public int Score { set; get; }
    
        //public void StuInfo1(string no, string name, int score)//输入学生信息的方法:StuInfo1 这个方法可以直接换成构造函数更好些。
        public StudentInfo(string no,string name,int score)
        {
          No = no;
          Name = name;
          Score = score;
        }
    
        /*
        public void putout()//输出学生信息
        {
          Console.WriteLine("学号:{0} 姓名:{1} 成绩:{2}", no, name, score);
        }
        public string sTostring()//把用方法StuInfo1(string no,string name,int score)
        //得到的数据转换成string
        {
          return no + " " + name + " " + Convert.ToString(score);
    
        }
        */
        //你可以直接把上面的两个方法合成一个重写Object的ToString()的方法。
        public override string ToString()
        {
          return string.Format("学号:{0} 姓名:{1} 成绩:{2}", No, Name, Score);
        }
      }
    
      class Program
      {
        static void Main(string[] args)
        {
          //StuInfo[] stu = new StuInfo[5];//实例化一个StuInfo 数组 这个是一个长度固定的数组,所以满足不了你的N的需求。
          List<StudentInfo> studentInfoCollection = new List<StudentInfo>();//这里你可以理解成一个StudentInfo的动态数组。
    
          /* 我想这样写,出错了!请问该怎么写?
          str[0].StuInfo1("aa", "ea", 90);
          str[1].StuInfo1("bb", "afb", 50);
          str[2].StuInfo1("cc", "fb", 80);
          str[3].StuInfo1("dd", "fb", 60);
          str[4].StuInfo1("ee", "fb", 99);//*/
    
          /*
          StuInfo stu11 = new StuInfo();//以下11行能否合并起来写?怎么写?
          StuInfo stu12 = new StuInfo();
          StuInfo stu13 = new StuInfo();
          StuInfo stu14 = new StuInfo();
          StuInfo stu15 = new StuInfo();
          stu[0] = stu11; stu[1] = stu12; stu[2] = stu13; stu[3] = stu14; stu[4] = stu15;
          stu11.StuInfo1("aa", "ea", 90);//输入学生信息的具体内容
          stu12.StuInfo1("bb", "afb", 50);
          stu13.StuInfo1("cc", "fb", 80);
          stu14.StuInfo1("dd", "fb", 60);
          stu15.StuInfo1("ee", "fb", 99);
          */
    
          //以下是从键盘输入学生信息的方法。由于代码内容较多,而且,功能独立,可以把他作为一个方法来实现。
          InputStudentInfo(studentInfoCollection);
    
          //排序同样改成方法比较好,而且你的不是冒泡排序啊。
          StudentInfo[] studentInfoArray = Sort(studentInfoCollection);
    
          /*
          int i = 0;
          while (i < 5)
          {
            stu[i].sTostring();
            stu[i].putout();
            i++;
          }*/
          //输出这里
          Console.WriteLine("排序前:");
          foreach (StudentInfo si in studentInfoCollection)
          {
            Console.WriteLine(si.ToString());
          }
          Console.WriteLine("排序后:");
          foreach (StudentInfo si in studentInfoArray)
          {
            Console.WriteLine(si.ToString());
          }
          Console.ReadKey();
        }
    
        static void InputStudentInfo(List<StudentInfo> studentInfoCollection)
        {
          string strContinue = "";
          string strStudentInfo;
          string[] studentInfoItem;
          int score;
    
          Console.WriteLine("请输入学生信息,格式为\"学号,姓名,成绩\"");
          do
          {
            strStudentInfo = Console.ReadLine();
            studentInfoItem = strStudentInfo.Split(',');
    
            if (studentInfoItem.Length != 3)
            {
              Console.WriteLine("您输入的信息格式不正确");
            }
            else
            {
              if (int.TryParse(studentInfoItem[2], out score))
              {
                studentInfoCollection.Add(new StudentInfo(studentInfoItem[0], studentInfoItem[1], score));
              }
              else
              {
                Console.WriteLine("您输入的信息格式不正确");
              }
            }
    
          continueInput:
            Console.Write("是否要继续输入(Y/N)?");
            strContinue = Console.ReadLine();
    
            if (strContinue != "Y" && strContinue != "N")
            {
              goto continueInput;
            }
          } while (strContinue == "Y");
        }
    
        static StudentInfo[] Sort(List<StudentInfo> studentInfoCollection)
        {
          StudentInfo[] studentInfoArray = studentInfoCollection.ToArray();
          StudentInfo temp;
          int studentInfoCount = studentInfoArray.Length;
          bool exchangeFlag;
    
          for (int j = 0; j < studentInfoCount; j++)
          {
            exchangeFlag = false;
            for (int k = studentInfoCount - 1; k >= j; k--)
            {
              if (studentInfoArray[j].Score < studentInfoArray[k].Score)
              {
                temp = studentInfoArray[j];
                studentInfoArray[j] = studentInfoArray[k];
                studentInfoArray[k] = temp;
                exchangeFlag = true;
              }
            }
            if (!exchangeFlag)
              break;
          }
    
          return studentInfoArray;
        }
      }
    }
    
    

    • 已建议为答案 mazhou 2011年5月6日 9:02
    • 已标记为答案 mldarkMember 2011年5月7日 10:30
    2011年5月6日 6:05
  • 你好:这里给出提示和关键性代码:

    如果你要输入N个学生进行排序,不建议用数组,而是使用动态的List<T>。比如:

    List<Student>students = new List<Students>

    int num = Convert.ToInt32(Console.ReadLine());  //输入学生

    for(int i=1;i<=num;++i)

    {

           //此处给出提示,并且输入学生的各个相关信息

    }

    students.Sort(new StudentSort());   //自定义排序

    自定义排序类——

    public class StudentSort: IComparer<Student>
    {

    public int Compare(Student x, Student y)
    {

                 //假设根据学生成绩排序

                  return x.Score >= y.Score;  

        }

    }


    如果你有其它意见或私下交流,请点击此处
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已建议为答案 mazhou 2011年5月6日 9:02
    • 已标记为答案 mldarkMember 2011年5月7日 10:30
    2011年5月6日 6:19
    版主

全部回复

  • 你好
    或者你可以嘗試以下方法 
    List<StuInfo) SList = new List<StuInfo>();
    SList.AddRange(stu);
    var q =
        from e in SList
        orderby e.Score descending
        select e;
    stu = SList.ToArray();
    Please correct me if my concept is wrong

    Chi
    2011年5月6日 5:15
    版主
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    //
    //以下程序是将5个学生信息以成绩排序,我想将这个程序改成输入n个学生信息后按成绩排序
    //请问该怎么改?
    //
    //namespace ConsoleApplication9 将项目名字换成一个有意义的名字,这样以后你查找起来会很方便。
    namespace ScoreManage
    {
      //class StuInfo //学生信息类 不是太长的名字,最好用全称。
      class StudentInfo
      {
        //public string no, name; //声明学号no,姓名name,本来访问修饰符是private, 
        //但这样就不能在class program里直接声明了,所以用public
        //public int score; 将字段,修改为属性。
    
        //属性的好处是,你可以控制他的操作方式。如:No学号,在实例中只可以读取,不可以修改。
        public string No { private set; get; } //在这里把set;前面加上一个private,就可以控制,在类内是可以修改他的值,但是,在类外面(实例中)是只能读取,不能修改的。
        public string Name { set; get; }
        public int Score { set; get; }
    
        //public void StuInfo1(string no, string name, int score)//输入学生信息的方法:StuInfo1 这个方法可以直接换成构造函数更好些。
        public StudentInfo(string no,string name,int score)
        {
          No = no;
          Name = name;
          Score = score;
        }
    
        /*
        public void putout()//输出学生信息
        {
          Console.WriteLine("学号:{0} 姓名:{1} 成绩:{2}", no, name, score);
        }
        public string sTostring()//把用方法StuInfo1(string no,string name,int score)
        //得到的数据转换成string
        {
          return no + " " + name + " " + Convert.ToString(score);
    
        }
        */
        //你可以直接把上面的两个方法合成一个重写Object的ToString()的方法。
        public override string ToString()
        {
          return string.Format("学号:{0} 姓名:{1} 成绩:{2}", No, Name, Score);
        }
      }
    
      class Program
      {
        static void Main(string[] args)
        {
          //StuInfo[] stu = new StuInfo[5];//实例化一个StuInfo 数组 这个是一个长度固定的数组,所以满足不了你的N的需求。
          List<StudentInfo> studentInfoCollection = new List<StudentInfo>();//这里你可以理解成一个StudentInfo的动态数组。
    
          /* 我想这样写,出错了!请问该怎么写?
          str[0].StuInfo1("aa", "ea", 90);
          str[1].StuInfo1("bb", "afb", 50);
          str[2].StuInfo1("cc", "fb", 80);
          str[3].StuInfo1("dd", "fb", 60);
          str[4].StuInfo1("ee", "fb", 99);//*/
    
          /*
          StuInfo stu11 = new StuInfo();//以下11行能否合并起来写?怎么写?
          StuInfo stu12 = new StuInfo();
          StuInfo stu13 = new StuInfo();
          StuInfo stu14 = new StuInfo();
          StuInfo stu15 = new StuInfo();
          stu[0] = stu11; stu[1] = stu12; stu[2] = stu13; stu[3] = stu14; stu[4] = stu15;
          stu11.StuInfo1("aa", "ea", 90);//输入学生信息的具体内容
          stu12.StuInfo1("bb", "afb", 50);
          stu13.StuInfo1("cc", "fb", 80);
          stu14.StuInfo1("dd", "fb", 60);
          stu15.StuInfo1("ee", "fb", 99);
          */
    
          //以下是从键盘输入学生信息的方法。由于代码内容较多,而且,功能独立,可以把他作为一个方法来实现。
          InputStudentInfo(studentInfoCollection);
    
          //排序同样改成方法比较好,而且你的不是冒泡排序啊。
          StudentInfo[] studentInfoArray = Sort(studentInfoCollection);
    
          /*
          int i = 0;
          while (i < 5)
          {
            stu[i].sTostring();
            stu[i].putout();
            i++;
          }*/
          //输出这里
          Console.WriteLine("排序前:");
          foreach (StudentInfo si in studentInfoCollection)
          {
            Console.WriteLine(si.ToString());
          }
          Console.WriteLine("排序后:");
          foreach (StudentInfo si in studentInfoArray)
          {
            Console.WriteLine(si.ToString());
          }
          Console.ReadKey();
        }
    
        static void InputStudentInfo(List<StudentInfo> studentInfoCollection)
        {
          string strContinue = "";
          string strStudentInfo;
          string[] studentInfoItem;
          int score;
    
          Console.WriteLine("请输入学生信息,格式为\"学号,姓名,成绩\"");
          do
          {
            strStudentInfo = Console.ReadLine();
            studentInfoItem = strStudentInfo.Split(',');
    
            if (studentInfoItem.Length != 3)
            {
              Console.WriteLine("您输入的信息格式不正确");
            }
            else
            {
              if (int.TryParse(studentInfoItem[2], out score))
              {
                studentInfoCollection.Add(new StudentInfo(studentInfoItem[0], studentInfoItem[1], score));
              }
              else
              {
                Console.WriteLine("您输入的信息格式不正确");
              }
            }
    
          continueInput:
            Console.Write("是否要继续输入(Y/N)?");
            strContinue = Console.ReadLine();
    
            if (strContinue != "Y" && strContinue != "N")
            {
              goto continueInput;
            }
          } while (strContinue == "Y");
        }
    
        static StudentInfo[] Sort(List<StudentInfo> studentInfoCollection)
        {
          StudentInfo[] studentInfoArray = studentInfoCollection.ToArray();
          StudentInfo temp;
          int studentInfoCount = studentInfoArray.Length;
          bool exchangeFlag;
    
          for (int j = 0; j < studentInfoCount; j++)
          {
            exchangeFlag = false;
            for (int k = studentInfoCount - 1; k >= j; k--)
            {
              if (studentInfoArray[j].Score < studentInfoArray[k].Score)
              {
                temp = studentInfoArray[j];
                studentInfoArray[j] = studentInfoArray[k];
                studentInfoArray[k] = temp;
                exchangeFlag = true;
              }
            }
            if (!exchangeFlag)
              break;
          }
    
          return studentInfoArray;
        }
      }
    }
    
    

    • 已建议为答案 mazhou 2011年5月6日 9:02
    • 已标记为答案 mldarkMember 2011年5月7日 10:30
    2011年5月6日 6:05
  • 你好:这里给出提示和关键性代码:

    如果你要输入N个学生进行排序,不建议用数组,而是使用动态的List<T>。比如:

    List<Student>students = new List<Students>

    int num = Convert.ToInt32(Console.ReadLine());  //输入学生

    for(int i=1;i<=num;++i)

    {

           //此处给出提示,并且输入学生的各个相关信息

    }

    students.Sort(new StudentSort());   //自定义排序

    自定义排序类——

    public class StudentSort: IComparer<Student>
    {

    public int Compare(Student x, Student y)
    {

                 //假设根据学生成绩排序

                  return x.Score >= y.Score;  

        }

    }


    如果你有其它意见或私下交流,请点击此处
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已建议为答案 mazhou 2011年5月6日 9:02
    • 已标记为答案 mldarkMember 2011年5月7日 10:30
    2011年5月6日 6:19
    版主
  • 感谢各位的热情答复!   慢慢消化中。。。


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
    2011年5月9日 14:53