Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-visualstudio-client/duesk-wpf/ServicesCalculator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using DueskWPF.Models;
namespace DueskWPF.Services;
public static class Calculator
{
public static int[] CalculateSums(IReadOnlyList<int> items)
{
var sums = new int[7];
for (var i = 0; i < 10; i++) sums[1] += items[i];
for (var i = 10; i < 20; i++) sums[2] += items[i];
for (var i = 20; i < 28; i++) sums[3] += items[i];
sums[3] += items[8] + items[9];
for (var i = 28; i < 36; i++) sums[4] += items[i];
sums[5] = items[0] + items[1] + items[5] + items[6] + items[7] +
items[8] + items[9] + items[11] + items[12] + items[13] + items[14];
sums[6] = items[2] + items[3] + items[4] + items[8] + items[9] +
items[10] + items[16] + items[17];
return sums;
}
public static int[] CalculateProfileValues(int[] sums, double[][] norm)
{
var values = new int[6];
for (var k = 1; k <= 6; k++)
{
var value = 5;
for (var p = 0; p < 5; p++)
{
if (sums[k] < norm[k - 1][p])
{
value = p + 1;
break;
}
}
values[k - 1] = value;
}
return values;
}
public static double CalculateCorrelation(int[] seValues, int[] feValues)
{
var n = seValues.Length;
double sumSE = 0, sumFE = 0, sumSEFE = 0, sumSE2 = 0, sumFE2 = 0;
for (var i = 0; i < n; i++)
{
sumSE += seValues[i];
sumFE += feValues[i];
sumSEFE += seValues[i] * feValues[i];
sumSE2 += seValues[i] * seValues[i];
sumFE2 += feValues[i] * feValues[i];
}
var numerator = n * sumSEFE - sumSE * sumFE;
var denominator = Math.Sqrt((n * sumSE2 - sumSE * sumSE) * (n * sumFE2 - sumFE * sumFE));
return Math.Abs(denominator) < 0.0001 ? 0 : numerator / denominator;
}
public static double CalculateAgreement(IReadOnlyList<int> seItems, IReadOnlyList<int> feItems)
{
var matches = 0;
for (var i = 0; i < 36; i++)
{
if (seItems[i] == feItems[i]) matches++;
}
return matches * 100.0 / 36;
}
public static (int[] SE, int[] FE) CalculateCompetenceValues(Profile profile, string normType = "HS")
{
var seItems = profile.GetAllSEItems();
var feItems = profile.GetAllFEItems();
var seSums = CalculateSums(seItems);
var feSums = CalculateSums(feItems);
var normSE = normType == "HS" ? Norms.NormSE_HS : Norms.NormSE_FS;
var normFE = normType == "HS" ? Norms.NormFE_HS : Norms.NormFE_FS;
return (CalculateProfileValues(seSums, normSE), CalculateProfileValues(feSums, normFE));
}
public static string GetInterpretation(double correlation, double agreement, int[] seValues, int[] feValues)
{
var text = "";
if (correlation >= 0.8)
text += $"Sehr gute Übereinstimmung zwischen Selbst- und Fremdeinschätzung (r = {correlation:F2}).\n\n";
else if (correlation >= 0.6)
text += $"Gute Übereinstimmung zwischen Selbst- und Fremdeinschätzung (r = {correlation:F2}).\n\n";
else if (correlation >= 0.4)
text += $"Mäßige Übereinstimmung zwischen Selbst- und Fremdeinschätzung (r = {correlation:F2}).\n\n";
else if (correlation >= 0.2)
text += $"Schwache Übereinstimmung zwischen Selbst- und Fremdeinschätzung (r = {correlation:F2}).\n\n";
else
text += $"Keine signifikante Übereinstimmung (r = {correlation:F2}).\n\n";
text += $"Inhaltliche Übereinstimmung: {agreement:F1}%\n\n";
text += "Selbsteinschätzung:\n";
for (var i = 0; i < 6; i++)
text += $" • {Norms.Competencies[i]}: {Norms.GetRatingText(seValues[i])} ({seValues[i]}/5)\n";
text += "\nFremdeinschätzung:\n";
for (var i = 0; i < 6; i++)
text += $" • {Norms.Competencies[i]}: {Norms.GetRatingText(feValues[i])} ({feValues[i]}/5)\n";
return text;
}
}