Workshop von Zerd und XBelt geschlossen 

Status
Für weitere Antworten geschlossen.
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.
 
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:
#include 
#include 

using namespace std;

void SWAP(int *pA, int *pB); 

int main()
{
int a = 220, b = 10;

cout << "Vor SWAP(): a = " << a << "; b = " << b;<br> SWAP(&a,&b);<br> cout << "\nNach SWAP(): a = " << a << "; b = "  
getch();
return 0;

}

void SWAP(int *pA, int *pB)
{
int temp;
temp = *pA;
*pA = *pB;
*pB = temp;
}
 
PHP:
void rechne(int a, int b) {
a += b;
}

void rechneZeiger(int *a, int *b) {
*a += *b;
}

int main() {
int wert1 = 5;
int wert2 = 10;

rechne(wert1, wert2); // Aufruf "Call by Value" ohne Zeiger
std::cout rechneZeiger(&wert1, &wert2); // Aufruf "Call by reference" mit Zeigern
std::cout return 0;
}
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...
 
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:
#include 
#include 

using namespace std;

void SORT(int *pA, int *pB, int *pC);
int array[2];

int main()
{
int a = 9, b = 1, c = 20;

cout  SORT(&a, &b, &c);
cout    
getch();
return 0;
}

void SORT(int *pA, int *pB, int *pC)
{

if( *pA > *pB && *pA > *pC)
{
array[0] = *pA;
if( *pB > *pC)
{
array[1] = *pB;
array[2] = *pC;
}
else
{
array[1] = *pC;
array[2] = *pB;
}
}
else if( *pA > *pB && *pA < *pC)
{
array[1] = *pA;
array[0] = *pB;
array[2] = *pC;
}
else if( *pA < *pB && *pA > *pC)
{
array[1] = *pA;
array[0] = *pC;
array[2] = *pB;
}
else if( *pA < *pB && *pA < *pC)
{
array[2] = *pA;
if( *pB > *pC)
{
array[0] = *pB;
array[1] = *pC;
}
else
{
array[0] = *pC;
array[1] = *pB;
}
}
else
cout }

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:
void SORT(int *pA, int *pB, int *pC) {
int temp;

for(int i=0; i < 2; i++) {
if(*pA < *pB) {
temp = *pA;
*pA = *pB;
*pB = temp;
}
if(*pB < *pC) {
temp = *pB;
*pB = *pC;
*pC = temp;
}
}
}

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).
 
Des hab ich schon berichtigt, ist mir aufgefallen als ich "Antworten" gedrückt hab das ich das nicht als variablennamen nehmen sollte ;)
 
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...
 
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:
#include 
#include 
#include 
#include 

using namespace std;

void calculate( double *p1, string *p2, double *p3);
void filter(string pGet);
void convert();

string part1;
string part2;
string part3;
int position;
double a = 0;
double b = 0;

int main()
{
string get;
cout  Zahl): "; 
getline(cin,get);

if( get == "")
cout  else
{
filter(get);
convert();
calculate(&a,&part2,&b);
}

getch();
return 0;
}

