C#——完善例6-4的泛型类Data,扩展并实现以下功能:针对任意个字符型、整型、浮点型或双精度型数据能进行排序和汇总,也能求出最大数、中位数、最小数和平均值。
例6-4,设计一个泛型类,实现任意类型的数据排序
8.完善例6-4的泛型类Data<T>,扩展并实现以下功能:针对任意个字符型、整型、浮点型或双精度型数据能进行排序和汇总,也能求出最大数、中位数、最小数和平均值。
设计界面:一个Label标签
编写代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 泛型类
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "";
Data<int> a = new Data<int> (3, 5, 2, 8, 7, 6 ); //1整型(排序、汇总、最大数、中位数、最小数 、平均值)
a.sort();
label1.Text = "(一)整型:\n\n排序:" + a.display() + "\n汇总:" + a.getSum()+" \n最大值:"
+a.getMax()+"\n最小值:"+a.getMin()+"\n平均值:"+a.getAvg()+"\n中位数:"+a.getCenter();
Data<float> b = new Data<float>(3.5f, 7.5f, 2.1f, 9.9f, 5.4f, 6.8f);//2浮点型
b.sort();
label1.Text += "\n\n\n(二)浮点型:\n\n排序:" + b.display() + "\n汇总:" + b.getSum() + " \n最大值:" + b.getMax()
+ "\n最小值:" + b.getMin() + "\n平均值:" + b.getAvg() + "\n中位数:" + b.getCenter();
Data<double> c = new Data<double>(3.53, 3.5, 4.1, 3.9, 5.4, 3.8);//3双精度型
c.sort();
label1.Text += "\n\n\n(三)双精度型:\n\n排序:" + c.display() + "\n汇总:" + c.getSum() + " \n最大值:" + c.getMax()
+ "\n最小值:" + c.getMin() + "\n平均值:" + c.getAvg() + "\n中位数:" + c.getCenter();
Data<string> d = new Data<string>("3", "7.5"," 2.9", "7.9"," 4"," 6.8"); //4字符型
d.sort();
label1.Text += "\n\n\n(四)字符型:\n\n排序:" + d.display() + "\n汇总:" + d.getSum() + " \n最大值:" + d.getMax()
+ "\n最小值:" + d.getMin() + "\n平均值:" + d.getAvg() + "\n中位数:" + d.getCenter();
}
}
//定义泛型类
class Data<T>
{
private T[] datas;
public Data(params T[] datas)
{
this.datas = datas;
}
//排序
public void sort()
{
for (int i = 0; i < datas.Length; i++)
{
for (int j = i; j < datas.Length; j++)
{
if(Convert .ToDouble(datas[i])<Convert.ToDouble (datas[j]))
{
T t = datas[i];
datas[i] = datas[j];
datas[j] = t;
}
}
}
}
//输出数组元素的方法
public string display()
{
string info = "";
for (int i = 0; i < datas.Length; i++)
{
info += datas[i].ToString() + " ";
}
return info;
}
//汇总
public double getSum()
{
double s = 0;
for (int i = 0; i < datas.Length;i++ )
{
s +=Convert .ToDouble( datas[i]);
}
return s;
}
//平均值
public double getAvg()
{
double s = 0;
for (int i = 0; i < datas.Length; i++)
{
s += Convert.ToDouble(datas[i]);
}
return s/datas .Length ;
}
//最大数
public double getMax()
{
return Convert .ToDouble ( datas[0]);
}
//最小数
public double getMin()
{
return Convert.ToDouble(datas[datas .Length -1]);
}
//中位数
public double getCenter()
{
int n = datas.Length;
if (n % 2 != 0) //如果为奇数个,则返回中间的数(因为数组已经排序好)
{
int i = (datas.Length - 1) / 2;
return Convert.ToDouble(datas[i]);
}
else //如果为偶数个,则返回中间两位数的平均值
{
int i=datas.Length /2;
double x= Convert.ToDouble(datas[i-1]);
double y= Convert.ToDouble(datas[i]);
return (x+y)/2;
}
}
}
}
运行结果: