Autor Beitrag
impete
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 17:47 
Hallo,
ich versuche gerade anhand dieses Tutorials www.csharpme.de/ganzzahlen.php C# zu erlernen. Auf der verlinkten Seite geht es um Ganzzahlen (int Variablen) und dort wird unter anderem auch beschrieben, wie man eine string Variable in eine int Variable konvertiert und diese dann anschließend in der Konsole ausgibt. Das ganze wird im Tutorial so gemacht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
string eingeleseneZeile = Console.ReadLine();
int gewandelteZeile;
gewandelteZeile = Convert.ToInt32(eingeleseneZeile);
Console.WriteLine(gewandelteZeile);
Console.ReadLine();

Ich habe das also in Visual C# 2008 Express Edition eingetippt und danach das Programm gestartet. Doch nachdem ich das Programm startete, öffnete sich nur die Konsole. Als ich dann mal Testweise Enter drückte, bekam ich folgende Ausnahmemeldung:
"FormatException wurde nicht behandelt. Die Eingabezeichenfolge hat das falsche Format."
Die Meldung bezieht sich auf diese Zeile:
ausblenden C#-Quelltext
1:
gewandelteZeile = Convert.ToInt32(eingeleseneZeile);					

Im Glauben, ich hätte irgendetwas falsch abgetippt, habe ich nun den Originalcode aus dem Tutorial kopiert und bei mir anstelle meines Codes eingefügt. Darauf hin startete ich das Programm erneut. Doch ich bekam die selbe Fehlermeldung. Mir ist es ein Rätsel, warum das bei dem im Tutorial funktioniert und es eigentlich auch funktionieren sollte, nur bei mir nicht. Kann mir vielleicht hier jemand weiterhelfen?
Würde mich riesig freuen.
PS: Bitte nicht flamen, falls es sehr einfach ist das zu lösen aber C# ist die erste Sprache, die ich erlernen möchte und ich habe dementsprechen wenig Ahnung.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 06.08.12 17:55 
Hallo,

ohne das ganze genauer zu kennen, vermute ich mal das du nichts eingegeben hast und daher ein Leerstring auch nicht in eine Zahl konvertiert werden konnte.
impete Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 18:12 
Aber ich habe das genau so wie im Tutorial und dort geht es. Und es ist ja im string Console.ReadLine().
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 18:45 
Dass in der Konsole nix steht, liegt daran, dass du nix anzeigen lässt. ^^

Schreib doch mal über die Zeile
ausblenden C#-Quelltext
1:
string eingeleseneZeile = Console.ReadLine();					

folgendes:
ausblenden C#-Quelltext
1:
Console.WriteLine("Gib eine Zahl ein und bestätige mit Enter:");					


Und wenn du dann startest, tust du genau das, was die Konsole dir sagt und voilà, es funktioniert. ;)


Der Grund, weshalb das das den Anschein hatte, dass es nicht funktioniert, ist folgender:
Du fragst in der ersten Zeile mit dem Befehl Console.ReadLine(); nach einer Konsolen-Eingabe.
Diese Zeile wartet also so lange, bis jemand die Enter-Taste drückt und dann gibt die den gesamten Text aus, der vorher eingegeben wurde. Weil du im Programm keine Text-Ausgabe hast, wartet es also ganz am Anfang auf eine Eingabe, daher ist das Fenster leer. Und wenn du Enter drückst, sagst du dem ReadLine, dass die Eingabe beendet ist und die wird die Eingabe zurück geben. Weil du aber nix eingegeben hast, kann sie nix zurück geben, also eine leere Zeichenkette. Und eine leere Zeichenkette kann nicht in eine Zahl konvertiert werden, daher der Fehler.



Edit:

