一个恼人的错误~
2004-11-11 09:18
405 查看
上次课给学生出了一道题,编写一个Web服务,实现以下三个功能:查询成绩、查询平均分、查询排名。给出了下面的表格:
这道题本是我一拍脑袋想出来的,所以需要自己来实现一下,老师都做不出来的话怎么交代。
于是就编写了下面的程序:
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的区别,千万不要犯这样的错误,基础很重要啊!:)
姓名 | .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的区别,千万不要犯这样的错误,基础很重要啊!:)
相关文章推荐
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- Java测试规范(引用)
- Java面试题目
- 英雄无敌程序员版
- 统一权限系统URight1.5
- delphi中的时间操作技术(2)
- 计算器原代码的问题
- 解析IP地址为主机域名
- 将某一主机域名解析为IP地址
- 在做控件的存取控制时碰到的问题,请教各位!
- struts tag lib(1)
- 关于目前的方向
- 引用一个人的说法看中国软件需求基础
- 有关TrueDBGrid的问题向各位大虾请教
- 从注册表中还原MSNMessenger口令
- 非对称加密算法中求解大正整数模大正整数的余数的快速计算法
- 使用C#开发COM+组件
- 一种基于R-Tree的改进多维索引[待正稿]