WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

100-Random-Zahlen der Größe nach sortieren

 

Anni
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.11.16
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 03.11.2016, 16:01     Titel: 100-Random-Zahlen der Größe nach sortieren
  Antworten mit Zitat      
Hallo ihr lieben Freunde es Programmierens Wink
ich bin vor knapp zwei Wochen das erste Mal in Berührung mit Octave gekommen und jetzt schon am verzweifeln Embarassed

Es wäre großartig wenn sich jemand die Mühe macht um mir meinen Start etwas zu erleichtern. Ich würde gerne mit einer Aufgabe aus unserer Übungsvorlesung beginnen. Es sollten 100 Zufallszahlen der Größe nach sortiert werden. Nun wurde uns auch eine Musterlösung vorgegeben. Leider muss ich beim abtippen einige Fehler gemacht haben, da das Ergebnis so nicht stimmen kann.

Hier mal meine Mitschriften:

Code:
sortiert=0;
hilfvariable=0;
zufallsvektor=rand(100,1);
while sortiert == 0
  hilfvariable=0;
  for i=1;size(zufallsvektor,1)-1;
    if zufallsvektor(i)>zufallsvektor(i+1);
      zwischenspeicher=zufallsvektor(i);
      zufallsvektor(i)=zufallsvektor(i+1);
      zufallsvektor(i+1)=zufallsvektor;
      hilfvariable=1;
     end
   end
   
   if hilfvariable == 0
    sortiert=1;
   end
end
plot(zufallsvektor)

 
Nun was ich davon verstanden habe ^^'

Ich lege zuerst meine Variablen fest (sortiert und hilfsvariable=0 und mein Zufallsvektor soll aus Zufallszahlen bestehen (rand) und 100 Zahlen haben, aber nur eine "Spalte").

Mit while beginne ich jetzt meine Schleife. Die Schleife "läuft" so lange, solange sortiert den Wert 0 hat. Aber warum sage ich jetzt nochmal, dass meine hilfvariable=0 ist? Das habe ich doch bereits definiert.

Wenn die Bedingungen erfüllt sind dann lege ich i als erste Stelle von meinen hundert Zahlen fest. Was jetzt dieser Size Befehl aussagt weiß ich nicht genau. Die Größe soll 100-1 sein??

Nun frage ich ab. Wenn meine erste Stelle (i) größer ist als meine zweite Stelle (i+1) muss ich etwas ändern. Nun wird eine weitere Variable eingefügt (zwischenspeicher). Es wurde gesagt, dass das benötigt wird um den zufallsvektor nicht zu überschreiben - da aber die Variable zwischenspeicher nicht mehr verwendet wird, weiß ich auch nicht was die da soll.
Nun Mache ich meine erste Stelle (i), die größer ist als meine zweite Stelle (i+1) zu i+1 - überschreibe ich damit nicht einfach eine Zahl??
Nun sage ich das mein zufallsvektor i+1 zu meinem zufallsvektor wird. Aber warum? Jedenfalls ich jetzt meine hilfvariable 1. Die Schleife geht nun so lange, bis i nicht mehr größer i+1 ist. Aber kann es nicht aus Zufall auch mal sein, dass i<i+1 ist? Naja, wenn die Bedingung nun nicht mehr erfüllt ist, dann wird sortiert zu 1 und damit endet die Schleife.

Freue mich auf vielen Antworten.
Vielen Dank!!

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.11.2016, 01:17     Titel: Re: 100-Random-Zahlen der Größe nach sortieren
  Antworten mit Zitat      
Hallo Anni,

Das erste "hilfvariable=0" ist überflüssig, denn es wird in der Schleife nochmals definiert.

Zitat:
Wenn die Bedingungen erfüllt sind dann lege ich i als erste Stelle von meinen hundert Zahlen fest. Was jetzt dieser Size Befehl aussagt weiß ich nicht genau. Die Größe soll 100-1 sein??

Code:
% Schleife von i=1 bis i=Länge des Vektors - 1:
for i=1:size(zufallsvektor,1)-1  % : statt ;

Weil Du innerhalb der Schleife auch auf das i+1.te Element zugreifst, darf die Schleife nicht über die ganze Länge des Vektors laufen, deshalb nur bis Länge-1.
Was der size Befehl macht, bekommst Du am besten in der Dokumentation heraus.

Verbesserung:
Code:
     zwischenspeicher=zufallsvektor(i);
      zufallsvektor(i)=zufallsvektor(i+1);
      zufallsvektor(i+1)=zwischenspeicher; % Nicht: zufallsvektor


Zitat:
Nun Mache ich meine erste Stelle (i), die größer ist als meine zweite Stelle (i+1) zu i+1 - überschreibe ich damit nicht einfach eine Zahl??

Richtig. Und deshalb speichert man die Zahl im "zwischenspeicher", bevor sie überschrieben wird. Diese 3 Zeilen vertauschen also das i.te und das i+1.te Element.

Zitat:
Nun sage ich das mein zufallsvektor i+1 zu meinem zufallsvektor wird. Aber warum?

