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

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方法进行计算。这样,客户端代码就不需要关心具体的计算器对象的创建过程,从而达到了解耦合的目的。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您需要用C#编写计算设备Cpk数据的程序。Cpk是一个用于衡量设备或过程的稳定性和能力的指标。它基于设备或过程的标准偏差和控制限,反映了该设备或过程的稳定性和能力。 以下是一个示例C#代码,可以用于计算设备Cpk数据: ```csharp using System; using System.Collections.Generic; using System.Linq; namespace CpkCalculator { class Program { static void Main(string[] args) { // 设备数据 List<double> data = new List<double> { 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0 }; // 计算平均 double mean = data.Average(); // 计算标准差 double stdDev = Math.Sqrt(data.Average(v => Math.Pow(v - mean, 2))); // 计算上限和下限 double upperLimit = mean + 3 * stdDev; double lowerLimit = mean - 3 * stdDev; // 计算Cpk double Cpk = Math.Min((mean - lowerLimit) / (3 * stdDev), (upperLimit - mean) / (3 * stdDev)); Console.WriteLine("平均: {0}", mean); Console.WriteLine("标准差: {0}", stdDev); Console.WriteLine("上限: {0}", upperLimit); Console.WriteLine("下限: {0}", lowerLimit); Console.WriteLine("Cpk: {0}", Cpk); Console.ReadLine(); } } } ``` 在这个示例中,我们首先定义了一个包含设备数据的列表。然后,我们计算了这些数据的平均和标准差,并使用它们计算了上限和下限。最后,我们计算了设备的Cpk,并将其打印到控制台上。 您可以将此示例代码作为起点,并根据您的具体需进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值