Wie setze ich ein Console.Beep();-Soundboard in C# um (Konsolenanwendung)?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

So in etwa geht es mit einer Swicht / Case (wie gesagt, nicht getestet)

string stringEingabe = Console.ReadLine();

switch(stringEingabe) {

case "L":

Console.Beep(15, 458);

break;

case "A":

Console.Beep(784, 150);

break;

case "B":

Console.Beep(452, 52);

break;

default:

Console.WriteLine("Andere Taste versuchen");

break;

}

KnorxyThieus  01.04.2016, 19:51

Also ich finde den Ansatz über das Dictionary ästhetischer :)

0
string stringEingabe = ConvertToInt32(Console.ReadLine());
if String eingabe = L

Was zur Hölle machst du da? Console.ReadLine() gibt eineinString zurück, den du dann in ein int konvertiertst um ihn in nem String zu speichern????

Un dann überprüfst du, ob der String eingabe (den du da anlegst) den Wert L (nicht den String "L"!!!!) erhält (erhält NICHT enthält)???? 

Les bitte nochmal nach, wie IFs funktionieren und was Datentypen sind!

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

Der Ansatz von SteBruBra mit dem switch-case ist zu bevorzugen.

Eine andere Idee wäre ein mathematischer Ansatz. Das geht allerdings nur, wenn die Frequenz des Tons und die Dauer einer bestimmten Funktion folgen soll. Um einen mathematisch Input für deine Funktion entsprechend des Buchstabens zu erzeugen könntest du den Ascii-Wert des Buchstabens nutzen.

PS: Wie kannst du Console.Beep mit einer Frequenz von 15 aufrufen? Das Minimum liegt bei 37. *g*

Hallo,

Es geht sogar noch schöner:

// Dies kommt in die Klasse als statisches Member:
static Dictionary<string, Tuple<int, int>> sounds
   = new Dictionary<string, Tuple<int, int>>
{
   { "A", Tuple.Create(784, 150) },
   { "B", Tuple.Create(452, 52) },
   { "L", Tuple.Create(150 /*Weil 15 hier kein gültiger Wert ist*/, 458) }
};


// Hier der Main-Code:
string input = Console.ReadLine();

try
{ var soundKey = sounds.First( _soundKey => input.Equals(_soundKey.Key, StringComparison.CurrentCultureIgnoreCase));
var sound = soundKey.Value;
Console.Beep(sound.Item1, sound.Item2);
}
catch (ArgumentNullException)
{
Console.WriteLine("Unbekannter Ton!");
}

Zur Erklärung: Im Dictionary oben - das ist eine Art zweispaltige Tabelle, in der jeder Eintrag aus der ersten Spalte, der Schlüssel oder Key, einmalig sein muss - sind jeweils ein String und die zugehörigen Infos zum Ton angegeben. Diese Infos habe ich in einem Tupel abgelegt, das ist so ein Datenset, das immer in diesem Fall genau zwei Integer aufnimmt, die hier für Länge und die Frequenz des Beeps stehen.

Im Main-Code wird die erste übereinstimmende Zeile (Wertepaar) in diesem Dictionary gesucht und der Variable soundKey zugewiesen, was ich mit der Linq.First-Methode realisiert habe: Diese prüft für jedes Wertepaar, ob dessen Schlüssel (der String) mit der Eingabe input übereinstimmt - und dies unter Vernachlässigung der Groß- und Kleinschreibung. Das Tupel für den Sound wird dann der Variable sound zugewiesen.
Anmerkung: Wenn du die Schreibweise beachten willst, kannst du sound auch einfach über den Accessor zuweisen: sounds[input].
Danach werden einfach nur noch die Daten aus dem Sound-Tupel ausgelesen und an Console.Beep übergeben.
Sollte ein entsprechender Key nicht gefunden worden sein, so stellt dies im Folgenden die catch-Anweisung fest und gibt eine Fehlermeldung aus.

Das ist auf jeden Fall ein besserer Stil als ein reiner switch-Block, bei dem man schnell den Überblick verliert und die Vorteile der Codewiederverwendbarkeit mitnichten ausschöpft, falls du das Programm irgendwann noch erweitern möchtest.

Ich hoffe, ich konnte dir helfen - wenn Unklarheiten bestehen, frag gern noch mal nach :)

Mit freundlichen Grüßen,
KnorxThieus (♂)

Woher ich das weiß:Studium / Ausbildung – Studiere Informatik und programmiere aus Leidenschaft

Ich versuche es mal schnell, ohne es zu kontrollieren:

string stringEingabe = Console.ReadLine();

if (stringEingabe == "L") Console.Beep(15, 458);
else {
}

KnorxyThieus  01.04.2016, 19:52

Wenn else wirklich nichts passieren kann, dann kannst du dort auch ein Semikolon setzen ...?

0