# Zufallszeilen ausgeben?



## FINDmySELF (15. März 2012)

Hallo Leute, 
ich muss eine Lotterie durchführen und hab mir überlegt mir dafür ein Programm zu besorgen. 

Wie ich es mir vorgestellt habe: 
Ich lasse eine .txt-Datei mit ~60 Zeilen einlesen. Dabei ist jede Zeile ein Name in der Liste. 
Im nächsten Schritt sollen 4 Namen/Zeilen ausgegeben werden. 

Da meine Künste im Programmieren mehr als begrenzt sind, frage ich euch, ob Ihr mir so ein Tool Basteln könntet. 
In meiner Schule habe ich zwar C#, aber mehr als in der Konsole 2 Zahlen eingeben und diese dann auszugeben, geht bei mir nicht. 

Wäre nett, wenn Ihr mir Hilfestellung geben könntet. 


Gruß FINDmySELF


----------



## fadade (15. März 2012)

Also wenn du es mit C# lösen möchtest, dann ist das bestimmt nicht so schwer (ich habe zwar momentan keinen PC, aber hier mal ein paar ansätze)


```
// Datei einlesen:
System.IO.Streamreader sr = new System.IO.Streamreader([DATEIPFAD]);

// Zeilen in einem Array unterbringen (Liste würde auch gehen) --> Trennzeichen ist hier der Systemspezifische Zeilenumbruch
String[] input = sr.ReadToEnd().Split(System.Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
sr.Close(); // stream schließen

// Zufallsgenerator erstellen
Random generator = new Random();

// 4 Zufallszahlen generieren, maximaler wert = länge der Input-Liste
int[] zufallszahlen = new int[4];
for (int i=0;i<zufallszahlen.Length; i++)
    zufallszahlen[i] = generator.Next(0, input.Length);

// Ausgabe kannst du jetzt machen mit irgendwie sowas:
foreach (int i in zufallszahlen)
     messageBox.Show("Ausgewählt: " + input[zufallszahlen[i]]);
```

Grob mal 
Natürlich solltest du noch prüfen, dass keine doppelten Zufallszahlen vorkommen und Ausgabe kannst du dann anstatt in einem Form auch z.B. in der Konsole machen, indem du einfach die vier ausgewählten zeilen in einem String anneinanderreihst und dann mit Console.Write(); o.ä. ausgibst


----------



## FINDmySELF (15. März 2012)

Danke schoneinmal. Allerdings frage ich mich, wo ich den Code (und wie) einfügen soll. Wie oben erwähnt, bin ich absolut nicht begabt. Liegt leider an unserem Lehrer, der das nicht rüberbringen kann. 
Von der Schule haben wir Visual Studio 2010 Professional bekommen und schlagen uns damit herum.


----------



## hBGl (15. März 2012)

Ich habe dir mal ein Beispiel geschrieben für eine txt Datei mit 10 Namen. Da gibt es Möglichkeiten on the fly die Zeilen zu zählen aber der Einfachheit wegen hier eine Konstante.

Hier der Code:


```
using System;
using System.IO;

public class Gewinnspiel
{
   public static void Main()
   {
      
      // Öffne txt Datei
      System.IO.StreamReader file = new System.IO.StreamReader(@"c:\namen.txt"); // Dein Pfad muss hier rein
      
      // Trennzeichen
      string[] delimiters = new string[] {System.Environment.NewLine};
      
      // Namen
      string[] names = file.ReadToEnd().Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
      
      // Schließe txt Datei
      file.Close();
      
      // Anzahl der Gewinner
      int winnerCount = 4;
      
      if (names.Length < winnerCount)
      {
        winnerCount = names.Length;
      }
      
      // Gewinner
      int[] winners = new int[winnerCount];
      
      // Initialisiere den Zufallsgenerator
      Random rnd = new Random();
      
      // 4 unterschiedliche "zufällige" Zahlen
      for (int j=0; j<winnerCount; j++)
      {
        winners[j] = rnd.Next(0,names.Length);
      
        for (int k=0; k<j; k++)
        {
            while (winners[k] == winners[j])
            {
                winners[j] = rnd.Next(0,names.Length);
            }
        }
      }
      
      Console.WriteLine("Anzahl der Teilnehmer: " + names.Length + "\r\n" +
                        "Anzahl der Gewinner: " + winnerCount + "\r\n\r\n");
      
      foreach (int winner in winners)
      {
        Console.WriteLine("Gewonnen hat: " + names[winner]);
      }
      
      Console.ReadLine();

   }
}
```
Ich hab mir den Kram gerade ein bisschen zusammengesucht. Ich habe zwar schon ein wenig C# programmiert aber noch nichts mit Zufallszahlen.
*fadade* hat schon das meiste gemacht ;D Danke dafür.


