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