C++ |
17.02.2013, 12:48 | Auf diesen Beitrag antworten » | |||||||||||||||
info | C++ Meine Frage: Hallo leute ich bin im moment wieder beim üben von informatik und brauche paar tips von euch: 1) Erstellen Sie einen Testplan für ein Programm (bzw. Funktion), zur Lösung folgender Aufgabe : Es sind mehrere Zahlen einzulesen und sortiert auszugeben ( nicht nur 3 wie in Teil 2). Die Anzahl der Zahlen wird vom Anwender vorgegeben. Fehlerhafte Eingaben müssen nicht geplant werden. 2) Es ist ein Programm zu erstellen, in welchem genau drei Zahlen in drei Variable (z.B. a,b,c) eingelesen werden. Diese drei Werte sollen so in drei neue Variable (z.B. x,y,z) umgespeichert werden, dass diese sortiert sind. Für die neuen Variablem muss also gelten: x<=y<=z . Danach sind diese drei Zahlen sortiert auszugeben. Dieses Programm ist damit ein Spezialfall der Aufgabe aus 1). Achten Sie in dem Programm auf ausreichend Kommentare einrücken bei den Abfragen gefällige Ausgabe unter Verwendung von Manipulatoren. Kann mir jemand erklären wie ich die Zahlen sortieren kann? Meine Ideen: keine |
|||||||||||||||
|
||||||||||||||||
17.02.2013, 15:38 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Der primitivste Sortieralgorithmus ist Bubblesort: du vergleichst zwei Elemente und vertauscht sie gegebenenfalls, genauer erklärt in der wikipedia. Nachteil: vor allem bei größeren Listen langsam, Laufzeit steig quadratisch mit der Größe. Alternative ist der quicksort, in C qsort genannt. Codebeispiel hier. |
|||||||||||||||
19.02.2013, 22:09 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Hallo leute mein programm sieht so aus: #include <iostream> #include <stdlib.h> using namespace std; int Zahl[] = { 5, 8 , 10 , 12 , 14 ,20 }; int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main() { std::cout << " Geben sie beliebige Zahlen ein !" << std::endl; return 0; } Ich hab mir die seite durchgelesen aber verstehe da was nicht. Was passiert hiermit? int compare (const void * a, const void * b) Werden hiermit nur zwei variablem vertauscht oder mehrere ? Das verstehe ich überhaupt nicht. |
|||||||||||||||
19.02.2013, 23:12 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito |
Es wird nur die Ausgabe " Geben sie beliebige Zahlen ein !" erzeugt.
Es wird gar nichts vertauscht. Compare heißt vergleichen und nicht tauschen! Die Funktion nimmt 2 Zeiger auf Integer-Werte entgegen und gibt die Differenz zwischen den beiden Zahlen, auf die gezeigt wird zurück. Vergleich heißt das deswegen, weil man im folgenden nur noch den Rückgabewert auf 2 oder 3 Fälle prüfen muss: - Ist der Rückgabewert negativ, so ist a < b - Ist der Rückgabewert 0, so ist a==b - Ist der Rückgabewert positiv, so ist a > b Bei Sortierungen interessiert meist nur, ob eine Zahl größer oder kleiner als eine Andere ist. Somit würde Beispielhaft folgendes reichen:
Damit würde x und y getauscht, wenn der Wert an der Adresse von Zeiger x kleiner ist als der Wert an der Adresse von Zeiger y ist... VG, Karlito |
|||||||||||||||
Anzeige | ||||||||||||||||
|
||||||||||||||||
20.02.2013, 10:18 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Ich will ja in meinem Programm mehrere Zahlen sortieren , müsste dann der Anfang so aussehen ? #include <iostream> #include <stdlib.h> using namespace std; int Zahl[6]; int main() { int a; int b; int c; int d; int e; std::cout<< " Geben sie beliebige Zahlen ein1" << std::endl; cin>> a >> b >> c >> d >> e; int *a, *b, *c, *d, *e; return 0; } Oder müsste ichnur das schreiben z.B int *a, *b; Weil das ist mir noch nicht ganz klar. |
|||||||||||||||
20.02.2013, 11:11 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Hallo, Einlesen von Zahlen: - Vorlesungsfolien Kapitel 4 Folie 36 Verwendung von Arrays: - Vorlesungsfolien Kapitel 5 Einlesen von Zahlen in ein Array: - Vorlesungsfolien Kapitel 8 Folie 28 (cin >> ptr_a[i]) Ich fühl mich ein wenig veräppelt... VG, Karlito |
|||||||||||||||
20.02.2013, 11:35 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Welche vorlesungsfolien meinst du? |
|||||||||||||||
20.02.2013, 12:30 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Die, die man erhält, wenn man nach der Aufgabenstellung googelt... Vorlesung Infromatik für EIT von Dr. Spangler an der Hochschule Darmstadt Wintersemester 2012/13. VG, Karlito |
|||||||||||||||
21.02.2013, 22:44 | Auf diesen Beitrag antworten » | |||||||||||||||
info |
Aber kannst du trotzdem wenigstens noch meine frage beantworten ? |
|||||||||||||||
21.02.2013, 23:56 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Ich muss ehrlich gestehen, dass mir dafür ein wenig die Geduld fehlt. Offensichtlich hast Du aus den vorrangegangenen Threads nicht viel mitgenommen. Beispiele: Die Deklaration
dafür überhaupt nicht.
Funktioniert so überhaupt gar nicht. Weiterhin ist es so, dass der Nutzer sagen können soll, wie viele Zahlen sortiert werden sollen. Wie viele Variablen willst du dafür denn deklarieren. Rein vom logischen Standpunkt kann das so nicht funktionieren. Es muss folglich andere Mittel geben um soetwas zu realisieren. Weiterhin stelle ich mir immer wieder die Frage, wie du solche Aufgaben erhältst und so wenig Ahnung hast... Das passt irgendwie nicht zusammen. Es ist auch für einen Nachholer (wenn Du den Stoff nachbereiten musst) die initiative, die ich ein wenig vermisse. Ich sehe, dass euler Dir in vielen Seiten versucht hat viel zu erklären und schlussendlich stammt fast der gesamte Quelltext von ihm. Das ist nicht das was ich unter Hilfe zur Selbsthilfe verstehe. Ich habe euler mal gefragt, ob er bereit ist, deine Frage weiter zu verfolgen. Ich bin nur teilweise dazu bereit. Oben ist ein Anfang. Wenn mir die Antwort gefällt bin ich auch gern bereit dir weiter zu helfen. VG, Karlito |
|||||||||||||||
22.02.2013, 02:25 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Soll ich nur 4 variablen einlesen oder wie? Ich wollte 6 einlesen daher hatte ich das so gemacht. |
|||||||||||||||
22.02.2013, 14:15 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl |
a,b,c,d,e sind aber nur 5 Variablen. Aber den Ansatz solltest du wieder verwerfen, da: -viel zu unflexibel -qsort() ein Array braucht Mit int Zahl[6]; definierst du dir ein Array (sowas lässt sich auch dynamisch anlegen, aber lassen wir das erst mal). Lies die Zahlen mit einer Schleife ein und schreibe sie dann in das Array. |
|||||||||||||||
22.02.2013, 23:43 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Kann man das so machen? #include <iostream> using namespace std; int main() { int n; int zahl[5]; cout<<" Anzahl der einzulesenden Elemente "; cin>>n; if ( n>5 )//Plausibilitaetskontrolle { cout << "Es sind nicht mehr elemente verfügbar" << endl; } cout<<" Elemente eingeben "; for (int i=0;i<n;i++)//Eingabe der Arrayelemente cin>>zahl[i]; } return 0; } |
|||||||||||||||
23.02.2013, 07:47 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Im Ansatz nicht schlecht, aber: - es gibt einmal mehr } als {, ich finde das solltest du auch selbst merken. - bei n>5 Elementen wird zwar mitgeteilt, dass es nicht genug Speicher gibt, dann aber trotzdem in den nicht vorhandenen Speicher eingelesen. Abhilfe kann das Wort else verscahffen. Das Einlesen könnte man noch benutzerfreundlicher gestalten:
|
|||||||||||||||
25.02.2013, 19:37 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Mein programm sieht so aus: using namespace std; int n; int Zahl[i]; int main() { for (int i=0;i<n;i++)//Eingabe der Arrayelemente { cout << i+1 <<". Element: "; cin >> zahl[i]; } } C:\C++\Zahlen einlesen\main.cpp|5|error: 'i' was not declared in this scope| C:\C++\Zahlen einlesen\main.cpp||In function 'int main()':| C:\C++\Zahlen einlesen\main.cpp|13|error: 'zahl' was not declared in this scope| ||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===| Kannst du mir helfen diese FEHLER ZU BESEITIGEN? |
|||||||||||||||
25.02.2013, 20:30 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Ich habe einen fehler erkannt , aber es funzt immer noch nicht. #include <iostream> using namespace std; int i[5]; int main() { for (int i=0;i<n;i++)//Eingabe der Arrayelemente { cout << i+1 <<". Element: "; cin >> zahl[i]; } } Das verstehe ich nicht |
|||||||||||||||
25.02.2013, 20:52 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Hallo leute ich habe einen ganz neuen weg genommen aber es funktioniert: #include <iostream> using namespace std; int i[5]; int main() { for (int Zahl=0;Zahl<5;Zahl++)//Eingabe der Arrayelemente { cout << Zahl+1 <<". Element: "; cin >> i[Zahl]; } } Kann ich es so machen ? Aber wie gehe ich weiter vor? |
|||||||||||||||
26.02.2013, 16:36 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Wir waren doch schon weiter: das Einlesen der Zahlen war einigermaßen flexibel, nicht zwingend 5 Zahlen.
Du hast keinen Fehler erkannt, sondern geraten. Dabei hilft es doch zu lesen: In Zeile 5 ist i unbekannt -> Zahl[5] In Zeile 13 ist zahl unbekannt -> weil du es oben groß geschrieben hast. Es ist so etwas wie ein ungeschriebenes Gesetz, dass i für Laufvariablen, also in Schleifen verwendet wird, nicht als Array. Da es sowieso wieder darauf hinauslaufen würde, dass ich dir die Lösung verrate, beschleunige ich das. Aber nochmals mein Ratschlag: hole dir Hilfe im persönlichen Umfeld, mit einem Forum kannst du dir zwar konkrete Fragen beantworten lassen, aber du scheitest schon bei den Grundlagen, die sitzen sollten, wenn ich mir anschaue, was sonst von dir gefordert wird.
|
|||||||||||||||
05.03.2013, 09:35 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Ich hab ja im moment dieses Programm . #include <iostream> using namespace std; int main() { int n; int zahl[5]; cout<<" Anzahl der einzulesenden Elemente "; cin>>n; if ( n>5 )//Plausibilitaetskontrolle { cout << "Es sind nicht mehr elemente verfügbar" << endl; } cout<<" Elemente eingeben "; for (int i=0;i<n;i++)//Eingabe der Arrayelemente cin>>zahl[i]; } return 0; } Kannst du mir sagen wenn ich das array jetzt mit der if bedingung sortieren will, und den ersten eingabewert mit dem zweiten wert vergleichen will , wie mache ich das so: if( wie heisst erste zahl und wie die zweite??? Ich versuche es irgendwie mit einem anderen weg. |
|||||||||||||||
05.03.2013, 16:39 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Wie ich schon am 23.02.2013 um 7:47 Uhr schrieb, scheitert das schon daran, dass es einmal mehr '{' als '}' gibt. Auch dass du eventuell in nicht reservierten Speicher schreibst habe ich dir verraten. Eine if-Bedingung sortiert auch kein Array. Lies dir meine früheren Antworten durch, versuche sie zu verstehen und melde dich wieder, wenn du konkrete Fragen hast, so drehen wir uns im Kreis. Ich habe dir sogar einen Lösungsvorschlag gemacht, besser bekommst du die Sortierung nicht hin, auch weiß ich nicht, was genau du vorhast. Hast du überhaupt eine Vorstellung, wie du das Array sortieren willst? Solange du das nicht weißt, brauchst du auch nicht versuchen, es umzusetzen. |
|||||||||||||||
13.03.2013, 00:00 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Hallo eulersche Zahl ich hab mal wieder was probiert : #include <iostream> #include <cstdlib> using namespace std; int main() { int n; int zahl[5]; cout<<" Anzahl der einzulesenden Elemente "; cin>>n; if ( n>5 )//Plausibilitaetskontrolle { cout << "Es sind nicht mehr elemente verfügbar" << endl; } cout<<" Elemente eingeben "; for (int i=0;i<n;i++)//Eingabe der Arrayelemente cin>>zahl[i]; for(int i = 0; i< 5 ; ++i) { if(zahl[i] > zahl[i+1]) { int swap = zahl[i+1]; zahl[i+1] = zahl[i]; zahl[i] = swap; } } cout << "sortiert" << endl; for(int i = 0;i< 5 ; ++i) { cout << zahl[i] << " Bye " << endl; } } ABer ich verstehe nicht so ganz was ich machen soll damit die eingelesenen Dateien richtig sortiert werden. Ich hoffe mein ansatz ist nicht ganz blöd. return 0; } |
|||||||||||||||
13.03.2013, 11:12 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Hallo, der Ansatz ist nicht blöd, aber:
Du legst nicht dar, was Du erreichen willst und machst einfach weiter mit den selben Fehlern wie vorher und einem Mini-Schritt, der vorgibt, dass du dir Gedanken gemacht hast. Für mich sieht es aus wie rumprobieren! Glaub mir, ich schreibe gerne hier und ich helfe auch gerne, aber was Du hier ablässt verstehe ich nicht! Mein EIndruck ist, dass du versuchst irgendwo mit Minimalaufwand zu bestehen. Du ziehst uns so lange kleine Schrittchen aus der Nase, bis du es begreifst ohne selbst viel Arbeit und Gedanken investieren zu müssen. -- Karlito |
|||||||||||||||
14.03.2013, 14:16 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Kann mir jemand anderer helfen ? |
|||||||||||||||
14.03.2013, 15:04 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Die Vertauschung ist soweit richtig. Du musst das solange wiederholen, bis nicht mehr getauscht werden muss. Packe die Tauschoperation in eine do-while-Schleife. Merke dir in einer Variable, die du bei jedem Durchlauf zurücksetzt, ob ein Tausch stattgefunden hat. Ist dies nicht der Fall, so ist dein Array sortiert. Das beantwortet auch deine Frage mit dem bereits sortierten Array. Liegt es bereits sortiert vor, wird die Sortierung geprüft und es kommt nie zu einem Tausch -> Abbruchbedingung. VG, Karlito |
|||||||||||||||
15.03.2013, 23:04 | Auf diesen Beitrag antworten » | |||||||||||||||
info | #include <iostream> #include <cstdlib> using namespace std; int main() { int n; int zahl[5]; cout<<" Anzahl der einzulesenden Elemente "; cin>>n; if ( n>5 )//Plausibilitaetskontrolle { cout << "Es sind nicht mehr elemente verfügbar" << endl; } cout<<" Elemente eingeben "; for (int i=0;i<n;i++){//Eingabe der Arrayelemente cin>>zahl[i]; for(int i = 0; i< 5 ; ++i) { do { int swap = zahl[i+1]; zahl[i+1] = zahl[i]; zahl[i] = swap; } while{ if(zahl[i] > zahl[i+1]) } } cout << "sortiert" << endl; for(int i = 0;i< 5 ; ++i) { cout << zahl[i]<< endl; } } return 0; } Ich hab jetzt ein wenig versucht die Schleife einzubauen aber es funktioniert immer noch nicht. Für hilfe wäre ich dankbar. |
|||||||||||||||
16.03.2013, 08:33 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Deine Schleife (ich kann nicht erkennen, ob es while oder do...while werden sollte) funktioniert so nicht, da die Syntax nicht stimmt. Zum Rest sage ich mal nichts, da ich es sowieso schon getan habe. Versuchen wir es mal anders: Das ist ein lauffähiges Programm (syntaktisch korrekt), allerdings funktioniert das Sortieren nicht, weil ich ein paar Fehler eingebaut habe. Viel Spaß beim Suchen.
Und eine Bitte für die Zukunft: Umschließe deinen Code mit [ code] ... [ /code] (Leerzeichen weglassen), damit der Quelltext eingerückt bleibt. |
|||||||||||||||
16.03.2013, 19:13 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Danke eulersche zahl. Nur damit du weisst dass ich es ein wenig verstanden hab. Hier das korrigierte programm: [ code] #include <iostream> #include <cstdlib> using namespace std; int main() { int n; int zahl[5]; cout << "Anzahl der einzulesenden Elemente: "; cin >> n; if (n > 5)//Plausibilitaetskontrolle { cout << "Es sind nicht genug Elemente verfügbar" << endl; } else { cout<<"Elemente eingeben\n"; for (int i = 0; i < n; i++)//Eingabe der Arrayelemente { cout << i+1 << ". Zahl: "; cin >> zahl[i]; } //Bubblesort //größtes nach oben for(int i = 0; i < n-1; i++) { for(int j = 0; j < n-1; j++) { if(zahl[i] > zahl[i+1]) {//tauschen int tmp = zahl[i]; zahl[i] = zahl[i+1]; zahl[i+1] = tmp; } } } cout << "\nsortiert:" << endl; for(int i = 0; i < n; i++) { cout << zahl[i]<< endl; } } system("PAUSE"); return 0; } [ /code] |
|||||||||||||||
16.03.2013, 21:35 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Einen Fehler hast du zwar gefunden, aber wie ein Probelauf zeigt, werden die Zahlen immer noch nicht richtig sortiert. |
|||||||||||||||
17.03.2013, 17:56 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Wo liegt den der andere Fehler? Den erkenne ich gar nicht. |
|||||||||||||||
18.03.2013, 08:11 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Dann musst du den Code wohl zeilenweise debuggen. Falls du noch Code::Blocks verwendest, ist hier ein Video, das dir zeigt, wie du das machst. |
|||||||||||||||
18.03.2013, 13:12 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Diese Zeile wirkt auf mich irgendwie komisch: for(int i = 0; i < n-1; i++) { for(int j = 0; j < n-1; j++) { Warum ist da einmal j und einmal i ??? |
|||||||||||||||
18.03.2013, 15:58 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Das hängt mit der Funktionsweise des Bubblesort zusammen: In einem Durchgang wird eine Zahl immer nur mit einem Nachbarn vertauscht: Bsp.: Zahlen sind 1, 4, 3, 2 -> geordnet: 1, 2, 3, 4. Aber der Algorthmus schiebt die 4 nicht direkt ans Ende, weil immer nur mit den Nachbarn vergleichen wird: 1 < 4, es wird also nicht getauscht 4 > 3 -> tauschen: 1, 3, 4, 2 4 > 2 -> tauschen: 1, 3, 2, 4 so sieht die Zahlenfolge nach einem Durchlauf aus, es muss nochmal sortiert werden. Dafür die äußere Schleife.
Die Frage ist vorallem: WO i und WO j? Da habe ich nämlich auch einen Fehler eingebaut. |
|||||||||||||||
18.03.2013, 17:49 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Stimmts so? [ code] #include <iostream> #include <cstdlib> using namespace std; int main() { int n; int zahl[5]; cout << "Anzahl der einzulesenden Elemente: "; cin >> n; if (n > 5)//Plausibilitaetskontrolle { cout << "Es sind nicht genug Elemente verfügbar" << endl; } else { cout<<"Elemente eingeben\n"; for (int i = 0; i < n; i++)//Eingabe der Arrayelemente { cout << i+1 << ". Zahl: "; cin >> zahl[i]; } //Bubblesort //größtes nach oben for(int i = 0; j < n-1; j++) { for(int i = 0; i < n-1; i++) { if(zahl[i] > zahl[i+1]) {//tauschen int tmp = zahl[i]; zahl[i] = zahl[i+1]; zahl[i+1] = tmp; } } } cout << "\nsortiert:" << endl; for(int i = 0; i < n; i++) { cout << zahl[i]<< endl; } } system("PAUSE"); return 0; } [ /code] |
|||||||||||||||
18.03.2013, 18:02 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Nö
Editg: Schau dir die äußere Schleife noch einmal an! |
|||||||||||||||
18.03.2013, 22:08 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Oh nein jetzt habe ich auch keine Ahnung . Was mache ich jetzt? |
|||||||||||||||
18.03.2013, 22:51 | Auf diesen Beitrag antworten » | |||||||||||||||
Karlito | Schau dir die Zeile 28 noch mal genau an. Was stimmt da nicht? Danach stimmt glaube alles (habe nicht komplett getestet und nachvollzogen)
|
|||||||||||||||
20.03.2013, 22:37 | Auf diesen Beitrag antworten » | |||||||||||||||
info | In zeile 28 müsste das stehen oder: for(int i = 0; i < n-1; i++) Richtig? |
|||||||||||||||
21.03.2013, 15:56 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Du sollst hier nicht wild drauflosraten, sondern logisch überlegen und das Resultat dieser Überlegungen testen, statt hier zu fragen - dann musst du auch keine 17 Stunden auf eine Antwort warten. Nein, das ist so nicht richtig. Bei dem, was Karlito dir zusammengefasst hat, musst du nur noch einen Buchstaben ändern. |
|||||||||||||||
21.03.2013, 20:24 | Auf diesen Beitrag antworten » | |||||||||||||||
info | Äh int j = 0. oder? |
|||||||||||||||
22.03.2013, 06:57 | Auf diesen Beitrag antworten » | |||||||||||||||
eulerscheZahl | Aus dem Fragezeichen schließe ich, dass du das Programm wieder nicht getestet hast. Aber ja, so funktioniert es. Was müsstest du ändern, damit genau anders herum sortiert wird, also die größte Zahl zuerst? |
|