Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bibliothek, mehrere getrennte Werte zurückgeben
Lizz4rd
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

Bibliothek, mehrere getrennte Werte zurückgeben

beantworten | zitieren | melden

Hallo!
Ich programmiere erst seit 1nem Monat C#. Zurzeit programmiere ich an einem Programm das zufällige Primzahlenpartner generiert. Diese Primzahlen möchte ich später noch getrennt voneinander verwenden.
Das Programm funktioniert einwandfrei (wenn auch ein wenig umständlich geschrieben). Danach habe ich eine Bibliothek erstellt das Programm dort hineingepackt und in einem Main aufgerufen.
Funktioniert ebenfalls --> ich bekomme dann als Ergebnis zum Beispiel 17,19 welche sich in einem String befinden --> wie löse ich jetzt also die Zahlen heraus.
Schon mal danke im voraus.


public static Tuple<int, int> Rdmprim(int r)
        {
            int y = 0;
            int a = 0;
            int b = 0;
            int z = 0;

            Random k = new Random();
            int w = k.Next(0, r); // Zufallszahl zwischen 0 und der Eingegebenen Zahl

            for (int i = 2; y ≤ 2; i++)
            {
                z = z + y;      //Wert um zu überprüfen ob a bereits einen Wert hat

                if (IstPrim(w) == true && y == 0)   //Primzahlgefunden und kein Wert in b
                {
                    a = w;
                    y++;
                }
                if (IstPrim(w) == true && z + i > i) //Primzahlgefunden und ein Wert in a
                {
                    b = w;
                    y++;
                    break;
                }
                else                          // Zufallszahl keine Primzahl --> +1
                {
                    w++;
                }
            }
            bool IstPrim(int x)     //Primzahlermittlung
            {
                x = w;

                for (int i = 2; i < Math.Sqrt(w) + 1; i++)
                {
                    if (w % i == 0)
                        return false;
                }
                return true;

            }
            return new Tuple<int, int>(a, b);
        }
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.288

beantworten | zitieren | melden

Dein Random erzeugt keine Zufallszahlen. Du verwendest Random falsch.
Warum: [FAQ] Random.Next liefert eine Zeit lang die gleiche Zufallszahl - Warum? Wie geht es richtig?

Ich verstehe die Frage nicht; wo willst Du was heraus lösen, und wo ist Dein String, den Du erwähnst?
Im Code sehe ich davon nichts.

Als Anfänger wäre es evtl. auch Hilfreich für die Übersicht nicht direkt Local Functions zu verwenden.
Das verwirrt Anfänger i.d.R; das nur als Tipp.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.208
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo Lizz4rd,

schau dir den Link von Abt mal an.

Weiter:
Zitat
ich bekomme dann als Ergebnis zum Beispiel 17,19 welche sich in einem String befinden

das ist kein String, was du herausbekommst, sondern ein Tuple. Darin stehen zwei Werte, "Item1" und "Item2". Somit kannst du auf die zugreifen. Etwa so.

 
var a = Rdmprim(14);
int firstNumber = a.Item1;
int secondNumber = a.Item2;

Statt Tuples kann man auch eine Klasse verwenden. Wäre etwas schöner ;-)

Gruss

Coffeebean
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Du willst für eine vorgegebene Zahl r zwei beliebige aufeinander folgende Primzahlen, die kleiner sind als [EDIT] eine zufällige Zahl, die kleiner ist als r[/EDIT]? Verstehe ich das richtig?

LaTino
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Lizz4rd
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Okay danke.
Sorry wegen der Sache mit dem String. Da habe ich mich wohl vertan .
Das werde ich mir mal ansehen.
private Nachricht | Beiträge des Benutzers
Lizz4rd
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Dein Random erzeugt keine Zufallszahlen. Du verwendest Random falsch.

Bei mir sollen nur einmal eine Zufallszahl im Gesamten Program ausgegebn werden. Was es auch glaube ich tut, da jedes mal (wen ich das Program ausführe ) zwei andere Primzahlen angezeigt werden.

Mit herauslösen habe ich gemeint das ich im Main die Variable a und b ,die zurückgegeben werden, einzeln aufrufen kann um sie später bei einer Multiplikation zu verwenden.

Sry wegen der Sache mit dem String hab mich da vertan.
private Nachricht | Beiträge des Benutzers
Lizz4rd
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Zitat von LaTino
Du willst für eine vorgegebene Zahl r zwei beliebige aufeinander folgende Primzahlen, die kleiner sind als [EDIT] eine zufällige Zahl, die kleiner ist als r[/EDIT]?

Ich habs eher so gemeint: Ich erzeuge eine Zufallszahl zwischen 0 und r. Dann uberprüfe ich ob diese eine Primzahl ist --> Nein --> Zufallszahl um eins erhöhen --> überprüfen
Wenn ich eine finde dann speichere ich diese in der Variable a ab.
Dan erhöhe ich wieder die Zufallszahl und speichere die nächste Primzahl in der Variable b ab.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.288

