Laden...

Bestimmte Zeit lang auf eine Eingabe warten

Erstellt von Elmini08 vor 5 Tagen Letzter Beitrag vor 2 Tagen 359 Views
Elmini08 Themenstarter:in
6 Beiträge seit 2024
vor 5 Tagen
Bestimmte Zeit lang auf eine Eingabe warten

Hi,

ich bin ganz neu hier.
Zur Info: Ich bin Azubi im ersten Lehrjahr und daher bin ich ein ziemlicher Neuling im Programmieren.

Ich möchte in meiner Konsolenanwendung, ähnlich wie bei einem Windows-boot, für eine bestimmte Zeit, einen bestimmten Key drücken können, um zu einem bestimmten Abschnitt des Codes zu gelangen, ähnlich wie, als würde ich das BIOS unter Windows aufrufen wollen. Falls in dieser Zeit die gewünschte Eingabe dann nicht erfolgt, soll ganz normal mit dem Code fortgefahren werden. Hat jemand Ahnung davon? Gerne auch mit Codebeispiel.

LG 
Elmini08

4.956 Beiträge seit 2008
vor 4 Tagen

Hallo und willkommen,

dafür kannst du Console.KeyAvailable sowie Console.ReadKey verwenden. Schau dir auch die Beispiele dort an.

Du mußt dann nur eine Schleife verwenden, welche basierend auf der Zeit (mittels DateTime.Now) die vergangenen Sekunden abwartet, bevor der restliche Code ausgeführt wird (alternativ kannst du auch die Klasse Stopwatch benutzen).

M
373 Beiträge seit 2006
vor 4 Tagen

Neuling im Programmieren.

Generell geht es beim Programmieren um die Frage wie sich der Compiler (Interpreter / Transpiler / ...) verhält, wenn er auf ein bestimmtes Schlüsselwort (evtl. i.V. mit anderen Schlüsselwörtern) (nicht) trifft.   Der C#-Compiler gibt auch Leitplanken an formell korrekten Code vor (neuere Compiler-Versionen sind hier aber liberaler). Und aus menschlicher Sicht ist der Code so zu schreiben, dass häufige(re) Änderungen oder Erweiterungen nur an einer zentralen Stelle vorzunehmen sind.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

Elmini08 Themenstarter:in
6 Beiträge seit 2024
vor 4 Tagen

Hi nochmal,

kann jemand evtl. mal zu dem DateTime.Now ein Codebeispiel zur Verfügung Stellen? Ich verstehe nicht ganz wie ich des in eine Schleife packe.

Danke schonmal!

VG
Elmini08

Mein Programm aktuell:
using System;

namespace Getränkeautomat
{
    internal class ProgrammGetränkeautomat
    {
        static void Main()
        {
            //Begrüßung
            Console.WriteLine("Programm is booting");

            //hier soll die Zeit verstreichen in der man den bestimmten key drücken kann um in die AdminOberfläche zu kommen 
            string sAdminInterface = Convert.ToString(Console.ReadKey());

            if (sAdminInterface == "I")
            {
                goto CommandLineInterface;
            }
            
//ganz viel anderer Code
            
            CommandLineInterface:
            {
                Console.WriteLine("TEST");
            }
        }   
    }
}
M
373 Beiträge seit 2006
vor 4 Tagen

In der Dokumentation recherchieren (oder KI befragen) gehört auch zur SW-Entwicklung...

Hier könnten Befehle wie "DateTime jetzt = DateTime.Now; "   "DateTime zukunft = jetzt.AddSeconds( /*Ganzzahl */ ); "  "while (DateTime.Now < zukunft) ..."  weiterhelfen

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

16.857 Beiträge seit 2008
vor 3 Tagen

..und den goto-Käse sein lassen.

Elmini08 Themenstarter:in
6 Beiträge seit 2024
vor 3 Tagen

Warum gotosein lassen? Begründung wäre schön xD

16.857 Beiträge seit 2008
vor 3 Tagen

Siehe mein Beitrag in https://mycsharp.de/forum/posts/3841689 unterer Teil.

Erst 3 Wochen alt.

Elmini08 Themenstarter:in
6 Beiträge seit 2024
vor 3 Tagen

Zitat von Th69

Lies mal über Spaghetticode.

Findest du das ist "Spaghetticode"?

					//User wählt Biersorte 1
					case 1:
						{
							if (iAnzahlVerfügbarkeitNummer1 <= 0)
							{
								Console.WriteLine("Diese Biersorte ist aktuell nicht verfügbar!");
                                Console.WriteLine();
                                break;
							}

							if (iAnzahlVerfügbarkeitNummer1 <= 5)
							{
                                Console.WriteLine("Es sind nur noch " + iAnzahlVerfügbarkeitNummer1 + " Flaschen dieser Biersorte verfügbar!");
                                Console.WriteLine();
                            }

							Console.WriteLine(sBiersorteNummer1 + "wurde deiner Aktuellen Auswahl hinzugefügt");
							Console.WriteLine("Preis pro Bier: {0:f} EUR", dPreisNummer1);
							Console.WriteLine();

							iAnzahlVerfügbarkeitNummer1--;
							
							dEndpreis += dPreisNummer1;

							Console.WriteLine("Preis deiner aktuellen Auswahl {0:f} EUR", dEndpreis);
							Console.WriteLine();
							Console.WriteLine("Möchtest du ein weiters Bier deiner Auswahl hinzufügen? Dann drücke die jeweilige Nummer der gewünschten Biersorte.");
							Console.WriteLine("Möchtest du kein weiters Bier drücke Taste <0>");
							Console.WriteLine();

							//Array für Ausgabe der Biere
							//ArrayZähler für nächste Belegung von Bit von Array
							sGewählteBiere[iArrayZähler] = sBiersorteNummer1 ;
							iArrayZähler += 1;

							//Maximal-Bestellwert    
							if (iArrayZähler == sGewählteBiere.Length)
							{
								Console.WriteLine("Maximal-Bestellwert erreictht. Bitte bezahlen sie nun.");
								Console.WriteLine();
								bWeitersBier = false;
							}
							break;
						}
16.857 Beiträge seit 2008
vor 3 Tagen

So startet Spaghetti-Code. Daher: ja.

Wie gesagt; goto hat in strukturierten Sprachen keinen direkten Anwendungsfall mehr. Verwende eine Sprache so, wie sie gedacht ist.

4.956 Beiträge seit 2008
vor 3 Tagen

Zitat von Elmini08

Findest du das ist "Spaghetticode"?

Dort verwendest du zwar kein goto, aber verbesserungswürdig ist der Code allemal (insb. wenn deine anderen case-Blöcke ähnlich aufgebaut sind).

Ich weiß, daß für einen Anfänger ersteinmal wichtig ist, daß der Code überhaupt funktioniert. Wenn man jedoch professionell Software entwickelt, dann sollte man sich immer selbst hinterfragen, ob der Code lesbar und wartbar ist.

Hier ein paar generelle Tipps:

  • Verwendung von Container-Datentypen (wie z.B. Array (T[]), List<T>, Directory<K, V>, s.a. [Übersicht] Collections (Auflistungen) ab .NET Framework 2.0) anstatt Einzelvariablen (wie bei dir sBiersorteNummer1- wie oben schon geschrieben, nehme ich an, du hast für die anderen case-Blöcke dann ähnlichen Code, nur eben bei den Variablen mit anderer Zahl am Ende?!)
  • längere Codezeilen sollten in einzelne (sinnvoll benannte) Methoden ausgelagert werden (ca. 10-20 Zeilen)
  • keine Vermischung von UI (Eingabe/Ausgabe) mit Logik (Berechnungen), d.h. Auslagerung in verschiedene Klassen (und Methoden)

Bei größeren Projekten sind dann weitergehende Themen zu beachten, wie z.B. in den Forenthemen FAQ bzw. Artikel beschrieben, insb. [Artikel] Drei-Schichten-Architektur.