Als Tipp: Folgendes Buch ist sehr gut:
openbook.galileocomp.../visual_csharp_2010/
Das lese ich gerade, bin bei ADO.Net (Datenbanken, kurz gesagt).
Damit bekommst du einen sehr guten Überblick über die ganzen Möglichkeiten mit C# und auch ein paar andere Techniken, wie WPF oder eben ADO.Net
Windows Forms wird leider nicht erklärt, aber das liegt daran, dass es veraltet ist und nicht mehr weiter entwickelt wurde. In der 2008-Version ist das aber glaube noch und wenn nicht, lässt es sich ganz leicht auch so lernen.
Hier ein Download-Link zu dem Buch:
download2.galileo-press.de/openbook/galileocomputing_visual_csharp_2010.zip

Und keine Sorge, das ist kostenlos und ganz sicher Virenfrei ^^

Das hier ist die Quelle:
www.galileocomputing...=01740217A5o1L6EC..8

Für diesen Beitrag haben gedankt: impete
impete Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 19:15 
Ok, schonmal ein fettes Danke an Palladin700! Aber eines versteh ich jetzt noch immer nicht. In dem Tutorial wird es so erklärt, dass mit der Methode Convert.ToInt32() eine string Variable (Text) in Zahlen umgewandelt wird und dann ausgegeben wird. Wenn ich nun aber selbst eine Zahl eingebe, dann wird doch kein Text umgewandelt, sondern nur die Zahl, die ich eingebe mit Console.ReadLine() eingelesen und wieder ausgegeben, oder nicht? Kann es sein dass das Tutorial der letzte Müll ist? Naja, werde wohl dann doch auf das zurückgreifen, dass du mir verlinkt hast :D
Danke!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 19:19 
Du gibst einfach ein Zeichen ein und wie jedes andere Zeichen ist auch die Zahl ein solches Zeichen.
Die Konsole kennt aber keine Zahlentypen, sondern nur string und deshalb gibt ReadLine auch nur Text aus.
Dafür gibt es doch Convert.ToInt32 (oder auch int.Parse) damit man aus dem Text wieder eine Zahl machen kann, da man mit dem Text nicht rechnen kann, mit dem Zahlen-Typ integer jedoch schon.



Und ob das Müll ist, kann ich nicht sagen, weil ich es nicht kenne, aber das, was du bisher gesagt hast, hängt ganz einfach nur an deinem Verständnis und wahrscheinlich nicht am Tutorial.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 06.08.12 19:30 
Zitat:
Kann es sein dass das Tutorial der letzte Müll ist?


Das Tutorial hat dir gezeigt das es knallt wenn du keinen gültiger Text der in eine Zahl umwandelbar ist eingibst. Du solltest also gelernt haben das der Text '7' was anderes ist als die Zahl '7'. Darstellung der Zahl(string) vs. Wert der Zahl(Integer). Wenn diese Lektion an dir vorbei gegangen ist ist das Tutorial vielleicht nicht für deinen Lerntyp geeignet.
impete Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 19:33 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Kann es sein dass das Tutorial der letzte Müll ist?


Das Tutorial hat dir gezeigt das es knallt wenn du keinen gültiger Text der in eine Zahl umwandelbar ist eingibst. Du solltest also gelernt haben das der Text '7' was anderes ist als die Zahl '7'. Darstellung der Zahl(string) vs. Wert der Zahl(Integer). Wenn diese Lektion an dir vorbei gegangen ist ist das Tutorial vielleicht nicht für deinen Lerntyp geeignet.



Aha. In dem Tutorial wurde das aber anders Dargestellt. Es wurde in dem Tutorial keine Fehlermeldung erwähnt und so getan, als ob es funktionieren würde.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 19:36 
Es funktioniert ja auch, voraus gesetzt, man gibt eine Zahl ein.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 06.08.12 19:37 
Zitat:
Es wurde in dem Tutorial keine Fehlermeldung erwähnt und so getan, als ob es funktionieren würde.


Du solltest das Tutorial auch zu ende lesen und dir nicht nur denn Code schnappen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 19:50 
Hab mir auch gerade die Mühe gemacht und gelesen:

