[QUIZ#8] kuddeldaddeldu (C#)


kuddeldaddeldu

Erfahrenes Mitglied
#1
... und nochmal in C#

Zum Einarbeiten habe ich einfach das Galileo OpenBook C# von Eric Gunnerson genommen. Für Leute, die auf Windows mit Visual Studio arbeiten, könnte Visual C# 2008 von Andreas Kuehnel noch interessant sein (ebenfalls als OpenBook verfügbar).
Unverzichtbar ist natürlich die .NET Framework Class Library, die allerdings sehr umfangreich und anstrengend zu lesen ist.

Begrüßer:
C#:
using System;

class Hallo {

   public static void Main() {
      Console.Write("Geben Sie bitte Ihren Namen ein: ");
      string name = Console.ReadLine();
      Console.WriteLine("Hallo {0} !", name);
   }
   
}
Quadratzahlen:
C#:
using System;

class Quadratzahlen {

   public static void Main() {
      Console.Write("Obergrenze: ");
      int n = Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("Quadratzahlen bis {0}:", n);
      int square = 1;
      int i = 1;
      do {
         Console.WriteLine(square);
         i++;
         square = i*i;
      } while(square <= n);
   }
   
}
Fakultät & Fibonacci:
C#:
using System;

class Formeln {

   private int n;
  
   public Formeln(int n) {
      this.n = n;
   }
   
   public long fakultaet() {
      long fak = 1;
      for(int i = 1; i <= n; i++) {
         fak *= (long)i;
      }
      return fak;
   }
   
   public long fibonacci() {
      long x = 1;
      long y = 1;
      long fib = 0;
      for(int i = 2; i < n; i++) {
         fib = x + y;
         x = y;
         y = fib;
      }
      return fib;
   }
   
}
   
class FakFib {

   public static void Main() {
      Console.Write("Zahl: ");
      int n = Convert.ToInt32(Console.ReadLine());
      Formeln formeln = new Formeln(n);
      Console.WriteLine("{0}! = {1}", n, formeln.fakultaet());
      Console.WriteLine("f({0}) = {1}", n, formeln.fibonacci());
   }
   
}
Zahlenraten:
C#:
using System;

class Zahlenraten {

   public static void Main() {
      Random r = new Random();
      int zahl = r.Next(1, 100);
      Console.WriteLine("Erraten Sie eine Zahl zwischen 1 und 100! ");
      Console.Write("Ihr Tipp: ");
      int guess = Convert.ToInt32(Console.ReadLine());
      while(guess != zahl) {
         if(guess < zahl) {
            Console.WriteLine("Zu klein.");
         } else {
            Console.WriteLine("Zu groß");
         }
         Console.Write("Ihr Tipp: ");
         guess = Convert.ToInt32(Console.ReadLine());
      }
      Console.WriteLine("Richtig!");
   }
   
}
Rückwärts:
C#:
using System;
using System.Collections;

class Rueckwaerts {

   public static void Main() {
      ArrayList zahlen = new ArrayList();
      string eingabe;
      int sum = 0;
      do {
         Console.Write("Zahl (q zum Beenden): ");
         eingabe = Console.ReadLine();
         if(eingabe == "q") {
            break;
         } else {
            try {
               zahlen.Add(Convert.ToInt32(eingabe));
            } catch(FormatException e) {
               Console.WriteLine("{0} ist keine Ganzzahl!", eingabe);
            }
         }
      } while(true);
      for(int i = zahlen.Count - 1; i >= 0; i--) {
         Console.WriteLine(zahlen[i]);
         sum += Convert.ToInt32(zahlen[i]);
      }
      Console.WriteLine("Mittelwert: {0}", Convert.ToDouble(sum)/Convert.ToDouble(zahlen.Count));
   }
   
}
LG
 

Anhänge

#2
Hi knuddeldaddeldu!

Schön das du dich mit C# beschäftigt hast. :)
Hier mal ein paar Anmerkungen zu deinen Lösungen.

Zuerst nur was zu deiner Klammersetzung. Es ist irgendwie sehr ungewohnt C# Code zu sehen, bei dem die öffnende, geschwungene Klammer nicht in einer eigenen Zeile steht. Klar ist das nur eine Sache des verwendeten "coding standards", wollte es aber erwähnt haben. :)

So, nun zum Code.

Die ersten Beiden schauen ganz gut aus. Bei deiner Lösung zu den Fibonacci Zahlen und der Fakultät würde ich allerdings den Parameter n den Methoden übergeben, und nicht schon bei erstellung des Objekts den Wert festlegen.
Hier würde es ausserdem auch völlig ausreichen, wenn du die Methoden als statisch definierst. Das Objekt brauchst ja gar nicht. Als Beispiel kannst dir mal die Math Klasse ansehen. Hier sind die Methoden auch statisch.

So, dann mal weiter zum Zahlenraten.
Hier fällt mir auf, dass der Code zum Abfragen des Tipps doppelt vorkommt. Einmal ausserhalb der Schleife, und dann nochmal am Ende. Doppelten Code sollte man immer vermeiden, und hier gehts auch ganz einfach. :)
Das ganze könnte so aussehen:
C#:
// *snipp*
      while((guess = ReadGuess()) != zahl)
      {
         if(guess < zahl)
         {
            Console.WriteLine("Zu klein.");
         }
         else
         {
            Console.WriteLine("Zu groß");
         }
         Console.Write("Ihr Tipp: ");
      }
      Console.WriteLine("Richtig!");
   }

   private static int ReadGuess()
   {
      Console.Write("Ihr Tipp: ");
      return Convert.ToInt32(Console.ReadLine());
   }
