Autor Beitrag
zopffa
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 18.11.09 17:33 
Hallo,
ich bin sowohl im forum als auch in der welt des programmierens absoluter neuling. wir haben nächste eine prüfung über C# und ich komme mit den übungsbeispielen nicht so recht klar, daher wende ich mich jetzt mal vertrauensvoll mit den angaben an euch vielleicht kann mir ja jemand bei der einen oder anderen aufgabe ein bisschen weiter helfen.

1. Erstellen sie eine Anwendung die Summe und den arithmetischen Mittelwert eines Arrays bestehend aus int-Werten berechnet und auf der Console ausgibt.

2. Erstellen sie eine Anwendung die größte und kleinste Zahl in einem Array bestehend aus int-Werten sucht und auf der Console ausgibt.

3. Erstellen sie eine Anwendung die überprüft, ob in einem Array, bestehend aus int-Werten mindestens ein Wert mehr als einmal vorkommt. Sie soll ausgeben ob und welcher Wert mehr als einmal vorkommt.

4. Schreiben sie eine Anwendung die den größten Teiler einer zahl ausgibt. Benutzen sie dabei z.B. den % Operator.

5. Berechnen sie die Ziffernsumme einer 6 stelligen Zahl. Sie können auf die einzelnen Positionen in einem string wie bei einem Feld mittels [] zugreifen. Hinweis: Convert.toInt32 erwartet einen string und keinen char.

6. Sortieren sie die Zahlen in einem Array aufsteigend.

dürfte glaub ich für jemanden mit ahnung keine schwierigkeit darstellen.

vielen dank

leo
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 18.11.09 17:43 
Hallo und herzlich :welcome:,

ich denke es bringt wenig, wenn wir dir die Aufgaben "machen". Die Lösungen gibt es unter anderem schon im Netz ;)

Deshalb würde ich vorschlagen du machst dir zur jeder Aufgabe Gedanken wie du so lösen würdest und wenn du dann konkrete Probleme hast kannst du dich gerne nochmal melden.

Z.B. zu 1). Erstellen sie eine Anwendung die Summe und den arithmetischen Mittelwert eines Arrays bestehend aus int-Werten berechnet und auf der Console ausgibt.

Array? Wie anlegen? --> Galileo-Openbook (openbook.galileocomputing.de/csharp/)
Console Ausgebn? --> Galileo-Openbook (openbook.galileocomputing.de/csharp/)
Wie man eine Summe bildet? --> Wikipedia (de.wikipedia.org/wiki/Summe)
Wie man das arithmetische Mittel bildet? Wikipedia (de.wikipedia.org/wiki/Mittelwert)

Nun hast du alle Bausteine für Aufgabe 1. Die Anleitung von Wikipedia heißt es nun in Quellcode umzuschreiben und fertig...

Gruß Daniel
zopffa Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 19.11.09 09:47 
Hallo,

Vielen Dank für die schnelle Antwort. Die erste Aufagabe hab ich einmal lösen können und zu punkt 2 und 3 hätt ich jetzt eine Frage.

2.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
int[] feld = new int[] { 110217 };
            int größte = 0;
            int kleinste = 1000;

            foreach (int index in feld)
            {
                if (index > größte) größte = index;
                if (index < kleinste) kleinste = index;
            }

            Console.WriteLine(größte);
            Console.WriteLine(kleinste);


funktioniern tut es allerdings nur so lange die Zahlen im array kleiner sind als die Variable "kleinste" is glaub ich nicht so ganz sauber oder?

3.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
int[] arr = { 12342 };
            
            foreach(int element in arr)
            {
                foreach(int teil in arr)
                {
                    if (teil == element)
                    {
                        Console.WriteLine(element);
                    }
                }


bei der dritten frage hab ich jetzt dass zusammen gebracht er schreibt alle zahlen auf und die doppelt vorkommen stehen eben doppelt da, aber ich komm einfach nicht dahinter wie das wirklich gehen soll.


Zuletzt bearbeitet von zopffa am Do 19.11.09 11:17, insgesamt 2-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 19.11.09 10:22 
Hallo und ebenfalls :welcome:

Vorab: Bitte benutze die Code-Markierung; das kannst du auch nachträglich erledigen: für deinen Beitrag den Schere-Button drücken, Code-Text markieren, "Bereiche" öffnen, C# auswählen, Plus-Button drücken, Absenden. Sieht das nicht viel lesbarer aus?

Zu 2. Du musst beide Variablen auf tatsächlich vorhandene Werte setzen, beispielsweise:
ausblenden C#-Quelltext
1:
2:
int größte = feld[0];
int kleinste = feld[0];


Zu 3. Es gibt viele Wege zur Lösung. Einer ist deine doppelte Schleife mit sofortiger Ausgabe der Treffer. Ein anderer ist, zuerst alle Treffer in einem weiteren Array (oder besser: List<int>) zu speichern. Noch besser wäre es, zuerst das Array zu sortieren (Aufgabe 6), dann stehen alle doppelten Werte direkt hintereinander.

Die Zusatzfrage "ob" weist sowieso auf eine boolsche Variable hin. (Das ist nicht zwingend; denn stattdessen kann auch abgefragt werden, ob die List<int> Einträge enthält.)

Gruß Jürgen
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 19.11.09 10:44 
Hi,

dein Problem ist ja, dass du klein und groß initialisieren musst bzw. der Compiler es automatisch machst. Der Kompiler würde ein int mit 0 initialisieren, was für dein Vorhaben schlecht wäre :) Wenn du es selber machst musst du eine Zahl größer als die im Feld wählen (aber das weißt du ja noch nicht). Folgende drei Möglichkeiten hast du nun:

1) Initialisier dein int mit der Größten bzw. Kleinsten Zahl der Datentyps:
ausblenden C#-Quelltext
1:
2:
int kleinster = int.MaxValue;
int groeßter = int.MinValue;


So kannst du dir sicher sein, dass dein Algo Richtig läuft. Ist aber nicht umbedingt schön.

2) Du verwendest einen "höheren" Datentyp, der auch Werte kennt, die keine Zahl sind. Hat zum Nachteil, dass er mehr Speicher benötig, aber dies heutzutage bei 95% der Anwendungen keine Rolle mehr spielt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
float kleinster = float.NaN;
float groeßter = float.Nan;

foreach(int number in numbers)
{
   if (kleinster == float.NaN || kleinster < number)
   {
      kleinster = number;
   }
   ....
}


3) Verwende die Funktion Min und Max - Da ist der Lerneffekt natürlich gleich Null ;)
ausblenden C#-Quelltext
1:
Console.WriteLine("Größte={0} ttKleinste={1}", numbers.Max(), numbers.Min());					




Zu Aufgabe 3)
Bei Aufgabe 3 geht es darum zu zählen, wie oft ein Element in dem Feld vorkommt. Dafür musst du dir jeweils merken wie oft eine Zahl bereits vorkam. Brauchst also einen Speicher. Hier gibt es "natürlich" wieder mehrere Möglichkeiten und es heißt die Richtige auszuwählen. Vom Titel würde ich sagen dein Lehrer will/schlägt vor Arrays zu nehmen. Dies wäre aber sehr umständlich (zwei Dimensionales array oder ein array mit Max Zahl als Elemente). Deshalb schlag ich vor du verwendest ein Dictionary. Ein Dictionary hinterlegt zu einem Key (Schlüssel) einen bestimmten Wert (Value).

Deklarieren tut man ein Dictionary indem man die Typ des Keys und der Values angibt:

ausblenden C#-Quelltext
1:
Dictionary<intint> counts = new Dictionary<intint>();					


Wenn du nun über das Feld von Zahlen interrierst/"gehst" hinterlegst du jede Zahl als Schlüssel und als Wert schreibst du 1 rein bzw. inkrementierst (hochzählen/+1) den vorhanden Wert.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
            foreach (int item in numbers)
            {
                if (!counts.ContainsKey(item))
                {
                    counts.Add(item, 1);
                }
                else
                {
                    counts[item]++;
                }
            }


Man kann den Wert (else-Zweig) nicht einfach hochzählen (Zeile 9), sondern muss beim ersten Mal (Zeile 3) den Wert anlegen (Zeile 5).

Bei der Ausgabe iterierst du über dein Wertpaare und gibst solche aus die öfters als einmal vorkommen (Anahl größer 1 ist).
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            foreach (KeyValuePair<intint> pair in counts)
            {
                if (pair.Value > 1)
                {
                    Console.WriteLine("Zahl {0} kam {1} vor.", pair.Key, pair.Value);
                }
            }


Gruß Daniel
zopffa Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 19.11.09 12:22 
Hallo,

steter tropfen höhlt den stein, einen kleinen schritt vorwärts hab ich schon wieder gemacht.

Neue Erkenntnisse bringen leider auch immer neue Fragen ;(.

4. Schreiben sie eine Anwendung die den größten Teiler einer zahl ausgibt. Benutzen sie dabei z.B. den % Operator.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
double eingabe = 6;
            double modulo = 0;

            for (double index = eingabe; index > 1; index--)
            {
                modulo = eingabe % index;

                if (modulo == 0)
                {
                    Console.WriteLine(index);
                }
            }
[cs]

Jetzt gibt er natürlich alle ganzzahligen Teiler aus und nicht nur den grßten, wie kann ich das ändern?


3. Erstellen sie eine Anwendung die überprüft, ob in einem Array, bestehend aus int-Werten mindestens ein Wert mehr als einmal vorkommt. Sie soll ausgeben ob und welcher Wert mehr als einmal vorkommt.

@ daniel: danke für den tip mit dem dictionary, ich glaub dir auch sofort dass es sich dabei um die bessere lösung handelt nur leider müssen wir mit den arrays auskommen ;(

6. Sortieren sie die Zahlen in einem Array aufsteigend.

und wie das mit dem sortieren funktionieren soll weiss ich leider auch noch nicht wirklich.

grüße
leo


Zuletzt bearbeitet von zopffa am Do 19.11.09 13:23, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 19.11.09 13:07 
Wenn du noch einen Code schreibst, der nicht als solcher markiert ist, stelle ich meine Hilfe ein. :oops:

Zu 4. Du willst nur einen Wert haben. Also musst du dafür sorgen, dass die Schleife nach dem Treffer abgebrochen wird. Dazu gibt es mehrere Möglichkeiten:

(a) Eine for-Schleife kann mit if-break abgebrochen werden.
(b) Alternativ kommt eine do-while-Schleife in Frage.
Warum du double-Werte für die Division ganzer Zahlen verwendest, verstehe ich überhaupt nicht.

Außerdem solltest du ein bisschen mehr nachdenken. Wie groß kann der größte Teiler einer ganzen Zahl eigentlich sein? Kann man die Schleife dann nicht etwas beschränken?

Zu 6. Siehe Wikipedia: Sortierverfahren. Bei den WebLinks gibt es einen Verweis auf Sortieralgorithmen, die für "beliebige" Programmiersprachen übernommen werden können.

Alternativ kannst du natürlich auch selbst nachdenken: Was muss ich auf dem Papier machen (oder mit 6 Würfeln, die in einer Reihe liegen), um mehrere Zahlen zu sortieren? Das gleiche Verfahren wird dann in den Code umgesetzt.

Jürgen
zopffa Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 24.11.09 22:43 
danke für die vielen antworten zum glück hab ich die prüfung jetzt hinter mir