Michas Anfängerfragen...



  • ok, zurück zu etwas einfacheren Dingen...
    Die Konsolenanwendung soll die Summe von 1 bis n berechnen, wobei n eingegeben werden muß.
    Ich möchte jetzt sicherstellen, dass Fehleingaben (also z.B. -34 oder 20d)abgefangen werden.

    Gibt es eine elegantere Möglichkeit als im Listing gezeigt, die korrekte Eingabe des Anwenders abzufragen?

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Konsole_test
    {
        class Program
        {
            static void Main(string[] args)
            {
                int n=0;
                int s=0;
                bool n_Ok;
                Console.WriteLine("Berechnet die Summe von 1 bis n!");
                Console.WriteLine("Geben Sie n ein (n>0):");
                do
                {
                    try
                    {
                        n = int.Parse(Console.ReadLine());
                        n_Ok = true;
                        if (n < 0)
                        {
                            n_Ok = false;
                            Console.WriteLine("Falsche Eingabe!");
                        }
                    }
                    catch
                    {
                        n_Ok = false;
                        Console.WriteLine("Falsche Eingabe!");
                    }
    
                } while (!n_Ok);
    
                for (int i = 0; i <= n; i++)
                {
                    s += i; 
                }
                Console.WriteLine("Summe ist {0}", s);
    
            }
        }
    }
    


  • Hallo Leute,

    Kann man eigentlich irgendwie Zeilennummern mit in die Listings einfügen?
    Man könnte sich in seinem Posting leichter auf bestimmte Zeilen im Code beziehen!

    In Visual C# 2005 Express Edition geht das ja, aber wenn man den Code hier herkopiert? Wie geht das dann?

    Zu meiner Frage:

    Wenn ich mit new eine Instanz von einer Klasse kreiere, dann durchläuft das Programm immer einen Konstruktor. Wenn keiner codiert wurde, dann eben intern den Standartkonstruktor.

    Die allgemeine Syntax sieht ja so aus:

    <Sichtbarkeit> <Klassenname> ([<Parameter>])

    {
    //Konstruktorcode
    }

    der Konstruktor ist doch eigentlich nichts anderes, als eine spezielle Methode. Er hat auch keine Angabe eines Rückgabetypes. Richtig?

    Nun noch mal zum Verständnis, was da abläuft, wenn man eine neue Windowsapplikation erstellt, ohne irgendetwas zu codieren.

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    
    namespace viele_Textfelder
    {
        static class Program
        {
            /// <summary>
            /// Der Haupteinstiegspunkt für die Anwendung.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Form1 f = new Form1();  // diese Zeile habe ich selbst eingefügt, 
                                        // um es besser verstehen zu können
                                        // in dieser Zeile springt er dann in
                                        //die Registerkarte "Form1.Designer.cs"
                Application.Run(f);
            }
        }
    }
    

    Ich dachte, er geht direkt zu dem Konstruktor für die Klasse Form1?

    Macht er aber nicht, er springt dann erst mal Zeile XX an in u.a. Listing!
    In dieser Zeile definiert er eine Variable. Aber warum geht er in diese Zeile?

    namespace viele_Textfelder
    {
        partial class Form1
        {
            /// <summary>
            /// Erforderliche Designervariable.
            /// </summary>
    XX      private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Verwendete Ressourcen bereinigen.
            /// </summary>
            /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Vom Windows Form-Designer generierter Code
    
            /// <summary>
            /// Erforderliche Methode für die Designerunterstützung.
            /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
            /// </summary>
            private void InitializeComponent()
            {
                this.components = new System.ComponentModel.Container();
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Text = "Form1";
            }
    
            #endregion
        }
    }
    

    Nachdem er diese eine Variable definiert hat, geht er dann wirklich in den Konstruktor der Klasse Form1. Dazu springt er wieder in die Registerkarte "Form1.cs" in Zeile **

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace viele_Textfelder
    {
        public partial class Form1 : Form
        {
    **      public Form1()
            {
                InitializeComponent();
            }
        }
    }
    

    Mein Verständnisproblem schein mit der Aufteilung des Codes auf mehrere Registerkarten zusammenzuhängen!
    Kann man den kompletten Code zu einem Listing zusammenfügen und mal abarbeiten lassen?



  • Hallo Leute,

    noch eine Anfängerfrage:

    Warum sind die autogenerierten Kommentarzeilen manchmal in grau und manchmal in grün dargestellt?
    Haben die grauen eine besondere Bedeutung?

    Siehe hier:



  • Das ist einfach nur Teil vom Syntaxhighlighting.
    Dient der besseren Unterscheidung von relevanten und irrelevanten Informationen.



  • Das sind die XML Doku Kommentare. Grau sind die Tags und Grün ist der Text der dann ausgegeben wird wenn die Doku generiert wird. Zur anderen Frage: Er muss ja erst alle Klassenvariablen initialisieren, sonst könntest du ja im Konstruktor nie Klassenvariablen was zuweisen. Von daher stimmt die Reihenfolge wie er den Coe abarbeitet.



  • Hallo Leute,

    in einer Textdatei befinden sich Ziffern getrennt durch Kommatas.
    Die Textdatei lese ich mit einem Zuge in den String myString ein.
    Nun will ich die Ziffern in ein Feld einlesen. Diese Ziffern in myString sind aber Zeichen, also anstelle der 1 bekomme ich 49 in das Feld. Gibt es eine Umwandlungsfunktion, welche aus dem Zeichen ein int macht?
    Ich habe schon einiges probiert, aber nicht hinbekommen.
    Derzeit helfe ich mir mit der Subtraktion von 48, was ich aber total ungeschickt finde!

    Feld[z, s] = int.Parse(myString[i]);  // will er nicht!
    Feld[z, s] = (int) myString[i];       // so meckert er auch!
    

    Wie geht es nun besser als -48 ?
    Hier mein Listing:

    int[,] Feld = new int[9, 9];
                int i = 0;
                for (int z = 0; z < 9; z++)       // Zeile
                {
                    for (int s = 0; s < 9; s++)   // Spalte
                    {
                        Console.Write(myString[i]); // Kontrollausgabe
    
                        Feld[z, s] = myString[i]-48;  // ungeschickte Umwandlung!
                        i +=2;
                    }
                    i++;    //Am Ende einer Zahlenzeile kommt noch ein Zeilenumbruch, den überlesen!
                }
    

    Danke für Eure Hilfe!
    Gruß,

    Micha

    p.s. Hoffentlich kommt mein C# - Buch bald!



  • p.s. Hoffentlich kommt mein C# - Buch bald!

    hoff ich auch



  • darf ich mal fragen wie du dich bisher versucht hast schlau zu machen?
    Also ich hab mal (um zu schauen ob es da nichts gibt) in die MSDN eingegeben "convert to int" Was du ja machen willst, und da kommen super Ergebnisse die genau das erklären.
    hier oder hier ...



  • @Polofreak:

    das steht in Deinem ersten "hier"-Link:

    int anInteger;
    anInteger = Convert.ToInt32(textBox1.Text);
    anInteger = int.Parse(textBox1.Text);

    und das steht in meinem Listing:
    Feld[z, s] = int.Parse(myString[i]); // will er nicht!

    was ist da jetzt bei mir falsch?

    Du kannst mal davon ausgehen, dass ich IMMER zuerst versuche, mir woanders Hilfe zu holen, bevor ich mir wage, hier was zu fragen!



  • Micha369 schrieb:

    und das steht in meinem Listing:
    Feld[z, s] = int.Parse(myString[i]); // will er nicht!

    Funktioniert bei mir wunderbar.
    Wer weiß was Du falsch machst, aus der Fehlermeldung - "will er nicht" - werde ich auch nicht schlau.



  • @Micha:

    Du hast gesagt, dass in der Textdatei was in der richtung steht:

    123,75,9

    Oder?

    Es reicht nicht, wenn du das dann einfach in nen Array reinliest, sondern du musst es auch noch Splitten...

    Vielleicht haste es ja gemacht, aber wie Noodless schon sagte... Eine Fehlermeldung würde uns schon helfen.



  • Hallo Leute,

    Also

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Array_test
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Read the file as one string.
                System.IO.StreamReader myFile =
                    new System.IO.StreamReader(@"d:\temp\test.txt");
                string myString = myFile.ReadToEnd();
    
                myFile.Close();
    
                // Display the file contents.
                System.Console.WriteLine(myString);
                // Suspend the screen.
                //System.Console.ReadLine();
    
                int[,] Feld = new int[9, 9];
                int i = 0;
                for (int z = 0; z < 9; z++)
                {
                    for (int s = 0; s < 9; s++)
                    {
                        Console.Write(myString[i]);
    
    xx1                 Feld[z, s] = int.Parse(myString[i]); // mit dieser Zeile geht es nicht!
    xx2                 // Feld[z, s] = myString[i]-48;      mit dieser zeile geht es super!
                        i +=2;
                    }
                    i++;    //Am Ende einer Zahlenzeile kommt noch ein Zeilenumbruch, den überlesen!
                }
            }
         }
    }
    

    Diese Code läuft korrekt mit Zeile xx2. Wenn aber anstelle Zeile xx2 die Zeile xx1 notiert wird, dann fäuft der Code nicht. Es kommen 2 Fehler:

    Fehler 1 Die beste Übereinstimmung für die überladene int.Parse(string)-Methode hat einige ungültige Argumente. D:\Dokumente\Visual_C#\Projects\Array_test\Array_test\Program.cs 31 34 Array_test
    Fehler 2 1-Argument: kann nicht von "char" in "string" konvertiert werden. D:\Dokumente\Visual_C#\Projects\Array_test\Array_test\Program.cs 31 44 Array_test

    Meine Textdatei "Test.txt" sieht so aus:

    2,5,6,3,7,5,3,2,
    1,2,3,4,3,5,2,7,
    ......
    5,4,3,0,8,6,7,5,

    Seht mal, wenn ich schreibe:

    .
    .
    .
                string myString = myFile.ReadToEnd();
    .
    .
    .
                string a = "";
                a = myString[i];
    

    dann sagt es:

    Fehler 1 Eine implizite Konvertierung vom Typ "char" in "string" ist nicht möglich. D:\Dokumente\Visual_C#\Projects\Array_test\Array_test\Program.cs 34 25 Array_test

    Sehr komisch!
    myString ist eindeutig ein String und a ebenfalls!
    Der hat irgendwie ein Problem mit mir! Ich habe in meinem Code keine chars!

    Ich will dem String a nur einen ganz kleinen String zuordnen. Er ist nur ein Zeichen lang, z.B. a = myString[6]!

    a = "" geht ja! hier ist der String sogar nur 0 Zeichen lang! Also dachte ich mir, sollte man a doch auch Strings der Länge 1 zuweisen können, oder?



  • Schau dir die Doku an! Mit dem Indexer greifst du bei Strings auf einzelne Zeichen(sprich char) zu, nicht auf einzelnen Strings! Genau das sagt doch auch die Fehlermeldung - wie deutlich soll sonst noch ne Fehlermeldung sein?


Anmelden zum Antworten