void calculate(double *pA, string *p2, double *pB)
{
double erg;
// Operator herrausfinden und ausrechnen
if( *p2 == "+")
{
cout  {
cout  {
cout ")
{
cout }

void filter(string pGet)
{
// Zahlen und Operator herrausfiltern
position = pGet.find_first_not_of("123456789");
part1 = pGet.substr(0,position);

position = pGet.find_first_of("+-*/");
part2 = pGet.substr(position,1);

part3 = pGet.substr(position+1);
position = part3.find_first_of("123456789");
part3 = part3.substr(position); 
}

void convert()
{
// Strings in Zahlen konvertieren
stringstream sstr(part1);
sstr >> a;
stringstream sstr2(part3);
sstr2 >> b;
}

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.
 
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:
#include 
#include 
#include 
#include 

using namespace std;

void calculate( double *p1, string *p2, double *p3);
void filter(string get, string *part1, string *part2, string *part3);
void convert();

double a = 0;
double b = 0;

int main()
{
string part1;
string part2;
string part3;
string get;
int strsize = get.size();
cout  Zahl): "; 
getline(cin,get);

if( get.size() == strsize)
{
cout  }
else
{
filter(get, &part1, &part2, &part3);
convert();
calculate(&a,&part2,&b);
}

getch();
return 0;
}

void calculate(double *pA, string *p2, double *pB)
{
double erg;
// Operator herrausfinden und ausrechnen
if( *p2 == "+")
{
cout  {
cout  {
cout ")
{
cout }

void filter(string Get, string *part1, string *part2, string *part3)
{
int position;

// Zahlen und Operator herrausfiltern
position = Get.find_first_not_of("123456789");
&part1 = Get.substr(0,position);

position = Get.find_first_of("+-/*");
&part2 = Get.substr(position,1);

&part3 = Get.substr(position+1);
position = &part3.find_first_of("123456789");
&part3 = &part3.substr(position); 
} 

void convert()
{
// Strings in Zahlen konvertieren
stringstream sstr(part1);
sstr >> a;
stringstream sstr2(part3);
sstr2 >> b;
}

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:
#include 
#include 
#include 
#include 

using namespace std;

void calculate( double *p1, string *p2, double *p3);
void filter(string get, string *part1, string *part2, string *part3);
void convert(string* part1, string* part3);

double a = 0;
double b = 0;

int main()
{
string get, part1 = "", part2 = "", part3 = "";
int strsize = get.size();
cout  Zahl): "; 
getline(cin,get);

if( get.size() == strsize)
{
cout  }
else
{
filter(get, &part1, &part2, &part3);
convert(&part1, &part3);
calculate(&a,&part2,&b);
}

getch();
return 0;
}

void calculate(double *pA, string *p2, double *pB)
{
double erg;
// Operator herrausfinden und ausrechnen
if( *p2 == "+")
{
cout  {
cout  {
cout ")
{
cout }

void filter(string Get, string *part1, string *part2, string *part3)
{
int position;
string one = *part1;
string two = *part2;
string three = *part3;

// Zahlen und Operator herrausfiltern
position = Get.find_first_not_of("123456789");
one = Get.substr(0,position);

position = Get.find_first_of("+-/*");
two = Get.substr(position,1);

three = Get.substr(position+1);
position = three.find_first_of("123456789");
three = three.substr(position);

*part1 = one;
*part2 = two;
*part3 = three;
} 

void convert(string* part1, string* part3)
{
string one = *part1;
string three = *part3;
// Strings in Zahlen konvertieren
stringstream sstr(one);
sstr >> a;
stringstream sstr2(three);
sstr2 >> b;
}

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:
if(get == "")
{
cout  }
else
{
temp = get[0];
if( temp == ' ')
{
cout  }
else
{
filter(get, &part1, &part2, &part3);
convert(&part1, &part3);
cout << "DEBUG-HELFER: a= " << a<br> << "\tb= " << b << "\tpart1= " << part1 << "\tpart2= " << part2<br> << "\tpart3= "  calculate(&a,&part2,&b);
}

}
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:

Code:
#include 

int main()
{
int a = 4, b = 8, Auslagerung;
Auslagerung = a;
a = b;
b = Auslagerung;
std::cout  return 0;
}
 
Code:
/*if (rechenart=='+') {
eingabe1 + eingabe2 = ergebnis;
}

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
 
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:
void swap(int *zahl1, int *zahl2) { 
...
}
 
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:

Code:
#include 

void swap(int a = 4, int b = 8, int *zahl1 = &a, int *zahl2 = &b, int Auslagerung) {
Auslagerung = *zahl1;
*zahl1 = *zahl2;
*zahl2 = Auslagerung;
}

Aber was kommt dann in main rein
 
So könnte es aussehen

void Swap(int* a, int* b)
{
int temp=*a;
*a=*b;
*b=temp;

}
void main()
{
int a=8;
int b=9;
// Ausgabe Vorher
swap(&a,&b);
// Ausgabe Nachher
}
 
Danke für den Workshop!

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

PHP:
#include 
using namespace std; 

int main(void)
{
int z1 = 0;
int z2 = 0;
int zeichen = 0;
int ergebnis = 0;
int xx = 0;

std::cout  std::cin >> z1;
std::cout  std::cin >> z2;


std::cout ]: ";
std::cin >> zeichen;

if(zeichen=='/')
{ ergebnis = z1 / z2;
std::cout  
else if(z2==0){
std::cout  }


if(zeichen=='+') 
ergebnis = z1 + z2;
{ std::cout  }

if(zeichen=='-')
ergebnis = z1 - z2;
{ std::cout  }

if(zeichen=='*')
ergebnis = z1 * z2;
{ std::cout  }



std::cout std::cin >> xx;


}

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:
std::cout  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:
// Weiter mit Return
std::cin.clear();
std::cin.ignore(256, '\n'); 
std::cout  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.
 
Jo genau das war das was ich wollte. Jedoch läuft nun das script nicht vernünftig. Die Ausgabe ist immer

Code:
"Das Ergebnis ist Null. Das Ergebnis ist Null. Das Ergebnis ist Null.

hier nochmal der code:
PHP:
#include 
using namespace std; 

int main(void)
{
int z1 = 0;
int z2 = 0;
int zeichen = 0;
int ergebnis = 0;


std::cout  std::cin >> z1;
std::cout  std::cin >> z2;


std::cout ]: ";
std::cin >> zeichen;

if(zeichen=='/')
{ ergebnis = z1 / z2;
std::cout  
else if(z2==0){
std::cout  }


if(zeichen=='+') 
ergebnis = z1 + z2;
{ std::cout  }

if(zeichen=='-')
ergebnis = z1 - z2;
{ std::cout  }

if(zeichen=='*')
ergebnis = z1 * z2;
{ std::cout  }



// Weiter mit Return
std::cin.clear();
std::cin.ignore(256, '\n'); 
std::cout  std::cin.get(); 


}
 
Ich habs dir mal verbessert... du hattest einige fehler bei der Klammersetzung und bei der division durch 0 abfrage:
PHP:
 /*...*/


std::cout ]: ";
std::cin >> zeichen;

if(zeichen=='/')
{ 
ergebnis = z1 / z2;
std::cout  if(z2==0){ // Die abfrage gehört in die if abfrage sonst knallts bei division durch 0
std::cout  }
}

if(zeichen=='+') // Hier hattest du falsche Klammersetzung
{ 
ergebnis = z1 + z2;
std::cout  }

if(zeichen=='-') // Hier hattest du falsche Klammersetzung
{ 
ergebnis = z1 - z2;
std::cout  }

if(zeichen=='*') // Hier hattest du falsche Klammersetzung
{ 
ergebnis = z1 * z2;
std::cout  }
/*...*/
 
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:
#include 
#include 
#include 


using namespace std;

int main(int argc, char *argv[])
{

int i;

for (i=1; i != 0; )
{

char was = 0;
double z1;
double z2;
double erg = 0;
double erg2 = 0;



cout ', '^', 'w')"  
do{ 
cout  cin >> was; //Eingabe Rechenart 


cout  cin >> z1;

cout  cin >> z2;
}

while ((was == '/') && (z2 == 0) || (was == 'w') && (z1 < 0) || (was == 'w') && (z2 < 0) ); //Division durch Null abfangen

switch (was)
{
case '+':
erg = z1 + z2;
cout  "  cout  break;

default :
cout ' verwenden!\n\n\n\n"  }

};


system("PAUSE");
return EXIT_SUCCESS;
}

MFG

RollinRoll

EDIT: Kleine verbesserung... jetzt kann man das programm auch mehrmals hintereinander nutzen :D
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

S
Antworten
1
Aufrufe
6K
Antworten
0
Aufrufe
958
Antworten
11
Aufrufe
2K
bladerunner
B
N
Antworten
3
Aufrufe
788
Zurück
Oben Unten