beantworten | zitieren | melden

a) bitte unterlass die Full Quotes, ich hab keine Lust die dauernd zu entfernen
b) wenn Du auf zwei Quotes antworten willst, dann geht das auch in einem Beitrag
[Hinweis] Wie poste ich richtig?
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von Lizz4rd
Zitat von LaTino
Du willst für eine vorgegebene Zahl r zwei beliebige aufeinander folgende Primzahlen, die kleiner sind als [EDIT] eine zufällige Zahl, die kleiner ist als r[/EDIT]?

Ich habs eher so gemeint: Ich erzeuge eine Zufallszahl zwischen 0 und r. Dann uberprüfe ich ob diese eine Primzahl ist --> Nein --> Zufallszahl um eins erhöhen --> überprüfen
Wenn ich eine finde dann speichere ich diese in der Variable a ab.
Dan erhöhe ich wieder die Zufallszahl und speichere die nächste Primzahl in der Variable b ab.

Dann lautet deine Aufgabe also:
"Finde für eine gegebene Zahl x eine zufällige Zahl r zwischen 0 und x, und gib die ersten beiden Primzahlen p0 und p1 aus, für die gilt: r ≤ p0 < p1."

Lagerst du das Erzeugen der Zufallszahl in den Kontext aus (was du tun solltest, denn, wie Abt sagt: so funktioniert Random nicht), bleibt übrig:

Tuple<int, int> FindPrimes(int startValue) (bzw mit den neuen Tupeln (int FirstPrime, int SecondPrime) FindPrimes(int startValue))

Der Pseudocode dafür sollte sein:

in einer Endlosschleife
    ermittle, ob der Zählwert eine Primzahl ist
    wenn ja und bereits eine Primzahl gespeichert wurde
        gib ein Tupel aus bereits gespeicherter Primzahl und dem Zählwert zurück, beende Funktion
    wenn ja und noch keine Primzahl gespeichert wurde
         speichere Zählwert als erste Primzahl
    erhöhe den Zählwert um eins

Tatsächlich ist die gesamte Methode auch nur 5 Zeilen lang und du brauchst nur eine einzige lokale Variable (statt 4). Schau dir dafür mal das hier an. Werd' außerdem die Inline-Methode los, in diesem Fall bringt die dich nur dazu, sie mehrfach aufzurufen: bedenke, dass bei jedem Aufruf von IstPrim() eine Schleife durchlaufen wird, die für sehr große Zahlen eine Weile brauchen wird. Jeder zusätzliche Aufruf dauert dann wieder...

Das wichtigste, um wirkliche Zufallszahlen zu erhalten, wäre aber, das Random aus deiner Methode zu verbannen.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Lizz4rd
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Zitat von LaTino
Tatsächlich ist die gesamte Methode auch nur 5 Zeilen lang und du brauchst nur eine einzige lokale Variable (statt 4). Schau dir dafür mal das hier an. Werd' außerdem die Inline-Methode los, in diesem Fall bringt die dich nur dazu, sie mehrfach aufzurufen: bedenke, dass bei jedem Aufruf von IstPrim() eine Schleife durchlaufen wird, die für sehr große Zahlen eine Weile brauchen wird. Jeder zusätzliche Aufruf dauert dann wieder...

Hört sich gut an. Danke für die Hilfe.
private Nachricht | Beiträge des Benutzers
CWolle
myCSharp.de - Member

Avatar #avatar-4065.jpg


Dabei seit:
Beiträge: 57
Herkunft: Süddeutschland

beantworten | zitieren | melden

Du kannst den String splitten mit der Methode Split(). Gib als Zeichen dann ',' an. Du bekommst so ein Array mit deinen Zahlen
OO gibts seit Platon - hatte der auch C#?
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 462
Herkunft: Untermeitingen

beantworten | zitieren | melden

Zitat von Lizz4rd



                if (IstPrim(w) == true && y == 0)   //Primzahlgefunden und kein Wert in b
                {
                    a = w;
                    y++;
                }
                if (IstPrim(w) == true && z + i > i) //Primzahlgefunden und ein Wert in a
                {
                    b = w;
                    y++;
                    break;
                }
              

Kleiner Tipp: du kannst hier == true weglassen und einfacher kürzer



                if (IstPrim(w) && y == 0)   //Primzahlgefunden und kein Wert in b
                {
                    a = w;
                    y++;
                }
                if (IstPrim(w) && z + i > i) //Primzahlgefunden und ein Wert in a
                {
                    b = w;
                    y++;
                    break;
                }
              

schreiben. Siehe auch [Tipp] Anfängerhinweis == true / == false

VG
Stefan
private Nachricht | Beiträge des Benutzers