上次课给学生出了一道题,编写一个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的区别,千万不要犯这样的错误,基础很重要啊!:) 
|