Autor Beitrag
pat_
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 31.12.12 12:00 
hallo,

Ich versuche mir mithilfe des Buches "Richtig einsteigen: Programmieren lernen mit Visual C# 2010" Grundlagen des programmierens beizubringen. Bitte entschuldigt meine totalen Anfängerfragen... Beim Versuch das Verschachteln von Schleifen zu verstehen, habe ich ein Problem bei dem ich nicht weiterkomm, weil ich da einfach was nicht verstehe :-). Bei der Ausgabe folgenden Codes beginnt die Ausgabe mit:

****
13
****
14
....


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> Zahlen = new List<int>();
            for (int j = 0; j < 40; j++)
            {
                Zahlen.Add(j);
            }


            for (int i = 0; i < 5; i++)
            {

                foreach (int k in Zahlen)
                {
                    {
                        Console.WriteLine(k);
                    }
                    Console.WriteLine("....");
                }
 Console.WriteLine("________________________________________");


            }
           }

        }
}



Warum beginnt die Ausgabe nicht bei 0??? Ich versteh es nicht... Ich kann den Code zwar so richten dass die Ausgabe so passt wie ich mir das vorstelle aber ich versteh einfach nicht warum es so nicht funktioniert. Ziel ist es in Folge ein kleines Programm zu machen das eine Liste aufsteigend nach Zahlenwerten ordnet, da das aber gar nicht funktioniert hat, sollte ich mal verstehen wie verschachtelte Schleifen abgearbeitet werden :-)...

Vielen Dank.
p.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 31.12.12 12:37 
:welcome: in der EE!

...könnte es sein, dass die Ausgabe so lang ist, dass der Anfang schon wieder aus dem Konsolen-Buffer herausgefallen ist ;) ? Lasse mal die äußere Schleife weg und scrolle in der Ausgabe hoch.

_________________
>λ=

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



BeitragVerfasst: Mo 31.12.12 15:05 
danke, das wird es gewesen sein, fast ein bissi peinlich. Dann hab ich mir wahrscheinlich nur eingebildet dass ich es mal geschafft habe mehr Zeilen auszugeben. Wenn ich nur 10 einträge in der Liste hab, dann bekomm ich die komplette Ausgabe.

Danke,
pat_ Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 31.12.12 15:56 
Jetzt mein eigentliches Problem. Ich versuche um das mit den verschachtelten SChleifen zu verstehen ein Programm zu schreiben das Zahlen in einer Liste ordnet. Meine Überlegung dafür:
-In der Inneren Schleife die Liste durchgehen und die kleinste Zahl ermitteln
- Kleinste Zahl in eine weitere Liste eintragen
- Aus der tempörären Liste die kleinste Zahl entfernen
- Mit der äußeren Schleife das so oft wiederholen bis die Zahlen geordnet sind

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {

            List <int> ListeZumOrdnen =  new List <int>();
            ListeZumOrdnen.Add(5);
            ListeZumOrdnen.Add(3);
            ListeZumOrdnen.Add(7);
            ListeZumOrdnen.Add(1);
            ListeZumOrdnen.Add(9);

            List<int> ListeGeordnet = new List<int>();
            List<int> ListeTemp = new List<int>(ListeZumOrdnen);
            int Minimum = ListeZumOrdnen[0];
            int ZählerTemp=0;

            for (int j = 0; j < ListeZumOrdnen.Count; j++)
            {

                for (int i = 0; i < ListeTemp.Count; i++)
                {
                    if (ListeTemp[i] < Minimum)
                    {
                        Minimum = ListeTemp[i];
                        ZählerTemp = i;
                    }
                }
                ListeGeordnet.Add(Minimum);
              ListeTemp.RemoveAt(ZählerTemp);
               Console.WriteLine(Minimum);
            }

        }
    }
}


So funktioninert es mal nicht :-) Der Fehler liegt mal unter anderem in Zeile 37 bei ListeTemp.RemoveAt(ZählerTemp); Wenn ich das auskommentiere dann kommt wenigstens keine Fehlermeldung:

Unbehandelte Ausnahme: System.ArgumentOutOfRangeException: Der Index lag außerha
lb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: index
bei System.ThrowHelper.ThrowArgumentOutOfRangeException()
bei ConsoleApplication3.Program.Main(String[] args) in C:\Users\kaufi\AppData
\Local\Temporary Projects\ConsoleApplication3\Program.cs:Zeile 30.
Drücken Sie eine beliebige Taste . . .



Vielleicht hat ja jemand eine Tip für mich was da alles falsch ist.
danke p.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 31.12.12 16:43 
Hallo pat_,

du solltest mal versuchen, mit dem Debugger dein Programm schrittweise durchzugehen.

Tipp: schau dir mal die Variable Minimum an...

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



BeitragVerfasst: Mo 31.12.12 19:29 
Danke,

Bin schrittweise das Programm durchgegangen und hab mal rausgefunden dass die Minimum Variable nach der inneren Schleife neu gesetzt werden muss. Funktionieren tut das ganze immer noch nicht ganz. Denn:
System.ArgumentOutOfRangeException wurde nicht behandelt.

Zeile 43: Message=Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.