Das ist ein Tippfehler.

Zitat:
Aber kann es nicht aus Zufall auch mal sein, dass i<i+1 ist?

Ja, das kann es. In diesem Fall werden die Elemte dann auch nicht vertauscht.

Der Code geht also immer wieder den Zufalls-Vektor vom ersten bis zum vorletzten Element durch und vertausch zwei Werte, falls der vorherige größer ist. So werden die großen Zahlen nach hinten geschoben und die kleinen nach vorne. Das ist ein ziemlich uneffizienter Sortier-Algorithmus, aber er funktioniert.
Die Hilfsvariable dient als Flag: Wenn irgendetwas vertauscht wurde, ist das Sortieren noch nicht fertig.

Die Namen der Variablen sind zwar sinnvoll gewählt, aber viel zu lang. Kein Wunder, dass man sich dann vertippt. "flag", "x", "tmp" sind praktischer im echten Programmier-Einsatz.

Lass Dich nicht einschüchtern! Matlab bzw. Octave ist einfach nur eine neue Sprache. Es braucht Zeit, sich daran zu gewöhnen. Kein Grund zu verzweifeln! :-)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Anni
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.11.16
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 04.11.2016, 13:09     Titel:
  Antworten mit Zitat      
Vielen Dank Jan für deine Hilfe!!
Leider habe ich immer noch ein paar Fragen ^^'
Du sagtest, dass zufallsvektor(i+1)=zufallsvektor; ein Tippfehler sei. Was müsste ich den da ändern? Ich habe ja davor gesagt, dass wenn i>i+ ist, dann muss ich i zwischenspeichern um die Zahl nicht zu überschreiben und dann sage ich, dass die zahl zu i+1 wird um weiter nach rechts in der Reihenfolge verschoben zu werden - korrekt? Nun müsste ich die i doch einfach nur ausgeben und dann ist alles okay. Warum brauche ich dann noch eine weitere Zeile?

Es wurde zu uns gesagt, dass es eventuell nicht die beste Lösung sei^^ Könnte man nicht einfach wie Folgt vorgehen?
-kleinsten Wert der 100-Zahlen wählen
-den Wert dann an erster Stelle setzten und aus den 100 Zahlen löschen
-und immer so weiter?
Leider fehlt mir das Vorstellungsvermögen um meine Schritte als Befehle umzuwandeln

Mein Versuch:
Code:

sortiert=0;
hilfsvariable=0;
zufallsvektor=rand(100,1)
   while sortiert==0
    hilfsvariable=0;
    for i=1, size (zufallsvektor,1) > 0;
       if zufallsvektor=sortiert(unique);
        zufallsvektor=Stelle(i);
        nun Stelle(i) löschen aus meiner Zufallsfolge ^^
      end
    end
    if hilfsvariable ==0
      sortiert=1;
   end
 end
 

Vielen Dank schon mal im Voraus für eure Mühen!

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Anni
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.11.16
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 04.11.2016, 13:11     Titel:
  Antworten mit Zitat      
@ Jan
was machen denn "flag", "x", "tmp"? Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.11.2016, 02:58     Titel:
  Antworten mit Zitat      
Hallo Anni,

Bitte verwende für Code immer die Code-Umgebung: Nutze dazu den "Code" Button im Eingabefeld des Forums. Danke.

Zitat:
Du sagtest, dass zufallsvektor(i+1)=zufallsvektor; ein Tippfehler sei. Was müsste ich den da ändern?

Das hatte ich bereits geantwortet:
Code:
  zwischenspeicher=zufallsvektor(i);
      zufallsvektor(i)=zufallsvektor(i+1);
      zufallsvektor(i+1)=zwischenspeicher; % Nicht: zufallsvektor


Zitat:
Nun müsste ich die i doch einfach nur ausgeben und dann ist alles okay. Warum brauche ich dann noch eine weitere Zeile?

Das verstehe ich nicht.
Wie gesagt: Wenn das i.te Element größer ist als das i+1.te, werden beide Elemente vertauscht.

Zitat:
Es wurde zu uns gesagt, dass es eventuell nicht die beste Lösung sei^^ Könnte man nicht einfach wie Folgt vorgehen?
-kleinsten Wert der 100-Zahlen wählen
-den Wert dann an erster Stelle setzten und aus den 100 Zahlen löschen
-und immer so weiter?

Ja, das ginge auch. Es gibt eine Menge verschiedener Sortier-Algorithmen. Frage mal WikiPedia danach.

Zu "for i=1, size (zufallsvektor,1) > 0": Schaue Dir die Dokumentation der FOR-Schleifen noch mal an.
Was "if zufallsvektor=sortiert(unique);" genau tun soll, müsste ich erraten. Das lasse ich lieber sein.

"flag", "x", "tmp" sind Beispiele für Variablen-Namen, die das Lesen des Codes nicht durch übermäßige Länge behindern. "flag" ist hübscher als "hilfsvariable". "tmp" steht für "temporary" und ist kompakter als "zwischenspeicher". Je übersichtlicher der Code, desto leichter findet man Bugs.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.