----------



## ILastSamuraiI (15. März 2012)

Ich weiß das jetzt gerade nicht aus dem Kopf, aber das müsste eigentlich auch auf der Kommandozeile gehen. In Linux wäre es jedenfalls kein Problem. Aber das Programm oben müsste ja auch gehen^^.
Aber.. gibt das Programm nicht nur eine Zeile aus? Wäre aber einfach das zu erweitern


----------



## hBGl (16. März 2012)

Ich habe noch mal eine bessere Version gemacht. Diesmal mit Liste und einer Funktion um Mehrfachteilnahmen auszuschließen  Mit -d als Parameter nimmt der die Duplikate raus.


```
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;

public class Gewinnspiel
{
   public static void Main(string[] args)
   {
      bool checkDuplicates = false;
      int winnersCount = 4;
      
      // Prüfe ob Duplikate gelöscht werden sollen
      if ( args.Length > 0)
      {
        if (args[0] == "-d")
        {
            checkDuplicates = true;
        }
      }
      
      // Öffne txt Datei
      System.IO.StreamReader file = new System.IO.StreamReader(@"c:\namen.txt"); // Dein Pfad muss hier rein
      
      // Trennzeichen
      string[] delimiters = new string[] {System.Environment.NewLine};
      
      // Namen
      List<string> names = new List<string>( file.ReadToEnd().Split(delimiters, StringSplitOptions.RemoveEmptyEntries) );
      
      // Schließe txt Datei
      file.Close();
      
      // Lösche Duplikate aus der Liste
      if (checkDuplicates)
      {
        names = names.Distinct().ToList();
      }
        
      // Sonderfall: Mehr Gewinner als Teilnehmer
      if (names.Count < winnersCount)
      {
        winnersCount = names.Count;
      }
      
      // Gewinner
      int[] winners = new int[winnersCount];
      
      // Initialisiere den Zufallsgenerator
      Random rnd = new Random();
      
      // 4 unterschiedliche "zufällige" Zahlen
      for (int j=0; j<winnersCount; j++)
      {
        winners[j] = rnd.Next(0,names.Count);
      
        for (int k=0; k<j; k++)
        {
            while (winners[k] == winners[j])
            {
                winners[j] = rnd.Next(0,names.Count);
            }
        }
      }
      
      // Ausgabe Informationen
      Console.WriteLine("\r\n" +
                        "Anzahl der Teilnehmer: " + names.Count + "\r\n" +
                        "Anzahl der Gewinner: " + winnersCount + "\r\n" +
                        "Entferne Duplikate: " + checkDuplicates + "\r\n" +
                        "\r\n");
      
      // Ausgabe Gewinner
      foreach (int winner in winners)
      {
        Console.WriteLine("Gewonnen hat: " + names[winner]);
      }
   }
}
```
Ich hab erst einmal alles in die Main gepackt. Ist einfacher


----------



## FINDmySELF (16. März 2012)

Es Funktioniert 
Vielen Dank. Sowas hätte ich auch in 3 Jahren Unterricht nicht hinbekommen.


----------



## hBGl (16. März 2012)