Versteh ich nicht ganz denn wenn man die Schleife nur 4 mal durchlaufen lässt, auskommentierte Zeile 28 dann funktioniert es 4mal, beim 5en mal funktioniert es dann nicht mehr.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
         {

            List <int> ListeZumOrdnen =  new List <int>();
            ListeZumOrdnen.Add(5);
            ListeZumOrdnen.Add(3);
            ListeZumOrdnen.Add(7);
            ListeZumOrdnen.Add(4);
            ListeZumOrdnen.Add(2);
            ListeZumOrdnen.Add(8);
            ListeZumOrdnen.Add(9);

            List<int> ListeGeordnet = new List<int>();
            List<int> ListeTemp = new List<int>(ListeZumOrdnen);
            int Minimum;
            int ZählerTemp=0;

            for (int j = 0; j < ListeZumOrdnen.Count; j++)
            //for (int j = 0; j < 4; j++)
            {
                Minimum = ListeTemp[0];
                for (int i = 0; i < ListeTemp.Count; i++)
                {

                    if (ListeTemp[i] < Minimum)
                    {
                        Minimum = ListeTemp[i];
                        ZählerTemp = i;
                    }


                }
               ListeGeordnet.Add(Minimum);
               ListeTemp.RemoveAt(ZählerTemp);
            }
            foreach (int k in ListeGeordnet)
            {
                Console.WriteLine(k);
            }
        }
    }
}


Ich bitte um einen Neuen Tipp was wieder falsch ist.
Danke, und allen einen guten Rutsch.
p.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 01.01.13 12:18 
Hallo und frohes Neues Jahr,

ich habe deinen Code auch nur angeschaut, ohne ihn selber zu debuggen, aber ich denke, daß du auch die Variable ZählerTemp innerhalb der äußeren Schleife neu initialisieren mußt (sonst hat sie ja noch den Wert aus dem vorherigen Schleifendurchgang).

P.S. Als Übungsprogramm ist dein Code gut geeignet, aber wenn du in späteren Programmen eine Liste sortieren möchtest, dann reicht ein einfaches list.Sort().

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



BeitragVerfasst: Di 01.01.13 12:48 
Danke, perfekt jetzt funktioniert es! Jetzt betrachtet auch völlig logisch auch für mich. ;-)

Ein schönes Neues Jahr.

P.S. Ist auch nur als Übungsprogramm gedacht, zwecks Schleifen und Arrays verstehen. Nächstes Kapitel Methoden, da wird es wieder zu gewaltigen Unklarheiten kommen..

Danke
pat_ Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 03.01.13 23:11 
hallo,
ich hab wieder eine frage :-) , bin gerade dabei Methoden zu behirnen und bin jetzt beim ref-Parameter angekommen. dafür ist in meiner Literatur ein kleines Programm:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            string s = "";
            Wochentag(ref s);
            Console.WriteLine("Heute ist {0}", s);

        }
        //______________________________________________________________________________
        public static void Wochentag(ref string wochentag)
// (ref string wochentag)  wochentag = Parameter???????????man braucht ja keinen Parameter um den Wochentag herauszufinden?
        {
            wochentag = System.DateTime.Now.ToString("ddddd");
//wochentag  das ist ja eigentlich der Rückgabewert?????
        }



    }
}


ich versteh nicht was das bringt, warum das so funktioniert.... hat jemand ein Beispiel mit einer vielleicht einfachen Addition, oder irgend ein Bsp. wo man das besser erkennen kann was da passiert?

Danke,
p.
pat_ Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 04.01.13 00:46 
....ist ref und out nur dafür da um Parameter auszugeben, also um z.B mehrere rückgabewerte aus der Methode zu bekommen. also:



ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class OutExample
{
    static void Method(out int i, out int j)
    {
        i = 44;
        j = 77;
    }
    static void Main()
    {
        int value;
        int valueB;
        Method(out value, out valueB);
        Console.WriteLine(value + valueB);

    }
}



Aber das bedeutet dann dass man nur entweder Rückgabewerte aus der Methode rausbekommt, aber zusätzlich keine Werte einlesen kann. Bsp. Wenn ich von einem Rechteck mit SeiteA u SeiteB die Fläche und den Umfang ausgeben will dann funktioniert sowas wie folgend nicht

ausblenden C#-Quelltext
1:
2:
 private static double Rechteckberechnungen(double SeiteA, double SeiteB, out double Fläche, out double Umfang)
....


Also entweder Parameter rein oder Parameter raus, nie beides???

Danke, p
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Fr 04.01.13 00:50 
Versuche, den Unterschied zu erkennen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int i=1;

            AddNoRef(i);
            Console.WriteLine("Addition ohne Ref ergibt: ", i);
            AddRef(i);
            Console.WriteLine("Addition mit Ref ergibt: ", i);

        }
        //______________________________________________________________________________
        public static void AddNoref(int Value)
        {
            Value=Value+1;
        }

        public static void AddRef(ref int Value)
        {
            Value=Value+1;
        }



    }
}


Das ganze mag ein wenig sinnlos erscheinen. In vergangenen Tagen gab es aber grundsätzlich nur die Option mit "AddNoref". Man mußte mit gefährlichen Konstrukten arbeiten, wenn man die Änderungen an der Parameter-Variablen "nach draußen" sichtbar haben wollte (Stichwort: Zeiger - der Alptraum der meisten Informatik-Studenten).

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 04.01.13 11:59 
Hallo!

Ich mache an dieser Stelle mal zu. Bitte erstelle für jede Frage einen eigenen Thread in der richtigen Sparte und vor allem mit einem Titel, der Dein Problem beschreibt! Sammelthreads führen nur zu Durcheinander und machen es anderen schwer, den Thread über die Suchfunktion zu finden.

Danke Dir! :zustimm:

Viele Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.