Zitat:
erstellen einer string Variable und Einlesen einer Zeile (darauf achten nur eine Ganzzahl einzugeben, ansonsten führt es zu einem Programmabsturz)


Da hast du es.
Und später kommt sogar ein Bild.


Gut, ich will jetzt nicht meckern, hab mich früher auch gerne vor dem Lesen gedrückt, weil es spannender ist, zu probieren.
Aber damit bist du beim Programmieren ziemlich schnell am Ende, weil so kannst du es nur sehr schwer lernen.

Am sinnvollsten ist es, ein solches Buch wie das, wie ich es dir vorgeschlagen habe, durch zuarbeiten und damit meine ich auch wirklich durch arbeiten. Ich hab mir vorher schon über diverse Tutorials und einfaches Suchen eine Grund-Basis zurecht gelegt, daher viel mir der Start sehr leicht, aber es gibt auch kompliziertere Dinge, die dir vielleicht nicht gleich klar sind.
Dann musst du das betreffende Kapitel noch mal lesen und noch mal und immer wieder, so lange, bis du es verstanden hast. Die Beispiele probierst du aus, testest, probierst, baust nach, etc. bis du alles verstanden hast.
Besonders in den ersten Kapitel ist das wichtig, weil da wirklich die grundlegendsten Dinge erklärt werden.

Und auch wenn die pure Masse vom Text erst abschreckt, es lässt sich sehr locker lesen, ist gut erklärt und, wie ich finde, auch irgendwie spannend. ^^
Auch macht es dann einfach mehr Spaß, zu programmieren, wenn man nicht ständig nach fragen muss, was das nun bedeutet, weil man eine unbekannte Klasse oder Methode einfach mal schnell nach lesen kann und auch versteht, was das nun sein soll.

Nachdem ich die Kapitel, die die reinen Themen von C# behandeln (also ohne WPF oder ADO.Net), gelesen habe, kam mir auch im Internet nichts mehr unter die Augen, was ich nicht verstehen konnte. Das einzige, was ich noch nicht kannte, war ein einfaches Schlüsselwort (extern) aber das lässt sich dann mit den Kenntnissen auch sehr leicht nach lesen.



PS: Bestes Beispiel bei mir ist grad auch ADO.Net
Hab schon oft genug Fragen deswegen gestellt, weil ich mich vor den Kapiteln dazu gescheut habe.
Jetzt hab ich mal rein gelesen und mir werden viele Fragen klar. ^^
Ich werde jetzt einfach nicht weiter machen, bis ich die Kapitel dazu komplett durch habe und wenn ich dann immer noch eine Frage habe, kann ich auch ganz beruhigt in einem Forum nach fragen.
impete Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 20:16 
Ehrlich gesagt habe ich mir das schon durchgelesen, aber irgendwie scheinbar nicht verstanden.
Ich glaube mein Problem ist es, dass ich nicht wirklich verstehe, wie man sich das einlesen einer Zeile in die Konsole durch Console.ReadLine() vorstellen kann. Man merkt ja praktisch davon nur, dass man durch Enter eine weitere Zeile ausgibt. Was bringt es aber, eine Zeile einzulesen?

Edit:
Ist es also so, dass durch das Programm, das dort geschrieben wurde eine Zahl als Text eingelesen wird und dann als Wert wieder ausgegeben wird? Habe ich das nun richtig verstanden?
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 21:11 
Dass du eine Zahl eingeben musst, weil es sonst einen Fehler gibt, steht da aber ziemlich eindeutig drin. O.o


Naja, ich finde das Tutorial jetzt allerdings auch nicht so sonderlich toll.
Ich habe jetzt zwar nur dieses eine Kapitel gelesen, vielleicht sind die Anderen ja besser, aber ich bezweifle es.

