一个恼人的错误~

类别:.NET开发 点击:0 评论:0 推荐:
上次课给学生出了一道题,编写一个Web服务,实现以下三个功能:查询成绩、查询平均分、查询排名。给出了下面的表格:
  姓名 .NET技术 C# XML J2EE JSP A 85 84 90 80 85 B 90 76 78 85 78 C 67 66 64 85 80 D 90 78 65 78 80 E 64 60 67 78 80


这道题本是我一拍脑袋想出来的,所以需要自己来实现一下,老师都做不出来的话怎么交代。
于是就编写了下面的程序:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace WSExercise
{

 public class Service1 : System.Web.Services.WebService
 {
  public Service1()
  {

   InitializeComponent();
  }

  #region 组件设计器生成的代码
  
  private IContainer components = null;

  private void InitializeComponent()
  {
  }


  protected override void Dispose( bool disposing )
  {
   if(disposing && components != null)
   {
    components.Dispose();
   }
   base.Dispose(disposing);  
  }
  
  #endregion

  int i,j,Order;     //定义全局变量i,j作为成绩数组中索引,Order存储名次
  double[] EveryOne=new double[5]; //定义EveryOne数组存储平均成绩的副本

  
  [WebMethod(Description="通过输入姓名和科目来查询学生成绩")]
  public int GetScore(string Name,string Lession)
  {
   GetIByName(Name);   //获得i的数值
   GetJByLession(Lession);  //获得j的数值
   return Score[i,j];   //从成绩数组中返回成绩
  }
  [WebMethod(Description="通过输入姓名来查询学生平均分")]
  public double GetAverage(string Name)
  {
   GetIByName(Name);   //获得i的数值
   Average();     //调用Average方法获得该生平均成绩
   return average[i];   
  }
  [WebMethod(Description="通过输入姓名来查询学生排名")]
  public int GetOrder(string Name)
  {
    Average();     //调用Average方法获得该生平均成绩
    EveryOne[i]=average[i];  //生成该生平均成绩的副本 

   for(int i=0;i<=3;i++)  //冒泡法排序获得平均值从大到小的顺序
   {    
    double big;

    for(int j=0;j<=3;j++)
    {
     if(average[j]<average[j+1])
     {
      big=average[j+1];
      average[j+1]=average[j];
      average[j]=big;
     }  
    }

   } 
   GetIByName(Name);   //获得j的数值
   for(int a=0;a<=4;a++)  //比较副本与变化后的平均值数组中的值
   {
    if(EveryOne[i]==average[a])
    {
     Order=a+1;   //得到现在平均值数组中的索引+1,即名次。
    }
   }
    
   return Order;
  } 
  
  private int GetIByName(string name)//获得i的数值
  {
   switch (name)
   {
    case "A":
     i=0;
     break;
    case "B":
     i=1;
     break;
    case "C":
     i=2;
     break;
    case "D":
     i=3;
     break;
    case "E":
     i=4;
     break;
   }
   return i;
  }
  private int GetJByLession(string lession)//获得j的数值
  {
   switch (lession)
   {
    case ".NET技术":
     j=0;
     break;
    case "C#":
     j=1;
     break;
    case "XML":
     j=2;
     break;
    case "J2EE":
     j=3;
     break;
    case "JSP":
     j=4;
     break;
   }
   return j;
  }
  
  //成绩数组
  int[,] Score=new int[5,5]{{85,84,90,80,85},{90,76,78,85,78},{67,66,64,85,80},{90,78,65,78,80},{64,60,67,78,80}};
  double[] average=new double[5];  //声明平均值数组
  
  private double[] Average()   //获得平均值
  {
     
   for(int a=0;a<=4;a++)
   {
    double sum=0;
    for(int b=0;b<=4;b++)
    {
     sum+=Score[a,b];
    }

    average[a]=sum/5;
   }
   return average;
  }
 }
}
**************************************
运行后发现前两个功能很容易就实现了,但就是排名怎么也做不出来,到底错在哪里呢?是算法的问题吧?我知道自己用了一个效率较低的冒泡法,但好像也不是错在这,而且自认为利用副本的这个获得排名的算法很出色,那到底是什么原因呢?
在反复试验了几次之后,只好利用单步调试来看看错在哪里了。
呵呵~~各位看官你猜怎么着?
...
...
...
...
...
...
副本EveryOne竟然随着average一同冒泡了,嘿嘿,原来如此啊,将程序:
    EveryOne[i]=average[i];  //生成该生平均成绩的副本 
改写为:
   for(int i=0;i<=4;i++)
   {
    EveryOne[i]=average[i];  //生成该生平均成绩的副本 
   }
在运行,好的,一切OK!
大家可一定要了解好引用与COPY的区别,千万不要犯这样的错误,基础很重要啊!:)

本文地址:http://com.8s8s.com/it/it42920.htm