[gelöst + Sourced Code]Einen String zufällig mischen



  • Moin leutz 🙂

    Das Programm soll einen String vom User einlesn und ihn zufällig mischen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void Greeting()
    {
         printf("Welcome, please enter a line of text:");
    }
    
    int main(int argc, char *argv[])
    {
        char String[100] = "";
        Greeting();
        fgets(str, 100, stdin);
        srand( time(0));
        for(i = 0; i < 100; i++);
        {
    

    Nun möchte ich in der for-Schleife jedes Element des Strings String[100] zufällig verändern.
    Ich hatte gelesen, dies könne man mit srand, also der Generierung einer zufälligen Zahl erreichen (was ja auch iwo sinn macht). Nun weiß ich allerdings nich so genau, wie ich das anstelle.

    Quelle: http://stackoverflow.com/questions/8013471/how-to-use-rand

    Mit besten Grüßen
    Lordakius



  • srand dient zum initialisieren vom Zufallsgenerator.
    DArum ruft man es auch nur einmal im ganzen Programm auf.

    Die Zufallszahlen bekommst du mit rand .
    http://www.cplusplus.com/reference/cstdlib/rand/

    Mischen:
    Du kannst für jede Position im String eine zufällige Position bestimmen, mit der du die Zeichen vertauscht.

    Anmerkung:
    Du solltest fgets auch ein gültiges Array übergeben.
    Der String kann weniger als 100 gültige Zeichen enthalten
    fgets speichert das '\n' von der Entertaste mit ab.



  • Du kannst für jede Position im String eine zufällige Position bestimmen, mit der du die Zeichen vertauscht.

    Nur dass ich dich richtig verstanden habe:
    Ich setze zB das Element auf pos1 im string auf pos 6?
    Hat man dann nicht festgelegte veränderung und keine zufällige? oder hab ich dich falsch verstanden.
    Vllt kannst mir mal Pseudocode (oder auch richtigen? :D) aufschreiben, damit ich ne Ahnung kriege, was du meinst.

    Was meinst du mit "gültiges Array übergeben"?.
    Inwiefern übergebe ich ungültige Arrays?
    lg Lordakius



  • Lordakius schrieb:

    Ich setze zB das Element auf pos1 im string auf pos 6?

    Du musst schon eine Zufallszahl im Bereich 0...Stringlänge bestimmen.
    Einmal würfeln reicht nicht: http://xkcd.com/221/

    Wenn du den Seed nicht mit srand neu (oder mit einem festen Wert) setzt, bekommst du bei jedem Programmstart dieselbe Reihenfolge.
    Darum nimmt man time(0) , dann besteht die Gefahr nur, wenn man das Programm innerhalb derselben Sekunde startet.

    Lordakius schrieb:

    Hat man dann nicht festgelegte veränderung und keine zufällige? oder hab ich dich falsch verstanden.

    Ja, hast du wohl.

    Lordakius schrieb:

    Vllt kannst mir mal Pseudocode (oder auch richtigen? :D) aufschreiben, damit ich ne Ahnung kriege, was du meinst.

    len = länge_von(String)
    for i=0 to len
    { z = zufallszahl(0,len-1)  // Zufallszahl zwischen 0 und len-1
      vertausche(String[i],String[z])
    }
    

    Lordakius schrieb:

    Was meinst du mit "gültiges Array übergeben"?.
    Inwiefern übergebe ich ungültige Arrays?

    str ist nicht definiert.



  • So,

    habe mittlerweile eine Lösung zu bekommen:
    Habe meine Fragen als Kommentar geschrieben

    #include <stdio.h>
    #include "readline.h"
    #include <stdlib.h>
    #include<time.h>
    #include<string.h>
    
    void chaotizeString(char*str, unsigned int len)
    {
    	for (int i = 0; i < len; i++)
    	{
    		unsigned int j = rand() % len;  //rand() % len => j ist gleich einer randomzahl zwischen 0 und len?
    		char tmp = str[i];            //Machen diese Zeilen überhaupt Sinn? warum macht man nicht gleich char tmp = str[j] (vermutung: zum speichern?)
    		str[i] = str[j];
    		str[j] = tmp;
    	}
    }
    
    int main()
    {
    	srand(time(0));                   //initialisiert den Random-Generator
    	printf("enter a line of text: ");
    	char line[1000] = "";
    	readLine(line, 1000);
    	chaotizeString(line, strlen(line));
    	printf("%s\n", line);
    }
    

    Hier noch die readline.h

    //readline.h
    
    #ifndef READLINE_H
    #define READLINE_H
    
    #include <stdio.h>
    
    void readLine(char* strbuffer, unsigned int buffersize)
    {
    	char format[30] = "";
    	sprintf(format, "%%%u[^\n]%%*c", buffersize - 1);
    	scanf(format, strbuffer);
    }
    
    #endif //#ifndef READLINE_H
    

    Sorry falls der Code etwas lang ist, aber wenn jemand mal kommt und den "richtigen" Code haben will muss er nich ewig fragen sondern kann gleich hier gucken 😉 (Spoiler-Funktion wäre hier vllt nice ... hab jedenfalls keine gefunden)

    Beste Grüße
    Lordakius

    PS:Dank geht natürlich an alle Poster, die geholfen und aufgeklärt haben 🙂



  • Lordakius schrieb:

    char tmp = str[i];            //warum macht man nicht gleich char tmp = str[j]
    

    Weil das was völlig anderes ist? Wie sollte es danach Deiner Meinung nach weitergehen?



  • Um den Wert zweier Variablen zu tauschen, benutzt man häufig eine Hilfsvariable.

    Man kann ja schließlich nicht schreiben:

    x = y;
    y = x;
    

    Denn bei der zweiten Zuweisung hat x ja schon einen anderen Wert.

    Mit Hilfsvariable:

    int tmp = x;
    x = y;
    y = tmp;
    

    So wie du geschrieben hast, merkt man sich zuerst den Wert, den x ursprünglich hatte, und weist ihn dann am Ende y zu.

    Es gibt Programmiersprachen, mit denen man auf den Ursprungswert der Eingabeparameter zugreifen kann, bei denen ist das dann aber nur vesteckt.

    Eine Lösung ohne Hilfsvariable wäre das Bitweise verknüpfen der Variablen:

    x ^= y;
    y ^= x;
    x ^= y;
    

    Wichtig: Es sind alle drei Anweisungen nötig. Auch geht es nur mit Datentypen, die XOR unterstützen.

    Mehr informationen dazu:
    http://en.wikipedia.org/wiki/XOR_swap_algorithm



  • char tmp = str[i];           
              str[i] = str[j];
              str[j] = tmp;
    

    bedeutet doch nichts anderes als:
    tmp str[i] str[j] zeile
    str[i] str[i] str[j] 1
    str[i] str[j] str[j] 2
    str[i] str[j] str[i] 3

    ....
    Hmm beim Nachdenken darüber ist mir der Unterschied aufgefallen 😮
    Mein fehler, bitte verzeih mir ! 😃

    Ansonsten sind meine Kommentare aber richtig?
    wills mir nicht falsch merken ^^



  • Naja, viel Kommentare sind da ja nicht 😛

    randomzahl zwischen 0 und len
    

    Korrekt wäre: randomzahl zwischen einschließlich 0 und len-1. Wenn dir das unklar ist, sieh dir den Modulus-Operator nochmal an.



  • oenone schrieb:

    [...]

    Mehr informationen dazu:
    http://en.wikipedia.org/wiki/XOR_swap_algorithm

    Danke für die Aufklärung.
    Mir geht wörtlich ein Licht auf 💡

    Thema kann geschlossen werden. (falls es sowas hier gibt 😕



  • oenone schrieb:

    Naja, viel Kommentare sind da ja nicht 😛

    Ist ja auch nicht viel Code da, den ich net verstehe ^^


Anmelden zum Antworten