M
373 Beiträge seit 2006
vor 3 Tagen

"Spaghetticode"?

Es gibt noch mehr Möglichkeiten aus menschlicher Sicht schwer(er) lesbaren oder erweiterbaren Code zu schreiben, weitere 25 (Codier-)Empfehlungen werden hier aufgeführt (gilt für Java, unter C# sieht die Sache aber ähnlich aus) : https://www.javaguides.net/2024/05/25-best-practices-for-java-developers.html

Im Grund gilt es die Teile der Software mit geringem Änderungsgrad (möglichst geschickt) zusammenzufügen und die Teile mit (sehr) hohem Änderungsgrad (möglichst geschickt) auszulagern.  Aber ab einer gewissen Komplexität dürften selbst Spezialisten-Teams ein Problem mit der implementierten Software haben.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

Elmini08 Themenstarter:in
6 Beiträge seit 2024
vor 3 Tagen

Zitat von Th69

Dort verwendest du zwar kein goto, aber verbesserungswürdig ist der Code allemal (insb. wenn deine anderen case-Blöcke ähnlich aufgebaut sind).

  • Verwendung von Container-Datentypen (wie z.B. Array (T[]), List<T>, Directory<K, V>, s.a. [Übersicht] Collections (Auflistungen) ab .NET Framework 2.0) anstatt Einzelvariablen (wie bei dir sBiersorteNummer1- wie oben schon geschrieben, nehme ich an, du hast für die anderen case-Blöcke dann ähnlichen Code, nur eben bei den Variablen mit anderer Zahl am Ende?!)

Das ist richtig. Jeder case-Block ist ziemlich das selbe und Tatsächlich ändern sich nur die zahlen der einzelnen Variablen. Ich habe schon versucht mit Directory zu arbeiten, doch wie bekomme ich es hin, dass sich die Variablen in jedem Case ändern?

Bitte um Hilfe!

Danke!
Elmini08

4.956 Beiträge seit 2008
vor 2 Tagen

Ähnlich wie du es schon so in deinem Code benutzt:

sGewählteBiere[iArrayZähler] = sBiersorteNummer1 ;

Wenn du also anstatt iAnzahlVerfügbarkeitNummer1--;(welches nur eine Vereinfachung von iAnzahlVerfügbarkeitNummer1 = iAnzahlVerfügbarkeitNummer1 - 1darstellt), hierfür eine List<int>benutzt:

iAnzahlVerfügbarkeitNummern[index]--;

wobei index dann die Variable ist, welche du für den switch über die Biersorte bisher benutzt hast (beachte außerdem, daß der index 0-basiert ist, während du bisher bei 1 beginnst, d.h. index = biersorte - 1).

PS: Die sog. Ungarische Notation  (genauer "Systems Hungarian"), d.h. die Benennung der Variablen anhand des Typen (i, d, s, ...), verwendet man in modernem Code nicht mehr.

Für .NET gibt es die Frameworkentwurfsrichtlinien.

Elmini08 Themenstarter:in
6 Beiträge seit 2024
vor 2 Tagen

Danke für die Hilfe schonmal.

Des mit der ungarischen Notation hat uns unser Lehrer in der Berufsschule beigebracht. Kannte es nicht anders.

Habe Tatsächlich auch bei 0 begonnen. Case 0 ist zum "Abbrechen der Bestellung" Sieht man auch im Code. Dass man <0> drücken soll um keine weiteren Biere der Auswahl hinzuzufügen.

Aber Danke dir! Werde des mit derListgleich mal ausprobieren.

LG
Elmini08

M
373 Beiträge seit 2006
vor 2 Tagen

Berufsschule

(etwa offtopic) jetzt könnte die Gefahr bestehen, dass weitere Codier-Methoden gelehrt werden, die früher durchaus Sinn hatten.  Und das Aufgaben mit Mitteln von früher bearbeitet werden wollen  (und dann auf modern(er)e Ratschläge trifft)

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