Problem:
Wir möchten uns optimal auf Tests oder Zertifikationen vorbereiten können. Wir wissen das viele Zertifikationen auf Multiple Choice Fragen und Antworten basieren.
Zielsetzung:
Daher möchten wir eine Anwendung entwickeln, welche uns eine Frage mit unterschiedlichen Antwortmöglichkeiten anzeigt. Natürlich möchten wir auch eine oder mehrere Antwortmöglichkeiten auswählen können und im Anschluss möchten wir uns die Ergebnisse ob wir richtig oder falsch lagen anzeigen lassen.
Vorbereitung:
Als erstes benötigen wir eine geeignete Programmier-/Skriptsprache zum Entwickeln der Anwendung. Powershell ist eine geeignete Skriptsprache. Ihr Sprachumfang ist umfangreich genug um alle Funktionalitäten der Anwendung umzusetzen. Wir entscheiden uns für PowerShell v.7 und wir wollen die Anwendung in Visual Studio Code entwickeln. Powershell v.7 und Visuell Studio Code müssen wir downloaden, da sie nicht standartmäßig mit dem Betriebssystem ausgeliefert werden.
Anforderungen:
- Es soll eine CSV-Datei einlesen
- Die CSV enthält folgende Informationen:
- mehrere Kategorien
- Jede Kategorie enthält mehrere Fragen
- Jede Frage enthält 1 bis 5 Antwortmöglichkeiten
- Jede Antwortmöglichkeit kann korrekt oder falsch sein
- Es wird sich gemerkt ob der Benutzer die Frage korrekt oder falsch beantwortet hat
- Es gibt einen Info-Bereich mit Hinweisen und Informationstext
- Die CSV enthält folgende Informationen:
- Es soll die CSV-Datei eingelesen werden können
- Die Daten aus der CSV Datei sollen auf der Konsole folgendermaßen dargestellt werden.
- Zuerst sucht der Benutzer sich eine Kategorie aus z.B. auf der Konsole werden alle Kategorien mit a. Kat1 b. Kat2 c. Kat3 usw. dargestellt und der Benutzer gibt beispielsweise b ein um Kat2 auszusuchen.
- Als nächstes werden Fragen aus dieser Kategorie zufällig ausgewählt und auf dem Terminal samt Antwortmöglichkeiten dargestellt
- Dann trifft der Benutzer eine oder mehrere Auswahlen der Antworten.
- Nun wird dem Benutzer angezeigt ob er alle korrekten Antwortmöglichkeiten gefunden hat oder nicht.
- Wurde die Frage falsch beantwortet wird dies in der csv Datei vermerkt, sodass wenn er den Test erneut startet nur fragen erhält die er falsch beantwortet hat
- Der Benutzer soll ebenfalls die Möglichkeit erhalten den Test vollständig neu zu starten so das auch wieder die Fragen erscheinen, die er zuvor korrekt beantwortet hat.
- Der Test wird automatisch neugestartet wenn der Benutzer alle Fragen korrekt beantwortet hat, weil es keinen Sinn macht einen Test zu machen ohne Antworten, da ja zuvor alle korrekt beantwortet worden sind.
Umsetzung:
Die CSV-Datei:
"Kategorie","Frage","Antwort1","Antwort2","Antwort3","Antwort4","Antwort5","Antwort1_Korrekt","Antwort2_Korrekt","Antwort3_Korrekt","Antwort4_Korrekt","Antwort5_Korrekt","Status","Info"
"IT-Security","Was ist PowerShell?","Eine Programmiersprache","Ein Texteditor","Ein Betriebssystem","Ein Automatisierungstool","Ein Compiler","False","False","False","True","False","Beantwortet","Info1"
"Kategorie2","Was ist SAP HANA?","Ein SQL-Datenbankmanagementsystem","Ein SAP-Modul","Eine Hardware","Ein Berichtstool","Eine Schnittstelle","True","False","False","False","False","Unbeantwortet","Info2"
"Kategorie3","Was bedeutet DNS?","Domain Name System","Data Network Service","Dynamic Network Setup","Distributed Network System","Direct Network Service","True","False","False","False","False","Unbeantwortet","Info3"
"Kategorie4","Was ist ein VPN?","Virtual Private Network","Verifiziertes Public Network","Virtual Process Node","Vertrauliches Public Network","Virtual Public Node","True","False","False","False","False","Unbeantwortet","Info4"
Powershell-Skript:
$csvPath = "D:\...\QA.csv"
# CSV-Datei einlesen
function Load-Questions {
Import-Csv -Path $csvPath
}
# Kategorien anzeigen und auswählen
function Select-Category {
param (
[array]$Questions
)
$Questions | Get-Member -MemberType Properties
$categories = $Questions | Select-Object -ExpandProperty Kategorie -Unique
Write-Host "Wählen Sie eine Kategorie aus:"
for ($i = 0; $i -lt $categories.Count; $i++) {
Write-Host "$(($i + 1)). $($categories[$i])"
}
$choice = Read-Host "Geben Sie die Nummer der Kategorie ein"
if ($choice -as [int] -and $choice -ge 1 -and $choice -le $categories.Count) {
$singleCategory = $categories[$choice - 1]
#Write-Host "tempvar: '$tempvar' endetempvar"
return $singleCategory
} else {
Write-Host "Ungültige Eingabe."
return $null
}
}
# Info anzeigen, wenn der Benutzer zustimmt
function Show-Info {
param (
[string]$InfoText
)
$showInfo = Read-Host "Möchten Sie die Info zur Frage sehen? (Ja/Nein)"
if ($showInfo -eq "Ja") {
Write-Host "Info: $InfoText"
}
}
# Fragen aus einer Kategorie anzeigen
function Ask-Questions {
param (
[array]$Questions,
[string]$Category
)
#$Questions | Format-List
#Write-Host " Kategorie: '$Category' ende"
$filteredQuestions = $Questions | Where-Object { $_.Kategorie -eq $Category }
if (-not $filteredQuestions) {
Write-Host "Keine unbeantworteten Fragen."
return
}
foreach ($question in $filteredQuestions) {
Write-Host "Frage: $($question.Frage)"
# Zeige die Info an, falls verfügbar
if ($question.Info) {
Show-Info -InfoText $question.Info
}
$answers = @()
for ($i = 1; $i -le 5; $i++) {
$answer = $question."Antwort$i"
if ($answer) {
$answers += $answer
Write-Host "$i. $answer"
}
}
$response = Read-Host "Wählen Sie die Nummer(n) der korrekten Antwort(en), getrennt durch Kommas"
$userAnswers = $response -split "," | ForEach-Object { $_.Trim() -as [int] }
$correctAnswers = @()
for ($i = 1; $i -le 5; $i++) {
if ($question."Antwort${i}_Korrekt" -eq "True") {
$correctAnswers += $i
}
}
if (($userAnswers | Sort-Object | Compare-Object -ReferenceObject ($correctAnswers | Sort-Object) -PassThru | Measure-Object).Count -eq 0) {
Write-Host "Korrekt!"
$question.Status = "Beantwortet"
} else {
Write-Host "Falsch. Die korrekten Antworten waren: $($correctAnswers -join ", ")"
}
}
$Questions | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
}
# Test zurücksetzen
function Reset-Test {
param (
[array]$Questions
)
foreach ($question in $Questions) {
$tempvar = $question.Status
Write-Host "setteings: ' $tempvar' "
$question.Status = "Unbeantwortet"
}
$Questions | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
Write-Host "Der Test wurde zurückgesetzt."
}
# Hauptmenü
function Main {
$questions = Load-Questions
while ($true) {
Write-Host "1. Test starten"
Write-Host "2. Test zurücksetzen"
Write-Host "3. Beenden"
$choice = Read-Host "Wählen Sie eine Option"
switch ($choice) {
"1" {
$categoryObject = Select-Category -Questions $questions
$category = $categoryObject[-1]
#Write-Host "anfang: '$teilstring' ende"
if ($category) {
# Write-Host "übergabe Kategorie: '$category' endeübergabe"
Ask-Questions -Questions $questions -Category $category
}
}
"2" {
Reset-Test -Questions $questions
}
"3" {
break
}
default {
Write-Host "Ungültige Eingabe."
}
}
}
}
Mai
Ergebnis:
Es ist ein QA-Editor entstanden, welcher aus einer geeigneten CSV-Datei Fragen und Antworten sowie einen Info Text lesen und anzeigen kann. Er prüft die Benutzerantworten auf Korrektheit und gibt dementsprechend ein Feedback zurück. Derzeit fehlt die Validierung Z.B. Fehlerbehandlung wenn eine unpassende CSV-Datei eingelesen wird. Auch das Ausrechnen wieviel Prozent der Fragen korrekt beantwortet worden sind fehlt.