Ich weiß allerdings auch nicht mehr, wie der Anfang im Buch erklärt ist, ich weiß nur noch, dass ich es sehr gut fand. ^^
Kann sein, dass du etwas länger brauchst, weil du komplett bei 0 anfängst, was ich nicht gemacht habe.
Aber auf jeden Fall bekommst du alles, was du brauchst, erklärt.



Und das "Programm" ist eigentlich nur zum veranschaulichen gedacht.
Du gibst eine Zahl ein, sie wird in integer (int ist die Kurzform) umgewandelt und anschließend wieder dargestellt.
Ich persönlich finde das Beispiel doof. Was ich eigentlich immer für den Anfang empfehle, ist ein Konsolen-Rechner.
Zu Beginn kann man ja so einfache Dinge wie Plus rechnen lassen. Die erste Version macht also nichts anderes, als zwei Zahlen zu addieren. Das geht mit Text nicht, daher brauchst du die Zahlen und damit hast du ein tolles Beispiel für Integer.
Das Programm wäre dann auch nicht weiter schwer. Es wird erst nach dem ersten Summanden gefragt, den du eingeben musst, dann der Zweite und danach werden sie addiert und das Ergebnis ausgegeben.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Console.WriteLine("Gib den ersten Summanden ein:");
string eingabe = Console.ReadLine();
int zahl1 = Convert.ToInt32(eingabe);

Console.WriteLine("Gib den zweiten Summanden :");
eingabe = Console.ReadLine();
int zahl2 = Convert.ToInt32(eingabe);

int ergebnis = zahl1 + zahl2;

string zahl1_Text = string.Format(zahl1);
string zahl2_Text = string.Format(zahl2);
string ergebnis _Text = string.Format(ergebnis );
// string.Format() formatiert das Angegebene in einen Text und unterstützt auch bestimmte Formatierungs-Arten.
// Im Prinzip macht diese Methode genau das, was auch Console.WriteLine() kann, wenn man davon absieht,
// dass Console.WriteLine() Text in der Konsole ausgibt und string.Format gibt den formatierten Text als Ergebnis zurück

Console.WriteLine("Das Ergebnis von " + zahl1_Text + " + " + zahl2_Text + " ist " + ergebnis _Text + ".");
Console.Read();


Wenn du das verstehst, hast du auch verstanden, wozu int verwendet wird. ^^

Du musst halt auch noch daran denken, dass das Programm ab stürzt, wenn keine Zahl eingegeben wird, dafür bietet int zwei Methoden:
ausblenden C#-Quelltext
1:
2:
int.Parse(text);
int.TryParse(text, out zahl);


Die erste macht genau das gleiche, wie Convert.ToInt32(text);
Die zweite ist etwas komplexer, zu komplex für deinen jetzigen Wissensstand, aber merk sie dir.

Ich persönlich bin ja der Meinung immer die eigenen Parse-Methoden zu nutzen. Finde ich einfach schöner und übersichtlicher. Ob du das auch so siehst, ist deine Sache.


Zuletzt bearbeitet von Palladin007 am Mo 06.08.12 21:33, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: impete
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 06.08.12 21:23 
Zitat:
Ist es also so, dass durch das Programm, das dort geschrieben wurde eine Zahl als Text eingelesen wird und dann als Wert wieder ausgegeben wird?


Nein. Immer wenn etwas visualisiert wird sei es in irgendeinem Control oder auf der Console geht das nur als string. Es wird also ein string von der Console gelesen und nachher auch wieder einer ausgegeben. An der Stelle ist das Tutorial tatsächlich eher schwach mann kann zwar wie dort beschrieben den Integer direkt per Console.WriteLine ausgeben. Aber da wird natürlich implizit in dieser Methode eine Umwandlung in string vorgenommen. Wie auch anders. Der Integer ist nur der Wert wir brauchen aber die Darstellung dieses Werts. Es erscheint dir vielleicht merkwürdig so genau zwischen Wert und Darstellung von Wert zu unterscheiden aber das ist wichtig. In unseren Köpfen sind Zahlenwerte zu sehr mit der dezimalen Darstellung verknüpft aber das ist ja nicht zwingend. Ich kann die Zahl ja auch binär, hexadezimal mit Tausendertrennzeichen oder Dezimaltrenner anzeigen. Das wären dann jedes mal eine andere Darstellungen als string aber das hat keinen Einfluß auf den Wert der Zahl (dann z.B. ein Integer).

