Workshop von Zerd und XBelt

  • C++

  • Zerd
  • 38789 Aufrufe 122 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ein einfaches Beispiel:

    Eine Funktion kann nur einen Wert zurück geben. Was machst du wenn du 2 oder mehr Werte in einer Funktion veränderst und an das aufrufende Programm zurück geben willst?

    Anderes Beispiel:
    Es gibt Objekte die nicht mehrfach existieren sollten, aber an verschiedenen stellen im Programm gebraucht werden. Z.B. ein Render-Fenster bei Grafischen anwendungen. Wenn du mit pointern arbeitest ist es immer das selbe Objekt auf das du zugreifst und keine Kopie.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • mmh gute frage!? wie mach ich das?? :P ich glaub ich versteh das prinzip von zeigern immer noch nicht ganz :P muss mich nochmal mehr damit auseinander setzen...

    EDIT: Hab jetzt mal dein SWAP beispiel ausprobiert.Es funktioniert zwar, Weiß aber nicht genau ob ich das jetzt so gemacht hab wie man es machen sollte :P

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4. void SWAP(int *pA, int *pB);
    5. int main()
    6. {
    7. int a = 220, b = 10;
    8. cout << "Vor SWAP(): a = " << a << "; b = " << b;
    9. SWAP(&a,&b);
    10. cout << "\nNach SWAP(): a = " << a << "; b = " << b;
    11. getch();
    12. return 0;
    13. }
    14. void SWAP(int *pA, int *pB)
    15. {
    16. int temp;
    17. temp = *pA;
    18. *pA = *pB;
    19. *pB = temp;
    20. }
    Alles anzeigen
  • PHP-Quellcode

    1. void rechne(int a, int b) {
    2. a += b;
    3. }
    4. void rechneZeiger(int *a, int *b) {
    5. *a += *b;
    6. }
    7. int main() {
    8. int wert1 = 5;
    9. int wert2 = 10;
    10. rechne(wert1, wert2); // Aufruf "Call by Value" ohne Zeiger
    11. std::cout<<"Ohne Zeiger: "<<wert1<<std::endl;
    12. rechneZeiger(&wert1, &wert2); // Aufruf "Call by reference" mit Zeigern
    13. std::cout<<"Mit Zeigern: "<<wert1<<std::endl;
    14. return 0;
    15. }
    Alles anzeigen

    Teste das Programm mal aus... (ich habs selbst nich getestet, also ich garantiere jetzt nicht für richtigkeit ;) Habs nur schnell hier getippt)
    Aber das zeigt dir hoffentlich was der unterschied ist...
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • hups, mit dem ergebnis hätte ich jetzt gar nicht gerechnet... hä? sry, aber wieso ist das denn jetzt so? warum kommt beim call by value nicht auch 15 heraus?

    EDIT: ahh, ok ich glaub ich habs gecheckt!! beim call by value wird einfach nur sozusagen der wert von der variable in eine andere variable kopiert. Man arbeitet also in der funktion mit einer Kopie und nicht mit der "originalen" Variable? ist das so richtig??

    mfg

    btw, hab hier mal deine sort übung ausprobiert aber irgendwie kommt sie mir n bissl länglich vor :P

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4. void SORT(int *pA, int *pB, int *pC);
    5. int array[2];
    6. int main()
    7. {
    8. int a = 9, b = 1, c = 20;
    9. cout << "Unsortiert:\n" << a << '\n' << b << '\n' << c;
    10. SORT(&a, &b, &c);
    11. cout << "\n\nAufsteigend sortiert:\n" << array[0] << '\n'
    12. << array[1] << '\n'
    13. << array[2];
    14. getch();
    15. return 0;
    16. }
    17. void SORT(int *pA, int *pB, int *pC)
    18. {
    19. if( *pA > *pB && *pA > *pC)
    20. {
    21. array[0] = *pA;
    22. if( *pB > *pC)
    23. {
    24. array[1] = *pB;
    25. array[2] = *pC;
    26. }
    27. else
    28. {
    29. array[1] = *pC;
    30. array[2] = *pB;
    31. }
    32. }
    33. else if( *pA > *pB && *pA < *pC)
    34. {
    35. array[1] = *pA;
    36. array[0] = *pB;
    37. array[2] = *pC;
    38. }
    39. else if( *pA < *pB && *pA > *pC)
    40. {
    41. array[1] = *pA;
    42. array[0] = *pC;
    43. array[2] = *pB;
    44. }
    45. else if( *pA < *pB && *pA < *pC)
    46. {
    47. array[2] = *pA;
    48. if( *pB > *pC)
    49. {
    50. array[0] = *pB;
    51. array[1] = *pC;
    52. }
    53. else
    54. {
    55. array[0] = *pC;
    56. array[1] = *pB;
    57. }
    58. }
    59. else
    60. cout << "\nDas darf nicht auf dem Bildschirm erscheinen!!";
    61. }
    Alles anzeigen


    passt das so oder hätte man das auch noch irgendwie kürzen können?

    mfg ( zum 2.mal :P )
  • Ja genau, call by value legt eine kopie der variablen an die übergeben werden, bei zeigern arbeitest du auf dem selben speicherbereich und hast somit direkt zugriff auf den selben inhalt...

    ^^ Also deine Lösung ist ein wenig größer als ich sie mir vorgestellt habe...
    Aber Solange sie funktioniert ist das doch schonmal gut :)
    Eigentlich sollten die übergebenen Vaiablen den inhalt so vertauschen das sie sortiert zurück gespeichert werden...

    Hier mal ein Lösungsvorschlag:

    PHP-Quellcode

    1. void SORT(int *pA, int *pB, int *pC) {
    2. int temp;
    3. for(int i=0; i < 2; i++) {
    4. if(*pA < *pB) {
    5. temp = *pA;
    6. *pA = *pB;
    7. *pB = temp;
    8. }
    9. if(*pB < *pC) {
    10. temp = *pB;
    11. *pB = *pC;
    12. *pC = temp;
    13. }
    14. }
    15. }
    Alles anzeigen


    Diese Lösung ist im Prinzip ein BubbleSort Algorithmus. (Der sieht in der Realen anwendung natürlich noch etwas anders aus). Der erste Wert wird mit dem zweiten verglichen, ist der zweite größer werden die werte getauscht. Dann wird der 2. mim 3. verglichen und ggf. getauscht. Das ganze muss 2 mal gemacht werden (deshalb die Schleife).
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • ok! :) jetzt versteh ichs :)

    EDIT: fällt mir grad so auf: was macht endl genau? im gegensatz zu \n ?

    EDIT2: noch was :P wie kann ich überprüfen ob die von einem benutzer eingegebene Zahl auch wirklich eine Zahl ist? weil mit buchstaben lässts sich schlecht rechnen...:P

    EDIT3: btw, fände es gut wenn du dein tut weiterschreiben könntest :) finde es nämlich sehr gut :) vor allem dann gleich hier mit dem diskussions thread !
    und vll könntest nochmla n paar aufgaben posten :)
  • -=[P3ac]=-;2844204 schrieb:

    fällt mir grad so auf: was macht endl genau? im gegensatz zu \n ?

    endl löscht den ausgapebuffer und fügt einen Zeilenumbruch ein. In den meisten fällen ist das garnicht nötig, und ein /n würde auch reichen. Ich glaube das hat sich weigehend aus Lesbarkeitsgründen eingebürgert... Muss aber nicht zwingend sein...

    -=[P3ac]=-;2844204 schrieb:

    noch was :P wie kann ich überprüfen ob die von einem benutzer eingegebene Zahl auch wirklich eine Zahl ist? weil mit buchstaben lässts sich schlecht rechnen...:P

    In den Beispielprogrammen liest du ja direkt integerwerte ein. Eine direkte Funktion die prüft ob beispielsweise ein String numerisch ist gibt es glaub ich nicht -> selber schreiben... ;)

    -=[P3ac]=-;2844204 schrieb:

    btw, fände es gut wenn du dein tut weiterschreiben könntest :) finde es nämlich sehr gut :) vor allem dann gleich hier mit dem diskussions thread !
    und vll könntest nochmla n paar aufgaben posten :)

    Ich häng im Mom noch an der Diplomarbeit, vielleicht hab ich danach etwas mehr Zeit...
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Hi Zerd!
    sry das ich das hier reinposte :) aber ich würd gern deine meinung hören zu einem programm hören dass ich geschrieben hab. Es ist noch nicht fertig aber das grundgerüst steht mehr oder weniger.

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. #include <string>
    4. #include <sstream>
    5. using namespace std;
    6. void calculate( double *p1, string *p2, double *p3);
    7. void filter(string pGet);
    8. void convert();
    9. string part1;
    10. string part2;
    11. string part3;
    12. int position;
    13. double a = 0;
    14. double b = 0;
    15. int main()
    16. {
    17. string get;
    18. cout << "Bitte geben Sie eine Rechnung ein( Format:Zahl +-*/ Zahl): ";
    19. getline(cin,get);
    20. if( get == "")
    21. cout << "Sie haben nichts eingegeben!Nochmal!" << endl;
    22. else
    23. {
    24. filter(get);
    25. convert();
    26. calculate(&a,&part2,&b);
    27. }
    28. getch();
    29. return 0;
    30. }
    31. void calculate(double *pA, string *p2, double *pB)
    32. {
    33. double erg;
    34. // Operator herrausfinden und ausrechnen
    35. if( *p2 == "+")
    36. {
    37. cout << "\n\nAddition: " << *pA << *p2 << *pB << " = ";
    38. erg = (*pA) + (*pB);
    39. cout << erg;
    40. }
    41. else if( *p2 == "-")
    42. {
    43. cout << "\n\nSubtraktion: " << *pA << *p2 << *pB << " = ";
    44. erg = (*pA) - (*pB);
    45. cout << erg;
    46. }
    47. else if( *p2 == "*")
    48. {
    49. cout << "\n\nMultiplikation: " << *pA << *p2 << *pB << " = ";
    50. erg = (*pA) * (*pB);
    51. cout << erg;
    52. }
    53. else if( *p2 == "/")
    54. {
    55. cout << "\n\nDivision: " <<*pA << *p2 << *pB << " = ";
    56. erg = (*pA) / (*pB);
    57. cout << erg;
    58. }
    59. else
    60. cout << "Something went wrong!";
    61. }
    62. void filter(string pGet)
    63. {
    64. // Zahlen und Operator herrausfiltern
    65. position = pGet.find_first_not_of("123456789");
    66. part1 = pGet.substr(0,position);
    67. position = pGet.find_first_of("+-*/");
    68. part2 = pGet.substr(position,1);
    69. part3 = pGet.substr(position+1);
    70. position = part3.find_first_of("123456789");
    71. part3 = part3.substr(position);
    72. }
    73. void convert()
    74. {
    75. // Strings in Zahlen konvertieren
    76. stringstream sstr(part1);
    77. sstr >> a;
    78. stringstream sstr2(part3);
    79. sstr2 >> b;
    80. }
    Alles anzeigen


    Das soll eine art rechner werden! Der benutzer gibt eine rechnung ein und das programm rechnet das dann aus. Ich hab den eingelesenen string in 3 teile geteilt und dann damit weitergerechnet. Aber meine methode kommt mir ein wenig umständlich vor...:P

    MFG :)
  • Prinzipiell hast du das ganz gut gelöst. Solange wir noch kein OOP gemacht haben ist das denke ich ne gute Lösung. Wenn man OOP anwendet gibt es schöne möglichkeiten Parser und Scanner zu schreiben und durch Grammatiken zu definieren wie die eingegebenen Texte interpretiert werden können. Vielleicht kommen wir da noch irgendwann mal zu ;)

    Allerdings frage ich mich wieso du alle Variablen global anlegst? Globale Variablen sollten wenn möglich vermieden werden.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • hoffentlich kommen wir noch dazu! :)

    mmh, ja stimmt! ich weiß...:P bin grad beim umschreiben. aber bei ein paar weiß ich nicht so genau wie ich das machen soll... bei den string parts zb! wenn ich ich die in die filter funktion reingeb sind die ja nur da gültig... und wenn ich also den in der main eingegebenen get string in der filter funktion auf drei strings aufgeteilt hab, wie kann ich dann die DREI strings wieder an die main funktion zurückgeben?...

    mfg

    EDIT: oder sind sie noch in filter gültig wenn ich die drei part strings in main definiere( oder wie man dazu noch mal sagt )? :P
    EDIT: nein geht nicht :P mmh, oder soll ich drei filter funktionen schreiben? für jeden part einen?
    Edit3 : oder geht das einfach mit zeigern?? :)

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. #include <string>
    4. #include <sstream>
    5. using namespace std;
    6. void calculate( double *p1, string *p2, double *p3);
    7. void filter(string get, string *part1, string *part2, string *part3);
    8. void convert();
    9. double a = 0;
    10. double b = 0;
    11. int main()
    12. {
    13. string part1;
    14. string part2;
    15. string part3;
    16. string get;
    17. int strsize = get.size();
    18. cout << "Bitte geben Sie eine Rechnung ein( Format:Zahl +-*/ Zahl): ";
    19. getline(cin,get);
    20. if( get.size() == strsize)
    21. {
    22. cout << "Sie haben nichts eingegeben!Nochmal!" << endl;
    23. }
    24. else
    25. {
    26. filter(get, &part1, &part2, &part3);
    27. convert();
    28. calculate(&a,&part2,&b);
    29. }
    30. getch();
    31. return 0;
    32. }
    33. void calculate(double *pA, string *p2, double *pB)
    34. {
    35. double erg;
    36. // Operator herrausfinden und ausrechnen
    37. if( *p2 == "+")
    38. {
    39. cout << "\n\nAddition: " << *pA << *p2 << *pB << " = ";
    40. erg = (*pA) + (*pB);
    41. cout << erg;
    42. }
    43. else if( *p2 == "-")
    44. {
    45. cout << "\n\nSubtraktion: " << *pA << *p2 << *pB << " = ";
    46. erg = (*pA) - (*pB);
    47. cout << erg;
    48. }
    49. else if( *p2 == "*")
    50. {
    51. cout << "\n\nMultiplikation: " << *pA << *p2 << *pB << " = ";
    52. erg = (*pA) * (*pB);
    53. cout << erg;
    54. }
    55. else if( *p2 == "/")
    56. {
    57. cout << "\n\nDivision: " <<*pA << *p2 << *pB << " = ";
    58. erg = (*pA) / (*pB);
    59. cout << erg;
    60. }
    61. else
    62. cout << "Something went wrong!";
    63. }
    64. void filter(string Get, string *part1, string *part2, string *part3)
    65. {
    66. int position;
    67. // Zahlen und Operator herrausfiltern
    68. position = Get.find_first_not_of("123456789");
    69. &part1 = Get.substr(0,position);
    70. position = Get.find_first_of("+-/*");
    71. &part2 = Get.substr(position,1);
    72. &part3 = Get.substr(position+1);
    73. position = &part3.find_first_of("123456789");
    74. &part3 = &part3.substr(position);
    75. }
    76. void convert()
    77. {
    78. // Strings in Zahlen konvertieren
    79. stringstream sstr(part1);
    80. sstr >> a;
    81. stringstream sstr2(part3);
    82. sstr2 >> b;
    83. }
    Alles anzeigen


    edit4: das geht nicht... kreig voll viele fehlermeldungen...
  • problem gelöst :)
    hab einfach mit zeigern gearbeitet. in den jeweiligen funktionen hab ich dann den inhalt von dem zeiger an eine string variable wieder übergeben damit gearbeitet und am ende schließlich die "werte" wieder an die zeiger zurückgegeben!! :)

    voila:

    PHP-Quellcode

    1. #include <iostream>
    2. #include <conio.h>
    3. #include <string>
    4. #include <sstream>
    5. using namespace std;
    6. void calculate( double *p1, string *p2, double *p3);
    7. void filter(string get, string *part1, string *part2, string *part3);
    8. void convert(string* part1, string* part3);
    9. double a = 0;
    10. double b = 0;
    11. int main()
    12. {
    13. string get, part1 = "", part2 = "", part3 = "";
    14. int strsize = get.size();
    15. cout << "Bitte geben Sie eine Rechnung ein( Format:Zahl +-*/ Zahl): ";
    16. getline(cin,get);
    17. if( get.size() == strsize)
    18. {
    19. cout << "Sie haben nichts eingegeben!Nochmal!" << endl;
    20. }
    21. else
    22. {
    23. filter(get, &part1, &part2, &part3);
    24. convert(&part1, &part3);
    25. calculate(&a,&part2,&b);
    26. }
    27. getch();
    28. return 0;
    29. }
    30. void calculate(double *pA, string *p2, double *pB)
    31. {
    32. double erg;
    33. // Operator herrausfinden und ausrechnen
    34. if( *p2 == "+")
    35. {
    36. cout << "\n\nAddition: " << *pA << *p2 << *pB << " = ";
    37. erg = (*pA) + (*pB);
    38. cout << erg;
    39. }
    40. else if( *p2 == "-")
    41. {
    42. cout << "\n\nSubtraktion: " << *pA << *p2 << *pB << " = ";
    43. erg = (*pA) - (*pB);
    44. cout << erg;
    45. }
    46. else if( *p2 == "*")
    47. {
    48. cout << "\n\nMultiplikation: " << *pA << *p2 << *pB << " = ";
    49. erg = (*pA) * (*pB);
    50. cout << erg;
    51. }
    52. else if( *p2 == "/")
    53. {
    54. cout << "\n\nDivision: " <<*pA << *p2 << *pB << " = ";
    55. erg = (*pA) / (*pB);
    56. cout << erg;
    57. }
    58. else
    59. cout << "Something went wrong!";
    60. }
    61. void filter(string Get, string *part1, string *part2, string *part3)
    62. {
    63. int position;
    64. string one = *part1;
    65. string two = *part2;
    66. string three = *part3;
    67. // Zahlen und Operator herrausfiltern
    68. position = Get.find_first_not_of("123456789");
    69. one = Get.substr(0,position);
    70. position = Get.find_first_of("+-/*");
    71. two = Get.substr(position,1);
    72. three = Get.substr(position+1);
    73. position = three.find_first_of("123456789");
    74. three = three.substr(position);
    75. *part1 = one;
    76. *part2 = two;
    77. *part3 = three;
    78. }
    79. void convert(string* part1, string* part3)
    80. {
    81. string one = *part1;
    82. string three = *part3;
    83. // Strings in Zahlen konvertieren
    84. stringstream sstr(one);
    85. sstr >> a;
    86. stringstream sstr2(three);
    87. sstr2 >> b;
    88. }
    Alles anzeigen


    edit: ah ups sry!! wollte keinen doppelpost machen...:-S
    edit2: leider funktioniert meine abfrage nicht so gut, wo ich überprüfe ob der eingebene sring leer ist oder nicht... sobald ich nur ein leerzeichen eingeb, wird der string als nicht leer angesehen...:-S

    edit3: (ich mache irgendwie ziemlich viele edits...:P) habe ich jetzt auch mehr oder weniger gut gelöst...

    PHP-Quellcode

    1. if(get == "")
    2. {
    3. cout << "Sie haben nichts eingegeben!Nochmal!" << endl;
    4. }
    5. else
    6. {
    7. temp = get[0];
    8. if( temp == ' ')
    9. {
    10. cout << "Sie haben nichts eingegeben!" << endl;
    11. }
    12. else
    13. {
    14. filter(get, &part1, &part2, &part3);
    15. convert(&part1, &part3);
    16. cout << "DEBUG-HELFER: a= " << a
    17. << "\tb= " << b << "\tpart1= " << part1 << "\tpart2= " << part2
    18. << "\tpart3= " << part3;
    19. calculate(&a,&part2,&b);
    20. }
    21. }
    Alles anzeigen

    Kann irgendwie nicht direkt get[0] überprüfen...sagt immer, dass er const char nicht in char umwandeln kann oder so...
  • Hi
    du kriegst von mir erstma ein riesen Dankeschön für die Mühe die du dir hier damit machst.
    ich werde mich jetzt die Tage mal versuchen etwas einzuarbeiten und ma sehn was so wird^^
    Das mit den Aufgaben find ich echt gut aber vllt ist es möglich das du noch lösungen etc. ergänzt um sich selbst etwas zu kontrollieren
    aber sonst ist das echt klasse

    mfg Tonix
  • Nach einer etwas längeren Pause habe ich jetzt mal wieder angefangen und habe jetzt auch den letzten Abschnitt des Tutorials durch(Zeiger)

    Mal schauen ob ich die Aufgabe am Ende richtig gelöst habe

    Die Aufgabe war "Schreibt eine Funktion die zwei Zahlen miteinander vertauscht. Dabei soll ein Zeigeraufruf verwendet werden."

    Meine Lösung:

    Quellcode

    1. #include <iostream>
    2. int main()
    3. {
    4. int a = 4, b = 8, Auslagerung;
    5. Auslagerung = a;
    6. a = b;
    7. b = Auslagerung;
    8. std::cout << "In der Variable a steht jetzt " << a << " und in der Variable b steht jetzt " << b;
    9. return 0;
    10. }
    Alles anzeigen
  • Quellcode

    1. /*if (rechenart=='+') {
    2. eingabe1 + eingabe2 = ergebnis;
    3. }


    du hast hier einen mehrzeiligen kommentar ( "/*" ) begonnen. Diesen hast du nicht wieder geschlossen, d.h. alles was danach in der datei kommt, ist auskommentiert (was hier natürlich nicht gewollt ist).
    Um solche Fehler in Zukunft zu vermeiden, würde ich dir empfehlen, einen editor mit syntax-highlighting zu benutzen (z.B. notepad2 [1]), da werden die verschiedenen bausteine von C++ (und auch kommentare) entsprechend eingefärbt.

    [1]: Notepad2 – Wikipedia
    [COLOR="Green"]"A dream you dream alone is only a dream. A dream you dream together is reality"[/color]

    John Lennon

    [SIZE=1],,,[/SIZE][SIZE=1]*&#801;&#844;l&#801;*,,,,,,,,,,&#801;&#801; &#801;&#820;&#305;&#820;&#820;&#801; ,,,,,,,,,*&#801;&#844;l&#801;*,,,,,,,,,,*&#801;&#844;l&#801;*&#801;&#801; &#801;&#820;&#305;&#820;&#820;&#801; &#801;&#801;&#865;|&#818;&#865;&#818;&#865;&#818;&#865; &#818;&#9643;&#865;&#818; &#818;&#865;&#818;&#865;&#818;&#960;&#818;&#865;&#818;&#865; &#818;&#865;&#818;&#9643;&#818;&#865;&#818;&#865; &#818;|&#801;&#801;&#801; &#801; &#801;&#820;&#305;&#820;&#801;&#801; *&#801;&#844;l&#801;*_,,,,,,,,&#801;&#801; &#801;&#820;&#305;&#820;&#820;&#801; ,,,,,,,,*&#801;&#844;l&#801;*,,[/SIZE][SIZE=1],,,[/SIZE][SIZE=1],,,,,,&#801;&#801; &#801;&#820;&#305;&#820;&#820;&#801; ,[/SIZE][SIZE=1],,[/SIZE]
    [SIZE="1"][COLOR="Purple"]Up 1[/color][/SIZE] [SIZE="1"] [COLOR="Olive"]Up 2_The_Beatles_Red_Album[/color][/SIZE]
  • serkanemre schrieb:

    ist es arg schwer c++ zu lernen?

    Bitte beim Thema "Workshop von Zerd" bleiben!

    Danke.

    Unabhängig davon sind solch philosophischen Fragen hier nicht so gern gesehen.

    Gruß
    Broken Sword
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.
  • 9999 schrieb:

    Mal schauen ob ich die Aufgabe am Ende richtig gelöst habe

    Die Aufgabe war "Schreibt eine Funktion die zwei Zahlen miteinander vertauscht. Dabei soll ein Zeigeraufruf verwendet werden."


    Also gelöst hast die die aufgabe... Aber nicht so wie es verlang wurde ;)

    In der Aufgabenstellung heißt es das du zum vertauschen der zwei zahlen eine Funktion schreiben sollst. Der Funktionskopf würde beispielsweise so aussehen:

    PHP-Quellcode

    1. void swap(int *zahl1, int *zahl2) {
    2. ...
    3. }
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Ich hab die ganze Sache mit dem void irgendwie nicht richtig verstanden

    Wenn ich mich nicht irre müsste der Anfang vom Code so aussehen:

    Quellcode

    1. #include <iostream>
    2. void swap(int a = 4, int b = 8, int *zahl1 = &a, int *zahl2 = &b, int Auslagerung) {
    3. Auslagerung = *zahl1;
    4. *zahl1 = *zahl2;
    5. *zahl2 = Auslagerung;
    6. }


    Aber was kommt dann in main rein
  • Danke für den Workshop!

    Hier auch schon mein erstes Problem, bzw kein problem sondern eher ne Frage:

    PHP-Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int main(void)
    4. {
    5. int z1 = 0;
    6. int z2 = 0;
    7. int zeichen = 0;
    8. int ergebnis = 0;
    9. int xx = 0;
    10. std::cout << "Zahl1";
    11. std::cin >> z1;
    12. std::cout << "Zahl2";
    13. std::cin >> z2;
    14. std::cout << "Bitte wählen Sie eine Rechenart [+, -, *, /]: ";
    15. std::cin >> zeichen;
    16. if(zeichen=='/')
    17. { ergebnis = z1 / z2;
    18. std::cout << "Das Ergebnis ist" << ergebnis;}
    19. else if(z2==0){
    20. std::cout << "Error";
    21. }
    22. if(zeichen=='+')
    23. ergebnis = z1 + z2;
    24. { std::cout << "Das Ergebnis ist" << ergebnis;
    25. }
    26. if(zeichen=='-')
    27. ergebnis = z1 - z2;
    28. { std::cout << "Das Ergebnis ist" << ergebnis;
    29. }
    30. if(zeichen=='*')
    31. ergebnis = z1 * z2;
    32. { std::cout << "Das Ergebnis ist" << ergebnis;
    33. }
    34. std::cout << "Drücken Sie Eingabe um das Programm zu beenden!";
    35. std::cin >> xx;
    36. }
    Alles anzeigen


    Erstmal hab ich noch eingebaut wenn z2=0 ist soll cout nen error ausspucken, das würde ich gern überprüfen jedoch geht die konsole nach durchlaufen des scripts ja immer wieder aus. deshalb hab ich versucht unten einfach noch

    PHP-Quellcode

    1. std::cout << "Drücken Sie Eingabe um das Programm zu beenden!";
    2. std::cin >> xx;
    anzufügen damit er noch auf ne eingabe von mir wartet und ich das zuvor ausgegebene lesen kann, klappt jedoch nicht so ganz.

    Gibts noch andere möglichkeiten?
  • hi just_for_fun,

    eine Alternative ist z.B. das hier:

    PHP-Quellcode

    1. // Weiter mit Return
    2. std::cin.clear();
    3. std::cin.ignore(256, '\n');
    4. std::cout << "Weiter mit Return..." << std::endl;
    5. std::cin.get();


    Vor der get() abfrage sollte der cin buffer gelöscht werden, bzw. noch vorhandene eingaben ignoriert werden... Mit dieser Methode sollte es nun funktionieren dass das Programm offen bleibt und erst bei einer Eingabe beendet wird.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Jo genau das war das was ich wollte. Jedoch läuft nun das script nicht vernünftig. Die Ausgabe ist immer

    Quellcode

    1. "Das Ergebnis ist Null. Das Ergebnis ist Null. Das Ergebnis ist Null.


    hier nochmal der code:

    PHP-Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int main(void)
    4. {
    5. int z1 = 0;
    6. int z2 = 0;
    7. int zeichen = 0;
    8. int ergebnis = 0;
    9. std::cout << "Zahl1: ";
    10. std::cin >> z1;
    11. std::cout << "Zahl2: ";
    12. std::cin >> z2;
    13. std::cout << "Bitte wählen Sie eine Rechenart [+, -, *, /]: ";
    14. std::cin >> zeichen;
    15. if(zeichen=='/')
    16. { ergebnis = z1 / z2;
    17. std::cout << "Das Ergebnis ist" << ergebnis;}
    18. else if(z2==0){
    19. std::cout << "Error";
    20. }
    21. if(zeichen=='+')
    22. ergebnis = z1 + z2;
    23. { std::cout << "Das Ergebnis ist" << ergebnis;
    24. }
    25. if(zeichen=='-')
    26. ergebnis = z1 - z2;
    27. { std::cout << "Das Ergebnis ist" << ergebnis;
    28. }
    29. if(zeichen=='*')
    30. ergebnis = z1 * z2;
    31. { std::cout << "Das Ergebnis ist" << ergebnis;
    32. }
    33. // Weiter mit Return
    34. std::cin.clear();
    35. std::cin.ignore(256, '\n');
    36. std::cout << "Weiter mit Return..." << std::endl;
    37. std::cin.get();
    38. }
    Alles anzeigen
  • Ich habs dir mal verbessert... du hattest einige fehler bei der Klammersetzung und bei der division durch 0 abfrage:

    PHP-Quellcode

    1. /*...*/
    2. std::cout << "Bitte wählen Sie eine Rechenart [+, -, *, /]: ";
    3. std::cin >> zeichen;
    4. if(zeichen=='/')
    5. {
    6. ergebnis = z1 / z2;
    7. std::cout << "Das Ergebnis ist " << ergebnis << std::endl;
    8. if(z2==0){ // Die abfrage gehört in die if abfrage sonst knallts bei division durch 0
    9. std::cout << "Error";
    10. }
    11. }
    12. if(zeichen=='+') // Hier hattest du falsche Klammersetzung
    13. {
    14. ergebnis = z1 + z2;
    15. std::cout << "Das Ergebnis ist " << ergebnis << std::endl;
    16. }
    17. if(zeichen=='-') // Hier hattest du falsche Klammersetzung
    18. {
    19. ergebnis = z1 - z2;
    20. std::cout << "Das Ergebnis ist " << ergebnis << std::endl;
    21. }
    22. if(zeichen=='*') // Hier hattest du falsche Klammersetzung
    23. {
    24. ergebnis = z1 * z2;
    25. std::cout << "Das Ergebnis ist " << ergebnis << std::endl;
    26. }
    27. /*...*/
    Alles anzeigen
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Hey,

    erstmal vielen vielen dank für die mühe!!!!

    es ist wirklich ein super tut;)

    und ich hoffe wirklich das du es noch fortsetzt :)
    auch wenn ich jetzt noch nicht bis zu ende gekommen bin :D :D

    ich habe mich allerdings schon mal an dem taschenrechner versucht, fände es aber super wenn ihr mir ein paar verbesserungsvorschläge geben würdet ;)

    PHP-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <math.h>
    4. using namespace std;
    5. int main(int argc, char *argv[])
    6. {
    7. int i;
    8. for (i=1; i != 0; )
    9. {
    10. char was = 0;
    11. double z1;
    12. double z2;
    13. double erg = 0;
    14. double erg2 = 0;
    15. cout << "\n\nWas willst du machen? ('+', '-', '*', '/', '^', 'w')" << endl;
    16. do{
    17. cout << "Rechenart: ";
    18. cin >> was; //Eingabe Rechenart
    19. cout << "Deine erste Zahl: ";
    20. cin >> z1;
    21. cout << "Deine zweite Zahl: ";
    22. cin >> z2;
    23. }
    24. while ((was == '/') && (z2 == 0) || (was == 'w') && (z1 < 0) || (was == 'w') && (z2 < 0) ); //Division durch Null abfangen
    25. switch (was)
    26. {
    27. case '+':
    28. erg = z1 + z2;
    29. cout << z1 << " + " << z2 << " = ";
    30. cout << erg << endl;
    31. break;
    32. case '-':
    33. erg = z1 - z2;
    34. cout << z1 << " - " << z2 << " = ";
    35. cout << erg << endl;
    36. break;
    37. case '/':
    38. erg = z1 / z2;
    39. cout << z1 << " / " << z2 << " = ";
    40. cout << erg << endl;
    41. break;
    42. case '*':
    43. erg = z1 * z1;
    44. cout << z1 << " * " << z2 << " = ";
    45. cout << erg << endl;
    46. break;
    47. case '^':
    48. erg = pow (z1, z2) ;
    49. cout << z1 << " ^ " << z2 << " = ";
    50. cout << erg << endl;
    51. break;
    52. case 'w':
    53. erg = sqrt (z1) ;
    54. erg2 = sqrt (z2);
    55. cout << "Die Wurzel von " << z1 << " ist: " << erg << endl;
    56. cout << "Die Wurzel von " << z2 << " ist: " << erg2 << endl;
    57. break;
    58. default :
    59. cout << endl << "\n\n\nDu kannst nur '+', '-', '*', 'w', '^' oder '/' verwenden!\n\n\n\n" << endl;
    60. }
    61. };
    62. system("PAUSE");
    63. return EXIT_SUCCESS;
    64. }
    Alles anzeigen


    MFG

    RollinRoll

    EDIT: Kleine verbesserung... jetzt kann man das programm auch mehrmals hintereinander nutzen :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von RollinRoll ()