用C#怎么实现求CPK和最大值 最小值,怎么用设计模式设计一个类和接口描述它更方便

文章介绍了如何使用C#语言计算CPK(过程能力指数)以及最大值和最小值。通过定义ICalculator接口和具体的CpkCalculator、MaxCalculator、MinCalculator类,实现了计算功能。此外,利用工厂模式的CalculatorFactory类,可以根据输入参数动态创建所需的计算器对象,提高了代码的可扩展性和解耦性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#实现求CPK和最大值最小值:
求CPK:

CPK是衡量一个过程是否稳定的指标。它的计算公式是:

CPK = Min(USL-μ, μ-LSL)/(3*σ)

其中,USL为上限规格限,LSL为下限规格限,μ为平均值,σ为标准差。

C#代码实现:

using System;
using System.Collections.Generic;
using System.Linq;

class CpkCalculator {
    public double CalculateCpk(List<double> data, double usl, double lsl) {
        double average = data.Average();
        double standardDeviation = CalculateStandardDeviation(data, average);
        double cpk = Math.Min((usl - average) / (3 * standardDeviation), (average - lsl) / (3 * standardDeviation));
        return cpk;
    }

    private double CalculateStandardDeviation(List<double> data, double average) {
        double sumOfSquaresOfDifferences = data.Select(val => (val - average) * (val - average)).Sum();
        double variance = sumOfSquaresOfDifferences / (data.Count - 1);
        double standardDeviation = Math.Sqrt(variance);
        return standardDeviation;
    }
}


最大值和最小值:

C#提供了Max和Min方法可以很方便地求一个集合中的最大值和最小值。

C#代码实现:

using System;
using System.Collections.Generic;
using System.Linq;

class MaxMinCalculator {
    public double CalculateMax(List<double> data) {
        double max = data.Max();
        return max;
    }

    public double CalculateMin(List<double> data) {
        double min = data.Min();
        return min;
    }
}

使用设计模式设计一个类和接口描述:
根据上述需求,我们可以使用工厂模式来创建计算器对象,这样可以将具体的计算器对象的创建过程与客户端代码解耦合,从而使客户端代码更加简洁。

具体实现如下:

using System;
using System.Collections.Generic;
using System.Linq;

interface ICalculator {
    double Calculate(List<double> data);
}

class CpkCalculator : ICalculator {
    private double usl;
    private double lsl;

    public CpkCalculator(double usl, double lsl) {
        this.usl = usl;
        this.lsl = lsl;
    }

    public double Calculate(List<double> data) {
        double average = data.Average();
        double standardDeviation = CalculateStandardDeviation(data, average);
        double cpk = Math.Min((usl - average) / (3 * standardDeviation), (average - lsl) / (3 * standardDeviation));
        return cpk;
    }

    private double CalculateStandardDeviation(List<double> data, double average) {
        double sumOfSquaresOfDifferences = data.Select(val => (val - average) * (val - average)).Sum();
        double variance = sumOfSquaresOfDifferences / (data.Count - 1);
        double standardDeviation = Math.Sqrt(variance);
        return standardDeviation;
    }
}

class MaxCalculator : ICalculator {
    public double Calculate(List<double> data) {
        double max = data.Max();
        return max;
    }
}

class MinCalculator : ICalculator {
public double Calculate(List<double> data) {
double min = data.Min();
return min;
}
}

class CalculatorFactory {
public static ICalculator GetCalculator(string calculatorType, double usl = 0, double lsl = 0) {
switch (calculatorType) {
case "cpk":
return new CpkCalculator(usl, lsl);
case "max":
return new MaxCalculator();
case "min":
return new MinCalculator();
default:
throw new ArgumentException("Invalid calculator type");
}
}
}
// 客户端代码
List<double> data = new List<double> { 1.2, 2.4, 3.6, 4.8 };
double usl = 5.0;
double lsl = 0.0;

ICalculator cpkCalculator = CalculatorFactory.GetCalculator("cpk", usl, lsl);
double cpk = cpkCalculator.Calculate(data);
Console.WriteLine("CPK: " + cpk);

ICalculator maxCalculator = CalculatorFactory.GetCalculator("max");
double max = maxCalculator.Calculate(data);
Console.WriteLine("Max: " + max);

ICalculator minCalculator = CalculatorFactory.GetCalculator("min");
double min = minCalculator.Calculate(data);
Console.WriteLine("Min: " + min);

这里我们定义了一个ICalculator接口,它包含一个Calculate方法用于计算。然后我们定义了三个具体的计算器类,分别用于计算CPK、最大值和最小值。这些具体的计算器类实现了ICalculator接口的Calculate方法。

我们还定义了一个CalculatorFactory工厂类,它根据客户端代码传入的类型参数,返回相应的具体计算器对象。在客户端代码中,我们使用工厂类创建不同类型的计算器对象,并调用它们的Calculate方法进行计算。这样,客户端代码就不需要关心具体的计算器对象的创建过程,从而达到了解耦合的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值