// *snipp*
Jetzt noch zu deinem letzten Programm.

Hier sind ein paar Sachen die man schöner regeln kann. :)

Statt einer einfachen ArrayList kannst eine generische Liste benutzen, dann brauchst du dein Ergebnis nicht umwandeln. Wenn du es aber schon umwandeln willst, in deinem Fall reicht ein Cast, Convert.ToInt32 wäre nicht notwendig.

Bei deinem Umwandeln der Eingabe in einen Integer kannst auch noch auf eine schönere Variante zurückgreifen. int.TryParse!

Hier mal die von mir modifizierte Variante:

C#:
using System;
using System.Collections.Generic;
 
class Rueckwaerts {
 
   public static void Main() {
      List<int> zahlen = new List<int>();
      string eingabe;
      int sum = 0;
      do {
         Console.Write("Zahl (q zum Beenden): ");
         eingabe = Console.ReadLine();
         if(eingabe == "q") {
            break;
         }
         // else nicht nötig. :)
		 
         int zahl;
         if (int.TryParse(eingabe, out zahl))
            zahlen.Add(zahl);
         else
            Console.WriteLine("{0} ist keine Ganzzahl!", eingabe);
         
      } while(true);
	
      for(int i = zahlen.Count - 1; i >= 0; i--) {
         Console.WriteLine(zahlen[i]);
         sum += zahlen[i];
      }
      Console.WriteLine("Mittelwert: {0}", (double)sum/(double)zahlen.Count);
      Console.ReadLine(); // damits fenster nicht verschwindet. Einfach [enter] drücken.
   }
   
}
lg, Alex :)
 

kuddeldaddeldu

Erfahrenes Mitglied
#3
Hi Alex,

vielen dank für Dein Feedback. :)

Zuerst nur was zu deiner Klammersetzung. Es ist irgendwie sehr ungewohnt C# Code zu sehen, bei dem die öffnende, geschwungene Klammer nicht in einer eigenen Zeile steht. Klar ist das nur eine Sache des verwendeten "coding standards", wollte es aber erwähnt haben. :)
Ja, da prallen sie aufeinander, die Religionen. ^^

Die ersten Beiden schauen ganz gut aus. Bei deiner Lösung zu den Fibonacci Zahlen und der Fakultät würde ich allerdings den Parameter n den Methoden übergeben, und nicht schon bei erstellung des Objekts den Wert festlegen.
Hier würde es ausserdem auch völlig ausreichen, wenn du die Methoden als statisch definierst. Das Objekt brauchst ja gar nicht. Als Beispiel kannst dir mal die Math Klasse ansehen. Hier sind die Methoden auch statisch.
Guter Punkt. Normalerweise hätte ich die zwei Funktionen gar nicht erst in eine Klasse gepackt, aber an dem Beispiel kann man das ganz schön ausprobieren. Eine rein statische Klasse wäre hier aber wohl tatsächlich angebracht. Sähe bei mir dann so aus:

C#:
using System;

class Formeln {
   
   public static long fakultaet(int n) {
      long fak = 1;
      for(int i = 1; i <= n; i++) {
         fak *= (long)i;
      }
      return fak;
   }
   
   public static long fibonacci(int n) {
      long x = 1;
      long y = 1;
      long fib = 0;
      for(int i = 2; i < n; i++) {
         fib = x + y;
         x = y;
         y = fib;
      }
      return fib;
   }
   
}
   
class FakFib {

   public static void Main() {
      Console.Write("Zahl: ");
      int n = Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("{0}! = {1}", n, Formeln.fakultaet(n));
      Console.WriteLine("f({0}) = {1}", n, Formeln.fibonacci(n));
      Console.ReadLine(); // Für Windowsbenutzer, die das mit einem Doppelklick öffnen (?)
   }
   
}
Darauf muss ich gleich mal nebenan bei der Ruby-Version zurückkommen. :)

So, dann mal weiter zum Zahlenraten.
Hier fällt mir auf, dass der Code zum Abfragen des Tipps doppelt vorkommt. Einmal ausserhalb der Schleife, und dann nochmal am Ende. Doppelten Code sollte man immer vermeiden, und hier gehts auch ganz einfach. :)
:-( :) In PHP hätte ich das auch nicht so gemacht. Das müssen noch die Nachwehen von Python gewesen sein, wo ich keine Möglichkeit gefunden habe, die Zuweisung im Schleifenkopf zu machen und die Eingabe vorher einfach dreckig auf -1 gesetzt habe. Vielleicht kommt ja noch ein Pythonbegabter vorbei und präsentiert eine elegante Lösung.

Statt einer einfachen ArrayList kannst eine generische Liste benutzen, dann brauchst du dein Ergebnis nicht umwandeln. Wenn du es aber schon umwandeln willst, in deinem Fall reicht ein Cast, Convert.ToInt32 wäre nicht notwendig.
Ah, danke. Ich glaube, um sich durch die .NET Class Libraries durchzufinden, brauchts etwas Zeit, ich war ein wenig erschlagen.

Bei deinem Umwandeln der Eingabe in einen Integer kannst auch noch auf eine schönere Variante zurückgreifen. int.TryParse!
Ja, das sieht gut aus. :)
Auf die Methoden, die int selbst bietet, hatte ich gar nicht geachtet...

LG
 

Neue Beiträge