Vielleicht wäre es eine gute Übung für dich raus zu finden wie man das Beispiel ändern muss um die Zahl in einem anderen Zahlenformat auszugeben zum Beispiel Hexadezimal.


Zitat:
Console.WriteLine("Das Ergebnis von " + zahl1 + " + " + zahl2 + " ist " + ergebnis + ".");


@Paladin7000

Du unterschlägst hier auch den meiner Meinung nach wichtigsten Teil des Tutorials in dem du hier Integer Variablen automatisch umwandeln lässt. Wie soll user profile iconimpete da erkennen das zahl1 als Integer was anderes ist als das was durch die obige Zeile für zahl1 auf der Console landet? Auch zahl1 und zahl2 werden durch obigen Code implizit vom System in strings umgewandelt. Da keinen näheren Details bestimmen wie das zu geschehen hat nimmt das System einfach mal eine Dezimalschreibweise. Ich würde es mir wünschen das man für Anfänger die ganze Magie die implizit irgend was tut abschalten könnte damit man wirklich verstehen kann.

Für diesen Beitrag haben gedankt: impete
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 21:28 
Stimmt, hast recht ^^

Ich bau einfach noch schnell über die Methode string.Format das mit ein.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 06.08.12 21:38 
Besser ein simples ToString(). Da ist eindeutiger das man dem ToString Parameter mitgeben kann wie etwas als string aussehen soll ;)
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 21:53 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Besser ein simples ToString(). Da ist eindeutiger das man dem ToString Parameter mitgeben kann wie etwas als string aussehen soll ;)


Ich hab jetzt absichtlich string.Format genommen, weil die Methode eben so ziemlich jede Formatierung beherrscht, die die Konsole intern vor nimmt.
Kann es sein, dass string.Format dort intern genutzt wird? Wäre ja eigentlich logisch, oder?
impete Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 22:04 
OK, ich glaube ich habe verstanden :D
Im nächsten Kapitel wird dann auch auf das Rechnen mit Ganzzahlen eingegangen. Ich stelle mir das im Kopf einfach so vor:
Ich gebe in einer bestimmten Schreibweise eine Zahl in die Konsole ein. Diese wandelt die Darstellung dann über die Methode Convert.ToInt32() in einen Wert (richtige Zahl) um. Das ist notwendig, weil ich ja mit Text schlecht rechnen kann.
Danke auf jeden Fall an euch beide für eure Hilfe, hat mir wirklich sehr geholfen!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 06.08.12 22:44 
Freut uns ^^


Aber ich finde trotzdem, du solltest das Tutorial lassen.
Ich finde das etwas schwach und nicht so gut.

Lies doch mal in das Buch rein, was ich dir gezeigt habe.
Das ist deutlich besser erklärt, bin eben noch mal drüber gegangen. ^^
impete Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 06.08.12 23:51 
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Freut uns ^^


Aber ich finde trotzdem, du solltest das Tutorial lassen.
Ich finde das etwas schwach und nicht so gut.

Lies doch mal in das Buch rein, was ich dir gezeigt habe.
Das ist deutlich besser erklärt, bin eben noch mal drüber gegangen. ^^


Ich muss dir recht geben, ich komme des öfteren durcheinander, das fängt teilweise schon bei simplen Grammatikfehlern an. Ich werde mit dem von dir empfohlenen Tutorial anfangen. Vielen Dank für den Tipp!