Kein Ursache. Wenn dein Lehrer eine Niete ist solltest du dir selbst etwas beibringen. Gibt doch 1000 Tutorials im Netz. Dann würde ich den Code noch mal durchgehen und verbessern oder erweitern oder sonstwas.


----------



## Olstyle (16. März 2012)

Der Streamreader kennt übrigens auch die Funktion ReadLine() die den String bis zum nächsten Zeilenumbruch zurück gibt. 
So kann man auch anschaulich durch die Zeilen wandern.

Das Gezeigte funktioniert natürlich auch und dürfte intern quasi identisch laufen, nur dass man die Schleife nicht "sieht".


FINDmySELF schrieb:


> Vielen Dank. Sowas hätte ich auch in *3 Jahren Unterricht* nicht hinbekommen.


Ach du S*****e. Das ist nun wirklich kein Hexenwerk sondern absolute Basics.


----------



## FINDmySELF (16. März 2012)

Für mich ist es Hexenwerk. 
Wir sind in 4 blöcken a 6 wochen mit 3x90min pro woche nicht über die ein/ausgabe in der Konsole hinweg gekommen. Und ab nächsten Block will er Datenbanken machen. Da freut sich schon jeder aus meiner Klasse.


----------



## fadade (16. März 2012)

Naja, für vieles reicht die Konsole auch, wenn du nur mit Daten hantieren möchtest!
Mein Tipp: such dir eine kleine Selbstaufgabe (Konsole/GUI/Whatever, vielleicht auch schon eine kleine Datenbank, einfach als listenbaum realisiert) und lern daran etwas. Kannst hier auch gerne fragen und dann im nächsten Block stellst du die Aufgabe einfach mal vor, als Einleitung oder "primitive" Vorstellung von Datenbanken und daran kann der Lehrer dann anknüpfen o.ä.


----------



## Skysnake (18. März 2012)

FINDmySELF schrieb:


> Danke schoneinmal. Allerdings frage ich mich, wo ich den Code (und wie) einfügen soll. Wie oben erwähnt, bin ich absolut nicht begabt. Liegt leider an unserem Lehrer, der das nicht rüberbringen kann.
> Von der Schule haben wir Visual Studio 2010 Professional bekommen und schlagen uns damit herum.


 "Super" Idee....

Mit Atombomben auf Spatzen schießen 

Schon allein die IDE ist VIEL zu überfrachtet, um für absolute Neulinge vernünftig eine Sprache zu lernen. Zumindest meine bescheidene Meinung... Da biste ja mehr mit der IDE beschäftigt, als mit allem anderen


----------



## Bärenmarke (20. März 2012)

Was auch nicht schlecht ist, Galileo Computing macht gute Bücher, damit hab ich z.b. php gelernt 
Kannst dirs ja mal angucken, ob das nicht was für dich wäre. Den in der Regel lernt man es in der Schule nicht richtig


----------



## hBGl (21. März 2012)

Skysnake schrieb:


> "Super" Idee....
> 
> Mit Atombomben auf Spatzen schießen
> 
> Schon allein die IDE ist VIEL zu überfrachtet, um für absolute Neulinge vernünftig eine Sprache zu lernen. Zumindest meine bescheidene Meinung... Da biste ja mehr mit der IDE beschäftigt, als mit allem anderen


 
Ich hab den Kram in Notepad++ gemacht und selbst kompiliert  Ist auf jeden Fall nicht optimal aber funktioniert.


----------



## Skysnake (21. März 2012)

Na, so schlecht ist das gar nicht, weil wenns funktioniert, dann weißte dass du alles richtig gemacht hast, und du musst halt alles wissen 

Ich schaff selbst heute noch in der Uni an nem großen Projekt mit gedit, der nur syntax highlighting hat, und das wars...  DAS GEHT!

Wobei ich sagen muss, ich will so langsam doch auf vim umsteigen, da ich so dann auch Vervollständigung hab. Bei nem 250-500k Zeilen Programm ist das dann doch nicht sooo schlecht


----------

